OctoBot-Trading 2.4.96__tar.gz → 2.4.98__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 (477) hide show
  1. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/CHANGELOG.md +13 -0
  2. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.96/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.98}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/README.md +1 -1
  5. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/__init__.py +2 -0
  7. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/exchange.py +1 -1
  8. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/symbol_data.py +26 -0
  9. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/exchange_symbols_data.py +1 -1
  10. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/prices_manager.py +7 -1
  11. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +6 -5
  12. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ticker/ticker_manager.py +6 -1
  13. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/abstract_exchange.py +30 -13
  14. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/config/exchange_config_data.py +15 -0
  15. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +14 -1
  16. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +2 -1
  17. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +1 -1
  18. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchange_builder.py +16 -2
  19. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchange_factory.py +23 -12
  20. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchange_manager.py +2 -2
  21. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchange_websocket_factory.py +3 -1
  22. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/implementations/exchange_simulator.py +9 -4
  23. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/traders/trader.py +52 -0
  24. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/types/rest_exchange.py +24 -12
  25. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/util/exchange_util.py +28 -15
  26. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/abstract_trading_mode.py +26 -0
  27. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/channel/orders.py +2 -2
  28. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/channel/trades_updater.py +22 -18
  29. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/trades_manager.py +18 -6
  30. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/__init__.py +15 -9
  31. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/implementations/test_default_rest_exchange.py +1 -1
  32. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_abstract_exchange.py +1 -1
  33. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_exchange_config_data.py +1 -1
  34. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_exchange_manager.py +1 -1
  35. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_exchanges.py +9 -9
  36. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/traders/test_trader.py +1 -1
  37. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/util/test_exchange_util.py +12 -12
  38. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/test_abstract_mode_consumer.py +1 -1
  39. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_order_factory.py +1 -1
  40. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/trades/test_trade_factory.py +1 -1
  41. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/__init__.py +1 -1
  42. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/LICENSE +0 -0
  43. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/MANIFEST.in +0 -0
  44. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  45. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  46. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  47. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/OctoBot_Trading.egg-info/requires.txt +0 -0
  48. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  49. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/channels.py +0 -0
  50. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/contracts.py +0 -0
  51. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/modes.py +0 -0
  52. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/orders.py +0 -0
  53. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/portfolio.py +0 -0
  54. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/positions.py +0 -0
  55. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/profitability.py +0 -0
  56. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/storage.py +0 -0
  57. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/trader.py +0 -0
  58. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/api/trades.py +0 -0
  59. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/constants.py +0 -0
  60. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/enums.py +0 -0
  61. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/errors.py +0 -0
  62. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_channel.py +0 -0
  63. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  66. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  67. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  68. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  69. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  72. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  73. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  75. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  78. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  79. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  80. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  81. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  83. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  84. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  86. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  87. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  88. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  89. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  92. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  93. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  94. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  95. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  98. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  99. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  100. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  101. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  102. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  104. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  105. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  106. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  107. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  110. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  111. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  113. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  114. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  115. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/config/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  117. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  118. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  119. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  120. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  121. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  122. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  123. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  124. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  126. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  127. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchange_channels.py +0 -0
  128. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchange_details.py +0 -0
  129. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/exchanges.py +0 -0
  130. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  132. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  133. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/traders/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  135. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/types/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  137. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/util/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  139. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  140. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  141. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/channel/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  144. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  145. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/channel/mode.py +0 -0
  146. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/mode_activity.py +0 -0
  147. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/mode_config.py +0 -0
  148. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/modes_factory.py +0 -0
  149. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/modes_util.py +0 -0
  150. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  151. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  152. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  153. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  154. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  155. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  156. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  157. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  158. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  159. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  160. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  161. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  163. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  164. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  166. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/octobot_channel_consumer.py +0 -0
  167. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  169. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  172. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  173. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  175. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  176. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  177. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  178. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/order.py +0 -0
  179. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  180. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  181. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/order_group.py +0 -0
  182. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/order_state.py +0 -0
  183. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/order_util.py +0 -0
  184. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  185. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  186. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  190. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  191. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  192. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  193. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  194. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  196. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  197. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  198. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  201. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  202. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  203. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  205. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  206. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  207. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  208. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  209. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  210. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  211. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  212. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  214. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  215. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  216. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  217. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  218. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  219. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  220. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  221. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  222. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  224. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  225. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  226. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  228. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  229. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  230. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  231. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  232. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  233. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  236. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  237. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  238. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  240. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  241. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  242. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  243. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/position.py +0 -0
  244. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  245. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/position_state.py +0 -0
  246. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/position_util.py +0 -0
  247. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  248. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  250. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  251. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  252. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  253. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  254. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  255. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  256. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/state.py +0 -0
  257. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  259. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  260. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/trade.py +0 -0
  261. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  262. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  263. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  264. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  266. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  267. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  268. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  270. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  271. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  272. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  273. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/channel/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  276. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  277. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/channel/signal_producer.py +0 -0
  278. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/signal_creation.py +0 -0
  279. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  280. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/signals/util.py +0 -0
  281. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/abstract_storage.py +0 -0
  283. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/candles_storage.py +0 -0
  284. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/orders_storage.py +0 -0
  285. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/portfolio_storage.py +0 -0
  286. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/storage_manager.py +0 -0
  287. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/trades_storage.py +0 -0
  288. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/transactions_storage.py +0 -0
  289. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/storage/util.py +0 -0
  290. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/supervisors/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  292. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  293. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/config_util.py +0 -0
  295. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/initializable.py +0 -0
  296. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/initialization_util.py +0 -0
  297. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/simulator_updater_utils.py +0 -0
  298. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/test_tools/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  300. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  301. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  302. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  303. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/requirements.txt +0 -0
  304. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/setup.cfg +0 -0
  305. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/setup.py +0 -0
  306. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/__init__.py +0 -0
  307. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_channels.py +0 -0
  308. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_exchange.py +0 -0
  309. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_modes.py +0 -0
  310. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_orders.py +0 -0
  311. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_portfolio.py +0 -0
  312. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_profitability.py +0 -0
  313. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_symbol_data.py +0 -0
  314. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_trader.py +0 -0
  315. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/api/test_trades.py +0 -0
  316. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/cli/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/contracts/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  320. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  321. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/funding/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  323. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/kline/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  325. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/ohlcv/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  327. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  328. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/order_book/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  330. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/prices/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  332. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  333. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/recent_trades/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  335. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  336. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/ticker/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  338. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/connectors/__init__.py +0 -0
  339. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  341. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  342. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/implementations/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  344. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  345. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_exchange_builder.py +0 -0
  346. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_exchange_factory.py +0 -0
  347. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/test_exchange_simulator.py +0 -0
  348. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/traders/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/types/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/util/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  353. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  357. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  358. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/test_abstract_trading_mode.py +0 -0
  363. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/modes/test_modes_util.py +0 -0
  364. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/groups/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  368. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  369. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  370. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/__init__.py +0 -0
  371. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  377. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  380. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  381. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_order.py +0 -0
  382. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_order_adapter.py +0 -0
  383. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_order_util.py +0 -0
  384. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_orders_manager.py +0 -0
  385. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  386. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  393. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  395. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/market/__init__.py +0 -0
  396. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  397. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  398. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  399. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  400. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  401. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  402. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  404. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  405. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  406. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  407. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/history/__init__.py +0 -0
  408. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  409. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  410. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/test_asset.py +0 -0
  411. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  412. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  413. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  414. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  415. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  416. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/types/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/channel/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/states/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/test_position.py +0 -0
  424. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/test_position_factory.py +0 -0
  425. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/test_positions_manager.py +0 -0
  426. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/types/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  428. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  429. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/trades/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/trades/test_trade_manager.py +0 -0
  431. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  432. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/trades/test_trade_util.py +0 -0
  433. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/transactions/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  435. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  436. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/signals/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  438. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  448. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_binance.py +0 -0
  449. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  450. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bingx.py +0 -0
  451. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  452. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bitget.py +0 -0
  453. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  454. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  455. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bitso.py +0 -0
  456. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  457. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bybit.py +0 -0
  458. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  459. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  460. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_coinex.py +0 -0
  461. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  462. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_gateio.py +0 -0
  463. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  464. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  465. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_htx.py +0 -0
  466. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_kraken.py +0 -0
  467. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  468. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  469. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_mexc.py +0 -0
  470. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_ndax.py +0 -0
  471. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  472. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_okx.py +0 -0
  473. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  474. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_phemex.py +0 -0
  475. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  476. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_upbit.py +0 -0
  477. {OctoBot-Trading-2.4.96 → OctoBot-Trading-2.4.98}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,19 @@ 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.98] - 2024-08-16
