OctoBot-Trading 2.4.142__tar.gz → 2.4.144__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 (479) hide show
  1. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/CHANGELOG.md +8 -0
  2. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.142/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.144}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/README.md +1 -1
  5. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/enums.py +1 -0
  7. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/errors.py +7 -1
  8. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +12 -1
  9. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +4 -3
  10. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/implementations/exchange_simulator.py +38 -0
  11. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/traders/trader.py +13 -5
  12. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/types/rest_exchange.py +7 -0
  13. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/order.py +11 -4
  14. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/order_factory.py +4 -1
  15. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -8
  16. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/util.py +1 -0
  17. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/test_tools/exchanges_test_tools.py +70 -30
  18. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/traders/test_trader.py +68 -1
  19. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_order.py +6 -4
  20. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_order_factory.py +50 -0
  21. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/signals/test_trading_signal_bundle_builder.py +5 -0
  22. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/signals/test_util.py +46 -2
  23. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/LICENSE +0 -0
  24. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/MANIFEST.in +0 -0
  25. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  26. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  27. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  28. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/OctoBot_Trading.egg-info/requires.txt +0 -0
  29. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  30. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/__init__.py +0 -0
  31. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/channels.py +0 -0
  32. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/contracts.py +0 -0
  33. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/exchange.py +0 -0
  34. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/modes.py +0 -0
  35. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/orders.py +0 -0
  36. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/portfolio.py +0 -0
  37. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/positions.py +0 -0
  38. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/profitability.py +0 -0
  39. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/storage.py +0 -0
  40. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/symbol_data.py +0 -0
  41. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/trader.py +0 -0
  42. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/api/trades.py +0 -0
  43. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/constants.py +0 -0
  44. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_channel.py +0 -0
  45. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/__init__.py +0 -0
  46. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  47. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  48. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  49. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  50. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  51. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  52. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  53. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  55. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  56. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  57. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  58. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  61. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  62. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  63. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  64. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  66. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  67. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  69. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  70. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  71. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  72. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  75. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  76. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  77. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  78. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  80. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  81. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  82. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  83. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  84. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  85. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  88. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  89. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  90. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  91. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  94. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  95. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  96. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  97. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  99. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  100. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  102. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/config/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  104. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  105. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  106. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  107. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  109. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  110. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  111. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  112. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  113. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  114. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  116. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  117. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchange_builder.py +0 -0
  118. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchange_channels.py +0 -0
  119. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchange_details.py +0 -0
  120. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchange_factory.py +0 -0
  121. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchange_manager.py +0 -0
  122. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  123. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/exchanges.py +0 -0
  124. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  126. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  127. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/traders/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  129. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/types/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  131. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/util/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  133. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  134. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  135. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  136. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  138. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/channel/__init__.py +0 -0
  139. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  140. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  141. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/channel/mode.py +0 -0
  142. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/mode_activity.py +0 -0
  143. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/mode_config.py +0 -0
  144. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/modes_factory.py +0 -0
  145. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/modes_util.py +0 -0
  146. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  149. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  150. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  151. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  152. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  153. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  154. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  155. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  156. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  157. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  159. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  160. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  162. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/octobot_channel_consumer.py +0 -0
  163. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  165. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  167. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  168. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  169. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  170. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  171. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  172. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  173. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  174. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  175. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  176. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/order_group.py +0 -0
  177. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/order_state.py +0 -0
  178. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/order_util.py +0 -0
  179. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  180. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  181. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  182. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  186. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  187. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  191. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  194. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  195. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  196. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  197. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  199. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  200. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  201. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  204. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  205. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  206. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  207. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  208. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  210. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  211. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  212. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  214. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  215. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  216. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  218. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  219. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  220. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  221. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  222. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  223. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  224. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  225. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  226. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  228. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  230. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  231. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  232. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  235. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  236. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  237. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/position.py +0 -0
  238. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  239. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/position_state.py +0 -0
  240. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/position_util.py +0 -0
  241. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  242. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  243. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  244. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  245. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  246. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  247. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  249. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  250. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/state.py +0 -0
  251. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/__init__.py +0 -0
  252. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  254. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  255. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/trade.py +0 -0
  256. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  257. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  258. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  259. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  260. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  262. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  263. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  264. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  268. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  269. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/channel/__init__.py +0 -0
  271. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  272. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  273. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/channel/signal_producer.py +0 -0
  274. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/signal_creation.py +0 -0
  275. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  276. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/abstract_storage.py +0 -0
  278. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/candles_storage.py +0 -0
  279. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/orders_storage.py +0 -0
  280. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/portfolio_storage.py +0 -0
  281. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/storage_manager.py +0 -0
  282. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/trades_storage.py +0 -0
  283. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/transactions_storage.py +0 -0
  284. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/storage/util.py +0 -0
  285. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/supervisors/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  288. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/config_util.py +0 -0
  290. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/initializable.py +0 -0
  291. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/initialization_util.py +0 -0
  292. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/simulator_updater_utils.py +0 -0
  293. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/test_tools/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  295. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  297. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/requirements.txt +0 -0
  298. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/setup.cfg +0 -0
  299. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/setup.py +0 -0
  300. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/__init__.py +0 -0
  301. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_channels.py +0 -0
  302. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_exchange.py +0 -0
  303. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_modes.py +0 -0
  304. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_orders.py +0 -0
  305. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_portfolio.py +0 -0
  306. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_profitability.py +0 -0
  307. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_symbol_data.py +0 -0
  308. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_trader.py +0 -0
  309. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/api/test_trades.py +0 -0
  310. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/cli/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/contracts/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  314. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  315. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/funding/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  317. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/kline/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  319. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/ohlcv/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  321. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  322. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/order_book/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  324. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/prices/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  326. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  327. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/recent_trades/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  329. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  330. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/ticker/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  332. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/connectors/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  336. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  337. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/implementations/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_abstract_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  342. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_exchange_builder.py +0 -0
  343. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_exchange_config_data.py +0 -0
  344. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_exchange_factory.py +0 -0
  345. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_exchange_manager.py +0 -0
  346. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_exchange_simulator.py +0 -0
  347. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/test_exchanges.py +0 -0
  348. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/traders/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/types/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/util/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  353. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/exchanges/util/test_exchange_util.py +0 -0
  354. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  358. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  359. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  360. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  361. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  363. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/test_abstract_mode_consumer.py +0 -0
  364. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/test_abstract_trading_mode.py +0 -0
  365. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/modes/test_modes_util.py +0 -0
  366. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/groups/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  370. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  371. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  372. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/__init__.py +0 -0
  373. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  379. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  381. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  382. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  383. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_order_adapter.py +0 -0
  384. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_order_util.py +0 -0
  385. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_orders_manager.py +0 -0
  386. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  387. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  394. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  395. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  396. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/market/__init__.py +0 -0
  397. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  398. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  399. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  400. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  402. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  403. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/__init__.py +0 -0
  404. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  405. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  406. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  407. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  408. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/history/__init__.py +0 -0
  409. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  410. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  411. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/test_asset.py +0 -0
  412. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  413. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  414. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  415. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  416. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  417. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/types/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  421. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/channel/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/states/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/test_position.py +0 -0
  425. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/test_position_factory.py +0 -0
  426. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/test_positions_manager.py +0 -0
  427. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/types/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  429. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  430. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/trades/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/trades/test_trade_factory.py +0 -0
  432. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/trades/test_trade_manager.py +0 -0
  433. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  434. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/trades/test_trade_util.py +0 -0
  435. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/transactions/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  437. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  438. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/signals/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.144}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,14 @@ 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.144] - 2025-01-10
