OctoBot-Trading 2.4.92__tar.gz → 2.4.93__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 (476) hide show
  1. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.92/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.93}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/README.md +1 -1
  5. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/__init__.py +8 -0
  7. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/exchange.py +11 -0
  8. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/orders.py +8 -0
  9. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/trades.py +9 -0
  10. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/constants.py +1 -1
  11. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/abstract_websocket_exchange.py +6 -0
  12. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +16 -5
  13. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchange_builder.py +4 -0
  14. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchange_manager.py +3 -2
  15. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchange_websocket_factory.py +6 -2
  16. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/traders/trader.py +2 -1
  17. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/types/websocket_exchange.py +23 -2
  18. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/abstract_trading_mode.py +1 -1
  19. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/modes_util.py +1 -1
  20. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/channel/orders.py +1 -1
  21. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/order_state.py +6 -0
  22. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/orders_manager.py +14 -1
  23. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +3 -0
  24. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/state.py +7 -1
  25. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/trades_manager.py +19 -4
  26. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/test_tools/exchanges_test_tools.py +10 -0
  27. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_exchange_builder.py +10 -1
  28. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/trades/test_trade_manager.py +18 -3
  29. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/LICENSE +0 -0
  30. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/MANIFEST.in +0 -0
  31. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  32. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  33. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  34. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/OctoBot_Trading.egg-info/requires.txt +0 -0
  35. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  36. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/channels.py +0 -0
  37. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/contracts.py +0 -0
  38. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/modes.py +0 -0
  39. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/portfolio.py +0 -0
  40. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/positions.py +0 -0
  41. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/profitability.py +0 -0
  42. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/storage.py +0 -0
  43. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/symbol_data.py +0 -0
  44. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/api/trader.py +0 -0
  45. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/enums.py +0 -0
  46. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/errors.py +0 -0
  47. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_channel.py +0 -0
  48. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/__init__.py +0 -0
  49. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  50. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  51. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  52. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  53. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  54. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  55. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  57. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  58. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  59. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  60. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  61. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  63. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  64. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  65. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  66. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  67. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  69. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  70. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  72. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  73. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  75. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  78. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  79. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  80. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  81. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  84. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  85. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  86. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  87. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  88. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  91. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  92. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  94. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  97. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  98. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  99. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  100. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  102. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  104. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/config/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  106. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  107. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  110. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  111. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  112. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  113. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  114. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  115. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  117. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  118. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  119. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchange_channels.py +0 -0
  120. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchange_details.py +0 -0
  121. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchange_factory.py +0 -0
  122. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/exchanges.py +0 -0
  123. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  126. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  127. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/traders/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  129. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/types/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  131. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/util/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  133. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  134. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  135. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  136. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/channel/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  139. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  140. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/channel/mode.py +0 -0
  141. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/mode_activity.py +0 -0
  142. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/mode_config.py +0 -0
  143. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/modes_factory.py +0 -0
  144. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  147. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  148. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  149. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  150. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  151. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  163. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  166. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  167. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  168. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  170. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  171. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  172. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/order.py +0 -0
  173. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  175. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/order_util.py +0 -0
  177. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  178. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  179. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  180. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  184. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  192. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  194. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  196. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  197. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  198. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  199. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  201. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  202. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  203. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  205. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  207. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  208. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  209. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  211. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  212. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  213. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  215. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  216. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  217. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  218. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  219. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  220. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  221. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  222. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  223. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  224. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  225. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  228. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  229. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  231. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  232. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  233. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  234. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/position.py +0 -0
  235. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  236. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/position_state.py +0 -0
  237. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/position_util.py +0 -0
  238. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  239. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  240. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  243. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  244. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  245. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  246. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  247. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  250. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  251. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/trade.py +0 -0
  252. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  253. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  254. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  255. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  257. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  258. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  259. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  261. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/channel/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  267. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  268. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/channel/signal_producer.py +0 -0
  269. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/signal_creation.py +0 -0
  270. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  271. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/signals/util.py +0 -0
  272. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/abstract_storage.py +0 -0
  274. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/candles_storage.py +0 -0
  275. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/orders_storage.py +0 -0
  276. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/portfolio_storage.py +0 -0
  277. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/storage_manager.py +0 -0
  278. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/trades_storage.py +0 -0
  279. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/transactions_storage.py +0 -0
  280. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/storage/util.py +0 -0
  281. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/supervisors/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  283. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/config_util.py +0 -0
  286. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/initializable.py +0 -0
  287. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/initialization_util.py +0 -0
  288. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/simulator_updater_utils.py +0 -0
  289. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/test_tools/__init__.py +0 -0
  290. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  291. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  292. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/requirements.txt +0 -0
  294. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/setup.cfg +0 -0
  295. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/setup.py +0 -0
  296. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/__init__.py +0 -0
  297. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_channels.py +0 -0
  298. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_exchange.py +0 -0
  299. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_modes.py +0 -0
  300. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_orders.py +0 -0
  301. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_portfolio.py +0 -0
  302. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_profitability.py +0 -0
  303. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_symbol_data.py +0 -0
  304. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_trader.py +0 -0
  305. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/api/test_trades.py +0 -0
  306. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/cli/__init__.py +0 -0
  307. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/contracts/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  310. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  311. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/funding/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  313. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/kline/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  315. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/ohlcv/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  317. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  318. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/order_book/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  320. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/prices/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  322. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  323. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/recent_trades/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  325. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  326. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/ticker/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  328. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/connectors/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  332. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  333. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/implementations/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  336. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_abstract_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_exchange_config_data.py +0 -0
  339. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_exchange_factory.py +0 -0
  340. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_exchange_manager.py +0 -0
  341. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_exchange_simulator.py +0 -0
  342. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/test_exchanges.py +0 -0
  343. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/traders/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/traders/test_trader.py +0 -0
  345. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/types/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  347. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/util/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  349. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/exchanges/util/test_exchange_util.py +0 -0
  350. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  354. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  355. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  356. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  357. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  359. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/test_abstract_mode_consumer.py +0 -0
  360. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/test_abstract_trading_mode.py +0 -0
  361. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/modes/test_modes_util.py +2 -2
  362. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/groups/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  366. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  367. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  368. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  375. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  378. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  379. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_order.py +0 -0
  380. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_order_factory.py +0 -0
  382. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_order_util.py +0 -0
  383. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_orders_manager.py +0 -0
  384. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  385. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  392. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  394. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/market/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  397. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  398. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  400. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  401. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  404. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  405. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  406. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/history/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  408. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  409. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/test_asset.py +0 -0
  410. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  411. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  412. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  413. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  414. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  415. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/types/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/channel/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/states/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/test_position.py +0 -0
  423. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/test_position_factory.py +0 -0
  424. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/test_positions_manager.py +0 -0
  425. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/types/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  427. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  428. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/trades/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/trades/test_trade_factory.py +0 -0
  430. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  431. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/trades/test_trade_util.py +0 -0
  432. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/transactions/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  434. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  435. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/signals/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  437. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/signals/test_util.py +0 -0
  438. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/test_utils/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/test_utils/order_util.py +0 -0
  440. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/test_utils/random_numbers.py +0 -0
  441. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/util/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests/util/test_config_util.py +0 -0
  443. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  448. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_binance.py +0 -0
  449. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  450. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bingx.py +0 -0
  451. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  452. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bitget.py +0 -0
  453. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  454. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bitso.py +0 -0
  455. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  456. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bybit.py +0 -0
  457. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  458. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  459. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_coinex.py +0 -0
  460. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  461. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_gateio.py +0 -0
  462. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  463. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  464. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_htx.py +0 -0
  465. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_kraken.py +0 -0
  466. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  467. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  468. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_mexc.py +0 -0
  469. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_ndax.py +0 -0
  470. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  471. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_okx.py +0 -0
  472. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  473. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_phemex.py +0 -0
  474. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  475. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_upbit.py +0 -0
  476. {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.93}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,16 @@ 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.93] - 2024-07-23
