OctoBot-Trading 2.4.175__tar.gz → 2.4.177__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 (510) hide show
  1. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/CHANGELOG.md +15 -0
  2. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/OctoBot_Trading.egg-info/SOURCES.txt +14 -0
  4. {OctoBot-Trading-2.4.175/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.177}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/README.md +1 -1
  6. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/__init__.py +2 -0
  8. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/orders.py +6 -2
  9. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/constants.py +2 -0
  10. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/enums.py +19 -0
  11. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +7 -2
  12. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchange_factory.py +1 -1
  13. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/traders/trader.py +65 -16
  14. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/types/rest_exchange.py +12 -6
  15. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/channel/abstract_mode_producer.py +19 -0
  16. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/__init__.py +20 -2
  17. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/exchange_personal_data.py +19 -0
  18. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/__init__.py +26 -2
  19. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py +37 -0
  20. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py +112 -0
  21. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py +30 -0
  22. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py +31 -0
  23. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/channel/orders.py +3 -3
  24. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +145 -56
  25. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/groups/group_util.py +11 -0
  26. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +30 -0
  27. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +9 -0
  28. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/order.py +176 -12
  29. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/order_factory.py +7 -1
  30. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/order_group.py +42 -3
  31. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/order_state.py +1 -4
  32. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/order_util.py +99 -18
  33. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/orders_manager.py +32 -18
  34. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/orders_storage_operations.py +8 -8
  35. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/cancel_order_state.py +4 -1
  36. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/close_order_state.py +16 -8
  37. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/open_order_state.py +10 -3
  38. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/triggers/__init__.py +32 -0
  39. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/triggers/base_trigger.py +77 -0
  40. OctoBot-Trading-2.4.177/octobot_trading/personal_data/orders/triggers/price_trigger.py +75 -0
  41. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/limit_order.py +17 -14
  42. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +2 -5
  43. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -3
  44. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +2 -2
  45. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -3
  46. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/market/market_order.py +6 -0
  47. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +7 -8
  48. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/portfolio_manager.py +1 -1
  49. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/portfolio_util.py +5 -0
  50. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +6 -0
  51. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/position.py +27 -8
  52. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/__init__.py +4 -0
  53. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/signal_creation.py +28 -0
  54. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/trading_signal_bundle_builder.py +6 -0
  55. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/util.py +19 -8
  56. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/orders_storage.py +37 -5
  57. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/traders/test_trader.py +3 -3
  58. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/__init__.py +2 -0
  59. OctoBot-Trading-2.4.177/tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py +286 -0
  60. OctoBot-Trading-2.4.177/tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py +33 -0
  61. OctoBot-Trading-2.4.177/tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py +33 -0
  62. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +199 -1
  63. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +73 -0
  64. OctoBot-Trading-2.4.177/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +611 -0
  65. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_order.py +192 -1
  66. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_order_factory.py +15 -4
  67. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_order_util.py +260 -4
  68. OctoBot-Trading-2.4.177/tests/personal_data/orders/triggers/test_base_trigger.py +97 -0
  69. OctoBot-Trading-2.4.177/tests/personal_data/orders/triggers/test_price_trigger.py +222 -0
  70. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +7 -0
  71. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_portfolio_util.py +109 -0
  72. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/positions/test_position.py +56 -0
  73. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/signals/test_trading_signal_bundle_builder.py +23 -1
  74. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/signals/test_util.py +30 -0
  75. OctoBot-Trading-2.4.177/tests/util/__init__.py +15 -0
  76. OctoBot-Trading-2.4.177/tests_additional/__init__.py +15 -0
  77. OctoBot-Trading-2.4.175/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -136
  78. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/LICENSE +0 -0
  79. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/MANIFEST.in +0 -0
  80. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  81. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  82. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/OctoBot_Trading.egg-info/requires.txt +0 -0
  83. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  84. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/channels.py +0 -0
  85. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/contracts.py +0 -0
  86. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/exchange.py +0 -0
  87. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/modes.py +0 -0
  88. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/portfolio.py +0 -0
  89. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/positions.py +0 -0
  90. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/profitability.py +0 -0
  91. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/storage.py +0 -0
  92. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/symbol_data.py +0 -0
  93. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/trader.py +0 -0
  94. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/api/trades.py +0 -0
  95. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/errors.py +0 -0
  96. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_channel.py +0 -0
  97. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  100. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  101. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  102. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  103. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  104. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  107. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  108. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  109. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  110. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  113. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  114. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  115. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  116. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  118. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  119. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  121. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  122. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  123. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  124. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  127. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  128. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  129. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  130. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  133. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  134. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  135. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  136. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  137. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  139. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  140. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  141. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  142. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  143. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  144. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  146. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  147. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  148. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  149. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/__init__.py +0 -0
  150. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  151. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  152. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  154. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/config/__init__.py +0 -0
  155. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  156. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  157. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
  158. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  159. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  162. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  163. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  164. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  165. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  166. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  167. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  169. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  170. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  171. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchange_builder.py +0 -0
  172. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchange_channels.py +0 -0
  173. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchange_details.py +0 -0
  174. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchange_manager.py +0 -0
  175. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  176. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/exchanges.py +0 -0
  177. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  178. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  179. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  180. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  181. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/traders/__init__.py +0 -0
  182. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  183. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/types/__init__.py +0 -0
  184. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  185. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/util/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  187. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  188. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  189. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  190. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/__init__.py +0 -0
  191. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  192. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/channel/__init__.py +0 -0
  193. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  194. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/channel/mode.py +0 -0
  195. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/mode_activity.py +0 -0
  196. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/mode_config.py +0 -0
  197. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/modes_factory.py +0 -0
  198. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/modes_util.py +0 -0
  199. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  200. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  201. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  202. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  203. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  204. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  205. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  206. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  207. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  208. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  209. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  210. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  211. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  212. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  213. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  215. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/octobot_channel_consumer.py +0 -0
  216. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  218. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  219. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  220. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  222. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  224. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  225. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  226. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  227. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  228. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  229. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  230. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  231. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  232. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  233. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  235. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  236. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  237. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  239. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  240. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  242. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  243. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  244. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  245. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  246. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  247. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  248. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  249. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  250. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  252. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  253. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  254. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  255. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  256. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  257. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  258. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  259. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  260. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  261. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  262. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  263. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  265. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  266. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  267. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  268. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  271. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  272. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  273. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  274. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/position_state.py +0 -0
  275. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/position_util.py +0 -0
  276. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  277. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  278. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  279. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  280. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  281. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  282. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  284. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  285. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/state.py +0 -0
  286. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/__init__.py +0 -0
  287. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  289. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  290. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/trade.py +0 -0
  291. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  292. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  293. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  294. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  295. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  296. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  297. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  298. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  299. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  301. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  302. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  303. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  304. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/channel/__init__.py +0 -0
  305. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  306. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  307. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/signals/channel/signal_producer.py +0 -0
  308. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/abstract_storage.py +0 -0
  310. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/candles_storage.py +0 -0
  311. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/portfolio_storage.py +0 -0
  312. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/storage_manager.py +0 -0
  313. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/trades_storage.py +0 -0
  314. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/transactions_storage.py +0 -0
  315. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/storage/util.py +0 -0
  316. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/supervisors/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  318. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  319. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/config_util.py +0 -0
  321. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/initializable.py +0 -0
  322. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/initialization_util.py +0 -0
  323. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/simulator_updater_utils.py +0 -0
  324. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/test_tools/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  326. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  327. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  328. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  329. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/requirements.txt +0 -0
  330. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/setup.cfg +0 -0
  331. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/setup.py +0 -0
  332. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_channels.py +0 -0
  334. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_modes.py +0 -0
  336. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_orders.py +0 -0
  337. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_portfolio.py +0 -0
  338. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_profitability.py +0 -0
  339. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_symbol_data.py +0 -0
  340. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_trader.py +0 -0
  341. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/api/test_trades.py +0 -0
  342. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/cli/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/contracts/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  346. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  347. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/funding/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  349. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/kline/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  351. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/ohlcv/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  353. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  354. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/order_book/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  356. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/prices/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  358. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  359. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/recent_trades/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  361. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  362. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/ticker/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  364. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/connectors/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  368. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  369. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/implementations/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  371. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  372. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_abstract_exchange.py +0 -0
  373. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  374. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_exchange_builder.py +0 -0
  375. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_exchange_config_data.py +0 -0
  376. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_exchange_factory.py +0 -0
  377. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_exchange_manager.py +0 -0
  378. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_exchange_simulator.py +0 -0
  379. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/test_exchanges.py +0 -0
  380. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/traders/__init__.py +0 -0
  381. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/types/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  383. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/util/__init__.py +0 -0
  384. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  385. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/exchanges/util/test_exchange_util.py +0 -0
  386. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  390. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  391. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  392. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  393. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  395. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/test_abstract_mode_consumer.py +0 -0
  396. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/test_abstract_trading_mode.py +0 -0
  397. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/modes/test_modes_util.py +0 -0
  398. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.175/tests/personal_data/orders/states → OctoBot-Trading-2.4.177/tests/personal_data/orders/active_order_swap_strategies}/__init__.py +0 -0
  400. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/groups/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  402. {OctoBot-Trading-2.4.175/tests/personal_data/orders/types → OctoBot-Trading-2.4.177/tests/personal_data/orders/states}/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  404. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  405. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  406. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  407. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_order_state.py +0 -0
  408. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  409. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  410. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  411. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  412. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  413. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_order_adapter.py +0 -0
  414. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_orders_manager.py +0 -0
  415. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  416. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  418. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  419. {OctoBot-Trading-2.4.175/tests/personal_data/orders/types/trailing → OctoBot-Trading-2.4.177/tests/personal_data/orders/triggers}/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.175/tests/personal_data/portfolios → OctoBot-Trading-2.4.177/tests/personal_data/orders/types}/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  423. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  424. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  425. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  426. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  427. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  428. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/market/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  430. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  431. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  432. {OctoBot-Trading-2.4.175/tests/personal_data/portfolios/assets → OctoBot-Trading-2.4.177/tests/personal_data/orders/types/trailing}/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  434. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  435. {OctoBot-Trading-2.4.175/tests/personal_data/portfolios/types → OctoBot-Trading-2.4.177/tests/personal_data/portfolios}/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.175/tests/personal_data/positions → OctoBot-Trading-2.4.177/tests/personal_data/portfolios/assets}/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  438. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  439. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  440. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/history/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  442. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  443. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_asset.py +0 -0
  444. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  445. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  446. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  447. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  448. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
  449. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  450. {OctoBot-Trading-2.4.175/tests/personal_data/positions/channel → OctoBot-Trading-2.4.177/tests/personal_data/portfolios/types}/__init__.py +0 -0
  451. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  452. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  453. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  454. {OctoBot-Trading-2.4.175/tests/personal_data/positions/states → OctoBot-Trading-2.4.177/tests/personal_data/positions}/__init__.py +0 -0
  455. {OctoBot-Trading-2.4.175/tests/personal_data/positions/types → OctoBot-Trading-2.4.177/tests/personal_data/positions/channel}/__init__.py +0 -0
  456. {OctoBot-Trading-2.4.175/tests/personal_data/transactions → OctoBot-Trading-2.4.177/tests/personal_data/positions/states}/__init__.py +0 -0
  457. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/positions/test_position_factory.py +0 -0
  458. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/positions/test_positions_manager.py +0 -0
  459. {OctoBot-Trading-2.4.175/tests/signals → OctoBot-Trading-2.4.177/tests/personal_data/positions/types}/__init__.py +0 -0
  460. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  461. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  462. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/trades/__init__.py +0 -0
  463. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/trades/test_trade_factory.py +0 -0
  464. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/trades/test_trade_manager.py +0 -0
  465. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  466. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/trades/test_trade_util.py +0 -0
  467. {OctoBot-Trading-2.4.175/tests/util → OctoBot-Trading-2.4.177/tests/personal_data/transactions}/__init__.py +0 -0
  468. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  469. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  470. {OctoBot-Trading-2.4.175/tests_additional → OctoBot-Trading-2.4.177/tests/signals}/__init__.py +0 -0
  471. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/test_utils/__init__.py +0 -0
  472. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/test_utils/order_util.py +0 -0
  473. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/test_utils/random_numbers.py +0 -0
  474. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests/util/test_config_util.py +0 -0
  475. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/__init__.py +0 -0
  476. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  477. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  478. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  479. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_binance.py +0 -0
  480. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  481. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bingx.py +0 -0
  482. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  483. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bitget.py +0 -0
  484. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  485. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  486. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  487. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bitso.py +0 -0
  488. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  489. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bybit.py +0 -0
  490. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  491. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  492. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_coinex.py +0 -0
  493. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  494. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_gateio.py +0 -0
  495. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  496. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  497. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_htx.py +0 -0
  498. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
  499. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_kraken.py +0 -0
  500. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  501. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  502. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_mexc.py +0 -0
  503. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_ndax.py +0 -0
  504. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  505. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_okx.py +0 -0
  506. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  507. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_phemex.py +0 -0
  508. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  509. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_upbit.py +0 -0
  510. {OctoBot-Trading-2.4.175 → OctoBot-Trading-2.4.177}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,21 @@ 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.177] - 2025-05-20
