OctoBot-Trading 2.4.138__tar.gz → 2.4.140__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.138 → OctoBot-Trading-2.4.140}/CHANGELOG.md +12 -0
  2. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.138/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.140}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/README.md +1 -1
  5. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/errors.py +14 -0
  7. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/abstract_exchange.py +4 -1
  8. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +5 -1
  9. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +6 -0
  10. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +9 -1
  11. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_manager.py +3 -3
  12. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/trader.py +24 -14
  13. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/rest_exchange.py +29 -4
  14. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order.py +90 -13
  15. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_util.py +5 -0
  16. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +16 -11
  17. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +13 -9
  18. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +16 -11
  19. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +13 -9
  20. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/market_order.py +2 -0
  21. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +16 -10
  22. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +12 -8
  23. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position.py +4 -1
  24. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/positions_manager.py +3 -3
  25. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order.py +209 -6
  26. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/test_future_portfolio.py +5 -1
  27. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/test_position.py +13 -13
  28. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/types/test_inverse_position.py +10 -10
  29. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/types/test_linear_position.py +10 -10
  30. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/LICENSE +0 -0
  31. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/MANIFEST.in +0 -0
  32. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  33. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  34. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  35. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/requires.txt +0 -0
  36. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  37. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/__init__.py +0 -0
  38. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/channels.py +0 -0
  39. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/contracts.py +0 -0
  40. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/exchange.py +0 -0
  41. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/modes.py +0 -0
  42. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/orders.py +0 -0
  43. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/portfolio.py +0 -0
  44. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/positions.py +0 -0
  45. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/profitability.py +0 -0
  46. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/storage.py +0 -0
  47. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/symbol_data.py +0 -0
  48. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/trader.py +0 -0
  49. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/api/trades.py +0 -0
  50. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/constants.py +0 -0
  51. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/enums.py +0 -0
  52. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_channel.py +0 -0
  53. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  56. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  57. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  58. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  59. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  60. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  61. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  63. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  64. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  65. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  66. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  69. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  70. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  71. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  72. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  74. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  75. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  77. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  78. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  79. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  80. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  83. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  84. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  86. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  89. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  90. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  92. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  93. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  96. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  97. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  98. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  99. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  102. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  103. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  104. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  105. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  107. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  109. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  111. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  112. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  113. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  114. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  116. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  117. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  118. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  119. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  120. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  121. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  123. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_builder.py +0 -0
  124. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_channels.py +0 -0
  125. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_details.py +0 -0
  126. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_factory.py +0 -0
  127. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  128. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchanges.py +0 -0
  129. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  131. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  132. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/exchange_simulator.py +2 -2
  133. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  135. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  137. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  139. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  140. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  141. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  142. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  144. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  146. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  147. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/mode.py +0 -0
  148. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/mode_activity.py +0 -0
  149. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/mode_config.py +0 -0
  150. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/modes_factory.py +0 -0
  151. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/modes_util.py +0 -0
  152. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  154. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  155. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  156. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  157. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  158. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  159. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  160. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  161. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  162. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  163. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  165. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  166. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  167. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  168. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/octobot_channel_consumer.py +0 -0
  169. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  171. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/__init__.py +0 -0
  172. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  173. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  174. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  175. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  176. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  177. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  178. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  179. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  180. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  181. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  182. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  183. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_group.py +0 -0
  184. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_state.py +0 -0
  185. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  186. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  187. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  188. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  190. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  191. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  192. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  193. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  194. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  195. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  196. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  197. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  198. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  201. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  202. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  203. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  205. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  206. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  207. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  208. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  210. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  211. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  212. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  214. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  215. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  216. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  218. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  219. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  220. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  221. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  222. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  223. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  224. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  225. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  226. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  228. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  230. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  231. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  232. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  235. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  236. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  237. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  238. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position_state.py +0 -0
  239. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position_util.py +0 -0
  240. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  243. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  244. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  245. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  247. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  248. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/state.py +0 -0
  249. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/__init__.py +0 -0
  250. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  252. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  253. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trade.py +0 -0
  254. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  255. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  256. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  257. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  258. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  259. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  260. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  261. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  262. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/__init__.py +0 -0
  268. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  270. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  271. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/signal_producer.py +0 -0
  272. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/signal_creation.py +0 -0
  273. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  274. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/signals/util.py +0 -0
  275. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/__init__.py +0 -0
  276. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/abstract_storage.py +0 -0
  277. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/candles_storage.py +0 -0
  278. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/orders_storage.py +0 -0
  279. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/portfolio_storage.py +0 -0
  280. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/storage_manager.py +0 -0
  281. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/trades_storage.py +0 -0
  282. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/transactions_storage.py +0 -0
  283. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/storage/util.py +0 -0
  284. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/supervisors/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  286. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/config_util.py +0 -0
  289. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/initializable.py +0 -0
  290. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/initialization_util.py +0 -0
  291. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/simulator_updater_utils.py +0 -0
  292. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/__init__.py +0 -0
  293. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  294. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  297. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/requirements.txt +0 -0
  298. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/setup.cfg +0 -0
  299. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/setup.py +0 -0
  300. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/__init__.py +0 -0
  301. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_channels.py +0 -0
  302. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_exchange.py +0 -0
  303. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_modes.py +0 -0
  304. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_orders.py +0 -0
  305. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_portfolio.py +0 -0
  306. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_profitability.py +0 -0
  307. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_symbol_data.py +0 -0
  308. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_trader.py +0 -0
  309. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/api/test_trades.py +0 -0
  310. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/cli/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/contracts/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  314. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  315. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/funding/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  317. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/kline/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  319. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/ohlcv/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  321. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  322. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/order_book/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  324. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/prices/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  326. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  327. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/recent_trades/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  329. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  330. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/ticker/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  332. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  336. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  337. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/implementations/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_abstract_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  342. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_builder.py +0 -0
  343. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_config_data.py +0 -0
  344. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_factory.py +0 -0
  345. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_manager.py +0 -0
  346. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_simulator.py +0 -0
  347. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchanges.py +0 -0
  348. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/traders/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/traders/test_trader.py +0 -0
  350. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/types/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  352. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/util/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  354. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/exchanges/util/test_exchange_util.py +0 -0
  355. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  359. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  360. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  361. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  362. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  364. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/test_abstract_mode_consumer.py +0 -0
  365. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/test_abstract_trading_mode.py +0 -0
  366. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/modes/test_modes_util.py +0 -0
  367. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  371. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  372. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  373. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/__init__.py +0 -0
  374. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  380. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  381. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  382. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  383. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  384. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order_adapter.py +0 -0
  385. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order_factory.py +0 -0
  386. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order_util.py +0 -0
  387. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_orders_manager.py +0 -0
  388. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  389. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  391. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  395. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  396. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  397. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  398. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/market/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  400. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  401. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  402. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  404. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  405. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  408. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  409. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  410. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/history/__init__.py +0 -0
  411. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  412. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  413. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_asset.py +0 -0
  414. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  415. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  416. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  417. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  418. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  419. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  421. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  422. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/channel/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/states/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/test_position_factory.py +0 -0
  426. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/test_positions_manager.py +0 -0
  427. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/types/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_factory.py +0 -0
  430. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_manager.py +0 -0
  431. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  432. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_util.py +0 -0
  433. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/transactions/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  435. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  436. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/signals/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  438. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.138 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,18 @@ 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.140] - 2025-01-03
