OctoBot-Trading 2.4.139__tar.gz → 2.4.141__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.139 → OctoBot-Trading-2.4.141}/CHANGELOG.md +12 -0
  2. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.139/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.141}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/README.md +1 -1
  5. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/__init__.py +2 -0
  7. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/contracts.py +4 -0
  8. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/enums.py +14 -0
  9. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/errors.py +20 -0
  10. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/margin_contract.py +12 -5
  11. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/abstract_exchange.py +4 -1
  12. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_manager.py +3 -3
  13. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/trader.py +31 -19
  14. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/rest_exchange.py +31 -2
  15. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/abstract_trading_mode.py +8 -0
  16. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +1 -2
  17. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order.py +90 -13
  18. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_util.py +5 -0
  19. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +16 -11
  20. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +13 -9
  21. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +16 -11
  22. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +13 -9
  23. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/market_order.py +2 -0
  24. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +16 -10
  25. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +12 -8
  26. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position.py +4 -1
  27. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/positions_manager.py +3 -3
  28. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/__init__.py +2 -0
  29. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/signal_creation.py +14 -0
  30. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/trading_signal_bundle_builder.py +103 -33
  31. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/util.py +15 -0
  32. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order.py +209 -6
  33. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/test_future_portfolio.py +5 -1
  34. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/test_position.py +13 -13
  35. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/types/test_inverse_position.py +10 -10
  36. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/types/test_linear_position.py +10 -10
  37. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/signals/test_trading_signal_bundle_builder.py +157 -20
  38. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/LICENSE +0 -0
  39. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/MANIFEST.in +0 -0
  40. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  41. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  42. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  43. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/requires.txt +0 -0
  44. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  45. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/channels.py +0 -0
  46. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/exchange.py +0 -0
  47. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/modes.py +0 -0
  48. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/orders.py +0 -0
  49. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/portfolio.py +0 -0
  50. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/positions.py +0 -0
  51. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/profitability.py +0 -0
  52. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/storage.py +0 -0
  53. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/symbol_data.py +0 -0
  54. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/trader.py +0 -0
  55. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/trades.py +0 -0
  56. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/constants.py +0 -0
  57. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_channel.py +0 -0
  58. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  61. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  62. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  63. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  64. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  66. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  67. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  68. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  69. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  70. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  73. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  74. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  75. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  76. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  78. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  79. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  80. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  81. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  82. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  83. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  84. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  87. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  88. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  89. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  90. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  93. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  94. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  96. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  97. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  100. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  101. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  102. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  103. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  106. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  107. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  108. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  109. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  111. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  113. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/__init__.py +0 -0
  114. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  115. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  116. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  117. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  118. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  119. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  120. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  121. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  122. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  123. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  124. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  125. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  126. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  128. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  129. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  130. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_builder.py +0 -0
  131. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_channels.py +0 -0
  132. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_details.py +0 -0
  133. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_factory.py +0 -0
  134. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  135. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchanges.py +0 -0
  136. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  138. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  139. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  140. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/__init__.py +0 -0
  141. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  142. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  144. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  146. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  147. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  148. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  149. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/__init__.py +0 -0
  150. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/__init__.py +0 -0
  151. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  152. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  153. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/mode.py +0 -0
  154. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/mode_activity.py +0 -0
  155. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/mode_config.py +0 -0
  156. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/modes_factory.py +0 -0
  157. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/modes_util.py +0 -0
  158. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  161. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  162. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  163. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  164. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  165. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  166. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  167. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  168. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  170. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  171. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  172. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  173. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/octobot_channel_consumer.py +0 -0
  174. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/__init__.py +0 -0
  175. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  176. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  178. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  179. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  180. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  181. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  182. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  183. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  184. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  185. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  186. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  187. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  188. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_group.py +0 -0
  189. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_state.py +0 -0
  190. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  191. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  192. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  193. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  194. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  195. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  196. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  197. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  198. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  199. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  200. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  201. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  204. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  205. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  207. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  208. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  210. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  211. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  213. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  215. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  216. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  217. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  218. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  219. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  220. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  221. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  222. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  223. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  224. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  225. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  227. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  228. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  229. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  230. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  231. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  232. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  234. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  236. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  237. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  240. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  241. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  242. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  243. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position_state.py +0 -0
  244. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position_util.py +0 -0
  245. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  247. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  248. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  249. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  250. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  252. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  253. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/state.py +0 -0
  254. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/__init__.py +0 -0
  255. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  257. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  258. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trade.py +0 -0
  259. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  260. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  261. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  262. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  263. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  265. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  266. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  267. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  268. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  269. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  270. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  271. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  272. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  274. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  275. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/signal_producer.py +0 -0
  276. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/abstract_storage.py +0 -0
  278. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/candles_storage.py +0 -0
  279. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/orders_storage.py +0 -0
  280. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/portfolio_storage.py +0 -0
  281. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/storage_manager.py +0 -0
  282. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/trades_storage.py +0 -0
  283. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/transactions_storage.py +0 -0
  284. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/util.py +0 -0
  285. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/supervisors/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  288. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/config_util.py +0 -0
  290. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/initializable.py +0 -0
  291. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/initialization_util.py +0 -0
  292. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/simulator_updater_utils.py +0 -0
  293. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  295. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  297. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  298. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/requirements.txt +0 -0
  299. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/setup.cfg +0 -0
  300. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/setup.py +0 -0
  301. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/__init__.py +0 -0
  302. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_channels.py +0 -0
  303. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_exchange.py +0 -0
  304. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_modes.py +0 -0
  305. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_orders.py +0 -0
  306. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_portfolio.py +0 -0
  307. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_profitability.py +0 -0
  308. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_symbol_data.py +0 -0
  309. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_trader.py +0 -0
  310. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_trades.py +0 -0
  311. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/cli/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/contracts/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  315. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  316. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/funding/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  318. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/kline/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  320. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ohlcv/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  322. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  323. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/order_book/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  325. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/prices/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  327. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  328. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/recent_trades/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  330. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  331. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ticker/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  333. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  337. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  338. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/implementations/__init__.py +0 -0
  339. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_abstract_exchange.py +0 -0
  342. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  343. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_builder.py +0 -0
  344. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_config_data.py +0 -0
  345. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_factory.py +0 -0
  346. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_manager.py +0 -0
  347. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_simulator.py +0 -0
  348. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchanges.py +0 -0
  349. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/traders/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/traders/test_trader.py +0 -0
  351. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/types/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  353. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/util/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  355. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/util/test_exchange_util.py +0 -0
  356. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  360. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  361. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  362. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  363. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  365. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/test_abstract_mode_consumer.py +0 -0
  366. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/test_abstract_trading_mode.py +0 -0
  367. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/test_modes_util.py +0 -0
  368. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/__init__.py +0 -0
  371. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  372. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  373. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  374. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/__init__.py +0 -0
  375. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  381. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  382. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  383. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  384. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  385. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order_adapter.py +0 -0
  386. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order_factory.py +0 -0
  387. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order_util.py +0 -0
  388. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_orders_manager.py +0 -0
  389. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  390. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/__init__.py +0 -0
  391. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  392. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  395. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  396. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  397. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  398. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  399. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/market/__init__.py +0 -0
  400. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  401. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  402. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  403. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  404. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  405. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  406. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  408. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  409. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  410. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  411. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/history/__init__.py +0 -0
  412. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  413. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  414. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_asset.py +0 -0
  415. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  417. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  418. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  419. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  420. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  422. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  423. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/channel/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/states/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/test_position_factory.py +0 -0
  427. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/test_positions_manager.py +0 -0
  428. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/types/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_factory.py +0 -0
  431. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_manager.py +0 -0
  432. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  433. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_util.py +0 -0
  434. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/transactions/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  436. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  437. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/signals/__init__.py +0 -0
  438. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/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.141] - 2025-01-05