8
+ ### Added
9
+ - [Exchanges] exchange_config_by_exchange in init
10
+ - [Trades] option to ignore cancelled orders
11
+
12
+ ## [2.4.97] - 2024-08-14
13
+ ### Added
14
+ - [Exchanges] cancel_all_orders
15
+ - [Exchanges] forced ticker setting
16
+ - [API] get_daily_base_and_quote_volume
17
+ ### Fixed
18
+ - [Exchanges] ticker volumes
19
+
7
20
  ## [2.4.96] - 2024-08-13
8
21
  ### Added
9
22
  - [Exchanges] BitMart tests
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.96
3
+ Version: 2.4.98
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.96](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.98](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.96
3
+ Version: 2.4.98
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.96](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.98](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.96](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.98](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.96" # major.minor.revision
18
+ VERSION = "2.4.98" # major.minor.revision
@@ -42,6 +42,7 @@ from octobot_trading.api.symbol_data import (
42
42
  get_symbol_high_candles,
43
43
  get_symbol_low_candles,
44
44
  get_symbol_volume_candles,
45
+ get_daily_base_and_quote_volume,
45
46
  get_symbol_time_candles,
46
47
  create_new_candles_manager,
47
48
  force_set_mark_price,
@@ -232,6 +233,7 @@ __all__ = [
232
233
  "get_symbol_high_candles",
233
234
  "get_symbol_low_candles",
234
235
  "get_symbol_volume_candles",
236
+ "get_daily_base_and_quote_volume",
235
237
  "get_symbol_time_candles",
236
238
  "create_new_candles_manager",
237
239
  "force_set_mark_price",
@@ -78,7 +78,7 @@ def get_exchange_configuration_from_exchange_id(exchange_id: str) -> exchanges.E
78
78
 
79
79
 
80
80
  # prefer get_exchange_manager_from_exchange_name_and_id when possible
81
- def get_exchange_manager_from_exchange_id(exchange_id: str) -> object:
81
+ def get_exchange_manager_from_exchange_id(exchange_id: str) -> exchanges.ExchangeManager:
82
82
  try:
83
83
  return get_exchange_configuration_from_exchange_id(exchange_id).exchange_manager
84
84
  except KeyError:
@@ -94,6 +94,32 @@ def get_symbol_volume_candles(symbol_data, time_frame, limit=-1, include_in_cons
94
94
  return exchange_data.get_symbol_volume_candles(symbol_data, time_frame, limit, include_in_construction)
95
95
 
96
96
 
97
+ def get_daily_base_and_quote_volume(symbol_data, reference_price: decimal.Decimal) -> (decimal.Decimal, decimal.Decimal):
98
+ base_volume = symbol_data.ticker_manager.ticker.get(
99
+ octobot_trading.enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value,
100
+ "nan"
101
+ )
102
+ quote_volume = symbol_data.ticker_manager.ticker.get(
103
+ octobot_trading.enums.ExchangeConstantsTickersColumns.QUOTE_VOLUME.value,
104
+ "nan"
105
+ )
106
+ if base_volume:
107
+ base_volume = decimal.Decimal(str(base_volume))
108
+ if not quote_volume or decimal.Decimal(str(quote_volume)).is_nan():
109
+ # compute from the other if missing
110
+ quote_volume = base_volume * reference_price
111
+ if quote_volume:
112
+ quote_volume = decimal.Decimal(str(quote_volume))
113
+ if not base_volume or decimal.Decimal(str(base_volume)).is_nan():
114
+ # compute from the other if missing
115
+ base_volume = quote_volume / reference_price
116
+ if not (base_volume and quote_volume):
117
+ raise ValueError(
118
+ f"Missing volume {base_volume=} {quote_volume=}"
119
+ )
120
+ return base_volume, quote_volume
121
+
122
+
97
123
  def get_symbol_time_candles(symbol_data, time_frame, limit=-1, include_in_construction=False):
98
124
  return exchange_data.get_symbol_time_candles(symbol_data, time_frame, limit, include_in_construction)
99
125
 
@@ -33,7 +33,7 @@ class ExchangeSymbolsData:
33
33
  exchange_symbol_data.stop()
34
34
  self.exchange_symbol_data = {}
35
35
 
36
- def get_exchange_symbol_data(self, symbol, allow_creation=True):
36
+ def get_exchange_symbol_data(self, symbol, allow_creation=True) -> ExchangeSymbolData:
37
37
  try:
38
38
  return self.exchange_symbol_data[symbol]
39
39
  except KeyError as e:
@@ -89,7 +89,13 @@ class PricesManager(util.Initializable):
89
89
  (mark_price, self.exchange_manager.exchange.get_exchange_current_time())
90
90
  return is_mark_price_updated
91
91
 
92
- async def get_mark_price(self, timeout=MARK_PRICE_FETCH_TIMEOUT):
92
+ def get_mark_price_no_wait(self) -> decimal.Decimal:
93
+ self._ensure_price_validity()
94
+ if not self.valid_price_received_event.is_set():
95
+ raise ValueError(f"No up to date mark price for {self.exchange_manager.exchange_name}")
96
+ return self.mark_price
97
+
98
+ async def get_mark_price(self, timeout=MARK_PRICE_FETCH_TIMEOUT) -> decimal.Decimal:
93
99
  """
94
100
  Return mark price if valid
95
101
  :param timeout: event wait timeout
@@ -95,11 +95,12 @@ class TickerUpdater(ticker_channel.TickerProducer):
95
95
  """
96
96
 
97
97
  def _should_use_future(self):
98
- return self.channel.exchange_manager.is_future and \
99
- (
100
- self.channel.exchange_manager.exchange.FUNDING_IN_TICKER
101
- or self.channel.exchange_manager.exchange.MARK_PRICE_IN_TICKER
102
- )
98
+ return (
99
+ self.channel.exchange_manager.is_future and (
100
+ self.channel.exchange_manager.exchange.FUNDING_IN_TICKER
101
+ or self.channel.exchange_manager.exchange.MARK_PRICE_IN_TICKER
102
+ )
103
+ )
103
104
 
104
105
  async def modify(self, added_pairs=None, removed_pairs=None):
105
106
  if added_pairs:
@@ -62,7 +62,12 @@ class TickerManager(util.Initializable):
62
62
  }
63
63
 
64
64
  def ticker_update(self, ticker):
65
- self.ticker.update(ticker)
65
+ ticker_update = {
66
+ key: val
67
+ for key, val in ticker.items()
68
+ if val
69
+ }
70
+ self.ticker.update(ticker_update)
66
71
 
67
72
  def mini_ticker_update(self, mini_ticker):
68
73
  self.mini_ticker.update(mini_ticker)
@@ -72,7 +72,7 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
72
72
  }
73
73
  ACCOUNTS = {}
74
74
 
75
- def __init__(self, config, exchange_manager):
75
+ def __init__(self, config, exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
76
76
  super().__init__()
77
77
  self.config = config
78
78
  self.exchange_manager = exchange_manager
@@ -95,8 +95,10 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
95
95
 
96
96
  self.is_unreachable = False
97
97
 
98
- self._creating_exchange_order_ids = set()
98
+ self._creating_exchange_order_descriptions = set()
99
99
 
100
+ if exchange_config_by_exchange and self.get_name() in exchange_config_by_exchange:
101
+ self.tentacle_config = exchange_config_by_exchange[self.get_name()]
100
102
  if self.exchange_manager.tentacles_setup_config is not None:
101
103
  self.load_user_inputs_from_class(self.exchange_manager.tentacles_setup_config, self.tentacle_config)
102
104
 
@@ -327,6 +329,13 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
327
329
  """
328
330
  raise NotImplementedError("get_leverage_tiers is not implemented")
329
331
 
332
+ async def cancel_all_orders(self, symbol: str = None, **kwargs: dict) -> None:
333
+ """
334
+ Cancel all orders on the exchange
335
+ :param symbol: the orders symbol
336
+ """
337
+ raise NotImplementedError("cancel_all_orders is not implemented")
338
+
330
339
  async def cancel_order(
331
340
  self, exchange_order_id: str, symbol: str, order_type: enums.TraderOrderType, **kwargs: dict
332
341
  ) -> enums.OrderStatus:
@@ -720,17 +729,25 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
720
729
  f"({error.__class__.__name__}: {error})")
721
730
 
722
731
  @contextlib.contextmanager
723
- def creating_order(self, creating_order: dict):
724
- exchange_order_id = creating_order.get(
725
- enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value
726
- ) if creating_order else None
732
+ def creating_order(
733
+ self, side: enums.TradeOrderSide, symbol: str, quantity: decimal.Decimal, price: decimal.Decimal
734
+ ):
735
+ desc = self._get_order_description(side, symbol, quantity, price)
727
736
  try:
728
- self._creating_exchange_order_ids.add(exchange_order_id)
737
+ self._creating_exchange_order_descriptions.add(desc)
729
738
  yield
730
739
  finally:
731
- self._creating_exchange_order_ids.remove(exchange_order_id)
732
-
733
- def is_creating_order(self, exchange_order_id):
734
- if exchange_order_id is None:
735
- return False
736
- return exchange_order_id in self._creating_exchange_order_ids
740
+ self._creating_exchange_order_descriptions.remove(desc)
741
+
742
+ def is_creating_order(
743
+ self, order: dict, symbol: str
744
+ ) -> bool:
745
+ quantity = decimal.Decimal(str(order[enums.ExchangeConstantsOrderColumns.AMOUNT.value]))
746
+ price = decimal.Decimal(str(order[enums.ExchangeConstantsOrderColumns.PRICE.value]))
747
+ side = enums.TradeOrderSide(str(order[enums.ExchangeConstantsOrderColumns.SIDE.value]))
748
+ return self._get_order_description(side, symbol, quantity, price) in self._creating_exchange_order_descriptions
749
+
750
+ def _get_order_description(
751
+ self, side: enums.TradeOrderSide, symbol: str, quantity: decimal.Decimal, price: decimal.Decimal
752
+ ) -> str:
753
+ return f"{side.value}-{symbol}-{float(quantity)}-{float(price)}"
@@ -65,6 +65,12 @@ class ExchangeConfig(util.Initializable):
65
65
  # number of required historical candles
66
66
  self.required_historical_candles_count = constants.DEFAULT_IGNORED_VALUE
67
67
 
68
+ # periodic updaters that should always be started for this configuration
69
+ self.forced_updater_channels = set()
70
+
71
+ # When False, cancelled orders won't be saved in trades history
72
+ self.is_saving_cancelled_orders_as_trade = True
73
+
68
74
  self.backtesting_exchange_config = None
69
75
 
70
76
  async def initialize_impl(self):
@@ -141,6 +147,15 @@ class ExchangeConfig(util.Initializable):
141
147
  # If required timeframes: use those. Use traded timeframes otherwise
142
148
  return self.available_required_time_frames or self.traded_time_frames
143
149
 
150
+ def has_forced_updater(self, channel: str) -> bool:
151
+ return channel in self.forced_updater_channels
152
+
153
+ def add_forced_updater_channels(self, channel: set[str]):
154
+ self.forced_updater_channels.update(channel)
155
+
156
+ def set_is_saving_cancelled_orders_as_trade(self, value: bool):
157
+ self.is_saving_cancelled_orders_as_trade = value
158
+
144
159
  async def add_watched_symbols(self, symbols):
145
160
  new_valid_symbols = [
146
161
  symbol
@@ -50,7 +50,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
50
50
  def __init__(
51
51
  self, config, exchange_manager, adapter_class=None, additional_config=None, rest_name=None, force_auth=False
52
52
  ):
53
- super().__init__(config, exchange_manager)
53
+ super().__init__(config, exchange_manager, None)
54
54
  self.client = None
55
55
  self.exchange_type = None
56
56
  self.adapter = self.get_adapter_class(adapter_class)(self)
@@ -571,6 +571,19 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
571
571
  symbol=symbol, quantity=quantity
572
572
  )
573
573
 
574
+ @ccxt_client_util.converted_ccxt_common_errors
575
+ async def cancel_all_orders(self, symbol: str = None, **kwargs: dict) -> None:
576
+ try:
577
+ with self.error_describer():
578
+ await self.client.cancel_all_orders(symbol=symbol, params=kwargs)
579
+ except (ccxt.NotSupported, octobot_trading.errors.NotSupported) as e:
580
+ raise octobot_trading.errors.NotSupported(e) from e
581
+ except Exception as e:
582
+ self.logger.exception(
583
+ e, True, f"Unexpected error when cancelling all {symbol} orders | {e} ({e.__class__.__name__})"
584
+ )
585
+ raise e
586
+
574
587
  @ccxt_client_util.converted_ccxt_common_errors
575
588
  async def cancel_order(
576
589
  self, exchange_order_id: str, symbol: str, order_type: enums.TraderOrderType, **kwargs: dict
@@ -926,7 +926,8 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
926
926
  Ectc.CLOSE.value: kline[commons_enums.PriceIndexes.IND_PRICE_CLOSE.value],
927
927
  Ectc.LAST.value: kline[commons_enums.PriceIndexes.IND_PRICE_CLOSE.value],
928
928
  Ectc.PREVIOUS_CLOSE.value: None,
929
- Ectc.BASE_VOLUME.value: kline[commons_enums.PriceIndexes.IND_PRICE_VOL.value],
929
+ # do not include volume as this is not the ticker volume but the current candle volume
930
+ Ectc.BASE_VOLUME.value: None,
930
931
  Ectc.TIMESTAMP.value: self.exchange.get_exchange_current_time(),
931
932
  }
932
933
  await self.push_to_channel(
@@ -35,7 +35,7 @@ import octobot_trading.exchanges.util as util
35
35
 
36
36
  class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
37
37
  def __init__(self, config, exchange_manager, backtesting, adapter_class=None):
38
- super().__init__(config, exchange_manager)
38
+ super().__init__(config, exchange_manager, None)
39
39
  self.backtesting = backtesting
40
40
  self.allowed_time_lag = constants.DEFAULT_BACKTESTING_TIME_LAG
41
41
  self.adapter = self.get_adapter_class(adapter_class)(self)
@@ -37,6 +37,7 @@ class ExchangeBuilder:
37
37
  self._is_using_trading_modes: bool = True
38
38
  self._matrix_id: str = None
39
39
  self.trading_config_by_trading_mode: dict = None
40
+ self.exchange_config_by_exchange: dict = None
40
41
  self.auto_start_trading_modes: bool = True
41
42
 
42
43
  async def build(self):
@@ -61,10 +62,12 @@ class ExchangeBuilder:
61
62
  if self._is_using_trading_modes:
62
63
  trading_mode_class = modes.get_activated_trading_mode(self.exchange_manager.tentacles_setup_config)
63
64
  # handle exchange related requirements if the activated trading mode has any
64
- self._register_trading_modes_requirements(trading_mode_class, self.exchange_manager.tentacles_setup_config)
65
+ self._register_trading_modes_requirements(
66
+ trading_mode_class, self.exchange_manager.tentacles_setup_config
67
+ )
65
68
 
66
69
  self._ensure_exchange_compatibility()
67
- await self.exchange_manager.initialize()
70
+ await self.exchange_manager.initialize(exchange_config_by_exchange=self.exchange_config_by_exchange)
68
71
  # add exchange to be able to use it
69
72
  exchanges.Exchanges.instance().add_exchange(self.exchange_manager, self._matrix_id)
70
73
 
@@ -106,6 +109,13 @@ class ExchangeBuilder:
106
109
  self.config[commons_constants.CONFIG_TENTACLES_REQUIRED_CANDLES_COUNT],
107
110
  modes.get_required_candles_count(trading_mode_class, tentacles_setup_config)
108
111
  )
112
+ # register forced updaters if any
113
+ self.exchange_manager.exchange_config.add_forced_updater_channels(
114
+ trading_mode_class.get_forced_updater_channels()
115
+ )
116
+ self.exchange_manager.exchange_config.set_is_saving_cancelled_orders_as_trade(
117
+ not trading_mode_class.is_ignoring_cancelled_orders_trades()
118
+ )
109
119
 
110
120
  async def _build_trading_modes_if_required(self, trading_mode_class):
111
121
  if self._is_using_trading_modes:
@@ -266,6 +276,10 @@ class ExchangeBuilder:
266
276
  self.trading_config_by_trading_mode = trading_config_by_trading_mode
267
277
  return self
268
278
 
279
+ def use_exchange_config_by_exchange(self, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
280
+ self.exchange_config_by_exchange = exchange_config_by_exchange
281
+ return self
282
+
269
283
  def set_auto_start_trading_modes(self, auto_start_trading_modes):
270
284
  self.auto_start_trading_modes = auto_start_trading_modes
271
285
  return self
@@ -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 asyncio
17
+ import typing
17
18
 
18
19
  import trading_backend
19
20
 
@@ -22,7 +23,7 @@ import octobot_trading.errors as errors
22
23
  import octobot_trading.exchanges as exchanges
23
24
 
24
25
 
25
- async def create_exchanges(exchange_manager):
26
+ async def create_exchanges(exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
26
27
  if exchange_manager.is_sandboxed and not exchange_manager.exchange_only:
27
28
  exchange_manager.logger.info(f"Using sandbox exchange for {exchange_manager.exchange_name}")
28
29
 
@@ -32,7 +33,7 @@ async def create_exchanges(exchange_manager):
32
33
  exchange_manager.load_constants()
33
34
  else:
34
35
  # real : create a rest or websocket exchange instance
35
- await create_real_exchange(exchange_manager)
36
+ await create_real_exchange(exchange_manager, exchange_config_by_exchange)
36
37
  exchange_manager.load_constants()
37
38
  await initialize_real_exchange(exchange_manager)
38
39
 
@@ -47,12 +48,13 @@ async def create_exchanges(exchange_manager):
47
48
  exchange_manager.is_ready = True
48
49
 
49
50
 
50
- async def create_real_exchange(exchange_manager) -> None:
51
+ async def create_real_exchange(exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]) -> None:
51
52
  """
52
53
  Create and initialize real REST exchange
53
54
  :param exchange_manager: the related exchange manager
55
+ :param exchange_config_by_exchange: optional exchange configurations
54
56
  """
55
- await _create_rest_exchange(exchange_manager)
57
+ await _create_rest_exchange(exchange_manager, exchange_config_by_exchange)
56
58
  try:
57
59
  await exchange_manager.exchange.initialize()
58
60
  _create_exchange_backend(exchange_manager)
@@ -62,7 +64,7 @@ async def create_real_exchange(exchange_manager) -> None:
62
64
  except errors.AuthenticationError:
63
65
  exchange_manager.logger.error("Authentication error, retrying without authentication...")
64
66
  exchange_manager.without_auth = True
65
- await create_real_exchange(exchange_manager)
67
+ await create_real_exchange(exchange_manager, exchange_config_by_exchange)
66
68
  return
67
69
 
68
70
 
@@ -112,12 +114,14 @@ async def _is_supporting_octobot() -> bool:
112
114
  return False
113
115
 
114
116
 
115
- async def _create_rest_exchange(exchange_manager) -> None:
117
+ async def _create_rest_exchange(
118
+ exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]
119
+ ) -> None:
116
120
  """
117
121
  create REST based on ccxt exchange
118
122
  :param exchange_manager: the related exchange manager
119
123
  """
120
- await _search_and_create_rest_exchange(exchange_manager)
124
+ await _search_and_create_rest_exchange(exchange_manager, exchange_config_by_exchange)
121
125
 
122
126
  if not exchange_manager.exchange:
123
127
  raise Exception(f"Can't create an exchange instance that match the exchange configuration ({exchange_manager})")
@@ -139,16 +143,23 @@ async def init_simulated_exchange(exchange_manager):
139
143
  await exchange_manager.exchange.create_backtesting_exchange_producers()
140
144
 
141
145
 
142
- async def _search_and_create_rest_exchange(exchange_manager) -> None:
146
+ async def _search_and_create_rest_exchange(
147
+ exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]
148
+ ) -> None:
143
149
  """
144
150
  Create a rest exchange if a RestExchange matching class is found
145
151
  :param exchange_manager: the related exchange manager
146
152
  """
147
- rest_exchange_class = exchanges.get_rest_exchange_class(exchange_manager.exchange_name,
148
- exchange_manager.tentacles_setup_config)
153
+ rest_exchange_class = exchanges.get_rest_exchange_class(
154
+ exchange_manager.exchange_name, exchange_manager.tentacles_setup_config, exchange_config_by_exchange
155
+ )
149
156
  if rest_exchange_class:
150
- exchange_manager.exchange = rest_exchange_class(config=exchange_manager.config,
151
- exchange_manager=exchange_manager)
157
+ if rest_exchange_class.HAS_FETCHED_DETAILS:
158
+ await rest_exchange_class.fetch_exchange_config(exchange_config_by_exchange, exchange_manager)
159
+ exchange_manager.exchange = rest_exchange_class(
160
+ config=exchange_manager.config, exchange_manager=exchange_manager,
161
+ exchange_config_by_exchange=exchange_config_by_exchange
162
+ )
152
163
 
153
164
 
154
165
  def _initialize_simulator_time_frames(exchange_manager):
@@ -85,8 +85,8 @@ class ExchangeManager(util.Initializable):
85
85
 
86
86
  self.debug_info = {}
87
87
 
88
- async def initialize_impl(self):
89
- await exchanges.create_exchanges(self)
88
+ async def initialize_impl(self, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
89
+ await exchanges.create_exchanges(self, exchange_config_by_exchange)
90
90
  if self.is_storage_enabled():
91
91
  await self.storage_manager.initialize()
92
92
 
@@ -34,14 +34,16 @@ def is_channel_managed_by_websocket(exchange_manager, channel):
34
34
  def is_channel_fully_managed_by_websocket(exchange_manager, channel):
35
35
  return (
36
36
  not any([
37
+ # no associated feed is related to a time frame
37
38
  exchange_manager.exchange_web_socket.is_time_frame_related_feed(feed)
38
39
  for feed in octobot_trading.constants.WEBSOCKET_FEEDS_TO_TRADING_CHANNELS[channel]
39
40
  ])
40
41
  or all([
42
+ # all required time frames are supported
41
43
  exchange_manager.exchange_web_socket.is_time_frame_supported(time_frame)
42
44
  for time_frame in exchange_manager.exchange_config.available_time_frames
43
45
  ])
44
- )
46
+ ) and not exchange_manager.exchange_config.has_forced_updater(channel)
45
47
 
46
48
 
47
49
  def is_websocket_feed_requiring_init(exchange_manager, channel):
@@ -13,6 +13,8 @@
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 typing
17
+
16
18
  import octobot_trading.constants as constants
17
19
  import octobot_trading.exchanges.util as exchange_util
18
20
  import octobot_trading.exchanges.connectors.simulator.exchange_simulator_connector as exchange_simulator_connector
@@ -22,12 +24,15 @@ import octobot_trading.exchanges.types.rest_exchange as rest_exchange
22
24
  class ExchangeSimulator(rest_exchange.RestExchange):
23
25
  DEFAULT_CONNECTOR_CLASS = exchange_simulator_connector.ExchangeSimulatorConnector
24
26
 
25
- def __init__(self, config, exchange_manager, backtesting):
27
+ def __init__(
28
+ self, config, exchange_manager, backtesting,
29
+ exchange_config_by_exchange: typing.Optional[dict[str, dict]] = None
30
+ ):
26
31
  self.backtesting = backtesting
27
32
  self.exchange_importers = []
28
33
  self.exchange_tentacle_class = None
29
34
  self.exchange_tentacle = None
30
- super().__init__(config, exchange_manager)
35
+ super().__init__(config, exchange_manager, exchange_config_by_exchange)
31
36
 
32
37
  def _create_connector(self, config, exchange_manager, connector_class):
33
38
  return (connector_class or self.DEFAULT_CONNECTOR_CLASS)(
@@ -41,7 +46,7 @@ class ExchangeSimulator(rest_exchange.RestExchange):
41
46
  await super().initialize_impl()
42
47
  self.exchange_importers = self.connector.exchange_importers
43
48
  self.exchange_tentacle_class = exchange_util.get_rest_exchange_class(
44
- self.exchange_manager.exchange_name, self.exchange_manager.tentacles_setup_config
49
+ self.exchange_manager.exchange_name, self.exchange_manager.tentacles_setup_config, None
45
50
  )
46
51
  if self.connector.should_adapt_market_statuses():
47
52
  await self._init_exchange_tentacle()
@@ -54,7 +59,7 @@ class ExchangeSimulator(rest_exchange.RestExchange):
54
59
  # initialize a locale exchange_tentacle to be able to access adapters for market statuses
55
60
  if self.exchange_tentacle_class:
56
61
  self.exchange_tentacle = self.exchange_tentacle_class(
57
- self.exchange_manager.config, self.exchange_manager
62
+ self.exchange_manager.config, self.exchange_manager, None
58
63
  )
59
64
  finally:
60
65
  self.exchange_manager.ignore_config = origin_ignore_config
@@ -459,6 +459,58 @@ class Trader(util.Initializable):
459
459
  f"Can't cancel order and unknown post sync order state for order: {order}."
460
460
  ) from err
461
461
 
462
+ async def cancel_all_orders(
463
+ self,
464
+ symbol: str,
465
+ allow_single_order_cancel_fallback: bool,
466
+ wait_for_cancelling: bool = True,
467
+ cancelling_timeout: float = octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
468
+ ) -> bool:
469
+ orders_to_cancel = self.exchange_manager.exchange_personal_data.orders_manager.get_all_orders(symbol)
470
+ success = True
471
+ if orders_to_cancel:
472
+ self.logger.info(f"Cancelling all {len(orders_to_cancel)} {symbol} orders")
473
+ else:
474
+ return success
475
+ try:
476
+ cancel_on_exchange = False
477
+ for order in orders_to_cancel:
478
+ await order.lock.acquire()
479
+ if self.simulate or order.is_self_managed():
480
+ order.status = octobot_trading.enums.OrderStatus.CANCELED
481
+ else:
482
+ cancel_on_exchange = True
483
+ if cancel_on_exchange:
484
+ try:
485
+ success = False
486
+ await self.exchange_manager.exchange.cancel_all_orders(symbol)
487
+ success = True
488
+ except errors.NotSupported:
489
+ if allow_single_order_cancel_fallback:
490
+ self.logger.debug(
491
+ f"cancel_all_orders is not supported on {self.exchange_manager.exchange_name}. Falling "
492
+ f"back to one by one cancel"
493
+ )
494
+ for order in orders_to_cancel:
495
+ if not await self.cancel_order(
496
+ order.symbol,
497
+ wait_for_cancelling=wait_for_cancelling,
498
+ cancelling_timeout=cancelling_timeout
499
+ ):
500
+ success = False
501
+ else:
502
+ # not supported and no fallback allowed: re-raise errors.NotSupported
503
+ raise
504
+ for order in orders_to_cancel:
505
+ await order.on_cancel(force_cancel=True, is_from_exchange_data=False)
506
+ if wait_for_cancelling and order.state is not None and order.state.is_pending():
507
+ await self._wait_for_order_cancel(order, cancelling_timeout)
508
+ finally:
509
+ for order in orders_to_cancel:
510
+ order.lock.release()
511
+ self.logger.info(f"Cancelling of all {len(orders_to_cancel)} {symbol} orders complete")
512
+ return success
513
+
462
514
  async def _wait_for_order_cancel(self, order, cancelling_timeout):
463
515
  self.logger.debug(f"Waiting for order cancelling, order: {order}")
464
516
  await order.state.wait_for_terminate(cancelling_timeout)