OctoBot-Trading 2.4.205__tar.gz → 2.4.206__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 (513) hide show
  1. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/CHANGELOG.md +6 -1
  2. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.205/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.206}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/README.md +1 -1
  5. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/traders/trader.py +16 -3
  7. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/exchange_personal_data.py +6 -0
  8. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/channel/orders_updater.py +1 -1
  9. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +2 -1
  10. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/order.py +28 -11
  11. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/order_state.py +4 -1
  12. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/order_util.py +3 -0
  13. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/orders_manager.py +6 -6
  14. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/cancel_order_state.py +5 -2
  15. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/close_order_state.py +5 -2
  16. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/fill_order_state.py +5 -2
  17. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/open_order_state.py +13 -7
  18. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/order_state_factory.py +12 -5
  19. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +5 -2
  20. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/portfolio_manager.py +29 -8
  21. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/portfolio_util.py +1 -0
  22. OctoBot-Trading-2.4.206/tests/personal_data/orders/states/__init__.py +74 -0
  23. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_cancel_order_state.py +9 -0
  24. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_close_order_state.py +11 -2
  25. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_fill_order_state.py +9 -0
  26. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_open_order_state.py +10 -0
  27. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +15 -0
  28. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_pending_creation_order_state.py +15 -0
  29. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_order.py +53 -2
  30. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_portfolio_manager.py +26 -4
  31. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_portfolio_util.py +11 -7
  32. OctoBot-Trading-2.4.205/tests_additional/__init__.py +0 -15
  33. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/LICENSE +0 -0
  34. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/MANIFEST.in +0 -0
  35. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  36. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  37. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  38. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/OctoBot_Trading.egg-info/requires.txt +0 -0
  39. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  40. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/__init__.py +0 -0
  41. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/channels.py +0 -0
  42. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/contracts.py +0 -0
  43. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/exchange.py +0 -0
  44. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/modes.py +0 -0
  45. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/orders.py +0 -0
  46. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/portfolio.py +0 -0
  47. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/positions.py +0 -0
  48. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/profitability.py +0 -0
  49. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/storage.py +0 -0
  50. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/symbol_data.py +0 -0
  51. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/trader.py +0 -0
  52. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/api/trades.py +0 -0
  53. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/constants.py +0 -0
  54. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/enums.py +0 -0
  55. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/errors.py +0 -0
  56. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_channel.py +0 -0
  57. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  60. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  61. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  62. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  63. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  64. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  66. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  67. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  68. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  69. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  70. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  73. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  74. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  75. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  76. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  78. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  79. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  80. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  81. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  82. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  83. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  84. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  87. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  88. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  89. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  90. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  93. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  94. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  96. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  97. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  100. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  101. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  102. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  103. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  106. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  107. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  108. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  109. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  111. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  112. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  113. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  114. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/config/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  116. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  117. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
  118. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  119. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  122. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  123. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  124. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  125. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  126. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  127. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  128. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  129. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  130. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  131. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  132. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/connectors/util.py +0 -0
  133. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchange_builder.py +0 -0
  134. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchange_channels.py +0 -0
  135. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchange_details.py +0 -0
  136. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchange_factory.py +0 -0
  137. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchange_manager.py +0 -0
  138. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  139. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/exchanges.py +0 -0
  140. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  141. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  142. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  143. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  144. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/traders/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  146. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/types/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  148. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  149. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/util/__init__.py +0 -0
  150. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  151. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  152. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  153. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  154. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/__init__.py +0 -0
  155. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  156. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/channel/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  158. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  159. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/channel/mode.py +0 -0
  160. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/mode_activity.py +0 -0
  161. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/mode_config.py +0 -0
  162. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/modes_factory.py +0 -0
  163. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/modes_util.py +0 -0
  164. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  167. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  168. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  169. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  170. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  171. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  172. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  173. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  174. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  175. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  176. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  177. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  178. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  179. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  180. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/octobot_channel_consumer.py +0 -0
  181. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/__init__.py +0 -0
  182. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/__init__.py +0 -0
  183. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  184. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py +0 -0
  185. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py +0 -0
  186. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py +0 -0
  187. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  188. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  189. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  190. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  191. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  192. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  193. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  194. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
  195. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  196. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  197. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/order_group.py +0 -0
  198. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  199. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  200. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  201. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  203. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  204. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  205. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  206. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  207. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/triggers/__init__.py +0 -0
  208. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/triggers/base_trigger.py +0 -0
  209. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/triggers/price_trigger.py +0 -0
  210. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  211. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  213. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  214. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  215. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  216. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  217. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  218. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  219. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  220. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  221. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  222. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  223. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  225. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  226. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  227. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  228. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  230. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  231. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  232. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  233. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  234. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  235. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  236. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  237. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  238. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  240. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  241. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  242. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  243. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  244. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  245. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  246. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/resolved_orders_portfolio_delta.py +0 -0
  247. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  248. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +0 -0
  249. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  250. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  251. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  252. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  253. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  254. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/__init__.py +0 -0
  255. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  257. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  258. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  259. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/position.py +0 -0
  260. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  261. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/position_state.py +0 -0
  262. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/position_util.py +0 -0
  263. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  264. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  266. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  267. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  268. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  269. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  271. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  272. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/state.py +0 -0
  273. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  276. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  277. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/trade.py +0 -0
  278. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  279. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  280. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  281. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  282. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  284. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  285. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  286. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  287. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  288. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  289. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  290. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  291. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/__init__.py +0 -0
  292. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/channel/__init__.py +0 -0
  293. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  294. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  295. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/channel/signal_producer.py +0 -0
  296. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/signal_creation.py +0 -0
  297. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  298. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/signals/util.py +0 -0
  299. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/abstract_storage.py +0 -0
  301. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/candles_storage.py +0 -0
  302. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/orders_storage.py +0 -0
  303. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/portfolio_storage.py +0 -0
  304. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/storage_manager.py +0 -0
  305. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/trades_storage.py +0 -0
  306. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/transactions_storage.py +0 -0
  307. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/storage/util.py +0 -0
  308. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/supervisors/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  310. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  311. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/config_util.py +0 -0
  313. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/initializable.py +0 -0
  314. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/initialization_util.py +0 -0
  315. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/simulator_updater_utils.py +0 -0
  316. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/test_tools/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  318. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  319. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  320. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  321. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/requirements.txt +0 -0
  322. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/setup.cfg +0 -0
  323. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/setup.py +0 -0
  324. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_channels.py +0 -0
  326. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_exchange.py +0 -0
  327. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_modes.py +0 -0
  328. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_orders.py +0 -0
  329. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_portfolio.py +0 -0
  330. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_profitability.py +0 -0
  331. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_symbol_data.py +0 -0
  332. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_trader.py +0 -0
  333. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/api/test_trades.py +0 -0
  334. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/cli/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/contracts/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  338. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  339. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/funding/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  341. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/kline/__init__.py +0 -0
  342. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  343. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/ohlcv/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  345. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  346. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/order_book/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  348. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/prices/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  350. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  351. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/recent_trades/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  353. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  354. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/ticker/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  356. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/connectors/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  360. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  361. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/connectors/test_util.py +0 -0
  362. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/implementations/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  364. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  365. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_abstract_exchange.py +0 -0
  366. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  367. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_exchange_builder.py +0 -0
  368. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_exchange_config_data.py +0 -0
  369. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_exchange_factory.py +0 -0
  370. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_exchange_manager.py +0 -0
  371. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_exchange_simulator.py +0 -0
  372. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/test_exchanges.py +0 -0
  373. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/traders/__init__.py +0 -0
  374. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/traders/test_trader.py +0 -0
  375. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/types/__init__.py +0 -0
  376. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  377. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/util/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  379. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/exchanges/util/test_exchange_util.py +0 -0
  380. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/__init__.py +0 -0
  381. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  384. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  385. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  386. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  387. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  389. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/test_abstract_mode_consumer.py +0 -0
  390. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/test_abstract_trading_mode.py +0 -0
  391. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/modes/test_modes_util.py +0 -0
  392. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/__init__.py +0 -0
  393. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py +0 -0
  396. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py +0 -0
  397. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py +0 -0
  398. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/groups/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  400. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  401. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  402. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
  403. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_order_state.py +0 -0
  404. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  405. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  406. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  407. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_order_adapter.py +0 -0
  408. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_order_factory.py +0 -0
  409. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_order_util.py +0 -0
  410. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_orders_manager.py +0 -0
  411. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  412. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  413. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  414. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  415. {OctoBot-Trading-2.4.205/tests/personal_data/orders/states → OctoBot-Trading-2.4.206/tests/personal_data/orders/triggers}/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/triggers/test_base_trigger.py +0 -0
  417. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/triggers/test_price_trigger.py +0 -0
  418. {OctoBot-Trading-2.4.205/tests/personal_data/orders/triggers → OctoBot-Trading-2.4.206/tests/personal_data/orders/types}/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  421. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  422. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  423. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  424. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  425. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  426. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  427. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/market/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  429. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  430. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  431. {OctoBot-Trading-2.4.205/tests/personal_data/orders/types → OctoBot-Trading-2.4.206/tests/personal_data/orders/types/trailing}/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  433. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  434. {OctoBot-Trading-2.4.205/tests/personal_data/orders/types/trailing → OctoBot-Trading-2.4.206/tests/personal_data/portfolios}/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.205/tests/personal_data/portfolios → OctoBot-Trading-2.4.206/tests/personal_data/portfolios/assets}/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  437. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  438. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  439. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/history/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  441. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  442. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_asset.py +0 -0
  443. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  444. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  445. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  446. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
  447. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  448. {OctoBot-Trading-2.4.205/tests/personal_data/portfolios/assets → OctoBot-Trading-2.4.206/tests/personal_data/portfolios/types}/__init__.py +0 -0
  449. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  450. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  451. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  452. {OctoBot-Trading-2.4.205/tests/personal_data/portfolios/types → OctoBot-Trading-2.4.206/tests/personal_data/positions}/__init__.py +0 -0
  453. {OctoBot-Trading-2.4.205/tests/personal_data/positions → OctoBot-Trading-2.4.206/tests/personal_data/positions/channel}/__init__.py +0 -0
  454. {OctoBot-Trading-2.4.205/tests/personal_data/positions/channel → OctoBot-Trading-2.4.206/tests/personal_data/positions/states}/__init__.py +0 -0
  455. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/positions/test_position.py +0 -0
  456. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/positions/test_position_factory.py +0 -0
  457. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/positions/test_positions_manager.py +0 -0
  458. {OctoBot-Trading-2.4.205/tests/personal_data/positions/states → OctoBot-Trading-2.4.206/tests/personal_data/positions/types}/__init__.py +0 -0
  459. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  460. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  461. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/trades/__init__.py +0 -0
  462. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/trades/test_trade_factory.py +0 -0
  463. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/trades/test_trade_manager.py +0 -0
  464. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  465. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/trades/test_trade_util.py +0 -0
  466. {OctoBot-Trading-2.4.205/tests/personal_data/positions/types → OctoBot-Trading-2.4.206/tests/personal_data/transactions}/__init__.py +0 -0
  467. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  468. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  469. {OctoBot-Trading-2.4.205/tests/personal_data/transactions → OctoBot-Trading-2.4.206/tests/signals}/__init__.py +0 -0
  470. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  471. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/signals/test_util.py +0 -0
  472. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/test_utils/__init__.py +0 -0
  473. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/test_utils/order_util.py +0 -0
  474. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/test_utils/random_numbers.py +0 -0
  475. {OctoBot-Trading-2.4.205/tests/signals → OctoBot-Trading-2.4.206/tests/util}/__init__.py +0 -0
  476. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests/util/test_config_util.py +0 -0
  477. {OctoBot-Trading-2.4.205/tests/util → OctoBot-Trading-2.4.206/tests_additional}/__init__.py +0 -0
  478. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/__init__.py +0 -0
  479. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  480. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  481. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  482. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_binance.py +0 -0
  483. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  484. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bingx.py +0 -0
  485. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  486. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bitget.py +0 -0
  487. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  488. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  489. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  490. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bitso.py +0 -0
  491. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  492. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bybit.py +0 -0
  493. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  494. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  495. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_coinex.py +0 -0
  496. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  497. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_gateio.py +0 -0
  498. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  499. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  500. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_htx.py +0 -0
  501. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
  502. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_kraken.py +0 -0
  503. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  504. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  505. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_mexc.py +0 -0
  506. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_ndax.py +0 -0
  507. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  508. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_okx.py +0 -0
  509. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  510. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_phemex.py +0 -0
  511. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  512. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_upbit.py +0 -0
  513. {OctoBot-Trading-2.4.205 → OctoBot-Trading-2.4.206}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,9 +4,14 @@ 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.206] - 2025-08-15