8
+ ### Added
9
+ [TradingSignals] add positions and leverage update
10
+
11
+ ## [2.4.140] - 2025-01-03
12
+ ### Updated
13
+ [Positions] properly clear closed positions
14
+ [Exchanges] handle newline error in keys
15
+ ### Fixed
16
+ [Exchanges] don't raise on missing order description
17
+ [Orders] fix closed pos & instant fill chained orders
18
+
7
19
  ## [2.4.139] - 2023-12-29
8
20
  ### Updated
9
21
  [Simulator] handle futures backtesting with market status and different ccxt classes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.139
3
+ Version: 2.4.141
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.139](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.141](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.139
3
+ Version: 2.4.141
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.139](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.141](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.139](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.141](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.139" # major.minor.revision
18
+ VERSION = "2.4.141" # major.minor.revision
@@ -210,6 +210,7 @@ from octobot_trading.api.contracts import (
210
210
  get_pair_contracts,
211
211
  is_handled_contract,
212
212
  has_pair_future_contract,
213
+ update_pair_contract,
213
214
  load_pair_contract,
214
215
  create_default_future_contract,
215
216
  )
@@ -386,6 +387,7 @@ __all__ = [
386
387
  "get_pair_contracts",
387
388
  "is_handled_contract",
388
389
  "has_pair_future_contract",
390
+ "update_pair_contract",
389
391
  "load_pair_contract",
390
392
  "create_default_future_contract",
391
393
  "set_is_exclusively_using_exchange_position_details",
@@ -38,6 +38,10 @@ def has_pair_future_contract(exchange_manager, pair: str) -> bool:
38
38
  return exchange_manager.exchange.has_pair_future_contract(pair)
39
39
 
40
40
 
41
+ def update_pair_contract(exchange_manager, pair: str, leverage: decimal.Decimal):
42
+ get_pair_contracts(exchange_manager)[pair].current_leverage = leverage
43
+
44
+
41
45
  def load_pair_contract(exchange_manager, contract_dict: dict):
42
46
  exchange_data.update_future_contract_from_dict(exchange_manager, contract_dict)
43
47
 
@@ -521,6 +521,7 @@ class TradingSignalAttrs(enum.Enum):
521
521
 
522
522
  class TradingSignalTopics(enum.Enum):
523
523
  ORDERS = "orders"
524
+ POSITIONS = "positions"
524
525
  PORTFOLIO = "portfolio"
525
526
 
526
527
 
@@ -559,6 +560,15 @@ class TradingSignalOrdersAttrs(enum.Enum):
559
560
  UPDATE_WITH_TRIGGERING_ORDER_FEES = "update_with_triggering_order_fees"
560
561
 
561
562
 
563
+ class TradingSignalPositionsAttrs(enum.Enum):
564
+ EXCHANGE = "exchange"
565
+ EXCHANGE_TYPE = "exchange_type"
566
+ STRATEGY = "strategy"
567
+ SYMBOL = "symbol"
568
+ SIDE = "side"
569
+ LEVERAGE = "leverage"
570
+
571
+
562
572
  class TradingSignalOrdersActions(enum.Enum):
563
573
  CREATE = "create"
564
574
  ADD_TO_GROUP = "add_to_group"
@@ -566,6 +576,10 @@ class TradingSignalOrdersActions(enum.Enum):
566
576
  CANCEL = "cancel"
567
577
 
568
578
 
579
+ class TradingSignalPositionsActions(enum.Enum):
580
+ EDIT = "edit"
581
+
582
+
569
583
  class StoredOrdersAttr(enum.Enum):
570
584
  GROUP = "gr"
571
585
  GROUP_ID = "gi"
@@ -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
@@ -258,6 +272,12 @@ class OrderDescriptionNotFoundError(Exception):
258
272
  """
259
273
 
260
274
 
275
+ class PositionDescriptionNotFoundError(Exception):
276
+ """
277
+ Raised when a position description is not found
278
+ """
279
+
280
+
261
281
  class AdapterError(Exception):
262
282
  """
263
283
  Raised when an error occurs in an adapter
@@ -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_commons.logging as logging
17
19
 
18
20
  import octobot_trading.enums as enums
@@ -24,12 +26,12 @@ class MarginContract:
24
26
  contract_size=constants.ONE,
25
27
  maximum_leverage=constants.ONE,
26
28
  current_leverage=constants.ONE):
27
- self.pair = pair
29
+ self.pair: str = pair
28
30
  self.margin_type = margin_type
29
31
 
30
- self.contract_size = contract_size
31
- self.maximum_leverage = maximum_leverage
32
- self.current_leverage = current_leverage
32
+ self.contract_size: decimal.Decimal = contract_size
33
+ self.maximum_leverage: decimal.Decimal = maximum_leverage
34
+ self.current_leverage: decimal.Decimal = current_leverage
33
35
 
34
36
  self.risk_limit = {}
35
37
 
@@ -47,7 +49,12 @@ class MarginContract:
47
49
  :param new_leverage: the leverage value to check
48
50
  :return: True if valid
49
51
  """
50
- return 0 < new_leverage if self.maximum_leverage is None else 0 < new_leverage <= self.maximum_leverage
52
+ dec_leverage = decimal.Decimal(str(new_leverage))
53
+ return (
54
+ constants.ZERO < dec_leverage
55
+ if self.maximum_leverage is None
56
+ else constants.ZERO < dec_leverage <= self.maximum_leverage
57
+ )
51
58
 
52
59
  def set_current_leverage(self, new_leverage):
53
60
  """
@@ -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
@@ -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,
@@ -769,13 +779,16 @@ class Trader(util.Initializable):
769
779
  async with self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.lock:
770
780
  await self.exchange_manager.exchange_personal_data.handle_portfolio_update_from_withdrawal(amount, currency)
771
781
 
772
- async def set_leverage(self, symbol, side, leverage):
782
+ async def set_leverage(
783
+ self, symbol: str, side: typing.Optional[enums.PositionSide], leverage: decimal.Decimal
784
+ ) -> bool:
773
785
  """
774
786
  Updates the symbol contract leverage
775
787
  Can raise InvalidLeverageValue if leverage value is not matching requirements
776
788
  :param symbol: the symbol to update
777
789
  :param side: the side to update (TODO)
778
790
  :param leverage: the new leverage value
791
+ :return True if leverage changed
779
792
  """
780
793
  contract = self.exchange_manager.exchange.get_pair_future_contract(symbol)
781
794
  if not contract.check_leverage_update(leverage):
@@ -783,12 +796,11 @@ class Trader(util.Initializable):
783
796
  f"but maximal value is {contract.maximum_leverage}")