8
+ ### Added
9
+ [Orders] add inactive orders to handle simultaneous stop & Take profit spot orders
10
+
11
+ ## [2.4.176] - 2025-05-20
12
+ ### Added
13
+ [Orders] custom volume in get_valid_split_orders
14
+ [Exchanges] add hyperliquid
15
+ ### Updated
16
+ [Exchange] warn on expected error in load markets
17
+ [Orders] ensure created order amount is always set
18
+ ### Fixed
19
+ [Portfolio] fix < 0 sub portfolio issue
20
+ [Positions] fix position reversing order and pnl
21
+
7
22
  ## [2.4.175] - 2025-05-13
8
23
  ### Fixed
9
24
  [Portfolio] fix different fees discount
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.175
3
+ Version: 2.4.177
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.175](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.177](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)
@@ -165,6 +165,10 @@ octobot_trading/personal_data/orders/order_state.py
165
165
  octobot_trading/personal_data/orders/order_util.py
166
166
  octobot_trading/personal_data/orders/orders_manager.py
167
167
  octobot_trading/personal_data/orders/orders_storage_operations.py
168
+ octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py
169
+ octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py
170
+ octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py
171
+ octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py
168
172
  octobot_trading/personal_data/orders/channel/__init__.py
169
173
  octobot_trading/personal_data/orders/channel/orders.py