8
+ ### Updated
9
+ [SubPortfolio] forward locked assets in resolved subportfolios
10
+ [Portfolio] make available funds update more flexible
11
+
7
12
  ## [2.4.205] - 2025-08-07
8
13
  ### Updated
9
- [SubPortfolio] add filled/cancelled orders inferring enging
14
+ [SubPortfolio] add filled/cancelled orders inferring engine
10
15
 
11
16
  ## [2.4.204] - 2025-08-04
12
17
  ### Updated
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.205
3
+ Version: 2.4.206
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.205](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.206](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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.205
3
+ Version: 2.4.206
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.205](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.206](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.205](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.206](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.205" # major.minor.revision
18
+ VERSION = "2.4.206" # major.minor.revision
@@ -205,7 +205,7 @@ class Trader(util.Initializable):
205
205
  )
206
206
  else:
207
207
  # consider order as cancelled to release portfolio amounts
208
- self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.update_portfolio_available(
208
+ self.exchange_manager.exchange_personal_data.portfolio_manager.refresh_portfolio_available_from_order(
209
209
  order, is_new_order=False
210
210
  )
211
211
  updated_price = edited_stop_price if edited_price is None else edited_price
@@ -218,7 +218,7 @@ class Trader(util.Initializable):
218
218
  current_price=edited_current_price,
219
219
  )
