OctoBot-Trading 2.4.183__tar.gz → 2.4.184__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 (509) hide show
  1. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/CHANGELOG.md +4 -0
  2. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.183/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.184}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/README.md +1 -1
  5. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +2 -1
  7. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/trader.py +28 -15
  8. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/orders.py +1 -1
  9. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/orders_updater.py +1 -1
  10. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order.py +9 -0
  11. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_abstract_mode_consumer.py +149 -2
  12. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/LICENSE +0 -0
  13. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/MANIFEST.in +0 -0
  14. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  15. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  16. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  17. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/requires.txt +0 -0
  18. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  19. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/__init__.py +0 -0
  20. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/channels.py +0 -0
  21. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/contracts.py +0 -0
  22. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/exchange.py +0 -0
  23. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/modes.py +0 -0
  24. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/orders.py +0 -0
  25. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/portfolio.py +0 -0
  26. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/positions.py +0 -0
  27. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/profitability.py +0 -0
  28. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/storage.py +0 -0
  29. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/symbol_data.py +0 -0
  30. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/trader.py +0 -0
  31. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/trades.py +0 -0
  32. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/constants.py +0 -0
  33. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/enums.py +0 -0
  34. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/errors.py +0 -0
  35. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_channel.py +0 -0
  36. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/__init__.py +0 -0
  37. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  38. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  39. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  40. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  41. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  42. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  43. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  44. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  46. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  47. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  48. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  49. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  50. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  51. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  52. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  53. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  54. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  55. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  57. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  58. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  60. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  61. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  62. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  63. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  66. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  67. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  68. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  69. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  72. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  73. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  75. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  76. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  79. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  80. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  81. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  84. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  85. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  86. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  87. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  89. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  90. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  92. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  94. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  95. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
  96. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  97. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  100. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  101. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  102. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  103. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  104. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  105. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  106. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  107. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  108. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  109. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  110. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_builder.py +0 -0
  111. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_channels.py +0 -0
  112. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_details.py +0 -0
  113. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_factory.py +0 -0
  114. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_manager.py +0 -0
  115. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  116. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchanges.py +0 -0
  117. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  118. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  119. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  120. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  121. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  123. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/types/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  126. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  128. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  129. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  130. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  131. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  133. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  135. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  136. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/mode.py +0 -0
  137. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/mode_activity.py +0 -0
  138. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/mode_config.py +0 -0
  139. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/modes_factory.py +0 -0
  140. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/modes_util.py +0 -0
  141. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  144. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  145. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  146. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  147. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  148. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  149. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  150. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  151. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  152. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  154. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  155. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  157. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/octobot_channel_consumer.py +0 -0
  158. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  160. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py +0 -0
  163. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py +0 -0
  164. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py +0 -0
  165. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  167. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  168. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  170. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  171. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  172. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
  173. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  175. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_state.py +0 -0
  177. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_util.py +0 -0
  178. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  179. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  180. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  186. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  187. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  190. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  191. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  192. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  193. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  194. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/triggers/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/triggers/base_trigger.py +0 -0
  196. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/triggers/price_trigger.py +0 -0
  197. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  199. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  201. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  202. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  204. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  205. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  206. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  207. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  208. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  209. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  210. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  211. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  212. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  213. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  214. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  215. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  216. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  217. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  218. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  219. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  220. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  221. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  222. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  223. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  224. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  225. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  226. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  227. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  228. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  229. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  230. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  231. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  232. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  233. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  234. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  235. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  236. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +0 -0
  237. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  239. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  240. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  241. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  242. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/__init__.py +0 -0
  243. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  245. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  246. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  247. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position.py +0 -0
  248. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  249. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position_state.py +0 -0
  250. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position_util.py +0 -0
  251. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  252. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  254. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  255. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  256. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  257. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  259. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  260. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/state.py +0 -0
  261. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/__init__.py +0 -0
  262. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  264. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  265. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trade.py +0 -0
  266. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  267. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  268. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  269. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  270. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  271. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  272. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  273. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  274. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  276. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  277. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  278. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  279. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/__init__.py +0 -0
  280. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/__init__.py +0 -0
  281. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  282. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  283. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/signal_producer.py +0 -0
  284. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/signal_creation.py +0 -0
  285. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  286. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/util.py +0 -0
  287. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/abstract_storage.py +0 -0
  289. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/candles_storage.py +0 -0
  290. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/orders_storage.py +0 -0
  291. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/portfolio_storage.py +0 -0
  292. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/storage_manager.py +0 -0
  293. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/trades_storage.py +0 -0
  294. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/transactions_storage.py +0 -0
  295. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/util.py +0 -0
  296. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/supervisors/__init__.py +0 -0
  297. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  298. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  299. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/config_util.py +0 -0
  301. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/initializable.py +0 -0
  302. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/initialization_util.py +0 -0
  303. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/simulator_updater_utils.py +0 -0
  304. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/__init__.py +0 -0
  305. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  306. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  307. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  308. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  309. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/requirements.txt +0 -0
  310. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/setup.cfg +0 -0
  311. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/setup.py +0 -0
  312. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_channels.py +0 -0
  314. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_exchange.py +0 -0
  315. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_modes.py +0 -0
  316. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_orders.py +0 -0
  317. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_portfolio.py +0 -0
  318. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_profitability.py +0 -0
  319. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_symbol_data.py +0 -0
  320. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_trader.py +0 -0
  321. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_trades.py +0 -0
  322. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/cli/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/contracts/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  326. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  327. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/funding/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  329. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/kline/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  331. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ohlcv/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  333. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  334. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/order_book/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  336. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/prices/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  338. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  339. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/recent_trades/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  341. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  342. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ticker/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  344. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  348. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  349. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/implementations/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  352. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_abstract_exchange.py +0 -0
  353. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  354. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_builder.py +0 -0
  355. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_config_data.py +0 -0
  356. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_factory.py +0 -0
  357. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_manager.py +0 -0
  358. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_simulator.py +0 -0
  359. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchanges.py +0 -0
  360. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/traders/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/traders/test_trader.py +0 -0
  362. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/types/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  364. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/util/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  366. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/util/test_exchange_util.py +0 -0
  367. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  371. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  372. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  373. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  374. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  375. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  376. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_abstract_trading_mode.py +0 -0
  377. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_modes_util.py +0 -0
  378. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/__init__.py +0 -0
  379. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/__init__.py +0 -0
  380. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  381. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py +0 -0
  382. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py +0 -0
  383. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py +0 -0
  384. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  386. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  387. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  388. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
  389. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  391. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  392. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  393. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  394. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_order_state.py +0 -0
  395. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  396. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  397. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  398. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  399. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  400. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order.py +0 -0
  401. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order_adapter.py +0 -0
  402. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order_factory.py +0 -0
  403. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order_util.py +0 -0
  404. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_orders_manager.py +0 -0
  405. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  406. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  408. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  409. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/triggers/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/triggers/test_base_trigger.py +0 -0
  411. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/triggers/test_price_trigger.py +0 -0
  412. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/__init__.py +0 -0
  413. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  414. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  415. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  416. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  417. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  418. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  419. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  420. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  421. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/market/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  423. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  424. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  425. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  427. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  428. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  431. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  432. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  433. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/history/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  435. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  436. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_asset.py +0 -0
  437. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  438. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  439. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  440. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_util.py +0 -0
  441. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  442. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
  443. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  444. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  446. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  447. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  448. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/__init__.py +0 -0
  449. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/channel/__init__.py +0 -0
  450. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/states/__init__.py +0 -0
  451. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/test_position.py +0 -0
  452. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/test_position_factory.py +0 -0
  453. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/test_positions_manager.py +0 -0
  454. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/types/__init__.py +0 -0
  455. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  456. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  457. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/__init__.py +0 -0
  458. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_factory.py +0 -0
  459. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_manager.py +0 -0
  460. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  461. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_util.py +0 -0
  462. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/transactions/__init__.py +0 -0
  463. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  464. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  465. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/signals/__init__.py +0 -0
  466. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  467. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/signals/test_util.py +0 -0
  468. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/test_utils/__init__.py +0 -0
  469. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/test_utils/order_util.py +0 -0
  470. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/test_utils/random_numbers.py +0 -0
  471. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/util/__init__.py +0 -0
  472. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/util/test_config_util.py +0 -0
  473. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/__init__.py +0 -0
  474. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/__init__.py +0 -0
  475. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  476. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  477. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  478. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_binance.py +0 -0
  479. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  480. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bingx.py +0 -0
  481. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  482. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitget.py +0 -0
  483. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  484. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  485. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  486. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitso.py +0 -0
  487. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  488. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bybit.py +0 -0
  489. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  490. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  491. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_coinex.py +0 -0
  492. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  493. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_gateio.py +0 -0
  494. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  495. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  496. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_htx.py +0 -0
  497. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
  498. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_kraken.py +0 -0
  499. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  500. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  501. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_mexc.py +0 -0
  502. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_ndax.py +0 -0
  503. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  504. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_okx.py +0 -0
  505. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  506. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_phemex.py +0 -0
  507. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  508. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_upbit.py +0 -0
  509. {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.4.184] - 2025-06-04
