OctoBot-Trading 2.4.73__tar.gz → 2.4.75__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.73/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.75}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/README.md +1 -1
  5. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/__init__.py +2 -0
  7. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/exchange.py +4 -0
  8. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/constants.py +8 -1
  9. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/errors.py +6 -0
  10. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/__init__.py +4 -0
  11. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/abstract_exchange.py +19 -0
  12. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +6 -2
  13. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/trader.py +5 -2
  14. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/rest_exchange.py +15 -1
  15. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/__init__.py +4 -0
  16. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/exchange_util.py +9 -1
  17. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/orders.py +19 -1
  18. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/orders_updater.py +1 -0
  19. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +4 -0
  20. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_factory.py +3 -0
  21. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/orders_storage_operations.py +28 -4
  22. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/orders_storage.py +8 -2
  23. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/exchanges_test_tools.py +37 -2
  24. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/traders/test_trader.py +33 -0
  25. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/test_exchange_util.py +27 -0
  26. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/LICENSE +0 -0
  27. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/MANIFEST.in +0 -0
  28. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  29. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  30. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  31. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/requires.txt +0 -0
  32. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  33. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/channels.py +0 -0
  34. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/contracts.py +0 -0
  35. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/modes.py +0 -0
  36. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/orders.py +0 -0
  37. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/portfolio.py +0 -0
  38. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/positions.py +0 -0
  39. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/profitability.py +0 -0
  40. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/storage.py +0 -0
  41. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/symbol_data.py +0 -0
  42. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/trader.py +0 -0
  43. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/trades.py +0 -0
  44. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/enums.py +0 -0
  45. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_channel.py +0 -0
  46. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/__init__.py +0 -0
  47. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  48. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  49. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  50. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  51. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  52. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  53. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  56. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  57. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  58. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  59. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  61. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  62. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  63. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  64. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  65. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  66. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  67. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  68. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  69. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  70. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  71. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  72. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  73. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  76. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  77. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  78. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  79. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  80. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  82. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  83. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  84. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  85. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  86. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  89. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  90. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  92. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  95. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  96. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  97. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  98. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  99. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  101. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/config/__init__.py +0 -0
  102. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  103. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  104. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  107. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  108. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  109. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  110. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  111. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  112. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  113. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  114. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  115. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  116. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_builder.py +0 -0
  117. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_channels.py +0 -0
  118. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_details.py +0 -0
  119. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_factory.py +0 -0
  120. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_manager.py +0 -0
  121. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  122. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchanges.py +0 -0
  123. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  126. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  127. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  129. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  131. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  132. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  133. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  134. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  136. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  138. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  139. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/mode.py +0 -0
  140. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/mode_activity.py +0 -0
  141. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/mode_config.py +0 -0
  142. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/modes_factory.py +0 -0
  143. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/modes_util.py +0 -0
  144. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  147. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  148. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  149. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  150. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  151. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  163. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  166. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  167. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  168. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  169. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  170. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order.py +0 -0
  171. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  172. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_group.py +0 -0
  173. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_state.py +0 -0
  174. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_util.py +0 -0
  175. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  176. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  178. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  179. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  180. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  182. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  185. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  187. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  191. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  193. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  195. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  196. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  197. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  200. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  201. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  202. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  203. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  204. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  205. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  206. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  207. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  208. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  210. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  211. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  212. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  214. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  215. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  216. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  217. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  218. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  219. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  220. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  221. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  222. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  223. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  228. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  231. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  232. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  233. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position.py +0 -0
  234. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  235. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position_state.py +0 -0
  236. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position_util.py +0 -0
  237. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  238. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  243. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  245. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  246. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/state.py +0 -0
  247. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  250. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  251. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trade.py +0 -0
  252. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  253. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  254. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  255. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  256. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  258. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  259. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  260. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/__init__.py +0 -0
  267. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  268. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  269. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/signal_producer.py +0 -0
  270. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/signal_creation.py +0 -0
  271. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  272. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/util.py +0 -0
  273. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/abstract_storage.py +0 -0
  275. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/candles_storage.py +0 -0
  276. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/portfolio_storage.py +0 -0
  277. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/storage_manager.py +0 -0
  278. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/trades_storage.py +0 -0
  279. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/transactions_storage.py +0 -0
  280. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/util.py +0 -0
  281. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/supervisors/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  283. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/config_util.py +0 -0
  286. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/initializable.py +0 -0
  287. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/initialization_util.py +0 -0
  288. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/simulator_updater_utils.py +0 -0
  289. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/__init__.py +0 -0
  290. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  291. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  292. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/requirements.txt +0 -0
  294. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/setup.cfg +0 -0
  295. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/setup.py +0 -0
  296. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/__init__.py +0 -0
  297. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_channels.py +0 -0
  298. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_exchange.py +0 -0
  299. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_modes.py +0 -0
  300. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_orders.py +0 -0
  301. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_portfolio.py +0 -0
  302. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_profitability.py +0 -0
  303. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_symbol_data.py +0 -0
  304. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_trader.py +0 -0
  305. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_trades.py +0 -0
  306. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/cli/__init__.py +0 -0
  307. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/contracts/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  310. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  311. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/funding/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  313. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/kline/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  315. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ohlcv/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  317. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  318. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/order_book/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  320. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/prices/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  322. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  323. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/recent_trades/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  325. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  326. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ticker/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  328. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  332. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  333. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/implementations/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  336. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_abstract_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_builder.py +0 -0
  339. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_config_data.py +0 -0
  340. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_factory.py +0 -0
  341. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_manager.py +0 -0
  342. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_simulator.py +0 -0
  343. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchanges.py +0 -0
  344. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/traders/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/types/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  347. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  349. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  353. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  354. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  355. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  356. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  358. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/test_abstract_mode_consumer.py +0 -0
  359. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/test_abstract_trading_mode.py +0 -0
  360. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/test_modes_util.py +0 -0
  361. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  365. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  366. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  367. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  369. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  374. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  377. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  378. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order.py +0 -0
  379. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order_adapter.py +0 -0
  380. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order_factory.py +0 -0
  381. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order_util.py +0 -0
  382. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_orders_manager.py +0 -0
  383. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  384. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  387. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  391. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  393. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/market/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  395. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  397. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  399. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  400. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  403. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  404. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  405. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/history/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  407. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  408. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_asset.py +0 -0
  409. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  410. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  411. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  412. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  413. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  414. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/channel/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/states/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/test_position.py +0 -0
  422. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/test_position_factory.py +0 -0
  423. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/test_positions_manager.py +0 -0
  424. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/types/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  426. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  427. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_factory.py +0 -0
  429. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_manager.py +0 -0
  430. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  431. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_util.py +0 -0
  432. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/transactions/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  434. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  435. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/signals/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  437. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/signals/test_util.py +0 -0
  438. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/test_utils/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/test_utils/order_util.py +0 -0
  440. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/test_utils/random_numbers.py +0 -0
  441. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/util/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/util/test_config_util.py +0 -0
  443. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  448. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_binance.py +0 -0
  449. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  450. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bingx.py +0 -0
  451. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  452. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitget.py +0 -0
  453. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  454. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitso.py +0 -0
  455. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  456. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bybit.py +0 -0
  457. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  458. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  459. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_coinex.py +0 -0
  460. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  461. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_gateio.py +0 -0
  462. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  463. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  464. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_htx.py +0 -0
  465. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_kraken.py +0 -0
  466. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  467. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  468. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_mexc.py +0 -0
  469. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_ndax.py +0 -0
  470. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  471. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_okx.py +0 -0
  472. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  473. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_phemex.py +0 -0
  474. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  475. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_upbit.py +0 -0
  476. {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.4.75] - 2024-04-11