220
220
  # consider order as new order to lock portfolio amounts
221
- self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.update_portfolio_available(
221
+ self.exchange_manager.exchange_personal_data.portfolio_manager.refresh_portfolio_available_from_order(
222
222
  order, is_new_order=True
223
223
  )
224
224
  # push order edit into orders channel as edit update
@@ -262,9 +262,22 @@ class Trader(util.Initializable):
262
262
  self.logger.debug(
263
263
  f"Successfully edited order on {self.exchange_manager.exchange_name}, new order values: {edited_order}"
264
264
  )
265
+ if not self.exchange_manager.exchange_personal_data.portfolio_manager.enable_portfolio_exchange_sync:
266
+ # consider order as cancelled to release portfolio amounts before locking the updated value
267
+ self.exchange_manager.exchange_personal_data.portfolio_manager.refresh_portfolio_available_from_order(
268
+ order, is_new_order=False
269
+ )
265
270
  changed = order.update_from_raw(edited_order)
266
271
  # update portfolio from exchange
267
- await self.exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order(order)
272
+ if self.exchange_manager.exchange_personal_data.portfolio_manager.enable_portfolio_exchange_sync:
273
+ await self.exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order(
274
+ order, require_exchange_update=True
275
+ )
276
+ else:
277
+ # consider order as cancelled to release portfolio amounts before locking the updated value
278
+ self.exchange_manager.exchange_personal_data.portfolio_manager.refresh_portfolio_available_from_order(
279
+ order, is_new_order=True
280
+ )
268
281
  return changed
269
282
 
270
283
  async def _create_new_order(
@@ -242,6 +242,12 @@ class ExchangePersonalData(util.Initializable):
242
242
  await self.handle_order_update_notification(order, update_type)
243
243
  return order.state is not None
244
244
 
245
+ def on_completed_orders_fetch(self):
246
+ # store the fact that all orders have been fetched from exchange
247
+ self.orders_manager.are_exchange_orders_initialized = True
248
+ # available funds can now be updated from fetched open orders
249
+ self.portfolio_manager.enable_portfolio_available_update_from_order = True
250
+
245
251
  def _is_out_of_sync_order(self, exchange_order_id) -> bool:
246
252
  return self.trades_manager.has_closing_trade_with_exchange_order_id(exchange_order_id)
247
253
 
@@ -106,7 +106,7 @@ class OrdersUpdater(orders_channel.OrdersProducer):
106
106
  retry_till_success=retry_till_success)
107
107
  finally:
108
108
  if self.channel is not None:
109
- self.channel.exchange_manager.exchange_personal_data.orders_manager.are_exchange_orders_initialized = True
109
+ self.channel.exchange_manager.exchange_personal_data.on_completed_orders_fetch()
110
110
  await asyncio.sleep(self.TIME_BETWEEN_ORDERS_REFRESH)
111
111
  try:
112
112
  # can raise, closed orders are not critical data
@@ -22,7 +22,8 @@ import octobot_trading.personal_data.orders.channel.orders_updater as orders_upd
22
22
 
23
23
  class OrdersUpdaterSimulator(orders_updater.OrdersUpdater):
24
24
  async def start(self):
25
- self.channel.exchange_manager.exchange_personal_data.orders_manager.are_exchange_orders_initialized = True
25
+ # on simulator, orders are fetched from the start
26
+ self.channel.exchange_manager.exchange_personal_data.on_completed_orders_fetch()
26
27
  await exchange_channel.get_chan(constants.RECENT_TRADES_CHANNEL, self.channel.exchange_manager.id) \
27
28
  .new_consumer(self.ignore_recent_trades_update)
28
29
  for symbol in self.channel.exchange_manager.exchange_config.traded_symbol_pairs:
@@ -544,17 +544,23 @@ class Order(util.Initializable):
544
544
  f"when creating active order from inactive order: {self}"
545
545
  )
