OctoBot-Trading 2.4.163__tar.gz → 2.4.164__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/CHANGELOG.md +4 -0
  2. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/OctoBot_Trading.egg-info/SOURCES.txt +11 -0
  4. {OctoBot-Trading-2.4.163/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.164}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/README.md +1 -1
  6. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/__init__.py +2 -0
  8. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/orders.py +5 -0
  9. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/enums.py +5 -0
  10. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/errors.py +6 -0
  11. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/traders/trader.py +4 -1
  12. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/__init__.py +16 -0
  13. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/__init__.py +19 -0
  14. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/groups/__init__.py +6 -0
  15. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +82 -37
  16. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +77 -0
  17. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/order.py +24 -7
  18. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/order_factory.py +3 -1
  19. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/order_util.py +11 -0
  20. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +51 -0
  21. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +86 -0
  22. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +30 -0
  23. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +33 -0
  24. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +58 -0
  25. OctoBot-Trading-2.4.164/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +20 -0
  26. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/util.py +4 -0
  27. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/__init__.py +2 -0
  28. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/orders_storage.py +10 -0
  29. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/implementations/test_default_websocket_exchange.py +1 -1
  30. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/traders/test_trader.py +1 -0
  31. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +60 -8
  32. OctoBot-Trading-2.4.164/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +136 -0
  33. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_order_factory.py +44 -3
  34. OctoBot-Trading-2.4.164/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +88 -0
  35. OctoBot-Trading-2.4.164/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +81 -0
  36. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/signals/test_util.py +13 -0
  37. OctoBot-Trading-2.4.164/tests/test_utils/__init__.py +0 -0
  38. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/LICENSE +0 -0
  39. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/MANIFEST.in +0 -0
  40. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  41. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  42. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/OctoBot_Trading.egg-info/requires.txt +0 -0
  43. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  44. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/channels.py +0 -0
  45. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/contracts.py +0 -0
  46. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/exchange.py +0 -0
  47. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/modes.py +0 -0
  48. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/portfolio.py +0 -0
  49. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/positions.py +0 -0
  50. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/profitability.py +0 -0
  51. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/storage.py +0 -0
  52. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/symbol_data.py +0 -0
  53. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/trader.py +0 -0
  54. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/api/trades.py +0 -0
  55. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/constants.py +0 -0
  56. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_channel.py +0 -0
  57. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  60. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  61. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  62. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  63. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  64. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  66. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  67. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  68. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  69. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  70. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  73. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  74. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  75. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  76. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  78. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  79. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  80. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  81. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  82. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  83. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  84. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  87. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  88. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  89. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  90. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  93. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  94. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  96. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  97. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  100. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  101. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  102. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  103. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  106. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  107. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  108. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  109. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  111. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  112. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  113. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  114. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/config/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  116. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  117. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  118. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  119. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  121. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  122. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  123. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  124. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  125. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  126. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  127. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  129. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  130. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  131. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchange_builder.py +0 -0
  132. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchange_channels.py +0 -0
  133. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchange_details.py +0 -0
  134. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchange_factory.py +0 -0
  135. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchange_manager.py +0 -0
  136. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  137. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/exchanges.py +0 -0
  138. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  139. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  140. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  141. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  142. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/traders/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  144. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/types/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  146. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  147. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/util/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  149. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  150. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  151. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  152. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  154. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/channel/__init__.py +0 -0
  155. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  156. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  157. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/channel/mode.py +0 -0
  158. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/mode_activity.py +0 -0
  159. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/mode_config.py +0 -0
  160. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/modes_factory.py +0 -0
  161. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/modes_util.py +0 -0
  162. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  165. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  166. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  167. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  168. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  169. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  170. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  171. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  172. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  173. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  174. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  175. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  176. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  178. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/octobot_channel_consumer.py +0 -0
  179. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  180. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  182. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  183. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  184. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  185. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  186. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  187. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  188. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/order_group.py +0 -0
  189. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/order_state.py +0 -0
  190. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  191. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  192. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  193. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  194. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  195. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  196. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  197. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  198. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  199. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  200. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  201. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  204. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  205. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  206. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  207. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  208. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  209. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  211. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  212. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  213. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  215. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  216. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  217. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  218. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  219. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  220. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  222. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  223. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  224. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  225. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  226. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  227. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  228. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  230. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  231. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  232. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  233. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  234. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  235. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  236. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  237. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  238. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  239. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +0 -0
  240. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  242. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  243. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  244. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  245. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  247. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  248. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  249. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  250. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/position.py +0 -0
  251. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  252. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/position_state.py +0 -0
  253. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/position_util.py +0 -0
  254. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  255. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  257. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  258. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  259. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  260. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  262. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  263. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/state.py +0 -0
  264. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  267. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  268. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/trade.py +0 -0
  269. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  270. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  271. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  272. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  273. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  275. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  276. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  277. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  278. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  279. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  280. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  281. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  282. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/channel/__init__.py +0 -0
  284. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  285. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  286. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/channel/signal_producer.py +0 -0
  287. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/signal_creation.py +0 -0
  288. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  289. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/abstract_storage.py +0 -0
  290. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/candles_storage.py +0 -0
  291. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/portfolio_storage.py +0 -0
  292. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/storage_manager.py +0 -0
  293. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/trades_storage.py +0 -0
  294. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/transactions_storage.py +0 -0
  295. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/storage/util.py +0 -0
  296. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/supervisors/__init__.py +0 -0
  297. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  298. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  299. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/config_util.py +0 -0
  301. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/initializable.py +0 -0
  302. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/initialization_util.py +0 -0
  303. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/simulator_updater_utils.py +0 -0
  304. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/test_tools/__init__.py +0 -0
  305. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  306. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  307. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  308. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  309. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/requirements.txt +0 -0
  310. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/setup.cfg +0 -0
  311. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/setup.py +0 -0
  312. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_channels.py +0 -0
  314. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_exchange.py +0 -0
  315. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_modes.py +0 -0
  316. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_orders.py +0 -0
  317. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_portfolio.py +0 -0
  318. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_profitability.py +0 -0
  319. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_symbol_data.py +0 -0
  320. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_trader.py +0 -0
  321. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/api/test_trades.py +0 -0
  322. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/cli/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/contracts/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  326. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  327. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/funding/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  329. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/kline/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  331. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/ohlcv/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  333. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  334. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/order_book/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  336. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/prices/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  338. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  339. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/recent_trades/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  341. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  342. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/ticker/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  344. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/connectors/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  348. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  349. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/implementations/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_abstract_exchange.py +0 -0
  352. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  353. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_exchange_builder.py +0 -0
  354. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_exchange_config_data.py +0 -0
  355. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_exchange_factory.py +0 -0
  356. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_exchange_manager.py +0 -0
  357. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_exchange_simulator.py +0 -0
  358. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/test_exchanges.py +0 -0
  359. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/traders/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/types/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  362. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/util/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  364. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/exchanges/util/test_exchange_util.py +0 -0
  365. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  369. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  370. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  371. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  372. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  373. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  374. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/test_abstract_mode_consumer.py +0 -0
  375. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/test_abstract_trading_mode.py +0 -0
  376. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/modes/test_modes_util.py +0 -0
  377. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/__init__.py +0 -0
  379. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/groups/__init__.py +0 -0
  380. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  381. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  382. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  384. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  385. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  386. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  387. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_order_state.py +0 -0
  388. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  389. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  390. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  391. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  392. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  393. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_order.py +0 -0
  394. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_order_adapter.py +0 -0
  395. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_order_util.py +0 -0
  396. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_orders_manager.py +0 -0
  397. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  398. {OctoBot-Trading-2.4.163/tests/personal_data/orders/types/limit → OctoBot-Trading-2.4.164/tests/personal_data/orders/trailing_profiles}/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/__init__.py +0 -0
  400. {OctoBot-Trading-2.4.163/tests/personal_data/orders/types/market → OctoBot-Trading-2.4.164/tests/personal_data/orders/types/limit}/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  402. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  403. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  404. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  405. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  406. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  407. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  408. {OctoBot-Trading-2.4.163/tests/personal_data/portfolios/history → OctoBot-Trading-2.4.164/tests/personal_data/orders/types/market}/__init__.py +0 -0
  409. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  410. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  411. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  412. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  413. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  414. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  415. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  418. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  419. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  420. {OctoBot-Trading-2.4.163/tests/test_utils → OctoBot-Trading-2.4.164/tests/personal_data/portfolios/history}/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  422. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  423. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_asset.py +0 -0
  424. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  425. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  426. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  427. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_portfolio_util.py +0 -0
  428. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  429. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  430. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/types/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  432. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  433. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  434. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/channel/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/states/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/test_position.py +0 -0
  438. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/test_position_factory.py +0 -0
  439. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/test_positions_manager.py +0 -0
  440. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/types/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  442. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  443. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/trades/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/trades/test_trade_factory.py +0 -0
  445. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/trades/test_trade_manager.py +0 -0
  446. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  447. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/trades/test_trade_util.py +0 -0
  448. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/transactions/__init__.py +0 -0
  449. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  450. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  451. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/signals/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  453. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/test_utils/order_util.py +0 -0
  454. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/test_utils/random_numbers.py +0 -0
  455. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/util/__init__.py +0 -0
  456. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests/util/test_config_util.py +0 -0
  457. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/__init__.py +0 -0
  458. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/__init__.py +0 -0
  459. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  460. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  461. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  462. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_binance.py +0 -0
  463. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  464. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bingx.py +0 -0
  465. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  466. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bitget.py +0 -0
  467. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  468. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  469. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  470. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bitso.py +0 -0
  471. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  472. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bybit.py +0 -0
  473. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  474. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  475. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_coinex.py +0 -0
  476. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  477. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_gateio.py +0 -0
  478. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  479. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  480. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_htx.py +0 -0
  481. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_kraken.py +0 -0
  482. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  483. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  484. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_mexc.py +0 -0
  485. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_ndax.py +0 -0
  486. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  487. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_okx.py +0 -0
  488. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  489. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_phemex.py +0 -0
  490. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  491. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_upbit.py +0 -0
  492. {OctoBot-Trading-2.4.163 → OctoBot-Trading-2.4.164}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.4.164] - 2025-03-21