784
797
  if contract.current_leverage != leverage:
785
798
  if not self.simulate:
786
- await self.exchange_manager.exchange.set_symbol_leverage(
787
- symbol=symbol,
788
- leverage=leverage
789
- )
799
+ await self.exchange_manager.exchange.set_symbol_leverage(symbol, float(leverage))
790
800
  self.logger.info(f"Switching {symbol} leverage from {contract.current_leverage} to {leverage}")
791
801
  contract.set_current_leverage(leverage)
802
+ return True
803
+ return False
792
804
 
793
805
  async def set_symbol_take_profit_stop_loss_mode(self, symbol, new_mode: enums.TakeProfitStopLossMode):
794
806
  """
@@ -102,6 +102,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
102
102
  CAN_HAVE_DELAYED_CANCELLED_ORDERS = False
103
103
  # Set True when the "limit" param when fetching order books is taken into account
104
104
  SUPPORTS_CUSTOM_LIMIT_ORDER_BOOK_FETCH = False
105
+ # Set False when the leverage value is set via something else that a set_leverage api (from orders for example)
106
+ UPDATE_LEVERAGE_FROM_API = True
105
107
 
106
108
  # text content of errors due to orders not found errors
107
109
  EXCHANGE_ORDER_NOT_FOUND_ERRORS: typing.List[typing.Iterable[str]] = []
@@ -119,6 +121,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
119
121
  EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
120
122
  # text content of errors due to unhandled authentication issues
121
123
  EXCHANGE_AUTHENTICATION_ERRORS: typing.List[typing.Iterable[str]] = []
124
+ # text content of errors due to a closed position on the exchange. Relevant for reduce-only orders
125
+ EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
126
+ # text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
127
+ EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
122
128
 
123
129
  DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
124
130
 
@@ -253,7 +259,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
253
259
  if self.should_log_on_ddos_exception(e):
254
260
  self.connector.log_ddos_error(e)
255
261
  raise errors.FailedRequest(
256
- f"Failed to order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
262
+ f"Failed order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
257
263
  ) from e
258
264
  except errors.OctoBotExchangeError:
259
265
  # custom error: forward it
@@ -276,6 +282,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
276
282
  f"Exchange is refusing this order request on this account because "
277
283
  f"of its compliancy requirements."
278
284
  ) from e
285
+ if self.is_exchange_closed_position_error(e):
286
+ raise errors.ExchangeClosedPositionError(
287
+ f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
288
+ f"Exchange is refusing this order request because associated position is closed."
289
+ ) from e
290
+ if self.is_exchange_order_would_immediately_trigger_error(e):
291
+ raise errors.ExchangeOrderInstantTriggerError(
292
+ f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
293
+ f"Exchange is refusing this order request because associated order would instantly trigger."
294
+ ) from e
279
295
  self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
280
296
  # print(traceback.format_exc(), file=sys.stderr) # uncomment for debugging in tests
281
297
  self.logger.exception(
@@ -920,7 +936,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
920
936
  :param leverage: the leverage
921
937
  :return: the update result
922
938
  """