546
546
 
547
- async def on_pending_creation(self, is_from_exchange_data=False, enable_associated_orders_creation=True):
547
+ async def on_pending_creation(self, is_from_exchange_data=False, enable_associated_orders_creation=True,
548
+ is_already_counted_in_available_funds=False
549
+ ):
548
550
  with self.order_state_creation():
549
551
  state_class = orders_states.PendingCreationChainedOrderState if self.is_waiting_for_chained_trigger \
550
552
  else orders_states.PendingCreationOrderState
551
553
  self.state = state_class(
552
554
  self, is_from_exchange_data=is_from_exchange_data,
553
- enable_associated_orders_creation=enable_associated_orders_creation
555
+ enable_associated_orders_creation=enable_associated_orders_creation,
556
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
554
557
  )
555
558
  await self.state.initialize()
556
559
 
557
- async def on_open(self, force_open=False, is_from_exchange_data=False, enable_associated_orders_creation=True):
560
+ async def on_open(
561
+ self, force_open=False, is_from_exchange_data=False, enable_associated_orders_creation=True,
562
+ is_already_counted_in_available_funds=False
563
+ ):
558
564
  with self.order_state_creation():
559
565
  if isinstance(self.state, orders_states.PendingCreationOrderState):
560
566
  await self.state.trigger_terminate()
@@ -566,11 +572,15 @@ class Order(util.Initializable):
566
572
  return
567
573
  self.state = orders_states.OpenOrderState(
568
574
  self, is_from_exchange_data=is_from_exchange_data,
569
- enable_associated_orders_creation=enable_associated_orders_creation
575
+ enable_associated_orders_creation=enable_associated_orders_creation,
576
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
570
577
  )
571
578
  await self.state.initialize(forced=force_open)
572
579
 
573
- async def on_fill(self, force_fill=False, is_from_exchange_data=False, enable_associated_orders_creation=None):
580
+ async def on_fill(
581
+ self, force_fill=False, is_from_exchange_data=False, enable_associated_orders_creation=None,
582
+ is_already_counted_in_available_funds=False
583
+ ):
574
584
  enable_associated_orders_creation = self.state.enable_associated_orders_creation \
575
585
  if (self.state and enable_associated_orders_creation is None) \
576
586
  else (True if enable_associated_orders_creation is None else enable_associated_orders_creation)
@@ -581,7 +591,8 @@ class Order(util.Initializable):
581
591
  with self.order_state_creation():
582
592
  self.state = orders_states.FillOrderState(
583
593
  self, is_from_exchange_data=is_from_exchange_data,
584
- enable_associated_orders_creation=enable_associated_orders_creation
594
+ enable_associated_orders_creation=enable_associated_orders_creation,
595
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
585
596
  )
586
597
  await self.state.initialize(forced=force_fill)