8
+ ### Added
9
+ [Trailing] add trailing profiles
10
+
7
11
  ## [2.4.163] - 2025-03-18
8
12
  ### Added
9
13
  [Portfolio] add subportfolio and portfolio delta functions
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.163
3
+ Version: 2.4.164
4
4
  Summary: OctoBot project trading package
5
5
  Home-page: https://github.com/Drakkar-Software/OctoBot-Trading
6
6
  Author: Drakkar-Software
@@ -16,7 +16,7 @@ Classifier: Operating System :: POSIX
16
16
  Requires-Python: >=3.8
17
17
  License-File: LICENSE
18
18
 
19
- # OctoBot-Trading [2.4.163](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.164](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
21
21
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -172,6 +172,7 @@ octobot_trading/personal_data/orders/groups/__init__.py
172
172
  octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py
173
173
  octobot_trading/personal_data/orders/groups/group_util.py
174
174
  octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py
175
+ octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py
175
176
  octobot_trading/personal_data/orders/states/__init__.py
176
177
  octobot_trading/personal_data/orders/states/cancel_order_state.py
177
178
  octobot_trading/personal_data/orders/states/close_order_state.py
@@ -180,6 +181,12 @@ octobot_trading/personal_data/orders/states/open_order_state.py
180
181
  octobot_trading/personal_data/orders/states/order_state_factory.py