8
+ ### Updated
9
+ [Positions] properly clear closed positions
10
+ [Exchanges] handle newline error in keys
11
+ ### Fixed
12
+ [Exchanges] don't raise on missing order description
13
+ [Orders] fix closed pos & instant fill chained orders
14
+
15
+ ## [2.4.139] - 2023-12-29
16
+ ### Updated
17
+ [Simulator] handle futures backtesting with market status and different ccxt classes
18
+
7
19
  ## [2.4.138] - 2023-12-28
8
20
  ### Updated
9
21
  [TradingModes] ignore fees in futures chained orders
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.138
3
+ Version: 2.4.140
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.138](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.140](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.138
3
+ Version: 2.4.140
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.138](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.140](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.138](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.140](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.138" # major.minor.revision
18
+ VERSION = "2.4.140" # major.minor.revision
@@ -143,6 +143,20 @@ class ExchangeAccountSymbolPermissionError(OctoBotExchangeError):
143
143
  """
144
144
 
145
145
 
146
+ class ExchangeClosedPositionError(OctoBotExchangeError):
147
+ """
148
+ Raised when an exchange failed to execute the given request because the associated position is closed.
149
+ Can happen with reduce-only orders
150
+ """
151
+
152
+
153
+ class ExchangeOrderInstantTriggerError(OctoBotExchangeError):
154
+ """
155
+ Raised when an exchange failed to execute the given request because the associated order would immediately trigger.
156
+ Can happen with stop orders
157
+ """
158
+
159
+
146
160
  class PortfolioNegativeValueError(Exception):
147
161
  """
148
162
  Raised when the portfolio is being updated with a negative value
@@ -742,7 +742,10 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
742
742
  self._creating_exchange_order_descriptions.add(desc)
743
743
  yield
744
744
  finally:
745
- self._creating_exchange_order_descriptions.remove(desc)
745
+ try:
746
+ self._creating_exchange_order_descriptions.remove(desc)
747
+ except KeyError:
748
+ self.logger.error(f"Failed to remove {desc} from exchange order descriptions")
746
749
 
747
750
  def is_creating_order(
748
751
  self, order: dict, symbol: str
@@ -236,7 +236,11 @@ def get_pair_cryptocurrency(client, pair) -> str:
236
236
 
237
237
 
238
238
  def get_contract_size(client, pair) -> float:
239
- return client.markets[pair][ccxt_enums.ExchangeConstantsMarketStatusCCXTColumns.CONTRACT_SIZE.value]
239
+ return get_market_status_contract_size(client.markets[pair])
240
+
241
+
242
+ def get_market_status_contract_size(market_status: dict) :
243
+ return market_status[ccxt_enums.ExchangeConstantsMarketStatusCCXTColumns.CONTRACT_SIZE.value]
240
244
 
241
245
 
242
246
  def get_fees(market_status) -> dict:
@@ -13,6 +13,8 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
+ import decimal
17
+
16
18
  import octobot_trading.exchanges.connectors.ccxt.ccxt_client_util as ccxt_client_util
17
19
 
18
20
 
@@ -24,3 +26,7 @@ def parse_markets(exchange_name, market_filter) -> dict:
24
26
 
25
27
  def get_fees(market_status) -> dict:
26
28
  return ccxt_client_util.get_fees(market_status)
29
+
30
+
31
+ def get_contract_size(market_status: dict) -> decimal.Decimal:
32
+ return decimal.Decimal(str(ccxt_client_util.get_market_status_contract_size(market_status)))
@@ -76,12 +76,20 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
76
76
  return market[enums.ExchangeConstantsMarketStatusColumns.SYMBOL.value] in self.symbols
77
77
 
78
78
  self._forced_market_statuses = ccxt_client_simulation.parse_markets(
79
- self.exchange_manager.exchange_class_string, market_filter
79
+ self._get_exchange_class_rest_name(), market_filter
80
80
  )
81
81
 
82
+ def _get_exchange_class_rest_name(self):
83
+ if self.exchange_manager.exchange.exchange_tentacle_class:
84
+ return self.exchange_manager.exchange.exchange_tentacle_class.get_rest_name(self.exchange_manager)
85
+ return self.exchange_manager.exchange_class_string
86
+
82
87
  def should_adapt_market_statuses(self) -> bool:
83
88
  return self.exchange_manager.use_cached_markets
84
89
 
90
+ def get_contract_size(self, symbol: str):
91
+ return ccxt_client_simulation.get_contract_size(self.get_market_status(symbol, with_fixer=False))
92
+
85
93
  @classmethod
86
94
  def load_user_inputs_from_class(cls, tentacles_setup_config, tentacle_config):
87
95
  # no user input in connector
@@ -322,9 +322,9 @@ class ExchangeManager(util.Initializable):
322
322
  common_constants.CONFIG_EXCHANGE_SECRET, config_exchange, None
323
323
  )
324
324
  return (
325
- # remove leading and trailing ", ' and whitespaces if any
326
- key.strip(' "').strip("'") if key else key,
327
- secret.strip(' "').strip("'") if secret else secret,
325
+ # remove leading and trailing ", ', newlines and whitespaces if any
326
+ key.strip(' "').strip("'").strip("\n") if key else key,
327
+ secret.strip(' "').strip("'").strip("\n") if secret else secret,
328
328
  configuration.decrypt_element_if_possible(
329
329
  common_constants.CONFIG_EXCHANGE_PASSWORD, config_exchange, None
330
330
  ),
@@ -87,9 +87,10 @@ class Trader(util.Initializable):
87
87
  Orders
88
88
  """
89
89
 
90
- async def create_order(self, order, loaded: bool = False, params: dict = None,
91
- wait_for_creation=True,
92
- creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT):
90
+ async def create_order(
91
+ self, order, loaded: bool = False, params: dict = None, wait_for_creation=True, raise_all_creation_error=False,
92
+ creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
93
+ ):
93
94
  """
94
95
  Create a new order from an OrderFactory created order, update portfolio, registers order in order manager and
95
96
  notifies order channel.
@@ -99,6 +100,8 @@ class Trader(util.Initializable):
99
100
  :param wait_for_creation: when True, always make sure the order is completely created before returning.
100
101
  On exchanges async api, a create request will return before the order is actually live on exchange, in this case
101
102
  the associated order state will make sure that the order is creating by polling the order from the exchange.
103
+ :param raise_all_creation_error: when True, will raise each ceation error when possible
104
+ (instead of retuning None)
102
105
  :param creation_timeout: time before raising a timeout error when waiting for an order creation
103
106
  :return: The crated order instance
104
107
  """
@@ -123,27 +126,34 @@ class Trader(util.Initializable):
123
126
  # forward errors that require actions to fix the situation
124
127
  raise
125
128
  except Exception as e:
129
+ if raise_all_creation_error:
130
+ raise
126
131
  self.logger.exception(e, True, f"Unexpected error when creating order: {e}. Order: {order}")
127
132
  return None
128
133
 
129
134
  return created_order
130
135
 
131
- async def create_artificial_order(self, order_type, symbol, current_price, quantity, price,
132
- emit_trading_signals=False,
133
- wait_for_creation=True,
134
- creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT):
136
+ async def create_artificial_order(
137
+ self, order_type, symbol, current_price, quantity, price, reduce_only, close_position,
138
+ emit_trading_signals=False, wait_for_creation=True,
139
+ creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
140
+ ):
135
141
  """
136
142
  Creates an OctoBot managed order (managed orders example: stop loss that is not published on the exchange and
137
143
  that is maintained internally).
138
144
  """
139
- order = order_factory.create_order_instance(trader=self,
140
- order_type=order_type,
141
- symbol=symbol,
142
- current_price=current_price,
143
- quantity=quantity,
144
- price=price)
145
+ order = order_factory.create_order_instance(
146
+ trader=self,
147
+ order_type=order_type,
148
+ symbol=symbol,
149
+ current_price=current_price,
150
+ quantity=quantity,
151
+ price=price,
152
+ reduce_only=reduce_only,
153
+ close_position=close_position,
154
+ )
145
155
  async with signals.remote_signal_publisher(self.exchange_manager, order.symbol, emit_trading_signals):
146
- await signals.create_order(
156
+ return await signals.create_order(
147
157
  self.exchange_manager,
148
158
  emit_trading_signals and signals.should_emit_trading_signal(self.exchange_manager),
149
159
  order,
@@ -119,6 +119,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
119
119
  EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
120
120
  # text content of errors due to unhandled authentication issues
121
121
  EXCHANGE_AUTHENTICATION_ERRORS: typing.List[typing.Iterable[str]] = []
122
+ # text content of errors due to a closed position on the exchange. Relevant for reduce-only orders
123
+ EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
124
+ # text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
125
+ EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
122
126
 
123
127
  DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
124
128
 
@@ -138,7 +142,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
138
142
  exchange_manager,
139
143
  adapter_class=self.get_adapter_class(),
140
144
  additional_config=self.get_additional_connector_config(),
141
- rest_name=self.get_rest_name(),
145
+ rest_name=self.get_rest_name(self.exchange_manager),
142
146
  force_auth=self.REQUIRES_AUTHENTICATION,
143
147
  )
144
148
 
@@ -166,8 +170,9 @@ class RestExchange(abstract_exchange.AbstractExchange):
166
170
  """
167
171
  return [enums.ExchangeTypes.SPOT]
168
172
 
169
- def get_rest_name(self):
170
- return self.exchange_manager.exchange_class_string
173
+ @classmethod
174
+ def get_rest_name(cls, exchange_manager):
175
+ return exchange_manager.exchange_class_string
171
176
 
172
177
  def get_associated_websocket_exchange_name(self):
173
178
  return self.exchange_manager.exchange_name
@@ -252,7 +257,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
252
257
  if self.should_log_on_ddos_exception(e):
253
258
  self.connector.log_ddos_error(e)
254
259
  raise errors.FailedRequest(
255
- f"Failed to order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
260
+ f"Failed order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
256
261
  ) from e
257
262
  except errors.OctoBotExchangeError:
258
263
  # custom error: forward it
@@ -275,6 +280,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
275
280
  f"Exchange is refusing this order request on this account because "
276
281
  f"of its compliancy requirements."
277
282
  ) from e
283
+ if self.is_exchange_closed_position_error(e):
284
+ raise errors.ExchangeClosedPositionError(
285
+ f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
286
+ f"Exchange is refusing this order request because associated position is closed."
287
+ ) from e
288
+ if self.is_exchange_order_would_immediately_trigger_error(e):
289
+ raise errors.ExchangeOrderInstantTriggerError(
290
+ f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
291
+ f"Exchange is refusing this order request because associated order would instantly trigger."
292
+ ) from e
278
293
  self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
279
294
  # print(traceback.format_exc(), file=sys.stderr) # uncomment for debugging in tests
280
295
  self.logger.exception(
@@ -988,6 +1003,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
988
1003
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_COMPLIANCY_ERRORS)
989
1004
  return False
990
1005
 
1006
+ def is_exchange_closed_position_error(self, error: BaseException) -> bool:
1007
+ if self.EXCHANGE_CLOSED_POSITION_ERRORS:
1008
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_CLOSED_POSITION_ERRORS)
1009
+ return False
1010
+
1011
+ def is_exchange_order_would_immediately_trigger_error(self, error: BaseException) -> bool:
1012
+ if self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS:
1013
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS)
1014
+ return False
1015
+
991
1016
  def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