587
598
  else:
@@ -589,20 +600,23 @@ class Order(util.Initializable):
589
600
  f"or canceled order: "
590
601
  f"ignored fill call for {self}")
591
602
 
592
- async def on_close(self, force_close=False, is_from_exchange_data=False, enable_associated_orders_creation=None):
603
+ async def on_close(self, force_close=False, is_from_exchange_data=False, enable_associated_orders_creation=None,
604
+ is_already_counted_in_available_funds=False
605
+ ):
593
606
  enable_associated_orders_creation = self.state.enable_associated_orders_creation \
594
607
  if (self.state and enable_associated_orders_creation is None) \
595
608
  else (True if enable_associated_orders_creation is None else enable_associated_orders_creation)
596
609
  with self.order_state_creation():
597
610
  self.state = orders_states.CloseOrderState(
598
611
  self, is_from_exchange_data=is_from_exchange_data,
599
- enable_associated_orders_creation=enable_associated_orders_creation
612
+ enable_associated_orders_creation=enable_associated_orders_creation,
613
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
600
614
  )
601
615
  await self.state.initialize(forced=force_close)
602
616
 
603
617
  async def on_cancel(
604
618
  self, is_from_exchange_data=False, force_cancel=False, enable_associated_orders_creation=None,
605
- ignored_order=None
619
+ ignored_order=None, is_already_counted_in_available_funds=False
606
620
  ):
607
621
  enable_associated_orders_creation = self.state.enable_associated_orders_creation \
608
622
  if (self.state and enable_associated_orders_creation is None) \
@@ -610,7 +624,8 @@ class Order(util.Initializable):
610
624
  with self.order_state_creation():
611
625
  self.state = orders_states.CancelOrderState(
612
626
  self, is_from_exchange_data=is_from_exchange_data,
613
- enable_associated_orders_creation=enable_associated_orders_creation
627
+ enable_associated_orders_creation=enable_associated_orders_creation,
628
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
614
629
  )
615
630
  await self.state.initialize(forced=force_cancel, ignored_order=ignored_order)
616
631
 
@@ -828,7 +843,9 @@ class Order(util.Initializable):
828
843
  def generate_executed_time(self):
829
844
  return self.exchange_manager.exchange.get_exchange_current_time()
830
845
 
831
- def is_counted_in_available_funds(self):
846
+ def is_counted_in_available_funds(self) -> bool:
847
+ if self.state and self.state.is_already_counted_in_available_funds:
848
+ return False
832
849
  if self.is_active:
833
850
  if self.trader.simulate or (
834
851
  self.reduce_only and self.exchange_manager and self.exchange_manager.is_future
@@ -27,7 +27,9 @@ import octobot_trading.personal_data.state as state_class
27
27
  class OrderState(state_class.State):
28
28
  MAX_SYNCHRONIZATION_ATTEMPTS = -1 # implement self._force_final_state() when this is enabled
29
29
 
30
- def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
30
+ def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True,
31
+ is_already_counted_in_available_funds=False
32
+ ):
31
33
  super().__init__(is_from_exchange_data)
32
34
 
33
35
  # ensure order has not been cleared
@@ -37,6 +39,7 @@ class OrderState(state_class.State):
37
39
  self.order = order
38
40
 
39
41
  self.enable_associated_orders_creation = enable_associated_orders_creation
42
+ self.is_already_counted_in_available_funds = is_already_counted_in_available_funds
40
43
 
41
44
  def is_created(self) -> bool:
42
45
  """
@@ -424,6 +424,9 @@ def get_orders_locked_amounts_by_asset(open_orders: list[order_import.Order]) ->
424
424
  return {}
425
425
  locked_funds_by_asset = {}
426
426
  for order in open_orders:
427
+ if not order.is_active:
428
+ # don't count inactive orders in locked funds
429
+ continue
427
430
  base, quote = symbol_util.parse_symbol(order.symbol).base_and_quote()
428
431
  # use get_order_locked_amount just like trader simulator to ensure locked funds integrity
429
432
  if order.side == enums.TradeOrderSide.BUY:
@@ -85,7 +85,7 @@ class OrdersManager(util.Initializable):
85
85
  until=until, limit=limit, tag=tag
86
86
  )
87
87
 
88
- def get_order(self, order_id, exchange_order_id=None):
88
+ def get_order(self, order_id: typing.Optional[str], exchange_order_id: typing.Optional[str]=None) -> order_class.Order:
89
89
  if order_id is None:
90
90
  for order in self.orders.values():
91
91
  if order.exchange_order_id == exchange_order_id:
@@ -93,7 +93,7 @@ class OrdersManager(util.Initializable):
93
93
  raise KeyError(exchange_order_id)
94
94
  return self.orders[order_id]
95
95
 
96
- def get_order_from_group(self, group_name):
96
+ def get_order_from_group(self, group_name: str) -> list[order_class.Order]:
97
97
  return [
98
98
  order
99
99
  for order in self.orders.values()
@@ -101,7 +101,7 @@ class OrdersManager(util.Initializable):
101
101
  ]
102
102
 
103
103
  def get_or_create_group(
104
- self, group_type, group_name,
104
+ self, group_type: type[order_group_import.OrderGroup], group_name: str,
105
105
  active_order_swap_strategy: typing.Optional[active_order_swap_strategy_import.ActiveOrderSwapStrategy] = None
106
106
  ):
107
107
  """