8
+ ### Fixed
9
+ [Order Cancel] fix deadlock
10
+
7
11
  ## [2.4.183] - 2025-06-01
8
12
  ### Fixed
9
13
  [Exchanges] fix edit_order
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.183
3
+ Version: 2.4.184
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.183](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.184](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.183
3
+ Version: 2.4.184
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.183](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.184](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.183](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.184](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.183" # major.minor.revision
18
+ VERSION = "2.4.184" # major.minor.revision
@@ -34,6 +34,7 @@ class RecentTradeUpdater(recent_trade_channel.RecentTradeProducer):
34
34
  self.refresh_time = RecentTradeUpdater.RECENT_TRADE_REFRESH_TIME
35
35
 
36
36
  async def init_recent_trades(self):
37
+ pair = None
37
38
  try:
38
39
  for pair in self.channel.exchange_manager.exchange_config.traded_symbol_pairs:
39
40
  recent_trades = await self.channel.exchange_manager.exchange.\
@@ -45,7 +46,7 @@ class RecentTradeUpdater(recent_trade_channel.RecentTradeProducer):
45
46
  self.logger.exception(
46
47
  e,
47
48
  True,
48
- f"Fail to initialize recent trades : {html_util.get_html_summary_if_relevant(e)}"
49
+ f"Fail to initialize {pair} recent trades : {html_util.get_html_summary_if_relevant(e)}"
49
50
  )
50
51
 
51
52
  async def start(self):
@@ -465,6 +465,7 @@ class Trader(util.Initializable):
465
465
  order.is_waiting_for_chained_trigger = False
466
466
  return success
467
467
  order_status = None
468
+ is_order_refreshing = False
468
469
  # if real order: cancel on exchange
469
470
  if not self.simulate and order.is_active and not order.is_self_managed():
470
471
  try:
@@ -496,6 +497,7 @@ class Trader(util.Initializable):
496
497
  except Exception as err:
497
498
  self.logger.exception(err, True, f"Failed to cancel order {order}")
498
499
  return False
500
+ is_order_refreshing = order.is_refreshing()
499
501
  if order_status is enums.OrderStatus.CANCELED:
500
502
  order.status = octobot_trading.enums.OrderStatus.CANCELED
501
503
  self.logger.debug(f"Successfully cancelled order {order}")
@@ -505,11 +507,14 @@ class Trader(util.Initializable):
505
507
  else:
506
508
  order.status = octobot_trading.enums.OrderStatus.CANCELED
507
509
 
508
- await order.on_cancel(force_cancel=order.status is octobot_trading.enums.OrderStatus.CANCELED,
509
- is_from_exchange_data=False,
510
- ignored_order=ignored_order)
511
- if wait_for_cancelling and order.state is not None and order.state.is_pending():
512
- await self._wait_for_order_cancel(order, cancelling_timeout)
510
+ if not is_order_refreshing:
511
+ # don't override state if order is already refreshing (most likely from open orders updater)
512
+ await order.on_cancel(force_cancel=order.status is octobot_trading.enums.OrderStatus.CANCELED,
513
+ is_from_exchange_data=False,
514
+ ignored_order=ignored_order)
515
+ if wait_for_cancelling and (order.is_refreshing() or order.is_pending()):
516
+ # Don't wait for new state to avoid potential deadlock. Will raise if cancel is not in process
517
+ self._ensure_probably_canceled_order(order, None)
513
518
  return True
514
519
 
515
520
  async def _handle_order_cancel_error(self, order, err, wait_for_cancelling, cancelling_timeout):
@@ -531,10 +536,7 @@ class Trader(util.Initializable):
531
536
  # can't wait for the order state to fully refresh as it will require a portfolio lock which might
532
537
  # be locked by this ask already (and create a deadlock)
533
538
  # => be optimistic and consider refreshing state as end state
534
- if order.is_refreshing_filling_state():
535
- raise errors.FilledOrderError(f"Order is filled, it can't be cancelled. Order: {order}") from err
536
- if order.is_refreshing_canceling_state():
537
- self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
539
+ if self._ensure_probably_canceled_order(order, err):
538
540
  return True
539
541
  else:
540
542
  # trigger forced refresh to get an update of the order
@@ -542,17 +544,14 @@ class Trader(util.Initializable):
542
544
  await order.state.synchronize(force_synchronization=True)
543
545
  if previous_status != order.status:
544
546
  # don't wait for new state to avoid potential deadlock
545
- if order.is_refreshing_filling_state():
546
- raise errors.FilledOrderError(f"Order is filled, it can't be cancelled. Order: {order}") from err
547
- if order.is_refreshing_canceling_state():
548
- self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
547
+ if self._ensure_probably_canceled_order(order, err):
549
548
  return True
550
549
  if order.is_cancelled():
551
550
  self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
552
551
  return True
553
552
  if order.is_cancelling():
554
- if wait_for_cancelling:
555
- await self._wait_for_order_cancel(order, cancelling_timeout)
553
+ # don't wait for new state to avoid potential deadlock, just check that order is not filling
554
+ self._ensure_probably_canceled_order(order, err)
556
555
  return True
557
556
  elif order.is_open():
558
557
  if isinstance(err, errors.OrderNotFoundOnCancelError):
@@ -574,6 +573,20 @@ class Trader(util.Initializable):
574
573
  f"Can't cancel order and unknown post sync order state for order: {order}."
575
574
  ) from err