8
+ ### Added
9
+ - [Trades] get_trade_pnl API
10
+ - [Orders] allow disabled_order_auto_synchronization
11
+ ### Fixed
12
+ - [Exchanges] Websocket limit issues
13
+ ### Updated
14
+ - [Trades] Increase default max trades history to 6000
15
+ - [Orders] Add logs on auto-refresh
16
+
7
17
  ## [2.4.92] - 2024-07-15
8
18
  ### Fixed
9
19
  - [Trades] optimize trade storage RAM
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.92
3
+ Version: 2.4.93
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.92](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.93](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.92
3
+ Version: 2.4.93
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.92](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.93](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.92](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.93](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.92" # major.minor.revision
18
+ VERSION = "2.4.93" # major.minor.revision
@@ -51,6 +51,7 @@ from octobot_trading.api.symbol_data import (
51
51
  from octobot_trading.api.trades import (
52
52
  get_trade_history,
53
53
  get_completed_pnl_history,
54
+ get_trade_pnl,
54
55
  is_executed_trade,
55
56
  is_trade_after_or_at,
56
57
  get_total_paid_trading_fees,
@@ -94,6 +95,7 @@ from octobot_trading.api.exchange import (
94
95
  get_backtesting_data_files,
95
96
  get_backtesting_data_file,
96
97
  get_has_websocket,
98
+ get_has_reached_websocket_limit,
97
99
  supports_websockets,
98
100
  is_compatible_account,
99
101
  get_new_ccxt_client,
@@ -177,10 +179,12 @@ from octobot_trading.api.profitability import (
177
179
  )
178
180
  from octobot_trading.api.orders import (
179
181
  get_open_orders,
182
+ get_pending_creation_orders,
180
183
  get_order_exchange_name,
181
184
  order_to_dict,
182
185
  parse_order_type,
183
186
  parse_order_status,
187
+ is_order_pending,
184
188
  get_order_profitability,
185
189
  get_minimal_order_cost,
186
190
  create_order,
@@ -234,6 +238,7 @@ __all__ = [
234
238
  "get_config_symbols",
235
239
  "get_trade_history",
236
240
  "get_completed_pnl_history",
241
+ "get_trade_pnl",
237
242
  "is_executed_trade",
238
243
  "is_trade_after_or_at",
239
244
  "get_total_paid_trading_fees",
@@ -273,6 +278,7 @@ __all__ = [
273
278
  "get_backtesting_data_files",
274
279
  "get_backtesting_data_file",
275
280
  "get_has_websocket",
281
+ "get_has_reached_websocket_limit",
276
282
  "supports_websockets",
277
283
  "is_compatible_account",
278
284
  "get_new_ccxt_client",
@@ -346,10 +352,12 @@ __all__ = [
346
352
  "get_reference_market",
347
353
  "get_initializing_currencies_prices",
348
354
  "get_open_orders",
355
+ "get_pending_creation_orders",
349
356
  "get_order_exchange_name",
350
357
  "order_to_dict",
351
358
  "parse_order_type",
352
359
  "parse_order_status",
360
+ "is_order_pending",
353
361
  "get_order_profitability",
354
362
  "get_minimal_order_cost",
355
363
  "create_order",
@@ -202,6 +202,13 @@ def get_has_websocket(exchange_manager) -> bool:
202
202
  return exchange_manager.has_websocket
203
203
 
204
204
 
205
+ def get_has_reached_websocket_limit(exchange_manager) -> bool:
206
+ return (
207
+ exchange_manager.exchange_web_socket
208
+ and exchange_manager.exchange_web_socket.is_beyond_feed_exchange_limit
209
+ )
210
+
211
+
205
212
  def supports_websockets(exchange_name: str, tentacles_setup_config) -> bool:
206
213
  return exchanges.supports_websocket(exchange_name, tentacles_setup_config)
207
214
 
@@ -243,10 +250,14 @@ def get_fees(exchange_manager, symbol) -> dict:
243
250
 
244
251
 
245
252
  def get_max_handled_pair_with_time_frame(exchange_manager) -> int:
253
+ if get_has_reached_websocket_limit(exchange_manager):
254
+ return exchange_manager.exchange_web_socket.get_connector_max_handled_feeds()
246
255
  return exchange_manager.exchange.get_max_handled_pair_with_time_frame()
247
256
 
248
257
 
249
258
  def get_currently_handled_pair_with_time_frame(exchange_manager) -> int:
259
+ if get_has_reached_websocket_limit(exchange_manager):
260
+ return exchange_manager.exchange_web_socket.get_connector_feeds_count()
250
261
  return exchange_manager.get_currently_handled_pair_with_time_frame()
251
262
 
252
263
 
@@ -45,6 +45,10 @@ def get_open_orders(exchange_manager, symbol=None) -> list:
45
45
  return exchange_manager.exchange_personal_data.orders_manager.get_open_orders(symbol=symbol)
46
46
 
47
47
 
48
+ def get_pending_creation_orders(exchange_manager) -> list:
49
+ return exchange_manager.exchange_personal_data.orders_manager.pending_creation_orders
50
+
51
+
48
52
  async def cancel_all_open_orders(exchange_manager, emit_trading_signals=True) -> bool:
49
53
  return await exchange_manager.trader.cancel_all_open_orders(emit_trading_signals=emit_trading_signals)
50
54
 
@@ -74,6 +78,10 @@ def parse_order_status(dict_order) -> octobot_trading.enums.OrderStatus:
74
78
  return personal_data.parse_order_status(dict_order)
75
79
 
76
80
 
81
+ def is_order_pending(order: personal_data.Order) -> bool:
82
+ return order.status == octobot_trading.enums.OrderStatus.PENDING_CREATION
83
+
84
+
77
85
  def get_order_profitability(exchange_manager, order_id) -> float:
78
86
  try:
79
87
  return exchange_manager.exchange_personal_data.orders_manager.get_order(order_id).get_profitability()
@@ -14,6 +14,7 @@
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
16
  import decimal
17
+ import typing
17
18
 
18
19
  import octobot_trading.enums
19
20
  import octobot_trading.personal_data as personal_data
@@ -38,6 +39,14 @@ def get_completed_pnl_history(exchange_manager, quote=None, symbol=None, since=N
38
39
  )
39
40
 
40
41
 
42
+ def get_trade_pnl(
43
+ exchange_manager, trade_id: typing.Optional[str] = None, order_id: typing.Optional[str] = None
44
+ ) -> typing.Optional[personal_data.TradePnl]:
45
+ return exchange_manager.exchange_personal_data.trades_manager.get_completed_trade_pnl(
46
+ trade_id, order_id
47
+ )
48
+
49
+
41
50
  def _trade_filter(trade, quote=None, symbol=None, timestamp=None, include_cancelled=False) -> bool:
42
51
  if trade.status is octobot_trading.enums.OrderStatus.CANCELED and not include_cancelled:
43
52
  return False
@@ -177,7 +177,7 @@ BALANCE_CHANNEL = "Balance"
177
177
  BALANCE_PROFITABILITY_CHANNEL = "BalanceProfitability"
178
178
  POSITIONS_CHANNEL = "Positions"
179
179
  INDIVIDUAL_ORDER_SYNC_TIMEOUT = 1 * commons_constants.MINUTE_TO_SECONDS
180
- MAX_TRADES_COUNT = int(os.getenv("MAX_TRADES_COUNT", "2000")) # larger values can use a large part of ram
180
+ MAX_TRADES_COUNT = int(os.getenv("MAX_TRADES_COUNT", "6000")) # larger values can use a large part of ram
181
181
 
182
182
  # History
183
183
  DEFAULT_SAVED_HISTORICAL_TIMEFRAMES = [commons_enums.TimeFrames.ONE_DAY]
@@ -42,6 +42,8 @@ class AbstractWebsocketExchange:
42
42
  octobot_trading.enums.WebsocketFeeds.CANDLE,
43
43
  octobot_trading.enums.WebsocketFeeds.KLINE,
44
44
  ]
45
+ # Feeds to create above which not to use websockets
46
+ MAX_HANDLED_FEEDS = octobot_trading.constants.NO_DATA_LIMIT
45
47
 
46
48
  def __init__(self, config, exchange_manager):
47
49
  self.config = config
@@ -212,6 +214,10 @@ class AbstractWebsocketExchange:
212
214
  """
213
215
  return octobot_trading.constants.INFINITE_MAX_HANDLED_PAIRS_WITH_TIMEFRAME
214
216
 
217
+ @classmethod
218
+ def get_feeds_count(cls, pairs, time_frames) -> int:
219
+ raise NotImplementedError(f"get_feeds_count is not implemented")
220
+
215
221
  def _should_authenticate(self):
216
222
  api_key, api_secret, _ = self.get_exchange_credentials()
217
223
  return not self.exchange_manager.without_auth \
@@ -620,14 +620,14 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
620
620
  if not already_got_closed_by_user_error:
621
621
  count_error = False
622
622
  self.logger.debug(
623
- f"{ws_des} connection automatically closed, reconnecting in {self.LONG_RECONNECT_DELAY} "
624
- f"seconds ({err})"
623
+ f"{ws_des} connection automatically closed, reconnecting in {self.LONG_RECONNECT_DELAY}"
624
+ f" seconds ({err})"
625
625
  )
626
626
  already_got_closed_by_user_error = True
627
627
  if count_error:
628
628
  error_count = self._increment_error_counter(g_kwargs.get("time_frame"), err)
629
- error_message = f"Unexpected error when handling {ws_des} feed: {err} ({err.__class__.__name__}) " \
630
- f"({error_count} times)"
629
+ error_message = f"Unexpected error when handling {ws_des} feed: {err} " \
630
+ f"({err.__class__.__name__}) ({error_count} times)"
631
631
  if error_count == 1:
632
632
  self.logger.exception(err, True, error_message)
633
633
  elif error_count % spamming_logs_warning_interval == 0:
@@ -642,7 +642,7 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
642
642
  def _create_task_if_necessary(self, feed, feed_callback, feed_generator, **kwargs):
643
643
  identifier = self._get_feed_identifier(feed_generator, kwargs)
644
644
  if identifier not in self.feed_tasks:
645
- self.logger.debug(f"Subscribing to {feed.value} with {kwargs}")
645
+ self.logger.debug(f"Subscribing to {feed.value} with {kwargs} ({len(self.feed_tasks)} total feeds)")
646
646
  self.feed_tasks[identifier] = asyncio.create_task(
647
647
  self._feed_task(feed, feed_callback, feed_generator, **kwargs)
648
648
  )
@@ -771,6 +771,17 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
771
771
  def _is_pair_independent_feed(self, feed):
772
772
  return feed in self.PAIR_INDEPENDENT_CHANNELS
773
773
 
774
+ @classmethod
775
+ def get_feeds_count(cls, pairs, time_frames) -> int:
776
+ total_count = 0
777
+ if pairs:
778
+ # rounding: account for 1 feed per symbol
779
+ total_count = len(pairs)
780
+ if cls.get_exchange_feed(trading_enums.WebsocketFeeds.CANDLE):
781
+ # rounding: account for 1 per timeframe per symbol
782
+ total_count += len(pairs) * len(time_frames)
783
+ return total_count
784
+
774
785
  def _convert_book_prices_to_orders(self, book_prices_and_volumes, book_side):
775
786
  """
776
787
  Convert a book_prices format : {PRICE_1: SIZE_1, PRICE_2: SIZE_2...}
@@ -17,6 +17,7 @@
17
17
  import typing
18
18
  import octobot_commons.logging as logging
19
19
  import octobot_commons.constants as commons_constants
20
+ import octobot_commons.authentication as commons_authentication
20
21
 
21
22
  import octobot_trading.errors as errors
22
23
  import octobot_trading.modes as modes
@@ -120,6 +121,9 @@ class ExchangeBuilder:
120
121
 
121
122
  async def build_trading_modes(self, trading_mode_class):
122
123
  try:
124
+ # ensure authenticated data are fetched before starting trading modes
125
+ if not self.exchange_manager.is_backtesting:
126
+ await commons_authentication.Authenticator.wait_and_check_has_open_source_package()
123
127
  self._ensure_trading_mode_compatibility(trading_mode_class)
124
128
  return await modes.create_trading_modes(
125
129
  self.config,
@@ -107,10 +107,11 @@ class ExchangeManager(util.Initializable):
107
107
  await self.exchange_web_socket.close_sockets()
108
108
  except Exception as err:
109
109
  self.logger.exception(err, True, f"Error when stopping exchange websocket: {err}")
110
- self.exchange_web_socket.clear()
111
- self.exchange_web_socket = None
112
110
  if enable_logs:
113
111
  self.logger.debug("Stopped websocket")
112
+ if self.exchange_web_socket:
113
+ self.exchange_web_socket.clear()
114
+ self.exchange_web_socket = None
114
115
 
115
116
  # stop trading modes
116
117
  if enable_logs:
@@ -59,8 +59,12 @@ async def _create_websocket(exchange_manager, websocket_class_name, ws_exchange_
59
59
  try:
60
60
  exchange_manager.exchange_web_socket = ws_exchange_class(exchange_manager.config, exchange_manager)
61
61
  await _init_websocket(exchange_manager)
62
- exchange_manager.logger.info(f"{ws_exchange_class.get_name()} connecting to "
63
- f"{exchange_manager.exchange.name.capitalize()}")
62
+ if exchange_manager.exchange_web_socket.is_websocket_running:
63
+ exchange_manager.logger.info(
64
+ f"{ws_exchange_class.get_name()} connecting to {exchange_manager.exchange.name.capitalize()}"
65
+ )
66
+ else:
67
+ exchange_manager.has_websocket = False
64
68
  except Exception as e:
65
69
  exchange_manager.logger.error(f"Fail to init websocket for {websocket_class_name} "
66
70
  f"({exchange_manager.exchange.name}): {e}")
@@ -285,7 +285,8 @@ class Trader(util.Initializable):
285
285
 
286
286
  await updated_order.initialize()
287
287
  if is_pending_creation and wait_for_creation \
288
- and updated_order.state is not None and updated_order.state.is_pending():
288
+ and updated_order.state is not None and updated_order.state.is_pending()\
289
+ and self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization:
289
290
  await updated_order.state.wait_for_terminate(creation_timeout)
290
291
  return updated_order
291
292
 
@@ -18,6 +18,7 @@ import sys
18
18
  import concurrent.futures as futures
19
19
 
20
20
  import octobot_commons.thread_util as thread_util
21
+ import octobot_trading.constants
21
22
  import octobot_trading.enums
22
23
  import octobot_trading.exchanges.abstract_websocket_exchange as abstract_websocket
23
24
 
@@ -42,6 +43,7 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
42
43
 
43
44
  self.is_websocket_running = False
44
45
  self.is_websocket_authenticated = False
46
+ self.is_beyond_feed_exchange_limit = False
45
47
 
46
48
  self.restart_task = None
47
49
 
@@ -59,6 +61,13 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
59
61
  self.time_frames = time_frames
60
62
 
61
63
  if self.pairs:
64
+ if self._has_too_many_feeds_to_handle():
65
+ self.logger.info(
66
+ f"Disabling websocket: {self.get_connector_feeds_count()} "
67
+ f"feeds are required and {self.get_connector_max_handled_feeds()} are supported at most."
68
+ )
69
+ self.is_beyond_feed_exchange_limit = True
70
+ return
62
71
  # unauthenticated
63
72
  await self.add_feed(octobot_trading.enums.WebsocketFeeds.TRADES)
64
73
  await self.add_feed(octobot_trading.enums.WebsocketFeeds.L1_BOOK)
@@ -91,8 +100,9 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
91
100
  # ensure feeds are added
92
101
  self.create_feeds()
93
102
  else:
94
- self.logger.warning(f"{self.exchange_manager.exchange_name.title()}'s "
95
- f"websocket has no symbol to feed")
103
+ self.logger.warning(
104
+ f"{self.exchange_manager.exchange_name.title()}'s websocket has no symbol to feed"
105
+ )
96
106
 
97
107
  async def add_feed(self, feed_name):
98
108
  if self.is_feed_available(feed_name):
@@ -213,6 +223,17 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
213
223
  for websocket in self.websocket_connectors:
214
224
  websocket.add_pairs(pairs, watching_only=watching_only)
215
225
 
226
+ def _has_too_many_feeds_to_handle(self) -> bool:
227
+ if self.get_connector_max_handled_feeds() == octobot_trading.constants.NO_DATA_LIMIT:
228
+ return False
229
+ return self.get_connector_feeds_count() >= self.get_connector_max_handled_feeds()
230
+
231
+ def get_connector_feeds_count(self):
232
+ return self.websocket_connector.get_feeds_count(self.pairs, self.time_frames)
233
+
234
+ def get_connector_max_handled_feeds(self):
235
+ return self.websocket_connector.MAX_HANDLED_FEEDS
236
+
216
237
  def clear(self):
217
238
  super(WebSocketExchange, self).clear()
218
239
  for connector in self.websocket_connectors:
@@ -349,7 +349,7 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
349
349
  return created_orders
350
350
 
351
351
  async def single_exchange_process_optimize_initial_portfolio(
352
- self, sellable_assets, target_asset: str, tickers: dict
352
+ self, sellable_assets: list, target_asset: str, tickers: dict
353
353
  ) -> list:
354
354
  raise NotImplementedError("single_exchange_process_optimize_initial_portfolio is not implemented")
355
355
 
@@ -75,7 +75,7 @@ def get_assets_requiring_extra_price_data_to_convert(exchange_manager, sellable_
75
75
 
76
76
  async def convert_assets_to_target_asset(trading_mode, sellable_assets: list, target_asset: str, tickers: dict) -> list:
77
77
  created_orders = []
78
- for asset in sellable_assets:
78
+ for asset in sorted(sellable_assets):
79
79
  new_orders = await convert_asset_to_target_asset(
80
80
  trading_mode, asset, target_asset, tickers, asset_amount=None
81
81
  )
@@ -214,7 +214,7 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
214
214
  wait_for_refresh=wait_for_refresh))
215
215
  except IndexError:
216
216
  if not self.channel.exchange_manager.is_simulated and create_order_producer_if_missing:
217
- self.logger.debug("Missing orders producer, starting one...")
217
+ self.logger.info("Missing orders producer, starting one...")
218
218
  await exchanges.create_authenticated_producer_from_parent(self.channel.exchange_manager,
219
219
  self.__class__,
220
220
  force_register_producer=True)
@@ -106,6 +106,9 @@ class OrderState(state_class.State):
106
106
  """
107
107
  try:
108
108
  self.ensure_not_cleared(self.order)
109
+ self.get_logger().info(
110
+ f"Synchronizing order {self.order} with {self.order.exchange_manager.exchange_name} exchange"
111
+ )
109
112
  await exchange_channel.get_chan(
110
113
  octobot_trading.constants.ORDERS_CHANNEL,
111
114
  self.order.exchange_manager.id
@@ -126,6 +129,9 @@ class OrderState(state_class.State):
126
129
  if order.is_cleared():
127
130
  raise octobot_trading.errors.InvalidOrderState(f"Order has already been cleared. Order: {order}")
128
131
 
132
+ def _is_synchronization_enabled(self):
133
+ return self.order.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization
134
+
129
135
  def clear(self):
130
136
  """
131
137
  Clear references
@@ -16,6 +16,7 @@
16
16
  import collections
17
17
  import uuid
18
18
  import typing
19
+ import contextlib
19
20
 
20
21
  import octobot_commons.logging as logging
21
22
 
@@ -35,7 +36,8 @@ class OrdersManager(util.Initializable):
35
36
  super().__init__()
36
37
  self.logger = logging.get_logger(self.__class__.__name__)
37
38
  self.trader = trader
38
- self.orders_initialized = False # TODO
39
+ self.orders_initialized = False
40
+ self.enable_order_auto_synchronization = True
39
41
  self.orders = collections.OrderedDict()
40
42
  self.order_groups = {}
41
43
  # orders that are expected from exchange but have not yet been fetched: will be removed when fetched
@@ -222,6 +224,17 @@ class OrdersManager(util.Initializable):
222
224
  self._add_order(order.order_id, order)
223
225
  self._check_orders_size()
224
226
 
227
+ @contextlib.contextmanager
228
+ def disabled_order_auto_synchronization(self):
229
+ """
230
+ Can be used to locally disable orders auto refresh when an order is pending
231
+ """
232
+ self.enable_order_auto_synchronization = False
233
+ try:
234
+ yield
235
+ finally:
236
+ self.enable_order_auto_synchronization = True
237
+
225
238
  # private methods
226
239
  def _reset_orders(self):
227
240
  self.orders_initialized = False
@@ -46,6 +46,9 @@ class PendingCreationOrderState(order_state.OrderState):
46
46
  # If it turns out to be instantly closed, OctoBot will miss it as is will never be fetched with
47
47
  # open orders refresh.
48
48
  self.ensure_not_cleared(self.order)
49
+ self.get_logger().info(
50
+ f"Synchronizing order {self.order} with {self.order.exchange_manager.exchange_name} exchange"
51
+ )
49
52
  while self.order.is_pending_creation() \
50
53
  and time.time() - t0 < octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT:
51
54
  iteration += 1
@@ -157,7 +157,7 @@ class State(util.Initializable):
157
157
  else:
158
158
  raise
159
159
  finally:
160
- self.has_already_been_synchronized_once = True
160
+ self.has_already_been_synchronized_once = self._is_synchronization_enabled()
161
161
 
162
162
  async def synchronize_with_exchange(self, force_synchronization: bool = False) -> None:
163
163
  """
@@ -166,6 +166,9 @@ class State(util.Initializable):
166
166
  Restore the previous state if the refresh process fails
167
167
  :param force_synchronization: When True, for the update of the order from the exchange
168
168
  """
169
+ if not self._is_synchronization_enabled():
170
+ self.get_logger().info(f"Skipped {self.__class__.__name__} exchange synchronization")
171
+ return
169
172
  if self.is_refreshing():
170
173
  self.log_event_message(enums.StatesMessages.ALREADY_SYNCHRONIZING)
171
174
  else:
@@ -236,6 +239,9 @@ class State(util.Initializable):
236
239
  """
237
240
  raise NotImplementedError("on_refresh_successful not implemented")
238
241
 
242
+ def _is_synchronization_enabled(self):
243
+ return True
244
+
239
245
  def clear(self):
240
246
  """
241
247
  Clear references
@@ -14,6 +14,7 @@
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
16
  import collections
17
+ import typing
17
18
 
18
19
  import octobot_commons.logging as logging
19
20
  import octobot_commons.tree as commons_tree
@@ -86,14 +87,23 @@ class TradesManager(util.Initializable):
86
87
  self.logger.warning(f"Trade without any registered fee: {trade.to_dict()}")
87
88
  return total_fees
88
89
 
89
- def get_completed_trades_pnl(self, trades=None) -> list:
90
- trades = trades or self.get_trades()
90
+ def get_completed_trade_pnl(
91
+ self, trade_id: typing.Optional[str], order_id: typing.Optional[str]
92
+ ) -> typing.Optional[trade_pnl.TradePnl]:
93
+ pnls = []
94
+ trade = self.get_trade(trade_id) if trade_id else self.get_trade_from_order_id(order_id)
95
+ if trade:
96
+ pnls = self.get_completed_trades_pnl(selected_trades=[trade])
97
+ return pnls[0] if pnls else None
98
+
99
+ def get_completed_trades_pnl(self, trades_history=None, selected_trades=None) -> list[trade_pnl.TradePnl]:
100
+ trades = trades_history or self.get_trades()
91
101
  trades_by_order_id = {
92
102
  trade.origin_order_id: trade
93
103
  for trade in trades
94
104
  }
95
105
  exits_by_entry_id = {}
96
- for trade in trades:
106
+ for trade in (selected_trades or trades):
97
107
  if trade.status is not enums.OrderStatus.CANCELED and trade.associated_entry_ids:
98
108
  for entry_id in trade.associated_entry_ids:
99
109
  if entry_id not in trades_by_order_id:
@@ -109,9 +119,14 @@ class TradesManager(util.Initializable):
109
119
  for entry_id, exit_trade in exits_by_entry_id.items()
110
120
  ]
111
121
 
112
- def get_trade(self, trade_id):
122
+ def get_trade(self, trade_id: str):
113
123
  return self.trades[trade_id]
114
124
 
125
+ def get_trade_from_order_id(self, order_id: str):
126
+ if trades := self.get_trades(origin_order_id=order_id):
127
+ return trades[0]
128
+ return None
129
+
115
130
  def get_trades(self, origin_order_id=None, exchange_order_id=None):
116
131
  return [
117
132
  trade
@@ -155,6 +155,14 @@ async def get_open_orders(
155
155
  return open_orders
156
156
 
157
157
 
158
+ async def get_order(
159
+ exchange_manager,
160
+ exchange_order_id: str,
161
+ symbol: str,
162
+ ) -> dict:
163
+ return await exchange_manager.exchange.get_order(exchange_order_id, symbol=symbol)
164
+
165
+
158
166
  async def get_cancelled_orders(
159
167
  exchange_manager,
160
168
  exchange_data: exchange_data_import.ExchangeData,
@@ -245,5 +253,7 @@ async def wait_for_other_status(order: personal_data.Order, timeout) -> personal
245
253
  return personal_data.create_order_instance_from_raw(
246
254
  order.trader, raw_order, force_open_or_pending_creation=False
247
255
  )
256
+ if time.time() - t0 + constants.CREATED_ORDER_FORCED_UPDATE_PERIOD >= timeout:
257
+ break
248
258
  await asyncio.sleep(constants.CREATED_ORDER_FORCED_UPDATE_PERIOD)
249
259
  raise TimeoutError(f"Order was not found with another status than {origin_status} within {timeout} seconds")
@@ -13,9 +13,11 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
+ import mock.mock
16
17
  import pytest
17
18
  import octobot_trading.api as api
18
19
  import octobot_trading.exchanges as exchanges
20
+ import octobot_commons.authentication as commons_authentication
19
21
 
20
22
  from tests.exchanges import exchange_manager
21
23
  from tests import event_loop
@@ -36,7 +38,14 @@ async def test_build_trading_modes_if_required(exchange_manager):
36
38
 
37
39
  # with trader simulator: will attempt to create a trading mode and fail (because of the None arg)
38
40
  builder.is_simulated()
39
- with pytest.raises(AttributeError):
41
+ with mock.patch.object(
42
+ commons_authentication.Authenticator, "has_open_source_package", mock.Mock(return_value=False)
43
+ ) as has_open_source_package_mock:
44
+ with pytest.raises(AttributeError):
45
+ await builder._build_trading_modes_if_required(None)
46
+ has_open_source_package_mock.assert_called_once()
47
+ # raised by default has_open_source_package (which should be overriden)
48
+ with pytest.raises(NotImplementedError):
40
49
  await builder._build_trading_modes_if_required(None)
41
50
 
42
51