@@ -123,7 +123,7 @@ class OrdersManager(util.Initializable):
123
123
  )
124
124
 
125
125
  def create_group(
126
- self, group_type, group_name=None,
126
+ self, group_type: type[order_group_import.OrderGroup], group_name: typing.Optional[str]=None,
127
127
  active_order_swap_strategy: typing.Optional[active_order_swap_strategy_import.ActiveOrderSwapStrategy] = None
128
128
  ):
129
129
  """
@@ -139,7 +139,7 @@ class OrdersManager(util.Initializable):
139
139
  self.order_groups[group_name] = group
140
140
  return group
141
141
 
142
- async def upsert_order_from_raw(self, exchange_order_id, raw_order, is_from_exchange) -> (bool, order_class.Order):
142
+ async def upsert_order_from_raw(self, exchange_order_id: str, raw_order: dict, is_from_exchange: bool) -> tuple[bool, order_class.Order]:
143
143
  if not self.has_order(None, exchange_order_id=exchange_order_id):
144
144
  self.logger.info(f"Including new order fetched from exchange: {raw_order}")
145
145
  new_order = order_factory.create_order_instance_from_raw(self.trader, raw_order)
@@ -154,7 +154,7 @@ class OrdersManager(util.Initializable):
154
154
  order = self.get_order(None, exchange_order_id=exchange_order_id)
155
155
  return await _update_order_from_raw(order, raw_order), order
156
156
 
157
- def register_pending_creation_order(self, pending_order):
157
+ def register_pending_creation_order(self, pending_order: order_class.Order):
158
158
  if self.trader.simulate:
159
159
  self.logger.error(f"Called register_pending_creation_order on an simulated trader, "
160
160
  f"this should not happen. Order: {pending_order}")
@@ -25,9 +25,12 @@ import octobot_trading.personal_data.orders.states.order_state_factory as order_
25
25
  class CancelOrderState(order_state.OrderState):
26
26
  MAX_SYNCHRONIZATION_ATTEMPTS = 5
27
27
 
28
- def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
28
+ def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True,
29
+ is_already_counted_in_available_funds=False
30
+ ):
29
31
  super().__init__(
30
- order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
32
+ order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation,
33
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
31
34
  )
32
35
  self.state = enums.OrderStates.CANCELING \
33
36
  if ((not self.order.simulated and not self.is_status_cancelled()) or self.is_status_pending()) \
@@ -19,9 +19,12 @@ import octobot_trading.personal_data.orders.order_state as order_state
19
19
 
20
20
 
21
21
  class CloseOrderState(order_state.OrderState):
22
- def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True, force_close=True):
22
+ def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True,
23
+ is_already_counted_in_available_funds=False, force_close=True
24
+ ):
23
25
  super().__init__(
24
- order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
26
+ order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation,
27
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
25
28
  )
26
29
  self.state = enums.States.CLOSED if is_from_exchange_data or force_close or self.order.simulated \
27
30
  else enums.States.CLOSING
@@ -25,9 +25,12 @@ import octobot_trading.personal_data.orders.states.order_state_factory as order_
25
25
  class FillOrderState(order_state.OrderState):
26
26
  MAX_SYNCHRONIZATION_ATTEMPTS = 5
27
27
 
28
- def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
28
+ def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True,
29
+ is_already_counted_in_available_funds=False
30
+ ) :
29
31
  super().__init__(
30
- order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
32
+ order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation,
33
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
31
34
  )
32
35
  self.state = enums.OrderStates.FILLING \
33
36
  if ((
@@ -21,9 +21,12 @@ import octobot_trading.personal_data.orders.states.order_state_factory as order_
21
21
 
22
22
 
23
23
  class OpenOrderState(order_state.OrderState):
24
- def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
24
+ def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True,
25
+ is_already_counted_in_available_funds=False
26
+ ):
25
27
  super().__init__(
26
- order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
28
+ order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation,
29
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
27
30
  )
28
31
  self.state = enums.States.OPEN if \
29
32
  is_from_exchange_data \
@@ -45,15 +48,18 @@ class OpenOrderState(order_state.OrderState):
45
48
  if forced:
46
49
  self.state = enums.States.OPEN
47
50
 
48
- if self.order.exchange_manager.exchange_personal_data.orders_manager.are_exchange_orders_initialized:
51
+ if (
52
+ self.order.exchange_manager.exchange_personal_data.orders_manager.are_exchange_orders_initialized
53
+ or self.order.exchange_manager.exchange_personal_data.portfolio_manager.enable_portfolio_available_update_from_order
54
+ ):
49
55
  # update the availability of the currency in the portfolio if order is not
50
56
  # from exchange initialization (otherwise it's already taken into account in portfolio)
51
- portfolio = self.order.exchange_manager.exchange_personal_data.portfolio_manager.portfolio
52
- before_order_details = str(portfolio)
53
- portfolio.update_portfolio_available(self.order, is_new_order=True)
57
+ portfolio_manager = self.order.exchange_manager.exchange_personal_data.portfolio_manager
58
+ before_order_details = str(portfolio_manager.portfolio)
59
+ portfolio_manager.refresh_portfolio_available_from_order(self.order, True)
54
60
  self.get_logger().debug(
55
61
  f"Updated portfolio available after new open order. "
56
- f"Before order: {before_order_details}. After order: {portfolio}"
62
+ f"Before order: {before_order_details}. After order: {portfolio_manager.portfolio}"
57
63
  )
58
64
 
59
65
  return await super().initialize_impl()
@@ -18,28 +18,35 @@ import octobot_trading.constants as constants
18
18
 
19
19
 
20
20
  async def create_order_state(
21
- order, is_from_exchange_data=False, enable_associated_orders_creation=True, ignore_states=None
21
+ order, is_from_exchange_data=False, enable_associated_orders_creation=True,
22
+ is_already_counted_in_available_funds=False, ignore_states=None
22
23
  ):
23
24
  if ignore_states is None:
24
25
  ignore_states = []
25
26
 
26
27
  if order.status is enums.OrderStatus.PENDING_CREATION \
27
28
  and enums.States.PENDING_CREATION not in ignore_states:
28
- await order.on_pending_creation(enable_associated_orders_creation=enable_associated_orders_creation)
29
+ await order.on_pending_creation(
30
+ enable_associated_orders_creation=enable_associated_orders_creation,
31
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
32
+ )
29
33
  elif order.status is enums.OrderStatus.OPEN and enums.States.OPEN not in ignore_states:
30
34
  await order.on_open(
31
35
  force_open=False, is_from_exchange_data=is_from_exchange_data,
32
- enable_associated_orders_creation=enable_associated_orders_creation
36
+ enable_associated_orders_creation=enable_associated_orders_creation,
37
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
33
38
  )
34
39
  elif order.status in constants.FILL_ORDER_STATUS_SCOPE \
35
40
  and enums.OrderStates.FILLED not in ignore_states \
36
41
  and enums.States.CLOSED not in ignore_states:
37
42
  await order.on_fill(
38
43
  force_fill=False, is_from_exchange_data=is_from_exchange_data,
39
- enable_associated_orders_creation=enable_associated_orders_creation
44
+ enable_associated_orders_creation=enable_associated_orders_creation,
45
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
40
46
  )
41
47
  elif order.status in constants.CANCEL_ORDER_STATUS_SCOPE and enums.OrderStates.CANCELED not in ignore_states:
42
48
  await order.on_cancel(
43
49
  force_cancel=False, is_from_exchange_data=is_from_exchange_data,
44
- enable_associated_orders_creation=enable_associated_orders_creation
50
+ enable_associated_orders_creation=enable_associated_orders_creation,
51
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
45
52
  )
@@ -25,9 +25,12 @@ import octobot_trading.personal_data.orders.order_state as order_state
25
25
 
26
26
  class PendingCreationOrderState(order_state.OrderState):
27
27
 
28
- def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
28
+ def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True,
29
+ is_already_counted_in_available_funds=False
30
+ ):
29
31
  super().__init__(
30
- order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
32
+ order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation,
33
+ is_already_counted_in_available_funds=is_already_counted_in_available_funds
31
34
  )
32
35
  self.state = enums.States.PENDING_CREATION
33
36
 
@@ -50,7 +50,9 @@ class PortfolioManager(util.Initializable):
50
50
  self.reference_market = None
51
51
  self._is_initialized_event_set = False
52
52
  self._forced_portfolio = None
53
- self._enable_portfolio_update_from_order = True
53
+ self._enable_portfolio_total_update_from_order = True
54
+ self.enable_portfolio_exchange_sync = True
55
+ self.enable_portfolio_available_update_from_order = self.trader.simulate
54
56
 
55
57
  async def initialize_impl(self):
56
58
  """
