OctoBot-Trading 2.4.142__tar.gz → 2.4.143__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.143}/CHANGELOG.md +4 -0
  2. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.142/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.143}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/README.md +1 -1
  5. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/enums.py +1 -0
  7. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/errors.py +7 -1
  8. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +12 -1
  9. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/trader.py +13 -5
  10. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/rest_exchange.py +7 -0
  11. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order.py +9 -2
  12. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_factory.py +4 -1
  13. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -8
  14. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/util.py +1 -0
  15. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/exchanges_test_tools.py +70 -30
  16. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/traders/test_trader.py +68 -1
  17. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_factory.py +50 -0
  18. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/signals/test_trading_signal_bundle_builder.py +5 -0
  19. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/signals/test_util.py +46 -2
  20. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/LICENSE +0 -0
  21. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/MANIFEST.in +0 -0
  22. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  23. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  24. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  25. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/requires.txt +0 -0
  26. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  27. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/__init__.py +0 -0
  28. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/channels.py +0 -0
  29. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/contracts.py +0 -0
  30. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/exchange.py +0 -0
  31. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/modes.py +0 -0
  32. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/orders.py +0 -0
  33. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/portfolio.py +0 -0
  34. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/positions.py +0 -0
  35. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/profitability.py +0 -0
  36. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/storage.py +0 -0
  37. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/symbol_data.py +0 -0
  38. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/trader.py +0 -0
  39. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/trades.py +0 -0
  40. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/constants.py +0 -0
  41. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_channel.py +0 -0
  42. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/__init__.py +0 -0
  43. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  44. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  45. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  46. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  47. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  48. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  49. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  50. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  51. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  52. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  53. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  54. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  55. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  57. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  58. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  59. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  60. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  61. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  63. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  64. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  66. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  67. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  68. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  69. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  72. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  73. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  75. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  78. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  79. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  80. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  81. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  82. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  85. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  86. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  87. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  88. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  91. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  92. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  94. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  96. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  97. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  99. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  101. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  102. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  103. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  106. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  107. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  108. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  109. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  110. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  111. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  113. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  114. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  115. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_builder.py +0 -0
  116. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_channels.py +0 -0
  117. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_details.py +0 -0
  118. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_factory.py +0 -0
  119. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_manager.py +0 -0
  120. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  121. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchanges.py +0 -0
  122. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  123. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  124. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  126. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  128. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/__init__.py +0 -0
  129. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  130. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  132. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  133. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  134. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  135. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  137. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  139. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  140. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/mode.py +0 -0
  141. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/mode_activity.py +0 -0
  142. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/mode_config.py +0 -0
  143. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/modes_factory.py +0 -0
  144. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/modes_util.py +0 -0
  145. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  148. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  149. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  150. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  151. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  152. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  153. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  154. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  155. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  156. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  158. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  159. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  161. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/octobot_channel_consumer.py +0 -0
  162. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  164. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  167. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  168. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  169. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  170. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  172. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  173. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  174. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  175. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_state.py +0 -0
  177. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_util.py +0 -0
  178. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  179. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  180. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  186. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  187. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  194. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  195. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  196. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  197. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  198. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  199. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  200. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  201. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  202. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  203. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  204. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  205. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  207. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  208. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  209. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  210. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  211. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  213. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  214. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  215. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  216. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  217. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  218. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  219. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  220. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  221. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  222. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  223. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  224. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  225. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  228. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  230. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  231. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/__init__.py +0 -0
  232. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  234. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  235. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  236. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position.py +0 -0
  237. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  238. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position_state.py +0 -0
  239. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position_util.py +0 -0
  240. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  241. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  242. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  243. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  244. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  245. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  246. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  247. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  248. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  249. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/state.py +0 -0
  250. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  252. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  253. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  254. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trade.py +0 -0
  255. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  256. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  257. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  258. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  259. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  261. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  262. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  263. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  268. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  271. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  272. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/signal_producer.py +0 -0
  273. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/signal_creation.py +0 -0
  274. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  275. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/__init__.py +0 -0
  276. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/abstract_storage.py +0 -0
  277. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/candles_storage.py +0 -0
  278. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/orders_storage.py +0 -0
  279. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/portfolio_storage.py +0 -0
  280. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/storage_manager.py +0 -0
  281. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/trades_storage.py +0 -0
  282. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/transactions_storage.py +0 -0
  283. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/util.py +0 -0
  284. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/supervisors/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  286. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/config_util.py +0 -0
  289. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/initializable.py +0 -0
  290. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/initialization_util.py +0 -0
  291. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/simulator_updater_utils.py +0 -0
  292. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/__init__.py +0 -0
  293. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  294. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/requirements.txt +0 -0
  297. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/setup.cfg +0 -0
  298. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/setup.py +0 -0
  299. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_channels.py +0 -0
  301. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_exchange.py +0 -0
  302. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_modes.py +0 -0
  303. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_orders.py +0 -0
  304. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_portfolio.py +0 -0
  305. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_profitability.py +0 -0
  306. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_symbol_data.py +0 -0
  307. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_trader.py +0 -0
  308. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_trades.py +0 -0
  309. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/cli/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/contracts/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  313. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  314. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/funding/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  316. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/kline/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  318. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ohlcv/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  320. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  321. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/order_book/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  323. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/prices/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  325. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  326. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/recent_trades/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  328. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  329. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ticker/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  331. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  335. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  336. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/implementations/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_abstract_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_builder.py +0 -0
  342. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_config_data.py +0 -0
  343. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_factory.py +0 -0
  344. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_manager.py +0 -0
  345. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_simulator.py +0 -0
  346. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchanges.py +0 -0
  347. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/traders/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/types/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  350. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/util/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  352. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/util/test_exchange_util.py +0 -0
  353. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  357. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  358. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/test_abstract_mode_consumer.py +0 -0
  363. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/test_abstract_trading_mode.py +0 -0
  364. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/test_modes_util.py +0 -0
  365. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  369. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  370. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  371. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  378. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  382. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order.py +0 -0
  383. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_adapter.py +0 -0
  384. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_util.py +0 -0
  385. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_orders_manager.py +0 -0
  386. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  387. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  394. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  395. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  396. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/market/__init__.py +0 -0
  397. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  398. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  399. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  400. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  402. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  403. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/__init__.py +0 -0
  404. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  405. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  406. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  407. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  408. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/history/__init__.py +0 -0
  409. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  410. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  411. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_asset.py +0 -0
  412. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  413. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  414. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  415. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  416. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  417. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  421. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/channel/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/states/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/test_position.py +0 -0
  425. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/test_position_factory.py +0 -0
  426. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/test_positions_manager.py +0 -0
  427. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/types/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  429. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  430. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_factory.py +0 -0
  432. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_manager.py +0 -0
  433. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  434. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_util.py +0 -0
  435. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/transactions/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  437. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  438. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/signals/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,10 @@ 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.143] - 2025-01-08