992
1017
  if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
993
1018
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
@@ -24,6 +24,7 @@ import octobot_trading.constants as constants
24
24
  import octobot_trading.enums as enums
25
25
  import octobot_trading.errors as errors
26
26
  import octobot_trading.personal_data.orders.states as orders_states
27
+ import octobot_trading.exchanges.traders.trader
27
28
  import octobot_trading.personal_data.orders.order_util as order_util
28
29
  import octobot_trading.personal_data.orders.decimal_order_adapter as decimal_order_adapter
29
30
  import octobot_trading.util as util
@@ -36,10 +37,11 @@ class Order(util.Initializable):
36
37
  It is also use to store creation & fill values of the order
37
38
  """
38
39
  CHECK_ORDER_STATUS_AFTER_INIT_DELAY = 2
40
+ SUPPORTS_GROUPING = True # False when orders of this type can't be grouped
39
41
 
40
42
  def __init__(self, trader, side=None):
41
43
  super().__init__()
42
- self.trader = trader
44
+ self.trader: octobot_trading.exchanges.traders.trader.Trader = trader
43
45
  self.exchange_manager = trader.exchange_manager
44
46
  self.lock = asyncio.Lock()
45
47
  self.is_synchronized_with_exchange = False
@@ -69,9 +71,9 @@ class Order(util.Initializable):
69
71
  self.origin_stop_price = constants.ZERO
70
72
 
71
73
  # order type attributes
72
- self.order_type = None
74
+ self.order_type: enums.TraderOrderType = None
73
75
  # raw exchange order type, used to create order dict
74
- self.exchange_order_type = None
76
+ self.exchange_order_type: enums.TradeOrderType = None
75
77
 
76
78
  # filled order attributes
77
79
  self.filled_quantity = constants.ZERO
@@ -112,6 +114,8 @@ class Order(util.Initializable):
112
114
  self.has_been_bundled = False
113
115
  # True when this order is to be opened as a chained order and has not been open yet
114
116
  self.is_waiting_for_chained_trigger = False
117
+ # instance of the order that has been created after self has been filled. Used in stop / TP orders
118
+ self.on_filled_artificial_order = None
115
119
 
116
120
  # Params given to the exchange request when this order is created. Include any exchange specific param here.
117
121
  # All params and values in those will be ignored in simulated orders
@@ -276,6 +280,17 @@ class Order(util.Initializable):
276
280
 
277
281
  return changed
278
282
 
283
+ async def create_on_filled_artificial_order(self, enable_associated_orders_creation):
284
+ """
285
+ :return: the equivalent artificial order after trigger price (ex: stop loss => market order)
286
+ """
287
+ await self.on_filled(enable_associated_orders_creation, force_artificial_orders=True)
288
+ if self.on_filled_artificial_order is not None:
289
+ logging.get_logger(self.logger_name).info(f"Created artificial order: {self.on_filled_artificial_order}")
290
+ if self.order_group:
291
+ self.on_filled_artificial_order.add_to_order_group(self.order_group)
292
+ return self.on_filled_artificial_order
293
+
279
294
  async def initialize_impl(self, **kwargs):
280
295
  """