@@ -91,7 +93,10 @@ class PortfolioManager(util.Initializable):
91
93
  portfolio changes using order data (as in trading simulator)
92
94
  :return: True if the portfolio was updated
93
95
  """
94
- if self.trader.is_enabled and self._enable_portfolio_update_from_order:
96
+ if self.trader.is_enabled:
97
+ if not self.enable_portfolio_exchange_sync:
98
+ return self._refresh_simulated_trader_portfolio_from_order(order)
99
+
95
100
  async with self.portfolio_history_update():
96
101
  if (self.trader.simulate or not order.is_active) or not require_exchange_update:
97
102
  return self._refresh_simulated_trader_portfolio_from_order(order)
@@ -244,15 +249,21 @@ class PortfolioManager(util.Initializable):
244
249
  update_origin_crypto_currencies_values(symbol, mark_price))
245
250
 
246
251
  @contextlib.contextmanager
247
- def disabled_portfolio_update_from_order(self):
252
+ def disabled_portfolio_update_from_order(self, enable_available_funds_update: bool = True):
248
253
  """
249
- Can be used to locally disable portfolio refresh when an order is updated
254
+ Can be used to locally disable portfolio available/total refresh or sync when an order is updated
250
255
  """
251
- self._enable_portfolio_update_from_order = False
256
+ previous_enable_portfolio_available_update_from_order = self.enable_portfolio_available_update_from_order
257
+ previous_enable_portfolio_exchange_sync = self.enable_portfolio_exchange_sync
258
+ self._enable_portfolio_total_update_from_order = False
259
+ self.enable_portfolio_available_update_from_order = enable_available_funds_update
260
+ self.enable_portfolio_exchange_sync = False
252
261
  try:
253
262
  yield
254
263
  finally:
255
- self._enable_portfolio_update_from_order = True
264
+ self._enable_portfolio_total_update_from_order = True
265
+ self.enable_portfolio_available_update_from_order = previous_enable_portfolio_available_update_from_order
266
+ self.enable_portfolio_exchange_sync = previous_enable_portfolio_exchange_sync
256
267
 
257
268
  async def _refresh_real_trader_portfolio(self) -> bool:
258
269
  """
