OctoBot-Trading 2.4.122__tar.gz → 2.4.124__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 (478) hide show
  1. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/CHANGELOG.md +9 -0
  2. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/OctoBot_Trading.egg-info/requires.txt +1 -1
  4. {OctoBot-Trading-2.4.122/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.124}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/README.md +1 -1
  6. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/errors.py +24 -11
  8. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +1 -1
  9. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/types/rest_exchange.py +34 -7
  10. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/modes_util.py +61 -47
  11. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/requirements.txt +1 -1
  12. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +10 -3
  13. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/test_modes_util.py +40 -5
  14. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/LICENSE +0 -0
  15. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/MANIFEST.in +0 -0
  16. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  17. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  18. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  19. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  20. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/__init__.py +0 -0
  21. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/channels.py +0 -0
  22. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/contracts.py +0 -0
  23. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/exchange.py +0 -0
  24. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/modes.py +0 -0
  25. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/orders.py +0 -0
  26. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/portfolio.py +0 -0
  27. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/positions.py +0 -0
  28. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/profitability.py +0 -0
  29. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/storage.py +0 -0
  30. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/symbol_data.py +0 -0
  31. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/trader.py +0 -0
  32. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/api/trades.py +0 -0
  33. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/constants.py +0 -0
  34. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/enums.py +0 -0
  35. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_channel.py +0 -0
  36. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/__init__.py +0 -0
  37. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  38. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  39. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  40. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  41. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  42. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  43. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  44. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  46. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  47. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  48. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  49. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  50. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  51. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  52. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  53. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  54. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  55. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  57. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  58. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  60. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  61. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  62. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  63. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  66. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  67. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  68. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  69. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  72. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  73. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  75. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  76. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  79. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  80. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  81. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  82. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  85. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  86. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  87. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  88. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  90. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  91. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  93. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/config/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  95. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  96. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  97. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  100. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  101. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  102. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  103. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  104. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  105. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  107. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  108. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  109. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchange_builder.py +0 -0
  110. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchange_channels.py +0 -0
  111. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchange_details.py +0 -0
  112. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchange_factory.py +0 -0
  113. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchange_manager.py +0 -0
  114. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  115. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/exchanges.py +0 -0
  116. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  118. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  119. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  120. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/traders/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/traders/trader.py +0 -0
  122. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  123. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/types/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/util/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  127. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  128. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  129. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  130. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  132. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/channel/__init__.py +0 -0
  133. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  134. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  135. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/channel/mode.py +0 -0
  136. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/mode_activity.py +0 -0
  137. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/mode_config.py +0 -0
  138. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/modes_factory.py +0 -0
  139. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  140. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  141. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  142. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  143. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  144. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  145. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  146. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  147. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  148. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  149. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  150. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  151. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  152. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  153. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  154. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  155. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/octobot_channel_consumer.py +0 -0
  156. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  158. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  161. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  162. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  163. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  164. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  166. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  167. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  168. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/order.py +0 -0
  169. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  170. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  171. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/order_group.py +0 -0
  172. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/order_state.py +0 -0
  173. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/order_util.py +0 -0
  174. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  175. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  176. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  178. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  179. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  180. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  182. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  185. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  187. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  191. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  193. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  195. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  196. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  197. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  200. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  201. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  202. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  203. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  204. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  205. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  206. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  207. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  208. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  210. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  211. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  212. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  214. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  215. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  216. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  217. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  218. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  219. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  220. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  221. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  222. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  223. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  228. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  231. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  232. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  233. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/position.py +0 -0
  234. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  235. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/position_state.py +0 -0
  236. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/position_util.py +0 -0
  237. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  238. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  243. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  245. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  246. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/state.py +0 -0
  247. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  250. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  251. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/trade.py +0 -0
  252. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  253. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  254. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  255. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  256. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  258. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  259. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  260. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/channel/__init__.py +0 -0
  267. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  268. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  269. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/channel/signal_producer.py +0 -0
  270. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/signal_creation.py +0 -0
  271. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  272. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/signals/util.py +0 -0
  273. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/abstract_storage.py +0 -0
  275. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/candles_storage.py +0 -0
  276. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/orders_storage.py +0 -0
  277. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/portfolio_storage.py +0 -0
  278. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/storage_manager.py +0 -0
  279. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/trades_storage.py +0 -0
  280. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/transactions_storage.py +0 -0
  281. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/storage/util.py +0 -0
  282. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/supervisors/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  285. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/config_util.py +0 -0
  287. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/initializable.py +0 -0
  288. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/initialization_util.py +0 -0
  289. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/simulator_updater_utils.py +0 -0
  290. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/test_tools/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  292. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  294. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/setup.cfg +0 -0
  296. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/setup.py +0 -0
  297. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/__init__.py +0 -0
  298. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_channels.py +0 -0
  299. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_exchange.py +0 -0
  300. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_modes.py +0 -0
  301. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_orders.py +0 -0
  302. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_portfolio.py +0 -0
  303. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_profitability.py +0 -0
  304. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_symbol_data.py +0 -0
  305. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_trader.py +0 -0
  306. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/api/test_trades.py +0 -0
  307. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/cli/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/contracts/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  311. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  312. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/funding/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  314. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/kline/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  316. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/ohlcv/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  318. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  319. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/order_book/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  321. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/prices/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  323. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  324. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/recent_trades/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  326. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  327. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/ticker/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  329. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/connectors/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  333. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/implementations/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  336. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_abstract_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_exchange_builder.py +0 -0
  339. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_exchange_config_data.py +0 -0
  340. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_exchange_factory.py +0 -0
  341. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_exchange_manager.py +0 -0
  342. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_exchange_simulator.py +0 -0
  343. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/test_exchanges.py +0 -0
  344. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/traders/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/traders/test_trader.py +0 -0
  346. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/types/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  348. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/util/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  350. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/exchanges/util/test_exchange_util.py +0 -0
  351. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  355. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  356. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  357. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  358. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  360. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/test_abstract_mode_consumer.py +0 -0
  361. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/modes/test_abstract_trading_mode.py +0 -0
  362. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/groups/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  366. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  367. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  368. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  375. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  378. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  379. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_order.py +0 -0
  380. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_order_factory.py +0 -0
  382. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_order_util.py +0 -0
  383. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_orders_manager.py +0 -0
  384. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  385. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  392. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  394. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/market/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  397. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  398. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  400. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  401. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  404. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  405. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  406. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/history/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  408. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  409. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/test_asset.py +0 -0
  410. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  411. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  412. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  413. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  414. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  415. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/types/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/channel/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/states/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/test_position.py +0 -0
  423. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/test_position_factory.py +0 -0
  424. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/test_positions_manager.py +0 -0
  425. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/types/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  427. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  428. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/trades/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/trades/test_trade_factory.py +0 -0
  430. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/trades/test_trade_manager.py +0 -0
  431. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  432. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/trades/test_trade_util.py +0 -0
  433. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/transactions/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  435. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  436. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/signals/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  438. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bitso.py +0 -0
  457. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  458. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bybit.py +0 -0
  459. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  460. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  461. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_coinex.py +0 -0
  462. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  463. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_gateio.py +0 -0
  464. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  465. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  466. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_htx.py +0 -0
  467. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_kraken.py +0 -0
  468. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  469. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  470. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_mexc.py +0 -0
  471. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_ndax.py +0 -0
  472. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  473. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_okx.py +0 -0
  474. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  475. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_phemex.py +0 -0
  476. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  477. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_upbit.py +0 -0
  478. {OctoBot-Trading-2.4.122 → OctoBot-Trading-2.4.124}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,15 @@ 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.124] - 2024-11-17