281
296
  Initialize order status update tasks
@@ -432,8 +447,8 @@ class Order(util.Initializable):
432
447
  await self.state.initialize(forced=force_close)
433
448
 
434
449
  async def on_cancel(
435
- self, is_from_exchange_data=False, force_cancel=False, enable_associated_orders_creation=None,
436
- ignored_order=None
450
+ self, is_from_exchange_data=False, force_cancel=False, enable_associated_orders_creation=None,
451
+ ignored_order=None
437
452
  ):
438
453
  enable_associated_orders_creation = self.state.enable_associated_orders_creation \
439
454
  if (self.state and enable_associated_orders_creation is None) \
@@ -451,12 +466,12 @@ class Order(util.Initializable):
451
466
  """
452
467
  self.status = enums.OrderStatus.FILLED
453
468
 
454
- async def on_filled(self, enable_associated_orders_creation):
469
+ async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
455
470
  """
456
471
  Filling complete callback
457
472
  """
458
473
  if enable_associated_orders_creation:
459
- await self._trigger_chained_orders()
474
+ await self._trigger_chained_orders(enable_associated_orders_creation)
460
475
  elif self.chained_orders:
461
476
  logging.get_logger(self.get_logger_name()).info(
462
477
  f"Skipped chained orders creation for {len(self.chained_orders)} chained orders: "
@@ -494,16 +509,68 @@ class Order(util.Initializable):
494
509
  Implement if necessary
495
510
  """