@@ -304,10 +315,11 @@ class PortfolioManager(util.Initializable):
304
315
  """
305
316
  try:
306
317
  if order.is_filled():
307
- self.portfolio.update_portfolio_from_filled_order(order)
318
+ if self._enable_portfolio_total_update_from_order:
319
+ self.portfolio.update_portfolio_from_filled_order(order)
308
320
  else:
309
321
  # order cancelled
310
- self.portfolio.update_portfolio_available(order, is_new_order=False)
322
+ self.refresh_portfolio_available_from_order(order, is_new_order=False)
311
323
  return True
312
324
  except errors.PortfolioNegativeValueError as portfolio_negative_value_error:
313
325
  self.logger.exception(portfolio_negative_value_error, True,
@@ -315,6 +327,15 @@ class PortfolioManager(util.Initializable):
315
327
  f"for order {order.to_dict()}")
316
328
  return False
317
329
 
330
+ def refresh_portfolio_available_from_order(self, order, is_new_order):
331
+ """
332
+ Refresh portfolio available from an order
333
+ :param order: the order to take into account
334
+ :param is_new_order: True if this is a newly opened order, false if it is a cancelled order
335
+ """
336
+ if self.enable_portfolio_available_update_from_order:
337
+ self.portfolio.update_portfolio_available(order, is_new_order=is_new_order)
338
+
318
339
  def _load_portfolio(self, reset_from_config):
319
340
  """
320
341
  Load simulated portfolio from config if required
@@ -303,6 +303,7 @@ def _resolve_sub_portfolio(
303
303
  sub_portfolio.unit,
304
304
  funds_deltas=funds_deltas,
305
305
  missing_funds=missing_funds,
306
+ locked_funds_by_asset=sub_portfolio.locked_funds_by_asset,
306
307
  )
307
308
 
308
309
 
@@ -0,0 +1,74 @@
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 mock
17
+ import octobot_trading.enums as enums
18
+ import typing
19
+
20
+
21
+ async def inner_test_initialize_without_kwargs(order, status: enums.OrderStatus, mocked_method_name: typing.Optional[str]):
22
+ order.status = status
23
+ order.exchange_manager.is_backtesting = True
24
+ pre_call_states = []
25
+ if mocked_method_name is not None:
26
+ async def _side_effect(*args, **kwargs):
27
+ pre_call_states.append(order.state)
28
+ return await origin_method(*args, **kwargs)
29
+
30
+ origin_method = getattr(order, mocked_method_name)
31
+ with mock.patch.object(order, mocked_method_name, mock.AsyncMock(side_effect=_side_effect)) as method_mock:
32
+ await order.initialize()
33
+ method_mock.assert_awaited_once()
34
+ else:
35
+ await order.initialize()
36
+ pre_call_states.append(order.state)
37
+ pre_call_state = pre_call_states[0]
38
+ assert pre_call_state.is_from_exchange_data is False
39
+ assert pre_call_state.enable_associated_orders_creation is True
40
+ assert pre_call_state.is_already_counted_in_available_funds is False
41
+ order.clear()
42
+
43
+
44
+ async def inner_test_initialize_with_kwargs(
45
+ order, status: enums.OrderStatus,
46
+ mocked_method_name: typing.Optional[str],
47
+ expected_is_from_exchange_data: bool = True
48
+ ):
49
+ order.status = status
50
+ order.exchange_manager.is_backtesting = True
51
+ pre_call_states = []
52
+ if mocked_method_name is not None:
53
+ async def _side_effect(*args, **kwargs):
54
+ pre_call_states.append(order.state)
55
+ return await origin_method(*args, **kwargs)
56
+
57
+ origin_method = getattr(order, mocked_method_name)
58
+ with mock.patch.object(order, mocked_method_name, mock.AsyncMock(side_effect=_side_effect)) as method_mock:
59
+ await order.initialize(
60
+ is_from_exchange_data=True, enable_associated_orders_creation=False,
61
+ is_already_counted_in_available_funds=True
62
+ )
63
+ method_mock.assert_awaited_once()
64
+ else:
65
+ await order.initialize(
66
+ is_from_exchange_data=True, enable_associated_orders_creation=False,
67
+ is_already_counted_in_available_funds=True
68
+ )
69
+ pre_call_states.append(order.state)
70
+ pre_call_state = pre_call_states[0]
71
+ assert pre_call_state.is_from_exchange_data is expected_is_from_exchange_data
72
+ assert pre_call_state.enable_associated_orders_creation is False
73
+ assert pre_call_state.is_already_counted_in_available_funds is True
74
+ order.clear()