8
+ ### Fixed
9
+ [Backtesting] fix default market status + adapter issues
10
+
11
+ ## [2.4.143] - 2025-01-08
12
+ ### Fixed
13
+ [Orders] properly handle trigger above
14
+
7
15
  ## [2.4.142] - 2025-01-07
8
16
  ### Fixed
9
17
  [Order] fix _create_triggered_chained_order
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.142
3
+ Version: 2.4.144
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.142](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.144](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.142
3
+ Version: 2.4.144
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.142](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.144](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.142](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.144](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.142" # major.minor.revision
18
+ VERSION = "2.4.144" # major.minor.revision
@@ -536,6 +536,7 @@ class TradingSignalOrdersAttrs(enum.Enum):
536
536
  EXCHANGE = "exchange"
537
537
  EXCHANGE_TYPE = "exchange_type"
538
538
  TYPE = "type"
539
+ TRIGGER_ABOVE = "trigger_above"
539
540
  QUANTITY = "quantity"
540
541
  TARGET_AMOUNT = "target_amount"
541
542
  TARGET_POSITION = "target_position"
@@ -57,7 +57,13 @@ class OrderCancelError(OctoBotExchangeError):
57
57
  """
58
58
 
59
59
 
60
- class OrderNotFoundOnCancelError(OrderCancelError):
60
+ class ExchangeOrderCancelError(OrderCancelError):
61
+ """
62
+ Raised when an exchange failed to execute the given request because the associated order can't be cancelled
63
+ """
64
+
65
+
66
+ class OrderNotFoundOnCancelError(ExchangeOrderCancelError):
61
67
  """
62
68
  Raised upon a failed order cancel because order is not found
63
69
  """
@@ -672,7 +672,18 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
672
672
  ) -> enums.OrderStatus:
673
673
  try:
674
674
  with self.error_describer():
675
- await self.client.cancel_order(exchange_order_id, symbol=symbol, params=kwargs)
675
+ try:
676
+ await self.client.cancel_order(exchange_order_id, symbol=symbol, params=kwargs)
677
+ except Exception as err:
678
+ if self.exchange_manager.exchange.is_exchange_order_uncancellable(err):
679
+ # handle ExchangeOrderCancelError locally not to raise it from other contexts
680
+ # (such as if used in error_describer)
681
+ raise octobot_trading.errors.ExchangeOrderCancelError(
682
+ f"Error when handling order {html_util.get_html_summary_if_relevant(err)}. "
683
+ f"Exchange is refusing to cancel this order. The order is probably filled "
684
+ f"or cancelled already."
685
+ ) from err
686
+ raise
676
687
  # no exception, cancel worked
677
688
  try:
678
689
  # make sure order is canceled
@@ -88,7 +88,8 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
88
88
  return self.exchange_manager.use_cached_markets
89
89
 
90
90
  def get_contract_size(self, symbol: str):
91
- return ccxt_client_simulation.get_contract_size(self.get_market_status(symbol, with_fixer=False))
91
+ market_status, _ = self.get_market_status(symbol, with_fixer=False)
92
+ return ccxt_client_simulation.get_contract_size(market_status)
92
93
 
93
94
  @classmethod
94
95
  def load_user_inputs_from_class(cls, tentacles_setup_config, tentacle_config):
@@ -157,7 +158,7 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
157
158
  return util.ExchangeMarketStatusFixer(
158
159
  self._forced_market_statuses[symbol], price_example
159
160
  ).market_status
160
- return self._forced_market_statuses[symbol]
161
+ return self._forced_market_statuses[symbol], True
161
162
  except KeyError:
162
163
  self._missing_market_statuses.add(symbol)
163
164
  if len(self._missing_market_statuses) >= len(self.symbols) - 1:
@@ -168,7 +169,7 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
168
169
  )
169
170
  else:
170
171
  self.logger.warning(f"Missing cached market status for {symbol}: using default market status")
171
- return self._get_default_market_status()
172
+ return self._get_default_market_status(), False
172
173
 
173
174
  def _get_default_market_status(self):
174
175
  return {
@@ -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 typing
17
+ import copy
17
18
 
18
19
  import octobot_trading.constants as constants
19
20
  import octobot_trading.exchanges.util as exchange_util
@@ -115,6 +116,43 @@ class ExchangeSimulator(rest_exchange.RestExchange):
115
116
  def get_backtesting_data_files(self):
116
117
  return self.connector.get_backtesting_data_files()
117
118
 
119
+ def get_market_status(self, symbol, price_example=None, with_fixer=True):
120
+ """
121
+ Override of the RESTExchange get_fixed_market_status to handle different get_market_status return values
122
+ """
123
+ if self._should_fix_market_status():
124
+ return self.get_fixed_market_status(
125
+ symbol,
126
+ price_example=price_example,
127
+ with_fixer=with_fixer,
128
+ remove_price_limits=self._should_remove_market_status_limits(),
129
+ adapt_for_contract_size=self._should_adapt_market_status_for_contract_size()
130
+ )
131
+ market_status, _ = self.connector.get_market_status(
132
+ symbol, price_example=price_example, with_fixer=with_fixer
133
+ )
134
+ return market_status
135
+
136
+ def get_fixed_market_status(self, symbol, price_example=None, with_fixer=True, remove_price_limits=False,
137
+ adapt_for_contract_size=False):
138
+ """
139
+ Override of the RESTExchange get_fixed_market_status to call adapt_market_status only on fetch market statuses
140
+ (should not be call on default market status)
141
+ """
142
+ market_status, is_real = self.connector.get_market_status(symbol, with_fixer=False)
143
+ market_status = copy.deepcopy(market_status)
144
+ if is_real:
145
+ # only use adapter on real market status (not default simulator values)
146
+ market_status = self.connector.adapter.adapt_market_status(
147
+ market_status,
148
+ remove_price_limits=remove_price_limits
149
+ )
150
+ if adapt_for_contract_size and self.exchange_manager.is_future:
151
+ self._adapt_market_status_for_contract_size(market_status, self.get_contract_size(symbol))
152
+ if with_fixer:
153
+ return exchange_util.ExchangeMarketStatusFixer(market_status, price_example).market_status
154
+ return market_status
155
+
118
156
  async def load_pair_future_contract(self, pair: str):
119
157
  """
120
158
  Create a new FutureContract for the pair
@@ -389,6 +389,7 @@ class Trader(util.Initializable):
389
389
  # order will just never get created
390
390
  order.is_waiting_for_chained_trigger = False
391
391
  return success
392
+ order_status = None
392
393
  # if real order: cancel on exchange
393
394
  if not self.simulate and not order.is_self_managed():
394
395
  try:
@@ -408,8 +409,15 @@ class Trader(util.Initializable):
408
409
  order.exchange_order_id, order.symbol, order.order_type
409
410
  )