170
174
  octobot_trading/personal_data/orders/channel/orders_updater.py
@@ -188,6 +192,9 @@ octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py
188
192
  octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py
189
193
  octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py
190
194
  octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py
195
+ octobot_trading/personal_data/orders/triggers/__init__.py
196
+ octobot_trading/personal_data/orders/triggers/base_trigger.py
197
+ octobot_trading/personal_data/orders/triggers/price_trigger.py
191
198
  octobot_trading/personal_data/orders/types/__init__.py
192
199
  octobot_trading/personal_data/orders/types/unknown_order.py
193
200
  octobot_trading/personal_data/orders/types/unsupported_order.py
@@ -376,6 +383,10 @@ tests/personal_data/orders/test_order_factory.py
376
383
  tests/personal_data/orders/test_order_util.py
377
384
  tests/personal_data/orders/test_orders_manager.py
378
385
  tests/personal_data/orders/test_orders_storage_operations.py
386
+ tests/personal_data/orders/active_order_swap_strategies/__init__.py
387
+ tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py
388
+ tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py
389
+ tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py
379
390
  tests/personal_data/orders/groups/__init__.py
380
391
  tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py
381
392
  tests/personal_data/orders/groups/test_group_util.py
@@ -393,6 +404,9 @@ tests/personal_data/orders/states/test_pending_creation_order_state.py
393
404
  tests/personal_data/orders/trailing_profiles/__init__.py
394
405
  tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py
395
406
  tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py
407
+ tests/personal_data/orders/triggers/__init__.py
408
+ tests/personal_data/orders/triggers/test_base_trigger.py
409
+ tests/personal_data/orders/triggers/test_price_trigger.py
396
410
  tests/personal_data/orders/types/__init__.py
397
411
  tests/personal_data/orders/types/test_unknown_order.py
398
412
  tests/personal_data/orders/types/limit/__init__.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.175