181
182
  octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py
182
183
  octobot_trading/personal_data/orders/states/pending_creation_order_state.py
184
+ octobot_trading/personal_data/orders/trailing_profiles/__init__.py
185
+ octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py
186
+ octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py
187
+ octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py
188
+ octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py
189
+ octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py
183
190
  octobot_trading/personal_data/orders/types/__init__.py
184
191
  octobot_trading/personal_data/orders/types/unknown_order.py
185
192
  octobot_trading/personal_data/orders/types/unsupported_order.py
@@ -372,6 +379,7 @@ tests/personal_data/orders/groups/__init__.py
372
379
  tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py
373
380
  tests/personal_data/orders/groups/test_group_util.py
374
381
  tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py
382
+ tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py
375
383
  tests/personal_data/orders/states/__init__.py
376
384
  tests/personal_data/orders/states/test_cancel_order_state.py
377
385
  tests/personal_data/orders/states/test_close_order_state.py
@@ -381,6 +389,9 @@ tests/personal_data/orders/states/test_order_state.py
381
389
  tests/personal_data/orders/states/test_order_state_factory.py
382
390
  tests/personal_data/orders/states/test_pending_creation_chained_order_state.py
383
391
  tests/personal_data/orders/states/test_pending_creation_order_state.py
392
+ tests/personal_data/orders/trailing_profiles/__init__.py
393
+ tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py
394
+ tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py
384
395
  tests/personal_data/orders/types/__init__.py
385
396
  tests/personal_data/orders/types/test_unknown_order.py
386
397
  tests/personal_data/orders/types/limit/__init__.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.163
3
+ Version: 2.4.164
4
4
  Summary: OctoBot project trading package
5
5
  Home-page: https://github.com/Drakkar-Software/OctoBot-Trading
6
6
  Author: Drakkar-Software
@@ -16,7 +16,7 @@ Classifier: Operating System :: POSIX
16
16
  Requires-Python: >=3.8
17
17
  License-File: LICENSE
18
18
 
19
- # OctoBot-Trading [2.4.163](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.164](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
21
21
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -1,4 +1,4 @@
1
- # OctoBot-Trading [2.4.163](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.164](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
2
2
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
3
3
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -15,4 +15,4 @@
15
15
  # License along with this library.
16
16
 
17
17
  PROJECT_NAME = "OctoBot-Trading"