8
+ ### Fixed
9
+ [Orders] properly handle trigger above
10
+
7
11
  ## [2.4.142] - 2025-01-07
8
12
  ### Fixed
9
13
  [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.143
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.143](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.143
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.143](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.143](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.143" # 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
@@ -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
 
@@ -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
@@ -81,6 +81,24 @@ class TestOrderFactory:
81
81
  }
82
82
  assert personal_data.parse_order_type(ccxt_order_sell_limit) == (TradeOrderSide.SELL, TraderOrderType.SELL_LIMIT)
83
83
 
84
+ ccxt_order_stop_loss_sell = {
85
+ "side": TradeOrderSide.SELL,
86
+ "type": TradeOrderType.STOP_LOSS
87
+ }
88
+ assert personal_data.parse_order_type(ccxt_order_stop_loss_sell) == (TradeOrderSide.SELL, TraderOrderType.STOP_LOSS)
89
+
90
+ ccxt_order_stop_loss_buy = {
91
+ "side": TradeOrderSide.BUY,
92
+ "type": TradeOrderType.STOP_LOSS
93
+ }
94
+ assert personal_data.parse_order_type(ccxt_order_stop_loss_buy) == (TradeOrderSide.BUY, TraderOrderType.STOP_LOSS)
95
+
96
+ unsupported = {
97
+ "side": TradeOrderSide.BUY,
98
+ "type": TradeOrderType.UNSUPPORTED
99
+ }
100
+ assert personal_data.parse_order_type(unsupported) == (TradeOrderSide.BUY, TraderOrderType.UNSUPPORTED)
101
+
84
102
  await self.stop(exchange_manager)
85
103
 
86
104
  async def test_create_order_from_dict(self):
@@ -114,7 +132,35 @@ class TestOrderFactory:
114
132
  assert limit_order.exchange_creation_params == {"plop": 1, "fake_param": True}
115
133
  # associated_entry_ids are not copied
116
134
  assert created_from_dict.associated_entry_ids is None
135
+ assert created_from_dict.trigger_above is limit_order.trigger_above is True
117
136
  assert limit_order.associated_entry_ids == ["1"]