3
+ Version: 2.4.177
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.175](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.177](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.175](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.177](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.175" # major.minor.revision
18
+ VERSION = "2.4.177" # major.minor.revision
@@ -188,6 +188,7 @@ from octobot_trading.api.profitability import (
188
188
  )
189
189
  from octobot_trading.api.orders import (
190
190
  get_open_orders,
191
+ get_all_orders,
191
192
  get_pending_creation_orders,
192
193
  get_order_exchange_name,
193
194
  order_to_dict,
@@ -379,6 +380,7 @@ __all__ = [
379
380
  "get_reference_market",
380
381
  "get_initializing_currencies_prices",
381
382
  "get_open_orders",
383
+ "get_all_orders",
382
384
  "get_pending_creation_orders",
383
385
  "get_order_exchange_name",
384
386
  "order_to_dict",
@@ -44,8 +44,12 @@ async def create_order(exchange_manager,
44
44
  )
45
45
 
46
46
 
47
- def get_open_orders(exchange_manager, symbol=None) -> list:
48
- return exchange_manager.exchange_personal_data.orders_manager.get_open_orders(symbol=symbol)
47
+ def get_open_orders(exchange_manager, symbol=None, active=None) -> list:
48
+ return exchange_manager.exchange_personal_data.orders_manager.get_open_orders(symbol=symbol, active=active)
49
+
50
+
51
+ def get_all_orders(exchange_manager, symbol=None, active=None) -> list:
52
+ return exchange_manager.exchange_personal_data.orders_manager.get_all_orders(symbol=symbol, active=active)
49
53
 
50
54
 
51
55
  def get_pending_creation_orders(exchange_manager) -> list:
@@ -40,6 +40,7 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
40
40
 
41
41
  # Order creation
42
42
  ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
43
+ ACTIVE_ORDER_STRATEGY_SWAP_TIMEOUT = 2 * commons_constants.MINUTE_TO_SECONDS
43
44
  CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
44
45
  CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
45
46
  # create instantly filled limit orders 0.5% beyond market
@@ -136,6 +137,7 @@ TESTED_EXCHANGES = [
136
137
  "coinbase",
137
138
  "cryptocom",
138
139
  "htx",
140
+ "hyperliquid",
139
141
  "bitget",
140
142
  "gateio",
141
143
  "ascendex",
@@ -334,6 +334,7 @@ class ExchangeConstantsOrderColumns(enum.Enum):
334
334
  ENTRIES = "entries"
335
335
  VOLUME = "volume"
336
336
  BROKER_APPLIED = "broker_applied"
337
+ IS_ACTIVE = "is_active"
337
338
 
338
339
 
339
340
  class TradeExtraConstants(enum.Enum):
@@ -552,9 +553,15 @@ class TradingSignalOrdersAttrs(enum.Enum):
552
553
  POST_ONLY = "post_only"
553
554
  GROUP_ID = "group_id"
554
555
  GROUP_TYPE = "group_type"
556
+ ACTIVE_SWAP_STRATEGY_TYPE = "active_swap_strategy_type"
557
+ ACTIVE_SWAP_STRATEGY_TIMEOUT = "active_swap_strategy_timeout"
558
+ ACTIVE_SWAP_STRATEGY_TRIGGER_CONFIG = "active_swap_strategy_trigger_config"
555
559
  TAG = "tag"
556
560
  ORDER_ID = "order_id"
557
561
  TRAILING_PROFILE_TYPE = "trailing_profile_type"
562
+ IS_ACTIVE = "is_active"
563
+ ACTIVE_TRIGGER_PRICE = "active_trigger_price"
564
+ ACTIVE_TRIGGER_ABOVE = "active_trigger_above"
558
565
  TRAILING_PROFILE = "trailing_profile"
559
566
  BUNDLED_WITH = "bundled_with"
560
567
  CHAINED_TO = "chained_to"
@@ -587,7 +594,14 @@ class StoredOrdersAttr(enum.Enum):
587
594
  GROUP = "gr"
588
595
  GROUP_ID = "gi"
589
596
  GROUP_TYPE = "gt"
597
+ ORDER_SWAP_STRATEGY = "oss"
598
+ STRATEGY_TYPE = "sty"
599
+ STRATEGY_TIMEOUT = "sti"
600
+ STRATEGY_TRIGGER_CONFIG = "stc"
590
601
  CHAINED_ORDERS = "co"
602
+ ACTIVE_TRIGGER = "at"
603
+ ACTIVE_TRIGGER_PRICE = "atp"
604
+ ACTIVE_TRIGGER_ABOVE = "ata"
591
605
  TRAILING_PROFILE = "tp"
592
606
  TRAILING_PROFILE_TYPE = "tpt"
593
607
  TRAILING_PROFILE_DETAILS = "tpd"
@@ -620,3 +634,8 @@ class TradingModeActivityType(enum.Enum):
620
634
  CREATED_ORDERS = "created_orders"
621
635
  NOTHING_TO_DO = "nothing_to_do"
622
636
  NO_ACTIVITY = None
637
+
638
+
639
+ class ActiveOrderSwapTriggerPriceConfiguration(enum.Enum):
640
+ FILLING_PRICE = "filling_price"
641
+ ORDER_PARAMS_ONLY = "order_params_only"
@@ -177,8 +177,13 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
177
177
  raise ccxt.AuthenticationError(
178
178
  f"Invalid key format ({html_util.get_html_summary_if_relevant(err)})"
179
179
  ) from err
180
- # should never happen: if it does, propagate it
181
- self.logger.error(f"Unexpected error when loading markets: {err} ({err.__class__.__name__})")
180
+ # should not happen: if it does, propagate it
181
+ if self.exchange_manager.exchange.CAN_MAKE_AUTHENTICATED_REQUESTS_WHEN_LOADING_MARKETS:
182
+ # can happen, just warn
183
+ self.logger.warning(f"{err.__class__.__name__} when loading markets: {err}")
184
+ else:
185
+ # unexpected: notify
186
+ self.logger.error(f"Unexpected error when loading markets: {err} ({err.__class__.__name__})")
182
187
  raise
183
188
  except ccxt.ExchangeNotAvailable as err:
184
189
  raise octobot_trading.errors.FailedRequest(
@@ -67,7 +67,7 @@ async def create_real_exchange(exchange_manager, exchange_config_by_exchange: ty
67
67
  or exchange_manager.disable_unauth_retry
68
68
  ):
69
69
  # auth is required or already retried, don't loop
70
- exchange_manager.logger.error(
70
+ exchange_manager.logger.warning(
71
71
  f"Authentication is required and raised an error: impossible to connect to "
72
72
  f"{exchange_manager.exchange_name} exchange: {err}"
73
73
  )
@@ -58,6 +58,7 @@ class Trader(util.Initializable):
58
58
  if not hasattr(self, 'simulate'):
59
59
  self.simulate = False
60
60
  self.is_enabled = self.__class__.enabled(self.config)
61
+ self.enable_inactive_orders = not self.simulate
61
62
 
62
63
  async def initialize_impl(self):
63
64
  self.is_enabled = self.is_enabled and self.exchange_manager.is_trading
@@ -72,6 +73,9 @@ class Trader(util.Initializable):
72
73
  def enabled(cls, config):
73
74
  return util.is_trader_enabled(config)
74
75
 
76
+ def set_enable_inactive_orders(self, enabled: bool):
77
+ self.enable_inactive_orders = enabled
78
+
75
79
  def set_risk(self, risk):
76
80
  min_risk = decimal.Decimal(str(octobot_commons.constants.CONFIG_TRADER_RISK_MIN))
77
81
  max_risk = decimal.Decimal(str(octobot_commons.constants.CONFIG_TRADER_RISK_MAX))
@@ -116,8 +120,7 @@ class Trader(util.Initializable):
116
120
  try:
117
121
  params = params or {}
118
122
  self.logger.info(f"Creating order: {created_order}")
119
- created_order = await self._create_new_order(order, params, wait_for_creation=wait_for_creation,
120
- creation_timeout=creation_timeout)
123
+ created_order = await self._create_new_order(order, params, wait_for_creation, creation_timeout)
121
124
  if created_order is None:
122
125
  self.logger.warning(f"Order not created on {self.exchange_manager.exchange_name} "
123
126
  f"(failed attempt to create: {order}). This is likely due to "
@@ -186,7 +189,7 @@ class Trader(util.Initializable):
186
189
  disabled_state_updater = self.exchange_manager.exchange_personal_data \
187
190
  .orders_manager.enable_order_auto_synchronization is False
188
191
  # now that we got the lock, ensure we can edit the order
189
- if not self.simulate and not order.is_self_managed() and (
192
+ if not self.simulate and order.is_active and not order.is_self_managed() and (
190
193
  order.state is not None or disabled_state_updater
191
194
  ):
192
195
  if disabled_state_updater:
@@ -264,16 +267,18 @@ class Trader(util.Initializable):
264
267
  await self.exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order(order)
265
268
  return changed
266
269
 
267
- async def _create_new_order(self, new_order, params: dict,
268
- wait_for_creation=True,
269
- creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT) -> object:
270
+ async def _create_new_order(
271
+ self, new_order, params: dict, wait_for_creation: bool, creation_timeout: float
272
+ ):
270
273
  """
271
274
  Creates an exchange managed order, it might be a simulated or a real order.
272
275
  Portfolio will be updated by the created order state after order will be initialized
273
276
  """
274
277
  updated_order = new_order
275
278
  is_pending_creation = False
276
- if not self.simulate and not new_order.is_self_managed():
279
+ if not self.simulate and not new_order.is_self_managed() and (
280
+ new_order.is_in_active_inactive_transition or new_order.is_active
281
+ ):
277
282
  order_params = self.exchange_manager.exchange.get_order_additional_params(new_order)
278
283
  order_params.update(new_order.exchange_creation_params)
279
284
  order_params.update(params)
@@ -313,6 +318,11 @@ class Trader(util.Initializable):
313
318
  updated_order.associated_entry_ids = new_order.associated_entry_ids
314
319
  updated_order.update_with_triggering_order_fees = new_order.update_with_triggering_order_fees
315
320
  updated_order.trailing_profile = new_order.trailing_profile
321
+ if new_order.active_trigger is not None:
322
+ updated_order.use_active_trigger(order_util.create_order_price_trigger(
323
+ updated_order, new_order.active_trigger.trigger_price, new_order.active_trigger.trigger_above
324
+ ))
325
+ updated_order.is_in_active_inactive_transition = new_order.is_in_active_inactive_transition
316
326
 
317
327
  if is_pending_creation:
318
328
  # register order as pending order, it will then be added to live orders in order manager once open
@@ -320,11 +330,19 @@ class Trader(util.Initializable):
320
330
  updated_order
321
331
  )
322
332
 
323
- await updated_order.initialize()
324
- if is_pending_creation and wait_for_creation \
325
- and updated_order.state is not None and updated_order.state.is_pending()\
326
- and self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization:
327
- await updated_order.state.wait_for_terminate(creation_timeout)
333
+ try:
334
+ await updated_order.initialize()
335
+ if is_pending_creation and wait_for_creation \
336
+ and updated_order.state is not None and updated_order.state.is_pending()\
337
+ and self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization:
338
+ await updated_order.state.wait_for_terminate(creation_timeout)
339
+ if new_order.is_in_active_inactive_transition:
340
+ # transition successful: new_order is now inactive
341
+ await new_order.on_active_from_inactive()
342
+ finally:
343
+ if updated_order.is_in_active_inactive_transition:
344
+ # transition completed: never leave is_in_active_inactive_transition to True after transition
345
+ updated_order.is_in_active_inactive_transition = False
328
346
  return updated_order
329
347
 
330
348
  def get_take_profit_order_type(self, base_order, order_type: enums.TraderOrderType) -> enums.TraderOrderType:
@@ -385,6 +403,36 @@ class Trader(util.Initializable):
385
403
  order.add_chained_order(chained_order)
386
404
  self.logger.info(f"Added chained order [{chained_order}] to [{order}] order.")
387
405
 
406
+ async def update_order_as_inactive(
407
+ self, order, ignored_order=None, wait_for_cancelling=True,
408
+ cancelling_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
409
+ ) -> bool:
410
+ if not self.enable_inactive_orders:
411
+ self.logger.error(f"Can't update order as inactive when {self.enable_inactive_orders=}.")
412
+ return False
413
+ cancelled = False
414
+ if order and order.is_open():
415
+ with order.active_or_inactive_transition():
416
+ cancelled = await self._handle_order_cancellation(
417
+ order, ignored_order, wait_for_cancelling, cancelling_timeout
418
+ )
419
+ else:
420
+ self.logger.error(f"Can't update order as inactive: {order} is not open on exchange.")
421
+ return cancelled
422
+
423
+ async def update_order_as_active(
424
+ self, order, params: dict = None, wait_for_creation=True, raise_all_creation_error=False,
425
+ creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
426
+ ):
427
+ if not self.enable_inactive_orders:
428
+ self.logger.error(f"Can't update order as active when {self.enable_inactive_orders=}.")
429
+ return order
430
+ with order.active_or_inactive_transition():
431
+ return await self.create_order(
432
+ order, loaded=False, params=params, wait_for_creation=wait_for_creation,
433
+ raise_all_creation_error=raise_all_creation_error, creation_timeout=creation_timeout
434
+ )
435
+
388
436
  async def cancel_order(self, order, ignored_order=None,
389
437
  wait_for_cancelling=True,
390
438
  cancelling_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT) -> bool:
@@ -400,11 +448,12 @@ class Trader(util.Initializable):
400
448
  :param cancelling_timeout: time before raising a timeout error when waiting for an order cancel
401
449
  :return: None
402
450
  """
403
- if order and order.is_open():
451
+ if order and order.is_open() or not order.is_active:
404
452
  self.logger.info(f"Cancelling order: {order}")
405
453
  # always cancel this order first to avoid infinite loop followed by deadlock
406
- return await self._handle_order_cancellation(order, ignored_order,
407
- wait_for_cancelling, cancelling_timeout)
454
+ return await self._handle_order_cancellation(
455
+ order, ignored_order, wait_for_cancelling, cancelling_timeout
456
+ )
408
457
  return False
409
458
 
410
459
  async def _handle_order_cancellation(
@@ -417,7 +466,7 @@ class Trader(util.Initializable):
417
466
  return success
418
467
  order_status = None
419
468
  # if real order: cancel on exchange
420
- if not self.simulate and not order.is_self_managed():
469
+ if not self.simulate and order.is_active and not order.is_self_managed():
421
470
  try:
422
471
  async with order.lock:
423
472
  try:
@@ -72,6 +72,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
72
72
  EXPECT_POSSIBLE_ORDER_NOT_FOUND_DURING_ORDER_CREATION = False # set True when get_order() can return None
73
73
  # (order not found) when orders are being created on exchange and are not fully processed on the exchange side.
74
74
  REQUIRES_AUTHENTICATION = False # set True when even normally public apis require authentication
75
+ # set True when even loading markets can make auth calls when creds are set
76
+ CAN_MAKE_AUTHENTICATED_REQUESTS_WHEN_LOADING_MARKETS = False
75
77
  HAS_FETCHED_DETAILS = False # set True when this exchange details (urls etc) have to be fetched before
76
78
  # starting the exchange
77
79
  IS_SKIPPING_EMPTY_CANDLES_IN_OHLCV_FETCH = False # set True when the exchange is known for not returning any
@@ -204,7 +206,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
204
206
  stop_price=stop_price, side=side, current_price=current_price,
205
207
  reduce_only=reduce_only, params=params)
206
208
  self.logger.debug(f"Created order: {created_order}")
207
- return await self._verify_order(created_order, order_type, symbol, price, side)
209
+ return await self._verify_order(created_order, order_type, symbol, price, quantity, side)
208
210
  return None
209
211
 
210
212
  async def edit_order(self, exchange_order_id: str, order_type: enums.TraderOrderType, symbol: str,
@@ -225,7 +227,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
225
227
  edited_order = await self._edit_order(exchange_order_id, order_type, symbol, quantity=float_quantity,
226
228
  price=float_price, stop_price=float_stop_price, side=side,
227
229
  current_price=float_current_price, params=params)
228
- order = await self._verify_order(edited_order, order_type, symbol, price, side)
230
+ order = await self._verify_order(edited_order, order_type, symbol, price, quantity, side)
229
231
  return order
230
232
  return None
231
233
 
@@ -310,7 +312,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
310
312
  f"Unexpected error during order operation: {html_util.get_html_summary_if_relevant(e)}"
311
313
  )
312
314
 
313
- async def _verify_order(self, created_order, order_type, symbol, price, side, get_order_params=None):
315
+ async def _verify_order(self, created_order, order_type, symbol, price, quantity, side, get_order_params=None):
314
316
  # some exchanges are not returning the full order details on creation: fetch it if necessary
315
317
  if created_order and not self._ensure_order_details_completeness(created_order):
316
318
  if ecoc.EXCHANGE_ID.value in created_order:
@@ -332,9 +334,13 @@ class RestExchange(abstract_exchange.AbstractExchange):
332
334
  else:
333
335
  created_order = fetched_order
334
336
 
335
- # on some exchange, market order are not including price, add it manually to ensure uniformity
336
- if created_order is not None and created_order[ecoc.PRICE.value] is None and price is not None:
337
- created_order[ecoc.PRICE.value] = float(price)
337
+ if created_order is not None:
338
+ # on some exchange, market order are not including price, add it manually to ensure uniformity
339
+ if created_order[ecoc.PRICE.value] is None and price is not None:
340
+ created_order[ecoc.PRICE.value] = float(price)
341
+ # sometimes, amount is 0, this is impossible. If it is, restore amount
342
+ if not created_order[ecoc.AMOUNT.value] and quantity is not None:
343
+ created_order[ecoc.AMOUNT.value] = float(quantity)
338
344
 
339
345
  return created_order
340
346
 
@@ -96,6 +96,9 @@ class AbstractTradingModeProducer(modes_channel.ModeChannelProducer):
96
96
  self._is_trigger_completed = asyncio.Event()
97
97
  self._is_trigger_completed.set()
98
98
 
99
+ # used to avoid spamming critical issues
100
+ self._sent_critical_notifications: set[str] = set()
101
+
99
102
  self.last_activity: mode_activity.TradingModeActivity = mode_activity.TradingModeActivity()
100
103
 
101
104
  def on_reload_config(self):
@@ -570,3 +573,19 @@ class AbstractTradingModeProducer(modes_channel.ModeChannelProducer):
570
573
  cls.PRODUCER_LOCKS_BY_EXCHANGE_ID.pop(
571
574
  exchange_manager.id, None
572
575
  )
576
+
577
+ async def sent_once_critical_notification(self, title: str, description: str):
578
+ if description not in self._sent_critical_notifications:
579
+ try:
580
+ import octobot_services.api as services_api
581
+ import octobot_services.enums as services_enum
582
+ self.logger.error(f"Critical error: {title}: {description}")
583
+ await services_api.send_notification(services_api.create_notification(
584
+ description, title=title, markdown_text=description,
585
+ level=services_enum.NotificationLevel.CRITICAL,
586
+ category=services_enum.NotificationCategory.GLOBAL_INFO
587
+ ))
588
+ except ImportError as e:
589
+ self.logger.exception(e, True, f"Impossible to send notification: {e}")
590
+ finally:
591
+ self._sent_critical_notifications.add(description)
@@ -54,10 +54,14 @@ from octobot_trading.personal_data.orders import (
54
54
  wait_for_order_fill,
55
55
  apply_order_storage_details_if_any,
56
56
  create_orders_storage_related_elements,
57
- create_missing_self_managed_orders_from_storage_order_groups,
57
+ create_missing_virtual_orders_from_storage_order_groups,
58
58
  is_associated_pending_order,
59
59
  apply_pending_order_from_created_order,
60
60
  get_up_to_date_price,
61
+ create_order_price_trigger,
62
+ create_as_active_order_using_strategy_if_any,
63
+ create_as_active_order_on_exchange,
64
+ update_order_as_inactive_on_exchange,
61
65
  get_potentially_outdated_price,
62
66
  get_pre_order_data,
63
67
  get_portfolio_amounts,
@@ -74,6 +78,11 @@ from octobot_trading.personal_data.orders import (
74
78
  TrailingProfileTypes,
75
79
  create_trailing_profile,
76
80
  create_filled_take_profit_trailing_profile,
81
+ ActiveOrderSwapStrategy,
82
+ StopFirstActiveOrderSwapStrategy,
83
+ TakeProfitFirstActiveOrderSwapStrategy,
84
+ BaseTrigger,
85
+ PriceTrigger,
77
86
  OrdersUpdater,
78
87
  adapt_price,
79
88
  get_minimal_order_amount,
@@ -293,10 +302,14 @@ __all__ = [
293
302
  "wait_for_order_fill",
294
303
  "apply_order_storage_details_if_any",
295
304
  "create_orders_storage_related_elements",
296
- "create_missing_self_managed_orders_from_storage_order_groups",
305
+ "create_missing_virtual_orders_from_storage_order_groups",
297
306
  "is_associated_pending_order",
298
307
  "apply_pending_order_from_created_order",
299
308
  "get_up_to_date_price",
309
+ "create_order_price_trigger",
310
+ "create_as_active_order_using_strategy_if_any",
311
+ "create_as_active_order_on_exchange",
312
+ "update_order_as_inactive_on_exchange",
300
313
  "get_potentially_outdated_price",
301
314
  "get_pre_order_data",
302
315
  "get_portfolio_amounts",
@@ -313,6 +326,11 @@ __all__ = [
313
326
  "TrailingProfileTypes",
314
327
  "create_trailing_profile",
315
328
  "create_filled_take_profit_trailing_profile",
329
+ "ActiveOrderSwapStrategy",
330
+ "StopFirstActiveOrderSwapStrategy",
331
+ "TakeProfitFirstActiveOrderSwapStrategy",
332
+ "BaseTrigger",
333
+ "PriceTrigger",
316
334
  "OrdersUpdater",
317
335
  "adapt_price",
318
336
  "get_minimal_order_amount",
@@ -14,6 +14,7 @@
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
16
  import asyncio
17
+ import decimal
17
18
  import uuid
18
19
  import typing
19
20
 
@@ -294,6 +295,24 @@ class ExchangePersonalData(util.Initializable):
294
295
  self.logger.exception(e, True, f"Failed to update order : {e}")
295
296
  return False
296
297
 
298
+ async def check_and_update_inactive_orders_when_necessary(
299
+ self, symbol: str, current_price: decimal.Decimal, price_time: float,
300
+ strategy_timeout: typing.Optional[float], wait_for_fill_callback: typing.Optional[typing.Callable]
301
+ ) -> int:
302
+ handled_orders_count = 0
303
+ sorted_inactive_orders = sorted(
304
+ self.orders_manager.get_all_orders(symbol=symbol, active=False),
305
+ key= lambda o: o.origin_price if o.trigger_above else -o.origin_price
306
+ )
307
+ for order in sorted_inactive_orders:
308
+ if order.should_become_active(price_time, current_price):
309
+ handled_orders_count += 1
310
+ try:
311
+ await order.on_active_trigger(strategy_timeout, wait_for_fill_callback)
312
+ except Exception as err:
313
+ self.logger.exception(err, True, f"Failed order on_active_trigger {err} (order: {order})")
314
+ return handled_orders_count
315
+
297
316
  async def handle_trade_update(self, symbol, trade_id, trade,
298
317
  is_old_trade: bool = False, should_notify: bool = True):
299
318
  try:
@@ -39,6 +39,17 @@ from octobot_trading.personal_data.orders.trailing_profiles import (
39
39
  create_trailing_profile,
40
40
  create_filled_take_profit_trailing_profile,
41
41
  )
42
+ from octobot_trading.personal_data.orders import active_order_swap_strategies
43
+ from octobot_trading.personal_data.orders.active_order_swap_strategies import (
44
+ ActiveOrderSwapStrategy,
45
+ StopFirstActiveOrderSwapStrategy,
46
+ TakeProfitFirstActiveOrderSwapStrategy,
47
+ )
48
+ from octobot_trading.personal_data.orders import triggers
49
+ from octobot_trading.personal_data.orders.triggers import (
50
+ BaseTrigger,
51
+ PriceTrigger,
52
+ )
42
53
  from octobot_trading.personal_data.orders import order
43
54
  from octobot_trading.personal_data.orders.order import (
44
55
  Order,
@@ -110,6 +121,10 @@ from octobot_trading.personal_data.orders.order_util import (
110
121
  is_stop_trade_order_type,
111
122
  is_take_profit_order,
112
123
  get_trade_order_type,
124
+ create_order_price_trigger,
125
+ create_as_active_order_using_strategy_if_any,
126
+ create_as_active_order_on_exchange,
127
+ update_order_as_inactive_on_exchange,
113
128
  create_as_chained_order,
114
129
  is_associated_pending_order,
115
130
  apply_pending_order_from_created_order,
@@ -123,7 +138,7 @@ from octobot_trading.personal_data.orders import orders_storage_operations
123
138
  from octobot_trading.personal_data.orders.orders_storage_operations import (
124
139
  apply_order_storage_details_if_any,
125
140
  create_orders_storage_related_elements,
126
- create_missing_self_managed_orders_from_storage_order_groups,
141
+ create_missing_virtual_orders_from_storage_order_groups,
127
142
  )
128
143
  from octobot_trading.personal_data.orders import order_adapter
129
144
  from octobot_trading.personal_data.orders.order_adapter import (
@@ -180,6 +195,10 @@ __all__ = [
180
195
  "parse_is_pending_cancel",
181
196
  "parse_is_open",
182
197
  "get_up_to_date_price",
198
+ "create_order_price_trigger",
199
+ "create_as_active_order_using_strategy_if_any",
200
+ "create_as_active_order_on_exchange",
201
+ "update_order_as_inactive_on_exchange",
183
202
  "get_potentially_outdated_price",
184
203
  "get_pre_order_data",
185
204
  "get_portfolio_amounts",
@@ -193,7 +212,7 @@ __all__ = [
193
212
  "generate_order_id",
194
213
  "wait_for_order_fill",
195
214
  "apply_order_storage_details_if_any",
196
- "create_missing_self_managed_orders_from_storage_order_groups",
215
+ "create_missing_virtual_orders_from_storage_order_groups",
197
216
  "is_associated_pending_order",
198
217
  "apply_pending_order_from_created_order",
199
218
  "OrderState",
@@ -209,6 +228,11 @@ __all__ = [
209
228
  "TrailingProfileTypes",
210
229
  "create_trailing_profile",
211
230
  "create_filled_take_profit_trailing_profile",
231
+ "ActiveOrderSwapStrategy",
232
+ "StopFirstActiveOrderSwapStrategy",
233
+ "TakeProfitFirstActiveOrderSwapStrategy",
234
+ "BaseTrigger",
235
+ "PriceTrigger",
212
236
  "OrdersUpdater",
213
237
  "adapt_price",
214
238
  "get_minimal_order_amount",