923
- return await self.connector.set_symbol_leverage(leverage=leverage, symbol=symbol, **kwargs)
939
+ if self.UPDATE_LEVERAGE_FROM_API:
940
+ return await self.connector.set_symbol_leverage(leverage=leverage, symbol=symbol, **kwargs)
941
+ # nothing to do when UPDATE_LEVERAGE_FROM_API is False
942
+ return None
924
943
 
925
944
  async def set_symbol_margin_type(self, symbol: str, isolated: bool, **kwargs: dict):
926
945
  """
@@ -989,6 +1008,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
989
1008
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_COMPLIANCY_ERRORS)
990
1009
  return False
991
1010
 
1011
+ def is_exchange_closed_position_error(self, error: BaseException) -> bool:
1012
+ if self.EXCHANGE_CLOSED_POSITION_ERRORS:
1013
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_CLOSED_POSITION_ERRORS)
1014
+ return False
1015
+
1016
+ def is_exchange_order_would_immediately_trigger_error(self, error: BaseException) -> bool:
1017
+ if self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS:
1018
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS)
1019
+ return False
1020
+
992
1021
  def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
993
1022
  if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
994
1023
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
@@ -17,6 +17,7 @@ import abc
17
17
  import contextlib
18
18
  import decimal
19
19
  import copy
20
+ import typing
20
21
 
21
22
  import octobot_commons.constants as common_constants
22
23
  import octobot_commons.enums as common_enums
@@ -585,6 +586,13 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
585
586
  params=params
586
587
  )
587
588
 
589
+ async def set_leverage(
590
+ self, symbol: str, side: typing.Optional[enums.PositionSide], leverage: decimal.Decimal
591
+ ) -> bool:
592
+ return await signals.set_leverage(
593
+ self.exchange_manager, self.should_emit_trading_signal(), symbol, side, leverage
594
+ )
595
+
588
596
  async def get_additional_metadata(self, is_backtesting):
589
597
  """
590
598
  Override if necessary
@@ -42,9 +42,8 @@ async def user_select_emit_trading_signals(ctx, identifier, def_val=False) -> bo
42
42
  return is_emitting_signals
43
43
 
44
44
 
45
- async def set_leverage(ctx, leverage):
45
+ async def set_leverage(ctx, leverage, side=None):
46
46
  if ctx.exchange_manager.is_future:
47
- side = None
48
47
  try:
49
48
  await ctx.exchange_manager.trader.set_leverage(ctx.symbol, side, decimal.Decimal(str(leverage)))
50
49
  except errors.ContractExistsError as e:
@@ -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(