137
+
138
+
139
+ _, exchange_manager, trader_inst = await self.init_default()
140
+ limit_order = personal_data.create_order_instance(
141
+ trader_inst,
142
+ TraderOrderType.SELL_LIMIT,
143
+ self.DEFAULT_SYMBOL,
144
+ price,
145
+ quantity,
146
+ price=price,
147
+ trigger_above=False,
148
+ )
149
+ order_dict = limit_order.to_dict()
150
+ created_from_dict = personal_data.create_order_from_dict(trader_inst, order_dict)
151
+ assert created_from_dict.origin_price == limit_order.origin_price == price
152
+ assert created_from_dict.origin_quantity == limit_order.origin_quantity == quantity
153
+ assert created_from_dict.__class__ is limit_order.__class__ == personal_data.SellLimitOrder
154
+ assert created_from_dict.symbol == limit_order.symbol == self.DEFAULT_SYMBOL
155
+ assert created_from_dict.reduce_only is limit_order.reduce_only is False
156
+ # exchange_creation_params are not copied
157
+ assert created_from_dict.exchange_creation_params == {}
158
+ assert limit_order.exchange_creation_params == {}
159
+ # associated_entry_ids are not copied
160
+ assert created_from_dict.associated_entry_ids is None
161
+ assert created_from_dict.trigger_above is limit_order.trigger_above is False
162
+ assert limit_order.associated_entry_ids is None
163
+
118
164
  await self.stop(exchange_manager)
119
165
 
120
166
  async def test_create_order_from_order_storage_details_with_simple_order(self):
@@ -127,6 +173,7 @@ class TestOrderFactory:
127
173
  current_price=decimal.Decimal("70"),
128
174
  quantity=decimal.Decimal("10"),
129
175
  price=decimal.Decimal("70"))
176
+ order.trigger_above = True
130
177
  order_storage_details = orders_storage._format_order(order, exchange_manager)
131
178
  order_storage_details[StoredOrdersAttr.ENTRIES.value] = ["11111"]
132
179
 
@@ -141,6 +188,7 @@ class TestOrderFactory:
141
188
  assert created_order.timestamp == order.timestamp
142
189
  assert created_order.creation_time == order.creation_time
143
190
  assert created_order.origin_price == order.origin_price
191
+ assert created_order.trigger_above is order.trigger_above is True
144
192
  assert created_order.__class__ is order.__class__
145
193
  # associated_entry_ids are added from order_storage_details but not in original order
146
194
  assert created_order.associated_entry_ids == ["11111"]
@@ -149,6 +197,7 @@ class TestOrderFactory:
149
197
  # updated creation_time (as with chained orders): creation_time is used to restore order
150
198
  assert created_order.creation_time != 123
151
199
  order.creation_time = 123
200
+ order.trigger_above = False
152
201
 
153
202
  order_storage_details = orders_storage._format_order(order, exchange_manager)
154
203
  created_order = await personal_data.create_order_from_order_storage_details(
@@ -160,6 +209,7 @@ class TestOrderFactory:
160
209
  assert created_order.timestamp == 123 # aligned with creation time
161
210
  assert created_order.creation_time == 123 # aligned with creation time
162
211
  assert created_order.origin_price == order.origin_price
212
+ assert created_order.trigger_above is order.trigger_above is False
163
213
  assert created_order.__class__ is order.__class__
164
214
  # associated_entry_ids are added from order_storage_details but not in original order
165
215
  assert created_order.associated_entry_ids is None
@@ -119,16 +119,19 @@ def test_add_created_order(trading_signal_bundle_builder, buy_limit_order):
119
119
 
120
120
  # update the same order
121
121
  buy_limit_order.order_type = enums.TraderOrderType.SELL_LIMIT
122
+ buy_limit_order.trigger_above = False
122
123
  trading_signal_bundle_builder.add_created_order(buy_limit_order, buy_limit_order.exchange_manager, target_position="2%")
123
124
  assert len(trading_signal_bundle_builder.signals) == 1
124
125
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TYPE.value] == enums.TraderOrderType.SELL_LIMIT.value
125
126
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
126
127
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "2%"
128
+ assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is False
127
129
 
128
130
  # add new order (orders are based on order_id)
129
131
  previous_order_id = buy_limit_order.order_id
130
132
  buy_limit_order.order_id = "other_id"
131
133
  buy_limit_order.order_type = enums.TraderOrderType.STOP_LOSS_LIMIT
134
+ buy_limit_order.trigger_above = True
132
135
  trading_signal_bundle_builder.add_created_order(buy_limit_order, buy_limit_order.exchange_manager, target_position="50")
133
136
  assert len(trading_signal_bundle_builder.signals) == 2
134
137
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ORDER_ID.value] == \
@@ -136,11 +139,13 @@ def test_add_created_order(trading_signal_bundle_builder, buy_limit_order):
136
139
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TYPE.value] == enums.TraderOrderType.SELL_LIMIT.value
137
140
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
138
141
  assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "2%"
142
+ assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is False
139
143
  assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.ORDER_ID.value] == "other_id"
140
144
  assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TYPE.value] == \
141
145
  enums.TraderOrderType.STOP_LOSS_LIMIT.value
142
146
  assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
143
147
  assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "50"
148
+ assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is True
144
149
 
145
150
 
146
151
  def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):