8
+ ### Fixed
9
+ - [Exchanges] Properly handle order not found errors
10
+ - [Order] Rare synch issues on creation
11
+ - [Order] Missing ungrouped stop orders when restarting
12
+
13
+ ## [2.4.74] - 2024-04-07
14
+ ### Added
15
+ - [Exchanges] ExchangeCompliancyError error
16
+
7
17
  ## [2.4.73] - 2024-04-04
8
18
  ### Added
9
19
  - [Exchanges] BinanceUS to full history exchanges
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.73
3
+ Version: 2.4.75
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.73](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.75](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.73
3
+ Version: 2.4.75
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.73](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.75](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.73](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.75](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.73" # major.minor.revision
18
+ VERSION = "2.4.75" # major.minor.revision
@@ -121,6 +121,7 @@ from octobot_trading.api.exchange import (
121
121
  get_auto_filled_exchange_names,
122
122
  get_exchange_details,
123
123
  is_api_permission_error,
124
+ is_exchange_rules_compliancy_error,
124
125
  cancel_ccxt_throttle_task,
125
126
  stop_exchange,
126
127
  )
@@ -301,6 +302,7 @@ __all__ = [
301
302
  "get_auto_filled_exchange_names",
302
303
  "get_exchange_details",
303
304
  "is_api_permission_error",
305
+ "is_exchange_rules_compliancy_error",
304
306
  "cancel_ccxt_throttle_task",
305
307
  "stop_exchange",
306
308
  "get_trading_modes",
@@ -326,6 +326,10 @@ def is_api_permission_error(error: BaseException) -> bool:
326
326
  return exchanges.is_api_permission_error(error)
327
327
 
328
328
 
329
+ def is_exchange_rules_compliancy_error(error: BaseException) -> bool:
330
+ return exchanges.is_exchange_rules_compliancy_error(error)
331
+
332
+
329
333
  def cancel_ccxt_throttle_task():
330
334
  for task in asyncio.all_tasks():
331
335
  # manually cancel ccxt async throttle task since it apparently can't be cancelled otherwise
@@ -42,6 +42,7 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
42
42
  ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
43
43
  CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
44
44
  CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
45
+ CREATED_ORDER_FORCED_UPDATE_PERIOD = 5
45
46
 
46
47
  # Tentacles
47
48
  TRADING_MODE_REQUIRED_STRATEGIES = "required_strategies"
@@ -104,6 +105,7 @@ TESTED_EXCHANGES = [
104
105
  "kucoin",
105
106
  "okx",
106
107
  ] + sorted([
108
+ "binanceus",
107
109
  "coinbase",
108
110
  "cryptocom",
109
111
  "htx",
@@ -115,7 +117,6 @@ TESTED_EXCHANGES = [
115
117
  "hollaex",
116
118
  "mexc",
117
119
  "bingx",
118
- "bitget",
119
120
  "coinex",
120
121
  ])
121
122
  DEFAULT_FUTURE_EXCHANGES = sorted(["bybit"])
@@ -133,6 +134,12 @@ EXCHANGE_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = [
133
134
  ("permission_denied", )
134
135
  ]
135
136
 
137
+ # text content of errors due to exchange compliancy rules
138
+ EXCHANGE_COMPLIANCY_ERRORS: typing.List[typing.Iterable[str]] = [
139
+ # OKX ex: Trading of this pair or contract is restricted due to local compliance requirements
140
+ ("restricted", "compliance"),
141
+ ]
142
+
136
143
  CONFIG_DEFAULT_FEES = 0.001
137
144
  CONFIG_DEFAULT_SIMULATOR_FEES = 0
138
145
 
@@ -99,6 +99,12 @@ class AuthenticationError(Exception):
99
99
  """
100
100
 
101
101
 
102
+ class ExchangeCompliancyError(Exception):
103
+ """
104
+ Raised when an exchange failed to execute the given request because of compliance rules for the current user account
105
+ """
106
+
107
+
102
108
  class PortfolioNegativeValueError(Exception):
103
109
  """
104
110
  Raised when the portfolio is being updated with a negative value
@@ -77,6 +77,8 @@ from octobot_trading.exchanges.util import (
77
77
  get_auto_filled_exchange_names,
78
78
  get_exchange_details,
79
79
  is_api_permission_error,
80
+ is_exchange_rules_compliancy_error,
81
+ is_error_on_this_type,
80
82
  force_disable_web_socket,
81
83
  check_web_socket_config,
82
84
  search_websocket_class,
@@ -162,6 +164,8 @@ __all__ = [
162
164
  "get_auto_filled_exchange_names",
163
165
  "get_exchange_details",
164
166
  "is_api_permission_error",
167
+ "is_exchange_rules_compliancy_error",
168
+ "is_error_on_this_type",
165
169
  "AbstractExchange",
166
170
  "is_channel_managed_by_websocket",
167
171
  "is_channel_fully_managed_by_websocket",
@@ -17,6 +17,7 @@ import asyncio
17
17
  import typing
18
18
  import decimal
19
19
  import time
20
+ import contextlib
20
21
 
21
22
  import octobot_commons.constants
22
23
  import octobot_commons.enums as common_enums
@@ -94,6 +95,8 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
94
95
 
95
96
  self.is_unreachable = False
96
97
 
98
+ self._creating_exchange_order_ids = set()
99
+
97
100
  if self.exchange_manager.tentacles_setup_config is not None:
98
101
  self.load_user_inputs_from_class(self.exchange_manager.tentacles_setup_config, self.tentacle_config)
99
102
 
@@ -698,3 +701,19 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
698
701
  def handle_token_error(self, error):
699
702
  self.logger.error(f"Exchange configuration is invalid : please check your configuration ! "
700
703
  f"({error.__class__.__name__}: {error})")
704
+
705
+ @contextlib.contextmanager
706
+ def creating_order(self, creating_order: dict):
707
+ exchange_order_id = creating_order.get(
708
+ enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value
709
+ ) if creating_order else None
710
+ try:
711
+ self._creating_exchange_order_ids.add(exchange_order_id)
712
+ yield
713
+ finally:
714
+ self._creating_exchange_order_ids.remove(exchange_order_id)
715
+
716
+ def is_creating_order(self, exchange_order_id):
717
+ if exchange_order_id is None:
718
+ return False
719
+ return exchange_order_id in self._creating_exchange_order_ids
@@ -351,8 +351,12 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
351
351
  # some exchanges are throwing this error when an order is cancelled (ex: coinbase pro)
352
352
  raise octobot_trading.errors.NotSupported(e) from e
353
353
  except ccxt.ExchangeError as e:
354
- # something went wrong and ccxt did not expect it
355
- raise octobot_trading.errors.FailedRequest(e) from e
354
+ if self.exchange_manager.exchange.is_order_not_found_error(e):
355
+ # when an OrderNotFound error should have been raised but is not for some reason
356
+ pass
357
+ else:
358
+ # something went wrong and ccxt did not expect it
359
+ raise octobot_trading.errors.FailedRequest(e) from e
356
360
  else:
357
361
  # When fetch_order is not supported, uses get_open_orders or get_closed_orders and extract order id
358
362
  for method in (self.get_open_orders, self.get_closed_orders):
@@ -1,3 +1,4 @@
1
+ # pylint: disable=W0706
1
2
  # Drakkar-Software OctoBot-Trading
2
3
  # Copyright (c) Drakkar-Software, All rights reserved.
3
4
  #
@@ -117,7 +118,7 @@ class Trader(util.Initializable):
117
118
  self.logger.warning(f"Order not created on {self.exchange_manager.exchange_name} "
118
119
  f"(failed attempt to create: {order}). This is likely due to "
119
120
  f"the order being refused by the exchange.")
120
- except errors.MissingFunds:
121
+ except (errors.MissingFunds, errors.AuthenticationError, errors.ExchangeCompliancyError):
121
122
  # forward errors that require actions to fix the situation
122
123
  raise
123
124
  except Exception as e:
@@ -278,7 +279,9 @@ class Trader(util.Initializable):
278
279
 
279
280
  if is_pending_creation:
280
281
  # register order as pending order, it will then be added to live orders in order manager once open
281
- self.exchange_manager.exchange_personal_data.orders_manager.register_pending_creation_order(updated_order)
282
+ self.exchange_manager.exchange_personal_data.orders_manager.register_pending_creation_order(
283
+ updated_order
284
+ )
282
285
 
283
286
  await updated_order.initialize()
284
287
  if is_pending_creation and wait_for_creation \
@@ -89,6 +89,9 @@ class RestExchange(abstract_exchange.AbstractExchange):
89
89
  # Set when order cost is not (yet) accurately computed for a given exchange
90
90
  MAX_INCREASED_POSITION_QUANTITY_MULTIPLIER = constants.ONE
91
91
 
92
+ # text content of errors due to orders not found errors
93
+ EXCHANGE_ORDER_NOT_FOUND_ERRORS: typing.List[typing.Iterable[str]] = []
94
+
92
95
  DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
93
96
 
94
97
  def __init__(self, config, exchange_manager, connector_class=None):
@@ -152,7 +155,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
152
155
  stop_price=stop_price, side=side, current_price=current_price,
153
156
  reduce_only=reduce_only, params=params)
154
157
  self.logger.debug(f"Created order: {created_order}")
155
- return await self._verify_order(created_order, order_type, symbol, price, side)
158
+ with self.creating_order(created_order):
159
+ return await self._verify_order(created_order, order_type, symbol, price, side)
156
160
  return None
157
161
 
158
162
  async def edit_order(self, exchange_order_id: str, order_type: enums.TraderOrderType, symbol: str,
@@ -211,6 +215,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
211
215
  raise errors.AuthenticationError(
212
216
  f"Error when handling order {e}. Please make sure that trading permissions are on for this API key."
213
217
  )
218
+ if exchanges_util.is_exchange_rules_compliancy_error(e):
219
+ raise errors.ExchangeCompliancyError(
220
+ f"Error when handling order {e}. Exchange is refusing this order request on this account because "
221
+ f"of its compliancy requirements."
222
+ )
214
223
  self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
215
224
  print(traceback.format_exc(), file=sys.stderr)
216
225
  self.logger.exception(e, False, f"Unexpected error during order operation: {e}")
@@ -861,6 +870,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
861
870
  def is_skipping_empty_candles_in_ohlcv_fetch(self):
862
871
  return self.IS_SKIPPING_EMPTY_CANDLES_IN_OHLCV_FETCH
863
872
 
873
+ def is_order_not_found_error(self, error: BaseException) -> bool:
874
+ if self.EXCHANGE_ORDER_NOT_FOUND_ERRORS:
875
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_NOT_FOUND_ERRORS)
876
+ return False
877
+
864
878
  """
865
879
  Auto fetched and filled exchanges
866
880
  """
@@ -45,6 +45,8 @@ from octobot_trading.exchanges.util.exchange_util import (
45
45
  get_auto_filled_exchange_names,
46
46
  get_exchange_details,
47
47
  is_api_permission_error,
48
+ is_exchange_rules_compliancy_error,
49
+ is_error_on_this_type,
48
50
  )
49
51
  from octobot_trading.exchanges.util import websockets_util
50
52
  from octobot_trading.exchanges.util.websockets_util import (
@@ -78,6 +80,8 @@ __all__ = [
78
80
  "get_auto_filled_exchange_names",
79
81
  "get_exchange_details",
80
82
  "is_api_permission_error",
83
+ "is_exchange_rules_compliancy_error",
84
+ "is_error_on_this_type",
81
85
  "force_disable_web_socket",
82
86
  "check_web_socket_config",
83
87
  "search_websocket_class",
@@ -429,8 +429,16 @@ def get_associated_symbol(exchange_manager, asset: str, target_asset: str) -> (t
429
429
 
430
430
 
431
431
  def is_api_permission_error(error: BaseException) -> bool:
432
+ return is_error_on_this_type(error, constants.EXCHANGE_PERMISSION_ERRORS)
433
+
434
+
435
+ def is_exchange_rules_compliancy_error(error: BaseException) -> bool:
436
+ return is_error_on_this_type(error, constants.EXCHANGE_COMPLIANCY_ERRORS)
437
+
438
+
439
+ def is_error_on_this_type(error: BaseException, descriptions: typing.List[typing.Iterable[str]]) -> bool:
432
440
  lower_error = str(error).lower()
433
- for identifiers in constants.EXCHANGE_PERMISSION_ERRORS:
441
+ for identifiers in descriptions:
434
442
  if all(identifier in lower_error for identifier in identifiers):
435
443
  return True
436
444
  return False
@@ -36,11 +36,19 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
36
36
  pending_groups = {} # Used when restoring orders from order storage:
37
37
  # a dict of order groups for which to check if associated self-managed orders are to be created
38
38
  for order in orders:
39
+ exchange_order_id: str = self.channel.exchange_manager.exchange.parse_exhange_order_id(order)
39
40
  symbol = self.channel.exchange_manager.get_exchange_symbol(
40
41
  self.channel.exchange_manager.exchange.parse_order_symbol(order)
41
42
  )
43
+ if self.channel.exchange_manager.exchange.is_creating_order(exchange_order_id):
44
+ # ignore orders that are being created
45
+ self.logger.debug(
46
+ f"Ignored update from order channel for {symbol} order with exchange order id "
47
+ f"{exchange_order_id} as "
48
+ f"this order is being created and will automatically be updated once creation is complete."
49
+ )
50
+ continue
42
51
  symbols.add(symbol)
43
- exchange_order_id: str = self.channel.exchange_manager.exchange.parse_exhange_order_id(order)
44
52
 
45
53
  # if this order was not managed by order_manager before
46
54
  is_new_order = not self.channel.exchange_manager.exchange_personal_data.orders_manager. \
@@ -83,6 +91,16 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
83
91
  except Exception as e:
84
92
  self.logger.exception(e, True, f"Exception when triggering update: {e}")
85
93
 
94
+ async def _restore_required_virtual_orders(self):
95
+ """
96
+ Restore virtual orders that would not be restored otherwise
97
+ Should only be called once or will create the same virtual orders multiple times
98
+ """
99
+ pending_groups = {}
100
+ await orders_storage_operations.create_required_virtual_orders(
101
+ pending_groups, self.channel.exchange_manager
102
+ )
103
+
86
104
  async def _handle_open_order_update(
87
105
  self, symbol, order_dict, exchange_order_id, is_from_bot, is_new_order, pending_groups
88
106
  ):
@@ -76,6 +76,7 @@ class OrdersUpdater(orders_channel.OrdersProducer):
76
76
  self.DEPENDENCIES_TIMEOUT
77
77
  )
78
78
  await self.fetch_and_push(is_from_bot=False, retry_till_success=True)
79
+ await self._restore_required_virtual_orders()
79
80
  except errors.NotSupported:
80
81
  self.logger.error(f"{self.channel.exchange_manager.exchange_name} is not supporting open orders updates")
81
82
  await self.pause()
@@ -33,3 +33,7 @@ class OrdersUpdaterSimulator(orders_updater.OrdersUpdater):
33
33
  """
34
34
  Used to subscribe at least one recent trades consumer during backtesting
35
35
  """
36
+
37
+ async def _restore_required_virtual_orders(self):
38
+ # nothing to do
39
+ pass
@@ -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 octobot_commons.logging as logging
17
+
16
18
  import octobot_trading.personal_data as personal_data
17
19
  import octobot_trading.enums as enums
18
20
  import octobot_trading.constants as constants
@@ -150,3 +152,4 @@ async def restore_chained_orders_from_storage_order_details(order, order_details
150
152
  **chained_order.get(enums.StoredOrdersAttr.TRADER_CREATION_KWARGS.value, {}),
151
153
  )
152
154
  order.add_chained_order(chained_order_inst)
155
+ logging.get_logger(order.get_logger_name()).debug(f"Restored chained order: {chained_order_inst}")
@@ -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 octobot_commons.logging as logging
17
+ import octobot_trading.enums as enums
17
18
  import octobot_trading.personal_data.orders.order_factory as order_factory
18
19
  import octobot_trading.personal_data.orders.groups.group_util as group_util
19
20
 
@@ -30,6 +31,7 @@ async def apply_order_storage_details_if_any(order, exchange_manager, pending_gr
30
31
  order.exchange_order_id
31
32
  )
32
33
  if order_details:
34
+ logging.get_logger(LOGGER_NAME).debug(f"Updating fetched order {order} using stored order details")
33
35
  order.update_from_storage_order_details(order_details)
34
36
  await create_orders_storage_related_elements(order, order_details, exchange_manager, pending_groups)
35
37
 
@@ -45,21 +47,43 @@ async def create_orders_storage_related_elements(order, order_storage_details, e
45
47
  )
46
48
 
47
49
 
50
+ async def create_order_from_storage_data(order_desc: dict, exchange_manager, pending_groups):
51
+ created_order = await order_factory.create_order_from_order_storage_details(
52
+ order_desc, exchange_manager, pending_groups
53
+ )
54
+ await created_order.initialize()
55
+ return created_order
56
+
57
+
48
58
  async def _create_storage_self_managed_orders_from_group(pending_group_id, exchange_manager, pending_groups):
49
59
  try:
50
60
  to_create_orders = exchange_manager.storage_manager.orders_storage \
51
61
  .get_startup_self_managed_orders_details_from_group(pending_group_id)
52
62
  for order_desc in to_create_orders:
53
- created_order = await order_factory.create_order_from_order_storage_details(
54
- order_desc, exchange_manager, pending_groups
55
- )
56
- await created_order.initialize()
63
+ await create_order_from_storage_data(order_desc, exchange_manager, pending_groups)
57
64
  except Exception as err:
58
65
  logging.get_logger(LOGGER_NAME).exception(
59
66
  err, True, f"Error when creating {pending_group_id} group self-managed orders with stored data: {err}"
60
67
  )
61
68
 
62
69
 
70
+ async def create_required_virtual_orders(pending_groups, exchange_manager):
71
+ virtual_orders = exchange_manager.storage_manager.orders_storage.get_all_self_managed_startup_orders()
72
+ # virtual order that are not within a group will only be restored here
73
+ virtual_non_grouped_order_details = [
74
+ order
75
+ for order in virtual_orders
76
+ if order.get(enums.StoredOrdersAttr.GROUP.value, {}) == {}
77
+ ]
78
+ logger = logging.get_logger(LOGGER_NAME)
79
+ for order_details in virtual_non_grouped_order_details:
80
+ try:
81
+ order = await create_order_from_storage_data(order_details, exchange_manager, pending_groups)
82
+ logger.debug(f"Restored order from storage: {order}")
83
+ except Exception as err:
84
+ logger.exception(err, True, f"Error when restoring virtual order order using stored data: {err}")
85
+
86
+
63
87
  async def create_missing_self_managed_orders_from_storage_order_groups(pending_groups, exchange_manager):
64
88
  # create order groups' associated self-managed orders if any
65
89
  to_complete_groups = list(pending_groups.keys())
@@ -124,10 +124,16 @@ class OrdersStorage(abstract_storage.AbstractStorage):
124
124
  def get_startup_self_managed_orders_details_from_group(self, group_id):
125
125
  return [
126
126
  order
127
- for order in self.startup_orders.values()
127
+ for order in self.get_all_self_managed_startup_orders()
128
128
  if order.get(enums.StoredOrdersAttr.GROUP.value, {}).get(enums.StoredOrdersAttr.GROUP_ID.value, None)
129
129
  == group_id
130
- and order.get(constants.STORAGE_ORIGIN_VALUE, {})
130
+ ]
131
+
132
+ def get_all_self_managed_startup_orders(self):
133
+ return [
134
+ order
135
+ for order in self.startup_orders.values()
136
+ if order.get(constants.STORAGE_ORIGIN_VALUE, {})
131
137
  .get(enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value, False)
132
138
  ]
133
139
 
@@ -21,6 +21,8 @@ import typing
21
21
  import octobot_commons.asyncio_tools as asyncio_tools
22
22
  import octobot_commons.enums as common_enums
23
23
  import octobot_commons.constants as commons_constants
24
+ import octobot_commons.logging as logging
25
+ import octobot_trading.constants as constants
24
26
  import octobot_trading.enums as enums
25
27
  import octobot_trading.api as trading_api
26
28
  import octobot_trading.exchanges as exchanges
@@ -172,7 +174,12 @@ async def get_trades(
172
174
  return trades
173
175
 
174
176
 
175
- async def create_orders(exchange_manager, exchange_data: exchange_data_import.ExchangeData, orders: list) -> list:
177
+ async def create_orders(
178
+ exchange_manager,
179
+ exchange_data: exchange_data_import.ExchangeData,
180
+ orders: list,
181
+ order_creation_timeout: float
182
+ ) -> list:
176
183
  async def _create_order(order_dict) -> personal_data.Order:
177
184
  symbol = order_dict[enums.ExchangeConstantsOrderColumns.SYMBOL.value]
178
185
  side, order_type = personal_data.parse_order_type(order_dict)
@@ -186,8 +193,36 @@ async def create_orders(exchange_manager, exchange_data: exchange_data_import.Ex
186
193
  reduce_only=order_dict[enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value],
187
194
  )
188
195
  # is private, to use in tests context only
189
- return personal_data.create_order_instance_from_raw(
196
+ order = personal_data.create_order_instance_from_raw(
190
197
  exchange_manager.trader, created_order, force_open_or_pending_creation=True
191
198
  ) if created_order else None
199
+ if not order:
200
+ return order
201
+ if order.status is enums.OrderStatus.PENDING_CREATION and order_creation_timeout > 0:
202
+ try:
203
+ return await wait_for_other_status(order, order_creation_timeout)
204
+ except TimeoutError as err:
205
+ logging.get_logger(order.get_logger_name()).error(f"Created order can't be fetched: {err}")
206
+ return None
207
+ return order
192
208
 
193
209
  return await asyncio.gather(*(_create_order(order_dict) for order_dict in orders))
210
+
211
+
212
+ async def wait_for_other_status(order: personal_data.Order, timeout) -> personal_data.Order:
213
+ t0 = time.time()
214
+ iterations = 0
215
+ origin_status = order.status.value
216
+ while time.time() - t0 < timeout:
217
+ raw_order = await order.exchange_manager.exchange.get_order(order.exchange_order_id, order.symbol)
218
+ iterations += 1
219
+ if raw_order is not None and raw_order[enums.ExchangeConstantsOrderColumns.STATUS.value] != origin_status:
220
+ logging.get_logger(order.get_logger_name()).info(
221
+ f"Order fetched with status different from {origin_status} after {iterations} "
222
+ f"iterations and {round(time.time() - t0)}s"
223
+ )
224
+ return personal_data.create_order_instance_from_raw(
225
+ order.trader, raw_order, force_open_or_pending_creation=False
226
+ )
227
+ await asyncio.sleep(constants.CREATED_ORDER_FORCED_UPDATE_PERIOD)
228
+ raise TimeoutError(f"Order was not found with another status than {origin_status} within {timeout} seconds")
@@ -18,6 +18,7 @@ import os
18
18
  import ccxt.async_support
19
19
  import decimal
20
20
 
21
+ import mock
21
22
  import pytest
22
23
  import time
23
24
  from mock import AsyncMock, patch, Mock
@@ -28,6 +29,7 @@ import octobot_commons.constants as commons_constants
28
29
  from octobot_commons.asyncio_tools import wait_asyncio_next_cycle
29
30
  from octobot_commons.tests.test_config import load_test_config
30
31
  from octobot_trading.personal_data.orders import Order
32
+ import octobot_trading.errors as errors
31
33
  from octobot_trading.enums import TraderOrderType, TradeOrderSide, TradeOrderType, OrderStatus, \
32
34
  ExchangeConstantsPositionColumns, PositionMode, MarginType, TakeProfitStopLossMode, ExchangeSupportedElements
33
35
  from octobot_trading.exchanges.exchange_manager import ExchangeManager
@@ -1080,6 +1082,37 @@ async def test__has_open_position(future_trader_simulator_with_default_linear):
1080
1082
  assert trader_inst._has_open_position(DEFAULT_FUTURE_SYMBOL)
1081
1083
 
1082
1084
 
1085
+ async def test_create_order(future_trader_simulator_with_default_linear):
1086
+ _, exchange_manager_inst, trader_inst, default_contract = future_trader_simulator_with_default_linear
1087
+ order_mock = mock.Mock()
1088
+ with mock.patch.object(trader_inst, "_create_new_order", mock.AsyncMock()) as _create_new_order_mock:
1089
+ assert await trader_inst.create_order(order_mock)
1090
+ _create_new_order_mock.assert_called_once_with(
1091
+ order_mock, {}, wait_for_creation=True, creation_timeout=constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
1092
+ )
1093
+ for err in (errors.MissingFunds, errors.AuthenticationError, errors.ExchangeCompliancyError):
1094
+ with mock.patch.object(
1095
+ trader_inst, "_create_new_order", mock.AsyncMock(side_effect=err)
1096
+ ) as _create_new_order_mock:
1097
+ with pytest.raises(err):
1098
+ assert await trader_inst.create_order(
1099
+ order_mock, params="params", wait_for_creation=False, creation_timeout=1
1100
+ )
1101
+ _create_new_order_mock.assert_called_once_with(
1102
+ order_mock, "params", wait_for_creation=False, creation_timeout=1
1103
+ )
1104
+ with mock.patch.object(
1105
+ trader_inst, "_create_new_order", mock.AsyncMock(side_effect=ZeroDivisionError)
1106
+ ) as _create_new_order_mock:
1107
+ # does not raise
1108
+ assert await trader_inst.create_order(
1109
+ order_mock, params="params", wait_for_creation=False, creation_timeout=1
1110
+ ) is None
1111
+ _create_new_order_mock.assert_called_once_with(
1112
+ order_mock, "params", wait_for_creation=False, creation_timeout=1
1113
+ )
1114
+
1115
+
1083
1116
  def make_coroutine(response):
1084
1117
  async def coroutine(*args, **kwargs):
1085
1118
  return response
@@ -19,7 +19,9 @@ import mock
19
19
  import trading_backend.exchanges
20
20
  import octobot_commons.constants as commons_constants
21
21
  import octobot_commons.configuration as commons_configuration
22
+ import octobot_trading.constants as constants
22
23
  import octobot_trading.exchanges as exchanges
24
+ import octobot_trading.exchanges.util.exchange_util as exchange_util
23
25
 
24
26
  from tests import event_loop
25
27
  from tests.exchanges import MockedRestExchange, MockedAutoFillRestExchange
@@ -240,3 +242,28 @@ async def test_get_exchange_details(tentacles_setup_config, supported_exchanges)
240
242
  )
241
243
  assert details == supported_exchanges["blip"]
242
244
  get_tentacle_config_mock.assert_called_once()
245
+
246
+
247
+ def test_is_api_permission_error():
248
+ with mock.patch.object(exchange_util, "is_error_on_this_type") as is_error_on_this_type_mock:
249
+ err = Exception("plop")
250
+ exchanges.is_api_permission_error(err)
251
+ is_error_on_this_type_mock.assert_called_once_with(
252
+ err, constants.EXCHANGE_PERMISSION_ERRORS
253
+ )
254
+
255
+
256
+ def test_is_exchange_rules_compliancy_error():
257
+ with mock.patch.object(exchange_util, "is_error_on_this_type") as is_error_on_this_type_mock:
258
+ err = Exception("plop")
259
+ exchanges.is_exchange_rules_compliancy_error(err)
260
+ is_error_on_this_type_mock.assert_called_once_with(
261
+ err, constants.EXCHANGE_COMPLIANCY_ERRORS
262
+ )
263
+
264
+
265
+ def test_is_error_on_this_type():
266
+ assert exchange_util.is_error_on_this_type(Exception("plop"), constants.EXCHANGE_PERMISSION_ERRORS) is False
267
+ assert exchange_util.is_error_on_this_type(Exception("api key"), constants.EXCHANGE_PERMISSION_ERRORS) is True
268
+ assert exchange_util.is_error_on_this_type(Exception("api"), constants.EXCHANGE_PERMISSION_ERRORS) is False
269
+ assert exchange_util.is_error_on_this_type(Exception("api"), constants.EXCHANGE_COMPLIANCY_ERRORS) is False