18
- VERSION = "2.4.163" # major.minor.revision
18
+ VERSION = "2.4.164" # major.minor.revision
@@ -195,6 +195,7 @@ from octobot_trading.api.orders import (
195
195
  is_order_pending,
196
196
  get_order_profitability,
197
197
  get_minimal_order_cost,
198
+ get_order_trailing_profile_dict,
198
199
  create_order,
199
200
  cancel_all_open_orders,
200
201
  cancel_all_open_orders_with_currency,
@@ -383,6 +384,7 @@ __all__ = [
383
384
  "is_order_pending",
384
385
  "get_order_profitability",
385
386
  "get_minimal_order_cost",
387
+ "get_order_trailing_profile_dict",
386
388
  "create_order",
387
389
  "cancel_all_open_orders",
388
390
  "cancel_all_open_orders_with_currency",
@@ -18,6 +18,7 @@ import octobot_commons.logging as logging
18
18
  import octobot_trading.personal_data as personal_data
19
19
  import octobot_trading.enums
20
20
  import octobot_trading.constants as constants
21
+ import octobot_trading.storage as storage
21
22
 
22
23
  LOGGER = logging.get_logger(constants.API_LOGGER_TAG)
23
24
 
@@ -95,3 +96,7 @@ def get_minimal_order_cost(exchange_manager, symbol, default_price=None) -> floa
95
96
  exchange_manager.exchange.get_market_status(symbol, with_fixer=False),
96
97
  default_price=default_price
97
98
  )
99
+
100
+
101
+ def get_order_trailing_profile_dict(order: personal_data.Order) -> dict:
102
+ return storage.get_order_trailing_profile_dict(order)
@@ -554,6 +554,8 @@ class TradingSignalOrdersAttrs(enum.Enum):
554
554
  GROUP_TYPE = "group_type"
555
555
  TAG = "tag"
556
556
  ORDER_ID = "order_id"
557
+ TRAILING_PROFILE_TYPE = "trailing_profile_type"
558
+ TRAILING_PROFILE = "trailing_profile"
557
559
  BUNDLED_WITH = "bundled_with"
558
560
  CHAINED_TO = "chained_to"
559
561
  ADDITIONAL_ORDERS = "additional_orders"
@@ -586,6 +588,9 @@ class StoredOrdersAttr(enum.Enum):
586
588
  GROUP_ID = "gi"
587
589
  GROUP_TYPE = "gt"
588
590
  CHAINED_ORDERS = "co"
591
+ TRAILING_PROFILE = "tp"
592
+ TRAILING_PROFILE_TYPE = "tpt"
593
+ TRAILING_PROFILE_DETAILS = "tpd"
589
594
  EXCHANGE_CREATION_PARAMS = "ecp"
590
595
  TRADER_CREATION_KWARGS = "tck"
591
596
  HAS_BEEN_BUNDLED = "hbb"
@@ -342,3 +342,9 @@ class InitializingError(Exception):
342
342
  """
343
343
  Raised when OctoBot is still in initialization
344
344
  """
345
+
346
+
347
+ class ExhaustedTrailingProfileError(Exception):
348
+ """
349
+ Raised when a trailing profile has no new price to produce anymore
350
+ """
@@ -205,10 +205,12 @@ class Trader(util.Initializable):
205
205
  self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.update_portfolio_available(
206
206
  order, is_new_order=False
207
207
  )
208
+ updated_price = edited_stop_price if edited_price is None else edited_price
208
209
  changed = order.update(
209
210
  order.symbol,
210
211
  quantity=edited_quantity,
211
- price=edited_stop_price if edited_price is None else edited_price,
212
+ price=updated_price,
213
+ filled_price=updated_price,
212
214
  stop_price=edited_stop_price,
213
215
  current_price=edited_current_price,
214
216
  )
@@ -310,6 +312,7 @@ class Trader(util.Initializable):
310
312
  updated_order.is_waiting_for_chained_trigger = new_order.is_waiting_for_chained_trigger
311
313
  updated_order.associated_entry_ids = new_order.associated_entry_ids
312
314
  updated_order.update_with_triggering_order_fees = new_order.update_with_triggering_order_fees
315
+ updated_order.trailing_profile = new_order.trailing_profile
313
316
 
314
317
  if is_pending_creation:
315
318
  # register order as pending order, it will then be added to live orders in order manager once open
@@ -56,14 +56,22 @@ from octobot_trading.personal_data.orders import (
56
56
  is_associated_pending_order,
57
57
  apply_pending_order_from_created_order,
58
58
  get_up_to_date_price,
59
+ get_potentially_outdated_price,
59
60
  get_pre_order_data,
60
61
  get_portfolio_amounts,
61
62
  OrderState,
62
63
  OrderGroup,
63
64
  BalancedTakeProfitAndStopOrderGroup,
65
+ TrailingOnFilledTPBalancedOrderGroup,
64
66
  OneCancelsTheOtherOrderGroup,
65
67
  get_group_class,
66
68
  get_or_create_order_group_from_storage_order_details,
69
+ TrailingPriceStep,
70
+ TrailingProfile,
71
+ FilledTakeProfitTrailingProfile,
72
+ TrailingProfileTypes,
73
+ create_trailing_profile,
74
+ create_filled_take_profit_trailing_profile,
67
75
  OrdersUpdater,
68
76
  adapt_price,
69
77
  get_minimal_order_amount,
@@ -284,14 +292,22 @@ __all__ = [
284
292
  "is_associated_pending_order",
285
293
  "apply_pending_order_from_created_order",
286
294
  "get_up_to_date_price",
295
+ "get_potentially_outdated_price",
287
296
  "get_pre_order_data",
288
297
  "get_portfolio_amounts",
289
298
  "OrderState",
290
299
  "OrderGroup",
291
300
  "BalancedTakeProfitAndStopOrderGroup",
301
+ "TrailingOnFilledTPBalancedOrderGroup",
292
302
  "OneCancelsTheOtherOrderGroup",
293
303
  "get_group_class",
294
304
  "get_or_create_order_group_from_storage_order_details",
305
+ "TrailingPriceStep",
306
+ "TrailingProfile",
307
+ "FilledTakeProfitTrailingProfile",
308
+ "TrailingProfileTypes",
309
+ "create_trailing_profile",
310
+ "create_filled_take_profit_trailing_profile",
295
311
  "OrdersUpdater",
296
312
  "adapt_price",
297
313
  "get_minimal_order_amount",
@@ -25,10 +25,20 @@ from octobot_trading.personal_data.orders.order_group import (
25
25
  from octobot_trading.personal_data.orders import groups
26
26
  from octobot_trading.personal_data.orders.groups import (
27
27
  BalancedTakeProfitAndStopOrderGroup,
28
+ TrailingOnFilledTPBalancedOrderGroup,
28
29
  OneCancelsTheOtherOrderGroup,
29
30
  get_group_class,
30
31
  get_or_create_order_group_from_storage_order_details,
31
32
  )
33
+ from octobot_trading.personal_data.orders import trailing_profiles
34
+ from octobot_trading.personal_data.orders.trailing_profiles import (
35
+ TrailingPriceStep,
36
+ TrailingProfile,
37
+ FilledTakeProfitTrailingProfile,
38
+ TrailingProfileTypes,
39
+ create_trailing_profile,
40
+ create_filled_take_profit_trailing_profile,
41
+ )
32
42
  from octobot_trading.personal_data.orders import order
33
43
  from octobot_trading.personal_data.orders.order import (
34
44
  Order,
@@ -90,6 +100,7 @@ from octobot_trading.personal_data.orders.order_util import (
90
100
  parse_is_pending_cancel,
91
101
  parse_is_open,
92
102
  get_up_to_date_price,
103
+ get_potentially_outdated_price,
93
104
  get_pre_order_data,
94
105
  get_portfolio_amounts,
95
106
  get_pnl_transaction_source_from_order,
@@ -165,6 +176,7 @@ __all__ = [
165
176
  "parse_is_pending_cancel",
166
177
  "parse_is_open",
167
178
  "get_up_to_date_price",
179
+ "get_potentially_outdated_price",
168
180
  "get_pre_order_data",
169
181
  "get_portfolio_amounts",
170
182
  "get_pnl_transaction_source_from_order",
@@ -183,9 +195,16 @@ __all__ = [
183
195
  "OrderState",
184
196
  "OrderGroup",
185
197
  "BalancedTakeProfitAndStopOrderGroup",
198
+ "TrailingOnFilledTPBalancedOrderGroup",
186
199
  "OneCancelsTheOtherOrderGroup",
187
200
  "get_group_class",
188
201
  "get_or_create_order_group_from_storage_order_details",
202
+ "TrailingPriceStep",
203
+ "TrailingProfile",
204
+ "FilledTakeProfitTrailingProfile",
205
+ "TrailingProfileTypes",
206
+ "create_trailing_profile",
207
+ "create_filled_take_profit_trailing_profile",
189
208
  "OrdersUpdater",
190
209
  "adapt_price",
191
210
  "get_minimal_order_amount",
@@ -19,6 +19,11 @@ from octobot_trading.personal_data.orders.groups.balanced_take_profit_and_stop_o
19
19
  BalancedTakeProfitAndStopOrderGroup,
20
20
  )
21
21
 
22
+ from octobot_trading.personal_data.orders.groups import trailing_on_filled_tp_balanced_order_group
23
+ from octobot_trading.personal_data.orders.groups.trailing_on_filled_tp_balanced_order_group import (
24
+ TrailingOnFilledTPBalancedOrderGroup,
25
+ )
26
+
22
27
  from octobot_trading.personal_data.orders.groups import one_cancels_the_other_order_group
23
28
  from octobot_trading.personal_data.orders.groups.one_cancels_the_other_order_group import (
24
29
  OneCancelsTheOtherOrderGroup,
@@ -33,6 +38,7 @@ from octobot_trading.personal_data.orders.groups.group_util import (
33
38
 
34
39
  __all__ = [
35
40
  "BalancedTakeProfitAndStopOrderGroup",
41
+ "TrailingOnFilledTPBalancedOrderGroup",
36
42
  "OneCancelsTheOtherOrderGroup",
37
43
  "get_group_class",
38
44
  "get_or_create_order_group_from_storage_order_details",
@@ -13,6 +13,11 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
+ import decimal
17
+ import typing
18
+
19
+ import octobot_commons.logging
20
+
16
21
  import octobot_trading.personal_data.orders.order_group as order_group
17
22
  import octobot_trading.personal_data.orders.order_util as order_util
18
23
  import octobot_trading.constants as constants
@@ -35,6 +40,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
35
40
  CANCEL = "cancel"
36
41
  ORDER = "order"
37
42
  UPDATED_QUANTITY = "updated_quantity"
43
+ UPDATED_PRICE = "updated_price"
38
44
 
39
45
  def __init__(self, name, orders_manager):
40
46
  super().__init__(name, orders_manager)
@@ -49,7 +55,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
49
55
  :param filled_order: the filled order
50
56
  :param ignored_orders: orders that should be ignored
51
57
  """
52
- await self._balance_orders(filled_order, ignored_orders)
58
+ await self._balance_orders(filled_order, ignored_orders, True)
53
59
 
54
60
  async def on_cancel(self, cancelled_order, ignored_orders=None):
55
61
  """
@@ -59,7 +65,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
59
65
  :param cancelled_order: the cancelled order
60
66
  :param ignored_orders: orders that should be ignored
61
67
  """
62
- await self._balance_orders(cancelled_order, ignored_orders)
68
+ await self._balance_orders(cancelled_order, ignored_orders, False)
63
69
 
64
70
  def can_create_order(self, order_type, quantity):
65
71
  """
@@ -68,7 +74,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
68
74
  :param quantity: quantity to put in order
69
75
  :return: True when an imbalance allows it
70
76
  """
71
- balance = self._get_balance(None, None)
77
+ balance = self._get_balance(None, None, False)
72
78
  if order_util.is_stop_order(order_type):
73
79
  return balance[self.STOP].get_balance() + quantity <= balance[self.TAKE_PROFIT].get_balance()
74
80
  return balance[self.TAKE_PROFIT].get_balance() + quantity <= balance[self.STOP].get_balance()
@@ -79,7 +85,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
79
85
  :param order_type: order type to create
80
86
  :return: the balancing quantity
81
87
  """
82
- balance = self._get_balance(None, None)
88
+ balance = self._get_balance(None, None, False)
83
89
  if order_util.is_stop_order(order_type):
84
90
  max_quantity = balance[self.TAKE_PROFIT].get_balance() - balance[self.STOP].get_balance()
85
91
  else:
@@ -91,15 +97,15 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
91
97
  # setting enabled to True will trigger an order balance
92
98
  await super().enable(enabled)
93
99
  if enabled:
94
- await self._balance_orders(None, None)
100
+ await self._balance_orders(None, None, False)
95
101
 
96
- async def _balance_orders(self, closed_order, ignored_orders):
102
+ async def _balance_orders(self, closed_order, ignored_orders, filled):
97
103
  if not self.enabled:
98
104
  return
99
105
  locally_balancing_orders = []
100
106
  try:
101
107
  updated_orders = False
102
- balance = self._get_balance(closed_order, ignored_orders)
108
+ balance = self._get_balance(closed_order, ignored_orders, filled)
103
109
  locally_balancing_orders = balance[self.TAKE_PROFIT].orders + balance[self.STOP].orders
104
110
  self.balancing_orders += locally_balancing_orders
105
111
  take_profit_actions = balance[self.TAKE_PROFIT].get_actions_to_balance(balance[self.STOP].get_balance())
@@ -116,15 +122,32 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
116
122
  self.logger.error(f"Skipping order cancel: {err}")
117
123
  updated_orders = True
118
124
  for update_data in take_profit_actions[self.UPDATE] + stop_actions[self.UPDATE]:
119
- self.logger.info(f"Updating order quantity to {update_data[self.UPDATED_QUANTITY]} to keep balance, "
120
- f"order: {update_data[self.ORDER]}")
121
125
  order = update_data[self.ORDER]
122
- async with signals.remote_signal_publisher(order.trader.exchange_manager, order.symbol, True):
123
- await signals.edit_order(order.trader.exchange_manager,
124
- signals.should_emit_trading_signal(order.trader.exchange_manager),
125
- order,
126
- edited_quantity=update_data[self.UPDATED_QUANTITY])
127
- updated_orders = True
126
+ update_info = ""
127
+ edited_quantity = None
128
+ edited_price = None
129
+ if (
130
+ update_data[self.UPDATED_QUANTITY] is not None
131
+ and update_data[self.UPDATED_QUANTITY] != order.origin_quantity
132
+ ):
133
+ update_info = f"Updating order quantity to {update_data[self.UPDATED_QUANTITY]} to keep balance. "
134
+ edited_quantity = update_data[self.UPDATED_QUANTITY]
135
+ if self.UPDATED_PRICE in update_data and update_data[self.UPDATED_PRICE] != order.origin_price:
136
+ update_info = f"{update_info}Updating price to {update_data[self.UPDATED_PRICE]}. "
137
+ edited_price = update_data[self.UPDATED_PRICE]
138
+ if edited_quantity or edited_price:
139
+ self.logger.info(f"{update_info}Order: {order}")
140
+ async with signals.remote_signal_publisher(order.trader.exchange_manager, order.symbol, True):
141
+ await signals.edit_order(
142
+ order.trader.exchange_manager,
143
+ signals.should_emit_trading_signal(order.trader.exchange_manager),
144
+ order,
145
+ edited_quantity=edited_quantity,
146
+ edited_price=edited_price
147
+ )
148
+ updated_orders = True
149
+ else:
150
+ self.logger.info(f"Order already up-to-date, skipped editing: {order}")
128
151
  if not updated_orders:
129
152
  self.logger.debug("Nothing to update, orders are already evenly balanced")
130
153
  except Exception as e:
@@ -137,11 +160,14 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
137
160
  if order not in locally_balancing_orders
138
161
  ]
139
162
 
140
- def _get_balance(self, closed_order, ignored_orders):
141
- balance = {
142
- self.TAKE_PROFIT: _SideBalance(),
143
- self.STOP: _SideBalance()
163
+ def _balances_factory(self, closed_order, filled):
164
+ return {
165
+ self.TAKE_PROFIT: SideBalance(closed_order, filled),
166
+ self.STOP: SideBalance(closed_order, filled)
144
167
  }
168
+
169
+ def _get_balance(self, closed_order, ignored_orders, filled):
170
+ balance = self._balances_factory(closed_order, filled)
145
171
  for order in self.get_group_open_orders():
146
172
  if (
147
173
  order is not closed_order
@@ -155,8 +181,10 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
155
181
  return balance
156
182
 
157
183
 
158
- class _SideBalance:
159
- def __init__(self):
184
+ class SideBalance:
185
+ def __init__(self, closed_order, filled):
186
+ self.closed_order = closed_order
187
+ self.are_closed_orders_filled = filled
160
188
  self.orders = []
161
189
 
162
190
  def add_order(self, order):
@@ -171,30 +199,47 @@ class _SideBalance:
171
199
  BalancedTakeProfitAndStopOrderGroup.UPDATE: [],
172
200
  }
173
201
  balance = self.get_balance()
202
+ balance_update_required = True
174
203
  if target_balance < constants.ZERO:
175
204
  target_balance = abs(target_balance)
176
205
  if balance <= target_balance:
177
- # only reducing the current balance is possible
178
- return actions
206
+ # only reducing the current balance might be possible
207
+ balance_update_required = False
179
208
  to_be_reduced_amount = constants.ZERO
180
209
  remaining_orders = list(self.orders)
181
- while remaining_orders and balance - to_be_reduced_amount > target_balance:
182
- order_quantity = remaining_orders[0].origin_quantity
183
- if balance - to_be_reduced_amount - order_quantity >= target_balance:
184
- # cancel order and keep reducing
185
- actions[BalancedTakeProfitAndStopOrderGroup.CANCEL].append(remaining_orders.pop(0))
186
- to_be_reduced_amount += order_quantity
187
- else:
188
- # update order and stop reducing
189
- actions[BalancedTakeProfitAndStopOrderGroup.UPDATE].append({
190
- BalancedTakeProfitAndStopOrderGroup.ORDER: remaining_orders.pop(0),
191
- BalancedTakeProfitAndStopOrderGroup.UPDATED_QUANTITY:
192
- target_balance - (balance - to_be_reduced_amount - order_quantity)
193
- })
194
- break
210
+ if balance_update_required:
211
+ while remaining_orders and balance - to_be_reduced_amount > target_balance:
212
+ order_quantity = remaining_orders[0].origin_quantity
213
+ if balance - to_be_reduced_amount - order_quantity >= target_balance:
214
+ # cancel order and keep reducing
215
+ actions[BalancedTakeProfitAndStopOrderGroup.CANCEL].append(remaining_orders.pop(0))
216
+ to_be_reduced_amount += order_quantity
217
+ else:
218
+ # update order and stop reducing
219
+ actions[BalancedTakeProfitAndStopOrderGroup.UPDATE].append(
220
+ self.get_order_update(
221
+ remaining_orders.pop(0),
222
+ target_balance - (balance - to_be_reduced_amount - order_quantity)
223
+ )
224
+ )
225
+ break
226
+ for order in remaining_orders:
227
+ # check for other kind of update if any
228
+ actions[BalancedTakeProfitAndStopOrderGroup.UPDATE].append(
229
+ self.get_order_update(order, None)
230
+ )
195
231
  return actions
196
232
 
233
+ def get_order_update(self, order, updated_quantity: typing.Optional[decimal.Decimal]) -> dict:
234
+ return {
235
+ BalancedTakeProfitAndStopOrderGroup.ORDER: order,
236
+ BalancedTakeProfitAndStopOrderGroup.UPDATED_QUANTITY: updated_quantity
237
+ }
238
+
197
239
  def get_balance(self):
198
240
  if self.orders:
199
241
  return sum(order.origin_quantity for order in self.orders)
200
242
  return constants.ZERO
243
+
244
+ def get_logger(self):
245
+ return octobot_commons.logging.get_logger(self.__class__.__name__)
@@ -0,0 +1,77 @@
1
+ # Drakkar-Software OctoBot-Trading
2
+ # Copyright (c) Drakkar-Software, All rights reserved.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 3.0 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library.
16
+ import typing
17
+ import decimal
18
+
19
+ import octobot_trading.errors
20
+ import octobot_trading.personal_data.orders.groups.balanced_take_profit_and_stop_order_group as \
21
+ balanced_take_profit_and_stop_order_group
22
+ import octobot_trading.personal_data.orders.order_util as order_util
23
+ import octobot_trading.personal_data.orders.order as order_import
24
+ import octobot_trading.personal_data.orders.trailing_profiles as trailing_profiles_import
25
+
26
+ import octobot_trading.constants as constants
27
+
28
+
29
+ class TrailingOnFilledTPBalancedOrderGroup(
30
+ balanced_take_profit_and_stop_order_group.BalancedTakeProfitAndStopOrderGroup
31
+ ):
32
+ """
33
+ TrailingOnFilledTPBalancedOrderGroup is a BalancedTakeProfitAndStopOrderGroup that also applies a trailing
34
+ profile to stop losses
35
+ """
36
+
37
+ def _balances_factory(self, closed_order, filled):
38
+ return {
39
+ self.TAKE_PROFIT: balanced_take_profit_and_stop_order_group.SideBalance(closed_order, filled),
40
+ self.STOP: TrailingSideBalance(closed_order, filled) # only stop orders are trailing
41
+ }
42
+
43
+
44
+ class TrailingSideBalance(balanced_take_profit_and_stop_order_group.SideBalance):
45
+ def _get_relevant_price(self, order: order_import.Order) -> decimal.Decimal:
46
+ filled_price = self.closed_order.origin_price if self.closed_order and self.are_closed_orders_filled else None
47
+ current_price, up_to_date = order_util.get_potentially_outdated_price(order.exchange_manager, order.symbol)
48
+ if not up_to_date:
49
+ self.get_logger().warning(
50
+ f"{order.exchange_manager.exchange_name} mark price: {current_price} is outdated for {order.symbol}. "
51
+ f"Using it anyway."
52
+ )
53
+ if filled_price is None or filled_price == constants.ZERO:
54
+ return current_price
55
+ if order.trigger_above:
56
+ # trigger above means it's a SL in a short position: price will trail down, look for min price
57
+ return min(filled_price, current_price)
58
+ # it's a SL in a long position: trail up and use max price as reference
59
+ return max(filled_price, current_price)
60
+
61
+ def _get_next_trailing_price(self, order: order_import.Order) -> typing.Optional[decimal.Decimal]:
62
+ if not isinstance(order.trailing_profile, trailing_profiles_import.FilledTakeProfitTrailingProfile):
63
+ self.get_logger().error(f"Ignored trailing profile: {order.trailing_profile} for order {order}")
64
+ return None
65
+ try:
66
+ updated_price = self._get_relevant_price(order)
67
+ return order.trailing_profile.update_and_get_trailing_price(updated_price)
68
+ except octobot_trading.errors.ExhaustedTrailingProfileError as err:
69
+ self.get_logger().error(f"Impossible to compute next trailing price: {err}")
70
+ return None
71
+
72
+ def get_order_update(self, order, updated_quantity: typing.Optional[decimal.Decimal]) -> dict:
73
+ # order should be updated, meaning it's quantity will be adjusted (from parent class SideBalance).
74
+ # here we also want to update its price according to the trailing profile
75
+ base_update = super().get_order_update(order, updated_quantity)
76
+ base_update[TrailingOnFilledTPBalancedOrderGroup.UPDATED_PRICE] = self._get_next_trailing_price(order)
77
+ return base_update