8
+ ### Updated
9
+ [Exchanges] Handle limit order in converter
10
+ [Exchanges] Handle more ccxt missed orders
11
+
12
+ ## [2.4.123] - 2024-11-16
13
+ ### Updated
14
+ [Requirements] Bump cachetools and make version more flexible
15
+
7
16
  ## [2.4.122] - 2024-11-14
8
17
  ### Fixed
9
18
  [Exchanges] Authorization header
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.122
3
+ Version: 2.4.124
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.122](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.124](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)
@@ -8,4 +8,4 @@ ccxt==4.3.85
8
8
  cryptography
9
9
  sortedcontainers==2.4.0
10
10
  tinydb==4.5.2
11
- cachetools==5.3.2
11
+ cachetools<6,>=5.5.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.122
3
+ Version: 2.4.124
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.122](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.124](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.122](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.124](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.122" # major.minor.revision
18
+ VERSION = "2.4.124" # major.minor.revision
@@ -15,13 +15,19 @@
15
15
  # License along with this library.
16
16
 
17
17
 
18
- class MissingFunds(Exception):
18
+ class OctoBotExchangeError(Exception):
19
+ """
20
+ Parent class of local exceptions raised when communicating with exchanges
21
+ """
22
+
23
+
24
+ class MissingFunds(OctoBotExchangeError):
19
25
  """
20
26
  Raised upon placing an order while having insufficient funds
21
27
  """
22
28
 
23
29
 
24
- class MissingMinimalExchangeTradeVolume(Exception):
30
+ class MissingMinimalExchangeTradeVolume(OctoBotExchangeError):
25
31
  """
26
32
  Raised when a new order is impossible to create due to exchange minimal funds restrictions
27
33
  """
@@ -33,19 +39,19 @@ class TradingModeIncompatibility(Exception):
33
39
  """
34
40
 
35
41
 
36
- class OrderCreationError(Exception):
42
+ class OrderCreationError(OctoBotExchangeError):
37
43
  """
38
44
  Raised upon a failed order creation
39
45
  """
40
46
 
41
47
 
42
- class OrderEditError(Exception):
48
+ class OrderEditError(OctoBotExchangeError):
43
49
  """
44
50
  Raised upon a failed order edition
45
51
  """
46
52
 
47
53
 
48
- class OrderCancelError(Exception):
54
+ class OrderCancelError(OctoBotExchangeError):
49
55
  """
50
56
  Raised upon a failed order cancel
51
57
  """
@@ -93,37 +99,44 @@ class NotSupported(Exception):
93
99
  """
94
100
 
95
101
 
96
- class FailedRequest(Exception):
102
+ class FailedRequest(OctoBotExchangeError):
97
103
  """
98
104
  Raised upon a failed request on an exchange API
99
105
  """
100
106
 
101
107
 
102
- class RateLimitExceeded(Exception):
108
+ class RateLimitExceeded(OctoBotExchangeError):
103
109
  """
104
110
  Raised upon an exchange API rate limit error
105
111
  """
106
112
 
107
113
 
108
- class UnavailableOrderTypeForMarketError(Exception):
114
+ class UnavailableOrderTypeForMarketError(OctoBotExchangeError):
109
115
  """
110
116
  Raised when an exchange refuses to create a given type of order that should normally be supported
111
117
  """
112
118
 
113
119
 
114
- class AuthenticationError(Exception):
120
+ class AuthenticationError(OctoBotExchangeError):
115
121
  """
116
122
  Raised when an exchange failed to authenticate
117
123
  """
118
124
 
119
125
 
120
- class ExchangeCompliancyError(Exception):
126
+ class ExchangeInternalSyncError(OctoBotExchangeError):
127
+ """
128
+ Raised when an exchange is returning an error due to its internal sync process
129
+ (ex: when an order is filled but portfolio has not yet been updated)
130
+ """
131
+
132
+
133
+ class ExchangeCompliancyError(OctoBotExchangeError):
121
134
  """
122
135
  Raised when an exchange failed to execute the given request because of compliance rules for the current user account
123
136
  """
124
137
 
125
138
 
126
- class ExchangeAccountSymbolPermissionError(Exception):
139
+ class ExchangeAccountSymbolPermissionError(OctoBotExchangeError):
127
140
  """
128
141
  Raised when an exchange failed to execute the given request because of allowed traded symbols
129
142
  on the current user account
@@ -225,7 +225,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
225
225
  @ccxt_client_util.converted_ccxt_common_errors
226
226
  async def _ensure_auth(self):
227
227
  try:
228
- await self.get_balance()
228
+ await self.exchange_manager.exchange.get_balance()
229
229
  except (octobot_trading.errors.AuthenticationError, ccxt.AuthenticationError) as e:
230
230
  await self.client.close()
231
231
  self.unauthenticated_exchange_fallback(e)
@@ -104,6 +104,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
104
104
  EXCHANGE_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
105
105
  # text content of errors due to account compliancy issues
106
106
  EXCHANGE_COMPLIANCY_ERRORS: typing.List[typing.Iterable[str]] = []
107
+ # text content of errors due to exchange internal synch (like when portfolio is not yet up to date after a trade)
108
+ EXCHANGE_INTERNAL_SYNC_ERRORS: typing.List[typing.Iterable[str]] = []
109
+ # text content of errors due to missing fnuds when creating an order (when not identified as such by ccxt)
110
+ EXCHANGE_MISSING_FUNDS_ERRORS: typing.List[typing.Iterable[str]] = []
107
111
  # text content of errors due to exchange local account permissions (ex: accounts from X country can't trade XYZ)
108
112
  # text content of errors due to traded assets for account
109
113
  EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
@@ -209,15 +213,18 @@ class RestExchange(abstract_exchange.AbstractExchange):
209
213
  quantity, price, stop_price, side,
210
214
  current_price, params)
211
215
 
216
+ def _on_missing_funds_err(self, err, order_type, symbol, quantity, price, stop_price):
217
+ self.log_order_creation_error(err, order_type, symbol, quantity, price, stop_price)
218
+ if self.__class__.PRINT_DEBUG_LOGS:
219
+ self.logger.warning(str(err))
220
+ raise errors.MissingFunds(err) from err
221
+
212
222
  @contextlib.asynccontextmanager
213
223
  async def _order_operation(self, order_type, symbol, quantity, price, stop_price):
214
224
  try:
215
225
  yield
216
226
  except ccxt.InsufficientFunds as e:
217
- self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
218
- if self.__class__.PRINT_DEBUG_LOGS:
219
- self.logger.warning(str(e))
220
- raise errors.MissingFunds(e) from e
227
+ self._on_missing_funds_err(e, order_type, symbol, quantity, price, stop_price)
221
228
  except ccxt.NotSupported as err:
222
229
  raise errors.NotSupported from err
223
230
  except (errors.AuthenticationError, ccxt.AuthenticationError) as err:
@@ -237,7 +244,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
237
244
  if self.should_log_on_ddos_exception(e):
238
245
  self.connector.log_ddos_error(e)
239
246
  raise errors.FailedRequest(f"Failed to order operation: {e.__class__.__name__} {e}") from e
240
- except errors.ExchangeAccountSymbolPermissionError:
247
+ except errors.OctoBotExchangeError:
248
+ # custom error: forward it
241
249
  raise
242
250
  except Exception as e:
243
251
  if not self.is_market_open_for_order_type(symbol, order_type):
@@ -311,9 +319,18 @@ class RestExchange(abstract_exchange.AbstractExchange):
311
319
  raise errors.ExchangeAccountSymbolPermissionError(
312
320
  f"Error when creating {symbol} {order_type} order on {self.exchange_manager.exchange_name}: {err}"
313
321
  ) from err
322
+ if self.is_exchange_internal_sync_error(err):
323
+ raise errors.ExchangeInternalSyncError(
324
+ f"Error when handling order {err}. Exchange is refusing this order request because of sync error "
325
+ f"({err})."
326
+ ) from err
327
+ if self.is_missing_funds_error(err):
328
+ self._on_missing_funds_err(err, order_type, symbol, quantity, price, stop_price)
314
329
  # can be raised when exchange precision/limits rules change
315
- self.logger.debug(f"Failed to create order ({err}) : order_type: {order_type}, symbol: {symbol}. "
316
- f"This might be due to an update on {self.name} market rules. Fetching updated rules.")
330
+ self.logger.warning(
331
+ f"Failed to create order ({err}) : order_type: {order_type}, symbol: {symbol}. "
332
+ f"This might be due to an update on {self.name} market rules. Fetching updated rules."
333
+ )
317
334
  await self.connector.load_symbol_markets(reload=True, market_filter=self.exchange_manager.market_filter)
318
335
  # retry order creation with updated markets (ccxt will use the updated market values)
319
336
  return await self._create_specific_order(order_type, symbol, quantity, price=price,
@@ -948,6 +965,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
948
965
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_COMPLIANCY_ERRORS)
949
966
  return False
950
967
 
968
+ def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
969
+ if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
970
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
971
+ return False
972
+
973
+ def is_missing_funds_error(self, error: BaseException) -> bool:
974
+ if self.EXCHANGE_MISSING_FUNDS_ERRORS:
975
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_MISSING_FUNDS_ERRORS)
976
+ return False
977
+
951
978
  def is_exchange_account_traded_symbol_permission_error(self, error: BaseException) -> bool:
952
979
  if self.EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS:
953
980
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS)
@@ -92,57 +92,71 @@ async def convert_asset_to_target_asset(
92
92
  tickers = tickers or {}
93
93
  portfolio = trading_mode.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio
94
94
  if asset in portfolio and portfolio[asset].available:
95
- # get symbol of the order
96
- symbol, order_type = _get_associated_symbol_and_order_type(trading_mode, asset, target_asset)
97
- if symbol is None:
98
- # can't convert asset into target_asset
99
- trading_mode.logger.warning(
100
- f"Impossible to convert {asset} into {target_asset}: no associated trading pair "
101
- f"on {trading_mode.exchange_manager.exchange_name}"
102
- )
103
- return created_orders
95
+ created_orders.extend(
96
+ await convert_with_market_or_limit_order(trading_mode, asset, target_asset, tickers, asset_amount)
97
+ )
98
+ return created_orders
104
99
 
105
- # get symbol price
106
- price_base = asset
107
- price_target = target_asset
108
- if order_type is trading_enums.TraderOrderType.BUY_MARKET:
109
- price_base = target_asset
110
- price_target = asset
111
100
 
112
- price = trading_personal_data.get_asset_price_from_converter_or_tickers(
113
- trading_mode.exchange_manager, price_base, price_target, symbol, tickers
101
+ async def convert_with_market_or_limit_order(
102
+ trading_mode, asset: str, target_asset: str, tickers: dict, asset_amount=None
103
+ ) -> list:
104
+ # get symbol of the order
105
+ symbol, order_type = _get_associated_symbol_and_order_type(trading_mode, asset, target_asset)
106
+ if symbol is None:
107
+ # can't convert asset into target_asset
108
+ trading_mode.logger.warning(
109
+ f"Impossible to convert {asset} into {target_asset}: no associated trading pair "
110
+ f"on {trading_mode.exchange_manager.exchange_name}"
114
111
  )
112
+ return []
115
113
 
116
- if not price:
117
- # can't get price, should not happen as symbol is in client_symbols
118
- trading_mode.logger.error(
119
- f"Impossible to convert {asset} into {target_asset}: {symbol} ticker can't be fetched"
120
- )
121
- return created_orders
122
-
123
- if trading_personal_data.get_trade_order_type(order_type) is not trading_enums.TradeOrderType.MARKET:
124
- # can't use market orders: use limit orders with price a bit under the current price to instant fill it.
125
- price = get_instantly_filled_limit_order_adapted_price(price, order_type)
126
-
127
- # get order quantity
128
- quantity = _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount)
129
- symbol_market = trading_mode.exchange_manager.exchange.get_market_status(symbol, with_fixer=False)
130
- for order_quantity, order_price in \
131
- trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
132
- quantity,
133
- price,
134
- symbol_market
135
- ):
136
- # create order
137
- order = trading_personal_data.create_order_instance(
138
- trader=trading_mode.exchange_manager.trader,
139
- order_type=order_type,
140
- symbol=symbol,
141
- current_price=price,
142
- quantity=order_quantity,
143
- price=order_price
144
- )
145
- created_orders.append(await trading_mode.create_order(order))
114
+ # get symbol price
115
+ price_base = asset
116
+ price_target = target_asset
117
+ if order_type is trading_enums.TraderOrderType.BUY_MARKET:
118
+ price_base = target_asset
119
+ price_target = asset
120
+
121
+ price = trading_personal_data.get_asset_price_from_converter_or_tickers(
122
+ trading_mode.exchange_manager, price_base, price_target, symbol, tickers
123
+ )
124
+
125
+ if not price:
126
+ # can't get price, should not happen as symbol is in client_symbols
127
+ trading_mode.logger.error(
128
+ f"Impossible to convert {asset} into {target_asset}: {symbol} ticker can't be fetched"
129
+ )
130
+ return []
131
+
132
+ if trading_personal_data.get_trade_order_type(order_type) is not trading_enums.TradeOrderType.MARKET:
133
+ # can't use market orders: use limit orders with price a bit under the current price to instant fill it.
134
+ price = get_instantly_filled_limit_order_adapted_price(price, order_type)
135
+
136
+ # get order quantity
137
+ quantity = _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount)
138
+ symbol_market = trading_mode.exchange_manager.exchange.get_market_status(symbol, with_fixer=False)
139
+ created_orders = []
140
+ for order_quantity, order_price in \
141
+ trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
142
+ quantity,
143
+ price,
144
+ symbol_market
145
+ ):
146
+ # create order
147
+ order = trading_personal_data.create_order_instance(
148
+ trader=trading_mode.exchange_manager.trader,
149
+ order_type=order_type,
150
+ symbol=symbol,
151
+ current_price=price,
152
+ quantity=order_quantity,
153
+ price=order_price
154
+ )
155
+ initialized_order = await trading_mode.create_order(order)
156
+ if isinstance(initialized_order, trading_personal_data.LimitOrder) and initialized_order.simulated:
157
+ # on simulator, this order should be instantly filled now as its price is meant to be instantly filled
158
+ await initialized_order.on_fill()
159
+ created_orders.append(initialized_order)
146
160
  return created_orders
147
161
 
148
162
 
@@ -19,4 +19,4 @@ sortedcontainers==2.4.0
19
19
  tinydb==4.5.2
20
20
 
21
21
  # Caching
22
- cachetools==5.3.2
22
+ cachetools>=5.5.0, <6
@@ -16,6 +16,7 @@
16
16
  # License along with this library.
17
17
  import decimal
18
18
 
19
+ import mock
19
20
  from mock import patch
20
21
 
21
22
  import octobot_trading.exchanges.connectors as exchange_connectors
@@ -58,11 +59,13 @@ async def test_initialize_impl_with_none_symbols_and_timeframes(ccxt_connector):
58
59
  def setSandboxMode(self, is_sandboxed):
59
60
  pass
60
61
 
61
- with patch.object(ccxt_connector, 'client', new=MockCCXT()) as mocked_ccxt:
62
+ with patch.object(ccxt_connector, 'client', new=MockCCXT()) as mocked_ccxt, \
63
+ patch.object(ccxt_connector, '_ensure_auth', new=mock.AsyncMock()) as _ensure_auth_mock:
62
64
  await ccxt_connector.initialize_impl()
63
65
  assert ccxt_connector.symbols == set()
64
66
  assert ccxt_connector.time_frames == set()
65
67
  assert mocked_ccxt.set_markets_calls in ([[]], []) # depends on call order
68
+ _ensure_auth_mock.assert_called_once()
66
69
 
67
70
 
68
71
  async def test_initialize_impl_with_empty_symbols_and_timeframes(ccxt_connector):
@@ -84,11 +87,13 @@ async def test_initialize_impl_with_empty_symbols_and_timeframes(ccxt_connector)
84
87
  def setSandboxMode(self, is_sandboxed):
85
88
  pass
86
89
 
87
- with patch.object(ccxt_connector, 'client', new=MockCCXT()) as mocked_ccxt:
90
+ with patch.object(ccxt_connector, 'client', new=MockCCXT()) as mocked_ccxt, \
91
+ patch.object(ccxt_connector, '_ensure_auth', new=mock.AsyncMock()) as _ensure_auth_mock:
88
92
  await ccxt_connector.initialize_impl()
89
93
  assert ccxt_connector.symbols == set()
90
94
  assert ccxt_connector.time_frames == set()
91
95
  assert mocked_ccxt.set_markets_calls in ([[]], []) # depends on call order
96
+ _ensure_auth_mock.assert_called_once()
92
97
 
93
98
 
94
99
  async def test_initialize_impl(ccxt_connector):
@@ -120,7 +125,8 @@ async def test_initialize_impl(ccxt_connector):
120
125
  def setSandboxMode(self, is_sandboxed):
121
126
  pass
122
127
 
123
- with patch.object(ccxt_connector, 'client', new=MockCCXT()) as mocked_ccxt:
128
+ with patch.object(ccxt_connector, 'client', new=MockCCXT()) as mocked_ccxt, \
129
+ patch.object(ccxt_connector, '_ensure_auth', new=mock.AsyncMock()) as _ensure_auth_mock:
124
130
  await ccxt_connector.initialize_impl()
125
131
  assert ccxt_connector.symbols == {
126
132
  "BTC/USDT",
@@ -133,6 +139,7 @@ async def test_initialize_impl(ccxt_connector):
133
139
  "4h",
134
140
  }
135
141
  assert mocked_ccxt.set_markets_calls in ([[]], []) # depends on call order
142
+ _ensure_auth_mock.assert_called_once()
136
143
 
137
144
 
138
145
  async def test_set_symbol_partial_take_profit_stop_loss(ccxt_connector):
@@ -17,10 +17,12 @@ import mock
17
17
  import pytest
18
18
  import decimal
19
19
 
20
+ import octobot_commons.asyncio_tools as asyncio_tools
20
21
  import octobot_trading.constants as constants
21
22
  import octobot_trading.enums as trading_enums
22
23
  import octobot_trading.personal_data as trading_personal_data
23
24
  import octobot_trading.modes.modes_util as modes_util
25
+ import octobot_trading.signals as signals
24
26
 
25
27
  from tests.exchanges import backtesting_trader, backtesting_config, backtesting_exchange_manager, fake_backtesting
26
28
  from tests import event_loop
@@ -130,6 +132,10 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
130
132
  assert order.symbol == "BTC/USDT"
131
133
  assert order.origin_quantity == decimal.Decimal(10)
132
134
  assert order.created_last_price == decimal.Decimal(30000)
135
+ # market order is instantly filled
136
+ assert order.is_filled()
137
+ assert order.filled_price == order.origin_price
138
+ assert order.filled_quantity > constants.ZERO
133
139
  trading_mode.create_order.assert_called_once()
134
140
  trading_mode.create_order.reset_mock()
135
141
  is_market_open_for_order_type_mock.assert_called_once_with(
@@ -142,8 +148,9 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
142
148
  order = orders[0]
143
149
  assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
144
150
  assert order.symbol == "BTC/USDT"
145
- assert order.origin_quantity == decimal.Decimal("0.03333333")
151
+ assert order.origin_quantity == decimal.Decimal("10.03333333")
146
152
  assert order.created_last_price == decimal.Decimal(30000)
153
+ assert order.is_filled()
147
154
  trading_mode.create_order.assert_called_once()
148
155
  trading_mode.create_order.reset_mock()
149
156
 
@@ -153,6 +160,8 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
153
160
  trading_enums.ExchangeConstantsTickersColumns.CLOSE.value: decimal.Decimal(1500)
154
161
  }
155
162
 
163
+ # reset portfolio
164
+ portfolio["USDT"] = trading_personal_data.SpotAsset("USDT", decimal.Decimal(1000), decimal.Decimal(1000))
156
165
  orders = await modes_util.convert_asset_to_target_asset(trading_mode, "USDT", "ETH", tickers)
157
166
  assert len(orders) == 1
158
167
  order = orders[0]
@@ -160,15 +169,17 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
160
169
  assert order.symbol == "ETH/USDT"
161
170
  assert order.origin_quantity == decimal.Decimal("0.66666666")
162
171
  assert order.created_last_price == decimal.Decimal(1500)
172
+ assert order.is_filled()
163
173
  trading_mode.create_order.assert_called_once()
164
174
  trading_mode.create_order.reset_mock()
165
175
 
176
+ portfolio["ETH"] = trading_personal_data.SpotAsset("ETH", constants.ZERO, constants.ZERO)
166
177
  orders = await modes_util.convert_asset_to_target_asset(trading_mode, "ETH", "USDT", tickers)
167
178
  # no ETH in portfolio
168
179
  assert orders == []
169
180
  trading_mode.create_order.assert_not_called()
170
181
 
171
- portfolio["ETH"] = trading_personal_data.Asset("ETH", constants.ONE, constants.ONE)
182
+ portfolio["ETH"] = trading_personal_data.SpotAsset("ETH", constants.ONE, constants.ONE)
172
183
  orders = await modes_util.convert_asset_to_target_asset(trading_mode, "ETH", "USDT", tickers)
173
184
  assert len(orders) == 1
174
185
  order = orders[0]
@@ -176,10 +187,12 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
176
187
  assert order.symbol == "ETH/USDT"
177
188
  assert order.origin_quantity == decimal.Decimal("1")
178
189
  assert order.created_last_price == decimal.Decimal(1500)
190
+ assert order.is_filled()
179
191
  trading_mode.create_order.assert_called_once()
180
192
  trading_mode.create_order.reset_mock()
181
193
 
182
194
  # with amount param
195
+ portfolio["ETH"] = trading_personal_data.SpotAsset("ETH", decimal.Decimal("2"), decimal.Decimal("2"))
183
196
  orders = await modes_util.convert_asset_to_target_asset(
184
197
  trading_mode, "ETH", "USDT", tickers, asset_amount=decimal.Decimal(2)
185
198
  )
@@ -189,6 +202,7 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
189
202
  assert order.symbol == "ETH/USDT"
190
203
  assert order.origin_quantity == decimal.Decimal(2)
191
204
  assert order.created_last_price == decimal.Decimal(1500)
205
+ assert order.is_filled()
192
206
  trading_mode.create_order.assert_called_once()
193
207
  trading_mode.create_order.reset_mock()
194
208
 
@@ -201,6 +215,7 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
201
215
  assert order.symbol == "ETH/USDT"
202
216
  assert order.origin_quantity == decimal.Decimal("0.3")
203
217
  assert order.created_last_price == decimal.Decimal(1500)
218
+ assert order.is_filled()
204
219
  trading_mode.create_order.assert_called_once()
205
220
  trading_mode.create_order.reset_mock()
206
221
 
@@ -213,6 +228,7 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
213
228
  assert order.symbol == "ETH/USDT"
214
229
  assert order.origin_quantity == decimal.Decimal("0.66666666")
215
230
  assert order.created_last_price == decimal.Decimal(1500)
231
+ assert order.is_filled()
216
232
  trading_mode.create_order.assert_called_once()
217
233
  trading_mode.create_order.reset_mock()
218
234
 
@@ -220,10 +236,12 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
220
236
  fees = {
221
237
  trading_enums.FeePropertyColumns.COST.value: "2",
222
238
  trading_enums.FeePropertyColumns.CURRENCY.value: "USDT",
239
+ trading_enums.FeePropertyColumns.IS_FROM_EXCHANGE.value: True,
223
240
  }
224
241
  with mock.patch.object(exchange_manager.exchange, "get_trade_fee", mock.Mock(return_value=fees)) \
225
242
  as get_trade_fee_mock:
226
243
  # cast 1: enough funds in pf to cover fees
244
+ portfolio["USDT"] = trading_personal_data.SpotAsset("USDT", decimal.Decimal(1000), decimal.Decimal(1000))
227
245
  orders = await modes_util.convert_asset_to_target_asset(
228
246
  trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(450)
229
247
  )
@@ -233,12 +251,14 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
233
251
  assert order.symbol == "ETH/USDT"
234
252
  assert order.origin_quantity == decimal.Decimal("0.3")
235
253
  assert order.created_last_price == decimal.Decimal(1500)
236
- get_trade_fee_mock.assert_called_once()
254
+ assert order.is_filled()
255
+ assert get_trade_fee_mock.call_count == 4
237
256
  get_trade_fee_mock.reset_mock()
238
257
  trading_mode.create_order.assert_called_once()
239
258
  trading_mode.create_order.reset_mock()
240
259
 
241
260
  # cast 2: reduce amount to cover fees
261
+ portfolio["USDT"] = trading_personal_data.SpotAsset("USDT", decimal.Decimal(1000), decimal.Decimal(1000))
242
262
  orders = await modes_util.convert_asset_to_target_asset(
243
263
  trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(1000)
244
264
  )
@@ -248,7 +268,8 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
248
268
  assert order.symbol == "ETH/USDT"
249
269
  assert order.origin_quantity == decimal.Decimal("0.66400000") # lower than 0.66666666 when fees is 0 USDT
250
270
  assert order.created_last_price == decimal.Decimal(1500)
251
- get_trade_fee_mock.assert_called_once()
271
+ assert order.is_filled()
272
+ assert get_trade_fee_mock.call_count == 4
252
273
  trading_mode.create_order.assert_called_once()
253
274
  trading_mode.create_order.reset_mock()
254
275
 
@@ -264,6 +285,7 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
264
285
  mock.Mock(side_effect=_is_market_open_for_order_type)
265
286
  ) as is_market_open_for_order_type_mock:
266
287
  # cast 1: buying
288
+ portfolio["USDT"] = trading_personal_data.SpotAsset("USDT", decimal.Decimal(1000), decimal.Decimal(1000))
267
289
  orders = await modes_util.convert_asset_to_target_asset(
268
290
  trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(450)
269
291
  )
@@ -278,6 +300,10 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
278
300
  )
279
301
  assert order.origin_price == adapted_price
280
302
  assert order.created_last_price == adapted_price
303
+ # limit order is designed to be instantly filled, on simulator it should be filled
304
+ assert order.is_filled()
305
+ assert order.filled_price == order.origin_price
306
+ assert order.filled_quantity > constants.ZERO
281
307
  assert is_market_open_for_order_type_mock.call_count == 2
282
308
  assert is_market_open_for_order_type_mock.mock_calls[0].args == \
283
309
  ("ETH/USDT", trading_enums.TraderOrderType.BUY_MARKET)
@@ -288,6 +314,7 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
288
314
  trading_mode.create_order.reset_mock()
289
315
 
290
316
  # cast 2: selling
317
+ portfolio["USDT"] = trading_personal_data.SpotAsset("USDT", decimal.Decimal(2), decimal.Decimal(2))
291
318
  orders = await modes_util.convert_asset_to_target_asset(
292
319
  trading_mode, "ETH", "USDT", tickers, asset_amount=decimal.Decimal(2)
293
320
  )
@@ -301,6 +328,9 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
301
328
  )
302
329
  assert order.origin_price == adapted_price
303
330
  assert order.created_last_price == adapted_price
331
+ assert order.is_filled()
332
+ assert order.filled_price == order.origin_price
333
+ assert order.filled_quantity > constants.ZERO
304
334
  assert is_market_open_for_order_type_mock.call_count == 2
305
335
  assert is_market_open_for_order_type_mock.mock_calls[0].args == \
306
336
  ("ETH/USDT", trading_enums.TraderOrderType.SELL_MARKET)
@@ -312,7 +342,12 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
312
342
 
313
343
 
314
344
  def _get_trading_mode(exchange_manager):
345
+ async def _create_order(order):
346
+ return await signals.create_order(
347
+ exchange_manager, False, order
348
+ )
349
+
315
350
  return mock.Mock(
316
351
  exchange_manager=exchange_manager,
317
- create_order=mock.AsyncMock(side_effect=lambda x: x)
352
+ create_order=mock.AsyncMock(side_effect=_create_order)
318
353
  )