496
511
 
497
- async def _trigger_chained_orders(self):
512
+ async def _trigger_chained_orders(self, enable_associated_orders_creation):
498
513
  logger = logging.get_logger(self.get_logger_name())
499
514
  for index, order in enumerate(self.chained_orders):
515
+ if order.is_cleared():
516
+ logger.error(
517
+ f"Chained order {index + 1}/{len(self.chained_orders)} has been cleared: skipping "
518
+ f"creation (order: {order})"
519
+ )
520
+ continue
500
521
  can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
501
522
  if can_be_created and order.should_be_created():
502
523
  logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
503
- await order_util.create_as_chained_order(order)
524
+ await self._create_triggered_chained_order(order, enable_associated_orders_creation)
504
525
  else:
505
526
  logger.debug(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
506
527
 
528
+ async def _create_triggered_chained_order(self, order, enable_associated_orders_creation):
529
+ logger = logging.get_logger(self.get_logger_name())
530
+ try:
531
+ await order_util.create_as_chained_order(order)
532
+ except errors.ExchangeClosedPositionError as err:
533
+ message = (
534
+ f"chained order is cancelled as it can't be created: position is closed "
535
+ f"on exchange ({err}) order: {order.id}"
536
+ )
537
+ if order.reduce_only:
538
+ # can happen on reduce only orders
539
+ logger.warning(f"Reduce only {message}")
540
+ else:
541
+ # should not happen on non-reduce only orders
542
+ logger.error(f"Unexpected: Non reduce only {message}")
543
+ # order can't be created: consider it cancelled
544
+ # note: grouped orders will also be skipped as this one is cancelled (should_be_created will be false)
545
+ order.status = octobot_trading.enums.OrderStatus.CLOSED
546
+ # clear state to avoid using outdated pending creation state
547
+ order.state = None
548
+ order.clear()
549
+ except errors.ExchangeOrderInstantTriggerError as err:
550
+ logger.info(f"Order would instantly trigger ({err}). Creating artificial order instead.")
551
+ equivalent_order = await order.create_on_filled_artificial_order(enable_associated_orders_creation)
552
+ if equivalent_order is None:
553
+ # should not happen on limit or market only orders
554
+ logger.error(f"Unexpected instant trigger error: {err} when creating chained order {order}")
555
+ else:
556
+ # acceptable: convert this order into its "triggered artificial order" equivalent
557
+ logger.warning(
558
+ f"Outdated chained order: order trigger price has already been reached. "
559
+ f"Creating equivalent {equivalent_order.get_name()} artificial order instead. "
560
+ f"Initial order: {order}, artificial order: {equivalent_order}."
561
+ )
562
+ # note: grouped orders will also be skipped as this one is filled (should_be_created will be false)
563
+ order.status = octobot_trading.enums.OrderStatus.CLOSED
564
+ # clear state to avoid using outdated pending creation state
565
+ order.state = None
566
+ order.clear()
567
+ except Exception as err:
568
+ logger.exception(
569
+ err,
570
+ True,
571
+ f"Unexpected error ({err.__class__.__name__}: {err}) when creating chained order: {order}"
572
+ )
573
+
507
574
  async def set_as_chained_order(self, triggered_by, has_been_bundled, exchange_creation_params,
508
575
  update_with_triggering_order_fees, **trader_creation_kwargs):
509
576
  if triggered_by is self:
@@ -526,9 +593,19 @@ class Order(util.Initializable):
526
593
  return False
527
594
  for other_order in self.triggered_by.chained_orders:
528
595
  if other_order is self:
529
- return False
530
- if self.order_group is not None and self.order_group is other_order.order_group \
531
- and other_order.is_closed():
596
+ continue
597
+ order_to_check = (
598
+ other_order
599
+ if other_order.on_filled_artificial_order is None
600
+ else other_order.on_filled_artificial_order
601
+ )
602
+ if (
603
+ self.order_group is not None and self.order_group is order_to_check.order_group
604
+ and (
605
+ order_to_check.is_closed() # grouped order has been closed
606
+ or not order_to_check.SUPPORTS_GROUPING # grouped order can't be used in groups (anymore)
607
+ )
608
+ ):
532
609
  return True
533
610
  return False
534
611
 
@@ -758,7 +835,7 @@ class Order(util.Initializable):
758
835
 
759
836
  self.fee = order_util.parse_raw_fees(raw_order[enums.ExchangeConstantsOrderColumns.FEE.value])
760
837
 
761
- self.executed_time = self.trader.exchange.get_uniformized_timestamp(
838
+ self.executed_time = self.trader.exchange_manager.exchange.get_uniformized_timestamp(
762
839
  raw_order[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value])
763
840
 
764
841
  def _update_type_from_raw(self, raw_order):
@@ -1,3 +1,4 @@
1
+ # pylint: disable=W0706
1
2
  # Drakkar-Software OctoBot-Trading
2
3
  # Copyright (c) Drakkar-Software, All rights reserved.
3
4
  #
@@ -479,8 +480,12 @@ async def create_as_chained_order(order):
479
480
  order,
480
481
  loaded=False,
481
482
  params=order.exchange_creation_params,
483
+ raise_all_creation_error=True,
482
484
  **order.trader_creation_kwargs
483
485
  )
486
+ except (errors.ExchangeClosedPositionError, errors.ExchangeOrderInstantTriggerError):
487
+ # Order can be created and might be outdated forward error for the caller to fix it if possible
488
+ raise
484
489
  except Exception as err:
485
490
  # log warning to be sure to keep track of the failed order details
486
491
  logging.get_logger(LOGGER_NAME).warning(
@@ -34,14 +34,19 @@ class StopLossLimitOrder(limit_order.LimitOrder):
34
34
  async def update_price_if_outdated(self):
35
35
  pass
36
36
 
37
- async def on_filled(self, enable_associated_orders_creation):
38
- await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
39
- # TODO replace with chained order ?
40
- await self.trader.create_artificial_order(enums.TraderOrderType.SELL_MARKET
41
- if self.side is enums.TradeOrderSide.SELL
42
- else enums.TraderOrderType.BUY_MARKET,
43
- self.symbol, self.origin_stop_price,
44
- self.origin_quantity,
45
- self.limit_price
46
- if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else
47
- self.origin_stop_price)
37
+ async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
38
+ await limit_order.LimitOrder.on_filled(
39
+ self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
40
+ )
41
+ order_type = (
42
+ enums.TraderOrderType.SELL_LIMIT
43
+ if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_LIMIT
44
+ )
45
+ limit_price = (
46
+ self.limit_price
47
+ if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else self.origin_stop_price
48
+ )
49
+ self.on_filled_artificial_order = await self.trader.create_artificial_order(
50
+ order_type, self.symbol, self.origin_stop_price, self.origin_quantity, limit_price,
51
+ self.reduce_only, self.close_position
52
+ )
@@ -32,12 +32,16 @@ class StopLossOrder(limit_order.LimitOrder):
32
32
  # Creates a market order when filled, which is taker
33
33
  return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
34
34
 
35
- async def on_filled(self, enable_associated_orders_creation):
36
- await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
37
- if not self.trader.simulate and self.is_self_managed():
38
- # TODO replace with chained order ?
39
- await self.trader.create_artificial_order(enums.TraderOrderType.SELL_MARKET
40
- if self.side is enums.TradeOrderSide.SELL
41
- else enums.TraderOrderType.BUY_MARKET,
42
- self.symbol, self.origin_stop_price,
43
- self.origin_quantity, self.origin_stop_price)
35
+ async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
36
+ await limit_order.LimitOrder.on_filled(
37
+ self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
38
+ )
39
+ if not self.trader.simulate and (self.is_self_managed() or force_artificial_orders):
40
+ order_type = (
41
+ enums.TraderOrderType.SELL_MARKET
42
+ if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_MARKET
43
+ )
44
+ self.on_filled_artificial_order = await self.trader.create_artificial_order(
45
+ order_type, self.symbol, self.origin_stop_price, self.origin_quantity, self.origin_stop_price,
46
+ self.reduce_only, self.close_position
47
+ )
@@ -29,14 +29,19 @@ class TakeProfitLimitOrder(limit_order.LimitOrder):
29
29
  async def update_price_if_outdated(self):
30
30
  pass
31
31
 
32
- async def on_filled(self, enable_associated_orders_creation):
33
- await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
34
- # TODO replace with chained order ?
35
- await self.trader.create_artificial_order(enums.TraderOrderType.SELL_LIMIT
36
- if self.side is enums.TradeOrderSide.SELL
37
- else enums.TraderOrderType.BUY_LIMIT,
38
- self.symbol, self.origin_stop_price,
39
- self.origin_quantity,
40
- self.limit_price
41
- if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else
42
- self.origin_stop_price)
32
+ async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
33
+ await limit_order.LimitOrder.on_filled(
34
+ self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
35
+ )
36
+ order_type = (
37
+ enums.TraderOrderType.SELL_LIMIT
38
+ if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_LIMIT
39
+ )
40
+ limit_price = (
41
+ self.limit_price
42
+ if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else self.origin_stop_price
43
+ )
44
+ self.on_filled_artificial_order = await self.trader.create_artificial_order(
45
+ order_type, self.symbol, self.origin_stop_price, self.origin_quantity, limit_price,
46
+ self.reduce_only, self.close_position
47
+ )