410
411
  except errors.OrderCancelError as err:
411
- if await self._handle_order_cancel_error(order, err, wait_for_cancelling, cancelling_timeout):
412
- return True
412
+ if self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization:
413
+ if await self._handle_order_cancel_error(order, err, wait_for_cancelling, cancelling_timeout):
414
+ return True
415
+ else:
416
+ self.logger.warning(
417
+ f"Impossible to cancel order ({err} {err.__class__.__name__}). "
418
+ f"Considering order as cancelled {order}"
419
+ )
420
+ order_status = enums.OrderStatus.CANCELED
413
421
  except Exception as err:
414
422
  self.logger.exception(err, True, f"Failed to cancel order {order}")
415
423
  return False
@@ -602,9 +610,9 @@ class Trader(util.Initializable):
602
610
  return all_cancelled, cancelled_orders
603
611
 
604
612
  async def cancel_all_open_orders_with_currency(
605
- self, currency, emit_trading_signals=False,
606
- wait_for_cancelling=True,
607
- cancelling_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
613
+ self, currency, emit_trading_signals=False,
614
+ wait_for_cancelling=True,
615
+ cancelling_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
608
616
  ) -> bool:
609
617
  """
610
618
  Should be called only if the goal is to cancel all open orders for each traded symbol containing the
@@ -125,6 +125,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
125
125
  EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
126
126
  # text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
127
127
  EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
128
+ # text content of errors due to an order that can't be cancelled on exchange (because filled or already cancelled)
129
+ EXCHANGE_ORDER_UNCANCELLABLE_ERRORS: typing.List[typing.Iterable[str]] = []
128
130
 
129
131
  DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
130
132
 
@@ -1018,6 +1020,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
1018
1020
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS)
1019
1021
  return False
1020
1022
 
1023
+ def is_exchange_order_uncancellable(self, error: BaseException) -> bool:
1024
+ if self.EXCHANGE_ORDER_UNCANCELLABLE_ERRORS:
1025
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_UNCANCELLABLE_ERRORS)
1026
+ return False
1027
+
1021
1028
  def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
1022
1029
  if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
1023
1030
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
@@ -59,6 +59,7 @@ class Order(util.Initializable):
59
59
  self.taker_or_maker = None
60
60
  self.timestamp = 0
61
61
  self.side = side
62
+ self.trigger_above = None
62
63
  self.tag = None
63
64
  self.associated_entry_ids = None
64
65
  self.broker_applied = False
@@ -138,7 +139,7 @@ class Order(util.Initializable):
138
139
  fee=None, total_cost=constants.ZERO, timestamp=None,
139
140
  order_type=None, reduce_only=None, close_position=None, position_side=None, fees_currency_side=None,
140
141
  group=None, tag=None, quantity_currency=None, exchange_creation_params=None,
141
- associated_entry_id=None) -> bool:
142
+ associated_entry_id=None, trigger_above=None) -> bool:
142
143
  changed: bool = False
143
144
  should_update_total_cost = False
144
145
 
@@ -275,6 +276,10 @@ class Order(util.Initializable):
275
276
  if associated_entry_id is not None:
276
277
  self.associate_to_entry(associated_entry_id)
277
278
 
279
+ if trigger_above is not None and self.trigger_above != trigger_above:
280
+ changed = True
281
+ self.trigger_above = trigger_above
282
+
278
283
  if should_update_total_cost and not total_cost:
279
284
  self._update_total_cost()
280
285
 
@@ -520,10 +525,10 @@ class Order(util.Initializable):
520
525
  continue
521
526
  can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
522
527
  if can_be_created and order.should_be_created():
523
- logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
528
+ logger.info(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
524
529
  await self._create_triggered_chained_order(order, enable_associated_orders_creation)
525
530
  else:
526
- logger.debug(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
531
+ logger.info(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
527
532
 
528
533
  async def _create_triggered_chained_order(self, order, enable_associated_orders_creation):
529
534
  logger = logging.get_logger(self.get_logger_name())
@@ -725,7 +730,8 @@ class Order(util.Initializable):
725
730
  total_cost=decimal.Decimal(str(raw_order.get(enums.ExchangeConstantsOrderColumns.COST.value, 0.0) or 0.0)),
726
731
  fee=order_util.parse_raw_fees(raw_order.get(enums.ExchangeConstantsOrderColumns.FEE.value, None)),
727
732
  timestamp=raw_order.get(enums.ExchangeConstantsOrderColumns.TIMESTAMP.value, None),
728
- reduce_only=raw_order.get(enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value, False)
733
+ reduce_only=raw_order.get(enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value, False),
734
+ trigger_above=raw_order.get(enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value, None)
729
735
  )
730
736
 
731
737
  async def update_from_order(self, other_order):
@@ -875,6 +881,7 @@ class Order(util.Initializable):
875
881
  enums.ExchangeConstantsOrderColumns.FEE.value: self.fee,
876
882
  enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
877
883
  enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
884
+ enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value: self.trigger_above,
878
885
  enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value: self.is_self_managed(),
879
886
  enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
880
887
  }
@@ -68,6 +68,7 @@ def create_order_instance(
68
68
  total_cost=constants.ZERO,
69
69
  timestamp=0,
70
70
  side=None,
71
+ trigger_above=None,
71
72
  fees_currency_side=None,
72
73
  group=None,
73
74
  tag=None,
@@ -103,7 +104,8 @@ def create_order_instance(
103
104
  quantity_currency=quantity_currency,
104
105
  close_position=close_position,
105
106
  exchange_creation_params=exchange_creation_params,
106
- associated_entry_id=associated_entry_id
107
+ associated_entry_id=associated_entry_id,
108
+ trigger_above=trigger_above,
107
109
  )
108
110
  return order
109
111
 
@@ -127,6 +129,7 @@ def create_order_from_dict(trader, order_dict):
127
129
  quantity_filled=order_dict[enums.ExchangeConstantsOrderColumns.FILLED.value],
128
130
  timestamp=order_dict[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value],
129
131
  side=enums.TradeOrderSide(order_dict[enums.ExchangeConstantsOrderColumns.SIDE.value]),
132
+ trigger_above=order_dict.get(enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value),
130
133
  tag=order_dict[enums.ExchangeConstantsOrderColumns.TAG.value],
131
134
  reduce_only=order_dict[enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value],
132
135
  )
@@ -29,14 +29,6 @@ class LimitOrder(order_class.Order):
29
29
  self.trigger_above = self.side is enums.TradeOrderSide.SELL
30
30
  self.allow_instant_fill = constants.ALLOW_SIMULATED_ORDERS_INSTANT_FILL
31
31
 
32
- def update_from_raw(self, raw_order):
33
- updated = super(LimitOrder, self).update_from_raw(raw_order)
34
- if enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value in raw_order \
35
- and self.trigger_above != raw_order[enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value]:
36
- updated = True
37
- self.trigger_above = raw_order[enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value]
38
- return updated
39
-
40
32
  async def update_price_if_outdated(self):
41
33
  # price is outdated if it would trigger and instantly filled order with more than the allowed tolerance
42
34
  try:
@@ -36,6 +36,7 @@ def create_order_signal_content(
36
36
  trading_enums.TradingSignalOrdersAttrs.EXCHANGE.value: exchange_manager.exchange_name,
37
37
  trading_enums.TradingSignalOrdersAttrs.EXCHANGE_TYPE.value: exchanges.get_exchange_type(exchange_manager).value,
38
38
  trading_enums.TradingSignalOrdersAttrs.SIDE.value: order.side.value,
39
+ trading_enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value: order.trigger_above,
39
40
  trading_enums.TradingSignalOrdersAttrs.TYPE.value: order.order_type.value,
40
41
  trading_enums.TradingSignalOrdersAttrs.QUANTITY.value: float(order.origin_quantity),
41
42
  trading_enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value: target_amount
@@ -145,26 +145,67 @@ async def get_portfolio(exchange_manager, as_float=False, clear_empty=True) -> d
145
145
  }
146
146
 
147
147
 
148
- async def _get_open_orders(exchange_manager, symbol: str, open_orders: list):
148
+ def _parse_order_dict(
149
+ exchange_manager, order: dict, force_open_or_pending_creation: bool
150
+ ) -> typing.Optional[personal_data.Order]:
151
+ if not order:
152
+ return None
153
+ try:
154
+ return personal_data.create_order_instance_from_raw(
155
+ exchange_manager.trader, order, force_open_or_pending_creation=force_open_or_pending_creation
156
+ )
157
+ except Exception as err:
158
+ logging.get_logger("_parse_order_dict").exception(
159
+ err,
160
+ True,
161
+ f"Unexpected error when parsing [{exchange_manager.exchange_name}] "
162
+ f"order ({err} {err.__class__.__name__}), order ignored: {order}"
163
+ )
164
+ return None
165
+
166
+
167
+ def _parse_order_into_dict(
168
+ exchange_manager, order: dict, force_open_or_pending_creation: bool, ignore_unsupported_orders: bool
169
+ ) -> typing.Optional[dict]:
170
+ if (
171
+ ignore_unsupported_orders and
172
+ order[enums.ExchangeConstantsOrderColumns.TYPE.value] == enums.TradeOrderType.UNSUPPORTED.value
173
+ ):
174
+ logging.get_logger("_parse_order_into_dict").warning(
175
+ f"Ignored unsupported [{exchange_manager.exchange_name}] order: {order}"
176
+ )
177
+ return None
178
+ if parsed_order := _parse_order_dict(exchange_manager, order, force_open_or_pending_creation):
179
+ try:
180
+ return parsed_order.to_dict()
181
+ except Exception as err:
182
+ logging.get_logger("_parse_order_dict").exception(
183
+ err,
184
+ True,
185
+ f"Unexpected error when converting [{exchange_manager.exchange_name}] order to dict"
186
+ f"({err}. {err.__class__.__name__}), order: {order}"
187
+ )
188
+ return None
189
+
190
+
191
+ async def _get_open_orders(exchange_manager, symbol: str, open_orders: list, ignore_unsupported_orders: bool):
149
192
  orders = await exchange_manager.exchange.get_open_orders(symbol=symbol)
150
- open_orders.extend(
151
- personal_data.create_order_instance_from_raw(
152
- exchange_manager.trader, order, force_open_or_pending_creation=True
153
- ).to_dict()
154
- for order in orders
155
- )
193
+ for order in orders:
194
+ if order_dict := _parse_order_into_dict(exchange_manager, order, True, ignore_unsupported_orders):
195
+ open_orders.append(order_dict)
156
196
 
157
197
 
158
198
  async def get_open_orders(
159
199
  exchange_manager,
160
200
  exchange_data: exchange_data_import.ExchangeData,
161
- symbols: list = None
201
+ symbols: list = None,
202
+ ignore_unsupported_orders: bool = True,
162
203
  ) -> list:
163
204
  open_orders = []
164
205
 
165
206
  symbols = symbols or [market.symbol for market in exchange_data.markets]
166
207
  await asyncio.gather(*(
167
- _get_open_orders(exchange_manager, symbol, open_orders) for symbol in symbols
208
+ _get_open_orders(exchange_manager, symbol, open_orders, ignore_unsupported_orders) for symbol in symbols
168
209
  ))
169
210
  return open_orders
170
211
 
@@ -177,25 +218,26 @@ async def get_order(
177
218
  return await exchange_manager.exchange.get_order(exchange_order_id, symbol=symbol)
178
219
 
179
220
 
180
- async def _get_cancelled_orders(exchange_manager, symbol: str, cancelled_orders: list):
221
+ async def _get_cancelled_orders(exchange_manager, symbol: str, cancelled_orders: list, ignore_unsupported_orders: bool):
181
222
  orders = await exchange_manager.exchange.get_cancelled_orders(symbol=symbol)
182
- cancelled_orders.extend(
183
- personal_data.create_order_instance_from_raw(
184
- exchange_manager.trader, order, force_open_or_pending_creation=False
185
- ).to_dict()
186
- for order in orders
187
- )
223
+ for order in orders:
224
+ if order_dict := _parse_order_into_dict(
225
+ exchange_manager, order, False, ignore_unsupported_orders
226
+ ):
227
+ cancelled_orders.append(order_dict)
188
228
 
189
229
 
190
230
  async def get_cancelled_orders(
191
231
  exchange_manager,
192
232
  exchange_data: exchange_data_import.ExchangeData,
193
- symbols: list = None
233
+ symbols: list = None,
234
+ ignore_unsupported_orders: bool = True,
194
235
  ) -> list:
195
236
  cancelled_orders = []
196
237
  symbols = symbols or [market.symbol for market in exchange_data.markets]
197
238
  await asyncio.gather(*(
198
- _get_cancelled_orders(exchange_manager, symbol, cancelled_orders) for symbol in symbols
239
+ _get_cancelled_orders(exchange_manager, symbol, cancelled_orders, ignore_unsupported_orders)
240
+ for symbol in symbols
199
241
  ))
200
242
  return cancelled_orders
201
243
 
@@ -230,11 +272,11 @@ async def _create_order(
230
272
  ) -> typing.Optional[personal_data.Order]:
231
273
  symbol = order_dict[enums.ExchangeConstantsOrderColumns.SYMBOL.value]
232
274
  side, order_type = personal_data.parse_order_type(order_dict)
233
- order_params = exchange_manager.exchange.get_order_additional_params(
234
- personal_data.create_order_instance_from_raw(
235
- exchange_manager.trader, order_dict, force_open_or_pending_creation=True
236
- )
237
- )
275
+ temp_order = _parse_order_dict(exchange_manager, order_dict, True)
276
+ if temp_order is None:
277
+ logging.get_logger("_create_order").error(f"Unexpected: order can't be created.")
278
+ return None
279
+ order_params = exchange_manager.exchange.get_order_additional_params(temp_order)
238
280
  created_order = await exchange_manager.exchange.create_order(
239
281
  order_type,
240
282
  symbol,
@@ -246,10 +288,9 @@ async def _create_order(
246
288
  params=order_params
247
289
  )
248
290
  # is private, to use in tests context only
249
- order = personal_data.create_order_instance_from_raw(
250
- exchange_manager.trader, created_order, force_open_or_pending_creation=True
251
- ) if created_order else None
252
- if not order:
291
+ order = _parse_order_dict(exchange_manager, created_order, True)
292
+ if order is None:
293
+ logging.get_logger("_create_order").error(f"Unexpected: order hasn't been created.")
253
294
  return order
254
295
  if order.status is enums.OrderStatus.PENDING_CREATION and order_creation_timeout > 0:
255
296
  try:
@@ -284,9 +325,8 @@ async def wait_for_other_status(order: personal_data.Order, timeout) -> personal
284
325
  f"Order fetched with status different from {origin_status} after {iterations} "
285
326
  f"iterations and {round(time.time() - t0)}s"
286
327
  )
287
- return personal_data.create_order_instance_from_raw(
288
- order.trader, raw_order, force_open_or_pending_creation=False
289
- )
328
+ if parsed_order := _parse_order_dict(order.exchange_manager, raw_order, False):
329
+ return parsed_order
290
330
  if time.time() - t0 + constants.CREATED_ORDER_FORCED_UPDATE_PERIOD >= timeout:
291
331
  break
292
332
  await asyncio.sleep(constants.CREATED_ORDER_FORCED_UPDATE_PERIOD)
@@ -23,7 +23,10 @@ import pytest
23
23
  import time
24
24
  from mock import AsyncMock, patch, Mock
25
25
 
26
- from octobot_trading.errors import TooManyOpenPositionError, InvalidLeverageValue, OrderEditError
26
+ from octobot_trading.errors import (
27
+ TooManyOpenPositionError, InvalidLeverageValue, OrderEditError,
28
+ ExchangeOrderCancelError, OrderNotFoundOnCancelError
29
+ )
27
30
  from octobot_trading.personal_data import LinearPosition
28
31
  import octobot_commons.constants as commons_constants
29
32
  from octobot_commons.asyncio_tools import wait_asyncio_next_cycle
@@ -178,6 +181,70 @@ class TestTrader:
178
181
 
179
182
  await self.stop(exchange_manager)
180
183
 
184
+
185
+ async def test_cancel_order_error(self):
186
+ _, exchange_manager, trader_inst = await self.init_default()
187
+
188
+ limit_buy = BuyLimitOrder(trader_inst)
189
+ limit_buy.update(order_type=TraderOrderType.SELL_LIMIT,
190
+ symbol=self.DEFAULT_SYMBOL,
191
+ current_price=decimal.Decimal("70"),
192
+ quantity=decimal.Decimal("10"),
193
+ price=decimal.Decimal("70"))
194
+ try:
195
+ trader_inst.simulate = False
196
+ with mock.patch.object(trader_inst, "_handle_order_cancel_error", mock.AsyncMock(
197
+ return_value=True
198
+ )) as _handle_order_cancel_error_mock:
199
+ with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
200
+ return_value=OrderStatus.CANCELED
201
+ )) as cancel_order_mock:
202
+ assert await trader_inst.cancel_order(limit_buy) is True
203
+ cancel_order_mock.assert_called_once()
204
+ _handle_order_cancel_error_mock.assert_not_called()
205
+ limit_buy.state = None
206
+ with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
207
+ side_effect=ExchangeOrderCancelError
208
+ )) as cancel_order_mock:
209
+ assert await trader_inst.cancel_order(limit_buy) is True
210
+ assert cancel_order_mock.call_count == 2
211
+ _handle_order_cancel_error_mock.assert_called_once()
212
+ _handle_order_cancel_error_mock.reset_mock()
213
+ limit_buy.state = None
214
+ with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
215
+ side_effect=OrderNotFoundOnCancelError
216
+ )) as cancel_order_mock:
217
+ assert await trader_inst.cancel_order(limit_buy) is True
218
+ assert cancel_order_mock.call_count == 2
219
+ _handle_order_cancel_error_mock.assert_called_once()
220
+ _handle_order_cancel_error_mock.reset_mock()
221
+ limit_buy.state = None
222
+
223
+ with trader_inst.exchange_manager.exchange_personal_data.orders_manager.disabled_order_auto_synchronization():
224
+ with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
225
+ side_effect=OrderNotFoundOnCancelError
226
+ )) as cancel_order_mock:
227
+ assert await trader_inst.cancel_order(limit_buy) is True
228
+ assert cancel_order_mock.call_count == 2
229
+ _handle_order_cancel_error_mock.assert_not_called()
230
+ limit_buy.state = None
231
+
232
+ with mock.patch.object(trader_inst, "_handle_order_cancel_error", mock.AsyncMock(
233
+ return_value=False
234
+ )) as _handle_order_cancel_error_mock:
235
+ with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
236
+ side_effect=ExchangeOrderCancelError
237
+ )) as cancel_order_mock:
238
+ assert await trader_inst.cancel_order(limit_buy) is True
239
+ assert cancel_order_mock.call_count == 2
240
+ _handle_order_cancel_error_mock.assert_called_once()
241
+ _handle_order_cancel_error_mock.reset_mock()
242
+ limit_buy.state = None
243
+
244
+ finally:
245
+ trader_inst.simulate = True
246
+
247
+
181
248
  async def test_cancel_open_orders_default_symbol(self):
182
249
  config, exchange_manager, trader_inst = await self.init_default()
183
250
  orders_manager = exchange_manager.exchange_personal_data.orders_manager
@@ -307,13 +307,13 @@ async def test_trigger_chained_orders(trader_simulator):
307
307
  # with chained orders
308
308
  order_mock_1 = mock.Mock(
309
309
  update_price_if_outdated=mock.AsyncMock(),
310
- update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
310
+ update_quantity_with_order_fees=mock.Mock(return_value=True),
311
311
  should_be_created=mock.Mock(return_value=True),
312
312
  is_cleared=mock.Mock(return_value=False)
313
313
  )
314
314
  order_mock_2 = mock.Mock(
315
315
  update_price_if_outdated=mock.AsyncMock(),
316
- update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
316
+ update_quantity_with_order_fees=mock.Mock(return_value=True),
317
317
  should_be_created=mock.Mock(return_value=False),
318
318
  is_cleared=mock.Mock(return_value=False)
319
319
  )
@@ -399,7 +399,7 @@ async def test_create_triggered_chained_order_mock(trader_simulator):
399
399
  base_order = personal_data.Order(trader_inst)
400
400
  eq_chained_order_1 = mock.Mock(get_name=mock.Mock(return_value="plop"))
401
401
  chained_order_1 = personal_data.Order(trader_inst)
402
- chained_order_1.create_triggered_equivalent_order=mock.AsyncMock(return_value=eq_chained_order_1)
402
+ chained_order_1.create_triggered_equivalent_order = mock.AsyncMock(return_value=eq_chained_order_1)
403
403
 
404
404
  # normal call
405
405
  with mock.patch.object(order_util, "create_as_chained_order", mock.AsyncMock()) as create_as_chained_order_mock:
@@ -443,7 +443,9 @@ async def test_create_triggered_chained_order_mock(trader_simulator):
443
443
  with mock.patch.object(
444
444
  order_util, "create_as_chained_order", mock.AsyncMock(side_effect=_create_as_chained_order)
445
445
  ) as create_as_chained_order_mock, mock.patch.object(
446
- chained_order_1, "create_on_filled_artificial_order", mock.AsyncMock()
446
+ chained_order_1, "create_on_filled_artificial_order", mock.AsyncMock(
447
+ return_value=mock.Mock(get_name=mock.Mock(return_value="plop"))
448
+ )
447
449
  ) as create_on_filled_artificial_order_mock:
448
450
  await base_order._create_triggered_chained_order(chained_order_1, True)
449
451
  create_as_chained_order_mock.assert_called_once_with(chained_order_1)