576
575
 
576
+ def _ensure_probably_canceled_order(self, order, err: typing.Optional[Exception]) -> bool:
577
+ if order.is_refreshing_filling_state():
578
+ filled_err = errors.FilledOrderError(f"Order is filled, it can't be cancelled. Order: {order}")
579
+ if err is None:
580
+ raise filled_err
581
+ raise filled_err from err
582
+ if order.is_refreshing_canceling_state():
583
+ self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
584
+ return True
585
+ if order.is_pending_cancel_state():
586
+ self.logger.debug(f"Tried to cancel a pending cancel order. Order: {order}")
587
+ return True
588
+ return False
589
+
577
590
  async def cancel_all_orders(
578
591
  self,
579
592
  symbol: str,
@@ -29,7 +29,7 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
29
29
 
30
30
  async def perform(self, orders, is_from_bot=False, are_closed=False):
31
31
  try:
32
- self.logger.debug(f"Received order update for {len(orders)} {'closed' if are_closed else ''} orders.")
32
+ self.logger.debug(f"Received order update for {len(orders)}{' closed' if are_closed else ''} orders.")
33
33
  has_new_order = False
34
34
  waiting_complete_init_orders = []
35
35
  symbols = set()
@@ -200,10 +200,10 @@ class OrdersUpdater(orders_channel.OrdersProducer):
200
200
 
201
201
  if raw_order is not None:
202
202
  self.logger.info(f"Received update for {order} on {exchange_name}: {raw_order}")
203
-
204
203
  await self.channel.exchange_manager.exchange_personal_data.handle_order_update_from_raw(
205
204
  order.exchange_order_id, raw_order, should_notify=should_notify
206
205
  )
206
+ self.logger.info(f"Completed update for {order} on {exchange_name}")
207
207
  else:
208
208
  self.logger.info(f"Can't received update for {order} on {exchange_name}: received order is None")
209
209
 
@@ -405,15 +405,24 @@ class Order(util.Initializable):
405
405
  def is_refreshing(self) -> bool:
406
406
  return self.state is not None and self.state.is_refreshing()
407
407
 
408
+ def is_pending(self) -> bool:
409
+ return self.state is not None and self.state.is_pending()
410
+
408
411
  def is_refreshing_filling_state(self) -> bool:
409
412
  return self._is_refreshing_state(orders_states.FillOrderState)
410
413
 
411
414
  def is_refreshing_canceling_state(self) -> bool:
412
415
  return self._is_refreshing_state(orders_states.CancelOrderState)
413
416
 
417
+ def is_pending_cancel_state(self) -> bool:
418
+ return self._is_pending_state(orders_states.CancelOrderState)
419
+
414
420
  def _is_refreshing_state(self, state_type) -> bool:
415
421
  return self.is_refreshing() and isinstance(self.state, state_type)
416
422
 
423
+ def _is_pending_state(self, state_type) -> bool:
424
+ return self.is_pending() and isinstance(self.state, state_type)
425
+
417
426
  def can_be_edited(self) -> bool:
418
427
  # orders that are not yet open or already open can be edited
419
428
  return self.state is None or (self.state.is_open() and not self.is_refreshing())
@@ -316,7 +316,6 @@ async def test_create_order_if_possible_ensure_no_deadlock_when_canceling_orders
316
316
 
317
317
  _origin_handle_portfolio_and_position_update_from_order_calls = []
318
318
  _synchronize_with_exchange_calls = []
319
- origin_handle_portfolio_and_position_update_from_order = exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order
320
319
  assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
321
320
  with mock.patch.object(
322
321
  consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
@@ -393,7 +392,6 @@ async def test_create_order_if_possible_ensure_no_deadlock_when_canceling_orders
393
392
 
394
393
  _origin_handle_portfolio_and_position_update_from_order_calls = []
395
394
  _synchronize_with_exchange_calls = []
396
- origin_handle_portfolio_and_position_update_from_order = exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order
397
395
  assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
398
396
  with mock.patch.object(
399
397
  consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
@@ -421,6 +419,155 @@ async def test_create_order_if_possible_ensure_no_deadlock_when_canceling_orders
421
419
  assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [] # order no more open
422
420
 
423
421
 
422
+ # 5. no concurrent task: open_order ends up in PENDING_CANCEL state after exchange.cancel() call
423
+ # order.on_cancel() and don't dead lock in cancelled order state
424
+ # => create_order_if_possible (which has portfolio lock) will not wait for cancel order state terminate
425
+ open_order = await _create_initialized_open_order(exchange_manager, symbol)
426
+ open_order.simulated = False # force real order simulation
427
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
428
+ completed_tasks.clear()
429
+
430
+ async def _synchronize_with_exchange(*_, **__):
431
+ # will not set order in final state => don't do anything, order stays pending
432
+ _synchronize_with_exchange_calls.append(1)
433
+ _synchronize_with_exchange_calls.append(1)
434
+
435
+ async def _create_new_orders(*_, **__):
436
+ # for now order is open
437
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
438
+ assert open_order.status == octobot_trading.enums.OrderStatus.OPEN
439
+ assert isinstance(open_order.state, personal_data.OpenOrderState)
440
+ # order cancel will end up in PENDING_CANCEL
441
+ await consumer.trading_mode.cancel_order(open_order, wait_for_cancelling=True) is True
442
+ # order now in pending cancel state
443
+ assert isinstance(open_order.state, personal_data.CancelOrderState)
444
+ assert open_order.is_pending_cancel_state() is True
445
+ for _ in range(10):
446
+ # wait a few cycles to make sure handle_portfolio_and_position_update_from_order_calls
447
+ # really don't get called (locked by consumer lock
448
+ await asyncio_tools.wait_asyncio_next_cycle()
449
+ # _synchronize_with_exchange_calls started and completed
450
+ assert _synchronize_with_exchange_calls == [1, 1]
451
+
452
+ async def _on_cancel(*args, **kwargs):
453
+ await origin_on_cancel(*args, **kwargs)
454
+
455
+
456
+ _synchronize_with_exchange_calls = []
457
+ _origin_handle_portfolio_and_position_update_from_order_calls = []
458
+ origin_on_cancel = open_order.on_cancel
459
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
460
+ with mock.patch.object(
461
+ consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
462
+ ) as _create_new_orders_mock, mock.patch.object(
463
+ open_order, "on_cancel", mock.AsyncMock(side_effect=_on_cancel)
464
+ ) as _on_cancel_mock, \
465
+ mock.patch.object(
466
+ exchange_manager.exchange_personal_data, "handle_portfolio_and_position_update_from_order", mock.AsyncMock()
467
+ ) as handle_portfolio_and_position_update_from_order_mock, \
468
+ mock.patch.object(
469
+ personal_data.CancelOrderState, "_synchronize_with_exchange", mock.AsyncMock(side_effect=_synchronize_with_exchange)
470
+ ) as _synchronize_with_exchange_mock, \
471
+ mock.patch.object(
472
+ exchange_manager.exchange, "cancel_order", mock.AsyncMock(return_value=octobot_trading.enums.OrderStatus.PENDING_CANCEL)
473
+ ) as cancel_order_mock:
474
+ # doesn't create a concurrent cancel order task let, it will be created from then on_cancel() call
475
+ await asyncio.gather(_create_order_if_possible_task(), _timeout_task(timeout))
476
+ _create_new_orders_mock.assert_called_once_with(symbol, -1, octobot_trading.enums.EvaluatorStates.VERY_LONG.value)
477
+ cancel_order_mock.assert_called_once()
478
+ _on_cancel_mock.assert_called_once()
479
+ handle_portfolio_and_position_update_from_order_mock.assert_not_called() # call has been skipped for the test
480
+ _synchronize_with_exchange_mock.assert_called_once()
481
+ # ensure no error was raised
482
+ assert symbol not in consumer.previous_call_error_per_symbol
483
+ consumer.previous_call_error_per_symbol.clear()
484
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [] # order no more open
485
+
486
+
487
+ # 6. concurrent task: open_order ends up in PENDING_CANCEL state after exchange.cancel() call
488
+ # because order is already refreshing (ex: from open orders updater)
489
+ # => create_order_if_possible (which has portfolio lock) will not wait for cancel order state terminate
490
+ open_order = await _create_initialized_open_order(exchange_manager, symbol)
491
+ open_order.simulated = False # force real order simulation
492
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
493
+ completed_tasks.clear()
494
+
495
+ async def _synchronize_with_exchange(*_, **__):
496
+ # will not set order in final state => don't do anything, order stays pending
497
+ _synchronize_with_exchange_calls.append(1)
498
+ for _ in range(10):
499
+ # wait a few cycles to let _cancel_order trading_mode.cancel_order
500
+ await asyncio_tools.wait_asyncio_next_cycle()
501
+ _synchronize_with_exchange_calls.append(1)
502
+
503
+ async def _create_new_orders(*_, **__):
504
+ assert _origin_handle_portfolio_and_position_update_from_order_calls == []
505
+ # for now order is open
506
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
507
+ assert open_order.status == octobot_trading.enums.OrderStatus.OPEN
508
+ assert isinstance(open_order.state, personal_data.OpenOrderState)
509
+ # order cancel will end up in PENDING_CANCEL
510
+ await consumer.trading_mode.cancel_order(open_order, wait_for_cancelling=True) is True
511
+ # _synchronize_with_exchange_calls is still waiting
512
+ assert _synchronize_with_exchange_calls == [1]
513
+ assert open_order.is_refreshing() is True
514
+ # order now in pending cancel state
515
+ assert isinstance(open_order.state, personal_data.CancelOrderState)
516
+ assert open_order.is_refreshing_canceling_state() is True
517
+ for _ in range(10):
518
+ # wait a few cycles to make sure _origin_handle_portfolio_and_position_update_from_order_calls
519
+ # really don't get called (locked by consumer lock
520
+ await asyncio_tools.wait_asyncio_next_cycle()
521
+ # _delayed_handle_portfolio_and_position_update_from_order is waiting for consumer to release lock
522
+ assert _origin_handle_portfolio_and_position_update_from_order_calls == []
523
+ # _synchronize_with_exchange_calls is now completed
524
+ assert _synchronize_with_exchange_calls == [1, 1]
525
+
526
+ async def _on_cancel(*args, **kwargs):
527
+ await origin_on_cancel(*args, **kwargs)
528
+
529
+ async def _cancel_order(*args, **kwargs):
530
+ # simulate an on_cancel call from somewhere else => triggers a canceling state
531
+ open_order.status = octobot_trading.enums.OrderStatus.PENDING_CANCEL
532
+ asyncio.create_task(open_order.on_cancel()) # will leave order in refreshing
533
+ await asyncio_tools.wait_asyncio_next_cycle() # let task run once (trigger refreshing state)
534
+ return octobot_trading.enums.OrderStatus.PENDING_CANCEL
535
+
536
+ _origin_handle_portfolio_and_position_update_from_order_calls = []
537
+ _synchronize_with_exchange_calls = []
538
+ origin_on_cancel = open_order.on_cancel
539
+ origin_ensure_probably_canceled_order = exchange_manager.trader._ensure_probably_canceled_order
540
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
541
+ with mock.patch.object(
542
+ consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
543
+ ) as _create_new_orders_mock, mock.patch.object(
544
+ open_order, "on_cancel", mock.AsyncMock(side_effect=_on_cancel)
545
+ ) as _on_cancel_mock, \
546
+ mock.patch.object(
547
+ exchange_manager.exchange_personal_data, "handle_portfolio_and_position_update_from_order", mock.AsyncMock()
548
+ ) as handle_portfolio_and_position_update_from_order_mock, \
549
+ mock.patch.object(
550
+ personal_data.CancelOrderState, "_synchronize_with_exchange", mock.AsyncMock(side_effect=_synchronize_with_exchange)
551
+ ) as _synchronize_with_exchange_mock, \
552
+ mock.patch.object(
553
+ exchange_manager.exchange, "cancel_order", mock.AsyncMock(side_effect=_cancel_order)
554
+ ) as cancel_order_mock, \
555
+ mock.patch.object(
556
+ exchange_manager.trader, "_ensure_probably_canceled_order", mock.AsyncMock(side_effect=origin_ensure_probably_canceled_order)
557
+ ) as _ensure_probably_canceled_order_mock:
558
+ # doesn't create a concurrent cancel order task let, it will be created from then on_cancel() call
559
+ await asyncio.gather(_create_order_if_possible_task(), _timeout_task(timeout))
560
+ _create_new_orders_mock.assert_called_once_with(symbol, -1, octobot_trading.enums.EvaluatorStates.VERY_LONG.value)
561
+ cancel_order_mock.assert_called_once()
562
+ _on_cancel_mock.assert_called_once()
563
+ handle_portfolio_and_position_update_from_order_mock.assert_not_called() # call has been skipped for the test
564
+ _synchronize_with_exchange_mock.assert_called_once()
565
+ _ensure_probably_canceled_order_mock.assert_called_once()
566
+ # ensure no error was raised
567
+ assert symbol not in consumer.previous_call_error_per_symbol
568
+ consumer.previous_call_error_per_symbol.clear()
569
+ assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [] # order no more open
570
+
424
571
 
425
572
  async def _create_initialized_open_order(exchange_manager, symbol):
426
573
  open_order = personal_data.BuyLimitOrder(exchange_manager.trader)