OctoBot-Trading 2.4.153__tar.gz → 2.4.155__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/requires.txt +2 -1
  4. {OctoBot-Trading-2.4.153/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.155}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/README.md +1 -1
  6. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/errors.py +6 -0
  8. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/proxy_config.py +5 -1
  9. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +59 -4
  10. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +14 -4
  11. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_builder.py +4 -0
  12. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_factory.py +5 -2
  13. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_manager.py +1 -0
  14. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/trader.py +50 -30
  15. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/rest_exchange.py +7 -0
  16. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/exchange_util.py +8 -2
  17. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +11 -7
  18. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order.py +1 -1
  19. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_util.py +1 -1
  20. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/requirements.txt +2 -1
  21. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +8 -1
  22. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/LICENSE +0 -0
  23. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/MANIFEST.in +0 -0
  24. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  25. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  26. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  27. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  28. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/__init__.py +0 -0
  29. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/channels.py +0 -0
  30. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/contracts.py +0 -0
  31. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/exchange.py +0 -0
  32. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/modes.py +0 -0
  33. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/orders.py +0 -0
  34. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/portfolio.py +0 -0
  35. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/positions.py +0 -0
  36. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/profitability.py +0 -0
  37. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/storage.py +0 -0
  38. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/symbol_data.py +0 -0
  39. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/trader.py +0 -0
  40. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/trades.py +0 -0
  41. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/constants.py +0 -0
  42. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/enums.py +0 -0
  43. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_channel.py +0 -0
  44. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  46. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  47. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  48. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  49. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  50. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  51. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  52. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  53. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  54. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  55. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  56. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  57. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  60. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  61. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  62. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  63. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  65. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  66. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  68. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  69. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  70. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  71. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  74. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  75. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  76. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  77. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  80. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  81. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  82. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  83. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  84. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  87. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  88. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  89. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  90. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  93. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  94. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  96. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  98. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  99. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  101. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/__init__.py +0 -0
  102. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  103. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  104. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  107. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  108. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  109. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  110. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  111. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  113. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  114. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  115. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_channels.py +0 -0
  116. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_details.py +0 -0
  117. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  118. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchanges.py +0 -0
  119. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  121. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  122. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  123. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  125. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  127. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  129. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  130. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  131. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  133. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  135. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  136. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/mode.py +0 -0
  137. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/mode_activity.py +0 -0
  138. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/mode_config.py +0 -0
  139. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/modes_factory.py +0 -0
  140. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/modes_util.py +0 -0
  141. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  144. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  145. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  146. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  147. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  148. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  149. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  150. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  151. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  152. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  154. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  155. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  157. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/octobot_channel_consumer.py +0 -0
  158. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  160. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  163. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  164. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  165. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  166. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  167. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  168. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  169. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  170. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  171. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_group.py +0 -0
  172. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_state.py +0 -0
  173. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  174. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  175. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  176. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  177. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  178. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  179. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  180. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  181. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  184. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  185. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  186. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  187. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  190. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  192. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  193. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  194. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  195. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  196. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  197. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  198. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  199. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  200. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  201. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  203. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  205. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  206. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  207. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  208. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  209. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  210. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  211. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  213. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  214. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  215. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  216. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  217. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  218. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  219. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  220. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  221. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  222. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  224. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  227. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/__init__.py +0 -0
  228. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  230. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  231. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  232. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position.py +0 -0
  233. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  234. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position_state.py +0 -0
  235. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position_util.py +0 -0
  236. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  237. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  239. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  242. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  243. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  244. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  245. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/state.py +0 -0
  246. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/__init__.py +0 -0
  247. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  249. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  250. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trade.py +0 -0
  251. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  252. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  253. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  254. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  255. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  257. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  258. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  259. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  261. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  267. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  268. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/signal_producer.py +0 -0
  269. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/signal_creation.py +0 -0
  270. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  271. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/util.py +0 -0
  272. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/abstract_storage.py +0 -0
  274. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/candles_storage.py +0 -0
  275. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/orders_storage.py +0 -0
  276. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/portfolio_storage.py +0 -0
  277. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/storage_manager.py +0 -0
  278. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/trades_storage.py +0 -0
  279. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/transactions_storage.py +0 -0
  280. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/util.py +0 -0
  281. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/supervisors/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  283. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/config_util.py +0 -0
  286. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/initializable.py +0 -0
  287. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/initialization_util.py +0 -0
  288. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/simulator_updater_utils.py +0 -0
  289. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/__init__.py +0 -0
  290. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  291. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  292. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  294. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/setup.cfg +0 -0
  295. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/setup.py +0 -0
  296. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/__init__.py +0 -0
  297. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_channels.py +0 -0
  298. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_exchange.py +0 -0
  299. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_modes.py +0 -0
  300. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_orders.py +0 -0
  301. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_portfolio.py +0 -0
  302. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_profitability.py +0 -0
  303. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_symbol_data.py +0 -0
  304. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_trader.py +0 -0
  305. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_trades.py +0 -0
  306. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/cli/__init__.py +0 -0
  307. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/contracts/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  310. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  311. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/funding/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  313. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/kline/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  315. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ohlcv/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  317. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  318. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/order_book/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  320. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/prices/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  322. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  323. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/recent_trades/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  325. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  326. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ticker/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  328. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  332. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/implementations/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  334. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_abstract_exchange.py +0 -0
  336. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_builder.py +0 -0
  338. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_config_data.py +0 -0
  339. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_factory.py +0 -0
  340. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_manager.py +0 -0
  341. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_simulator.py +0 -0
  342. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchanges.py +0 -0
  343. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/traders/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/traders/test_trader.py +0 -0
  345. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/types/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  347. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/util/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  349. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/util/test_exchange_util.py +0 -0
  350. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  354. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  355. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  356. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  357. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  359. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/test_abstract_mode_consumer.py +0 -0
  360. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/test_abstract_trading_mode.py +0 -0
  361. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/test_modes_util.py +0 -0
  362. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  366. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  367. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  368. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  375. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  378. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  379. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order.py +0 -0
  380. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order_factory.py +0 -0
  382. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order_util.py +0 -0
  383. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_orders_manager.py +0 -0
  384. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  385. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  392. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  394. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/market/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  397. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  398. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  400. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  401. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  404. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  405. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  406. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/history/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  408. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  409. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_asset.py +0 -0
  410. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  411. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  412. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  413. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  414. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  415. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/channel/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/states/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/test_position.py +0 -0
  423. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/test_position_factory.py +0 -0
  424. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/test_positions_manager.py +0 -0
  425. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/types/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  427. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  428. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_factory.py +0 -0
  430. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_manager.py +0 -0
  431. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  432. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_util.py +0 -0
  433. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/transactions/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  435. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  436. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/signals/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  438. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,16 @@ 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.155] - 2025-02-03
8
+ ### Added
9
+ [Exchanges] handle Socks proxies
10
+ ### Updated
11
+ [Trader] enable edit_order when without enable_order_auto_synchronization
12
+
13
+ ## [2.4.154] - 2025-01-31
14
+ ### Added
15
+ [Exchanges] handle InvalidAPIKeyIPWhitelistError
16
+
7
17
  ## [2.4.153] - 2025-01-29
8
18
  ### Updated
9
19
  [TradingMode] make register_chained_order more flexible
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.153
3
+ Version: 2.4.155
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.153](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.155](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)
@@ -3,8 +3,9 @@ OctoBot-Backtesting<1.10,>=1.9
3
3
  Async-Channel<2.3,>=2.2
4
4
  OctoBot-Commons<1.10,>=1.9.64
5
5
  OctoBot-Tentacles-Manager<2.10,>=2.9
6
- trading-backend>=1.2.7
6
+ trading-backend>=1.2.35
7
7
  ccxt==4.3.85
8
+ aiohttp_socks==0.10.1
8
9
  cryptography
9
10
  sortedcontainers==2.4.0
10
11
  tinydb==4.5.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.153
3
+ Version: 2.4.155
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.153](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.155](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.153](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.155](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.153" # major.minor.revision
18
+ VERSION = "2.4.155" # major.minor.revision
@@ -147,6 +147,12 @@ class AuthenticationError(OctoBotExchangeError):
147
147
  """
148
148
 
149
149
 
150
+ class InvalidAPIKeyIPWhitelistError(AuthenticationError):
151
+ """
152
+ Raised when an exchange failed to authenticate due to an IP whitelist issue
153
+ """
154
+
155
+
150
156
  class ExchangeInternalSyncError(OctoBotExchangeError):
151
157
  """
152
158
  Raised when an exchange is returning an error due to its internal sync process
@@ -33,9 +33,13 @@ class ProxyConfig:
33
33
  # if set, will be called when exchange stops
34
34
  stop_proxy_callback: typing.Optional[typing.Callable] = None
35
35
  # if set, returns the last url given to a callback method that return "True", meaning the last url that used a proxy
36
- get_last_proxied_request_url: typing.Optional[typing.Callable] = None
36
+ get_last_proxied_request_url: typing.Optional[typing.Callable[[], typing.Optional[str]]] = None
37
+ get_proxy_url: typing.Optional[typing.Callable[[], str]] = None
37
38
  # the host of this proxy, used to identify proxy connexion errors
38
39
  proxy_host: str = "DEFAULT PROXY HOST"
40
+ # if DNS cache should be disabled with this proxy config. Warning: in this case, DNS cache will be
41
+ # completely disabled for this exchange
42
+ disable_dns_cache: bool = False
39
43
 
40
44
  @classmethod
41
45
  def default_env_var_config(cls):
@@ -14,7 +14,9 @@
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 aiohttp_socks
17
18
  import os
19
+ import ssl
18
20
  import aiohttp
19
21
  import copy
20
22
  import logging
@@ -143,7 +145,10 @@ def instantiate_exchange(
143
145
  client = exchange_class(config)
144
146
  _use_proxy_if_necessary(client, proxy_config)
145
147
  if constants.ENABLE_CCXT_REQUESTS_COUNTER and allow_request_counter:
146
- _use_request_counter(identifier, client)
148
+ if proxy_config.socks_proxy or proxy_config.socks_proxy_callback:
149
+ commons_logging.get_logger(__name__).error("socks proxy and request counter can't yet be used together.")
150
+ else:
151
+ _use_request_counter(identifier, client, proxy_config)
147
152
  return client
148
153
 
149
154
 
@@ -304,6 +309,51 @@ def _use_proxy_if_necessary(client, proxy_config: proxy_config_import.ProxyConfi
304
309
  client.socks_proxy = proxy_config.socks_proxy
305
310
  if proxy_config.socks_proxy_callback:
306
311
  client.socks_proxy_callback = proxy_config.socks_proxy_callback
312
+ if proxy_config.socks_proxy or proxy_config.socks_proxy_callback:
313
+ # rewrite of async_ccxt.exchange.client.fetch() ProxyConnector creation
314
+ _init_ccxt_client_session_requirements(client)
315
+ proxy_url = proxy_config.get_proxy_url()
316
+ if (client.socks_proxy_sessions is None):
317
+ client.socks_proxy_sessions = {}
318
+ if (proxy_url not in client.socks_proxy_sessions):
319
+ connector = aiohttp_socks.ProxyConnector.from_url(
320
+ proxy_url,
321
+ # extra args copied from self.open()
322
+ ssl=client.ssl_context,
323
+ loop=client.asyncio_loop,
324
+ use_dns_cache=not proxy_config.disable_dns_cache,
325
+ enable_cleanup_closed=True
326
+ )
327
+ client.socks_proxy_sessions[proxy_url] = aiohttp.ClientSession(
328
+ loop=client.asyncio_loop, connector=connector, trust_env=client.aiohttp_trust_env
329
+ )
330
+ elif proxy_config.disable_dns_cache:
331
+ # rewrite of async_ccxt.exchange.client.open()
332
+ _init_ccxt_client_session_requirements(client)
333
+ if client.session:
334
+ # should not happen
335
+ asyncio.create_task(client.session.close())
336
+ connector = aiohttp.TCPConnector(
337
+ ssl=client.ssl_context, loop=client.asyncio_loop, enable_cleanup_closed=True,
338
+ # local overrides
339
+ use_dns_cache=False
340
+ # end local overrides
341
+ )
342
+ client.session = aiohttp.ClientSession(
343
+ loop=client.asyncio_loop, connector=connector, trust_env=client.aiohttp_trust_env
344
+ )
345
+
346
+
347
+ def _init_ccxt_client_session_requirements(client):
348
+ # from async_ccxt.exchange.client.open()
349
+ if client.asyncio_loop is None:
350
+ client.asyncio_loop = asyncio.get_running_loop()
351
+ client.throttle.loop = client.asyncio_loop
352
+
353
+ if client.ssl_context is None:
354
+ # Create our SSL context object with our CA cert file
355
+ client.ssl_context = ssl.create_default_context(cafile=client.cafile) if client.verify else client.verify
356
+
307
357
 
308
358
 
309
359
  def _get_client_config(
@@ -372,7 +422,9 @@ def _get_patched_url_config(url_config: dict, old: str, new: str):
372
422
  return updated_config
373
423
 
374
424
 
375
- def _use_request_counter(identifier: str, ccxt_client: async_ccxt.Exchange):
425
+ def _use_request_counter(
426
+ identifier: str, ccxt_client: async_ccxt.Exchange, proxy_config: proxy_config_import.ProxyConfig
427
+ ):
376
428
  """
377
429
  Replaces the given exchange async session by an aiohttp_util.CounterClientSession
378
430
  WARNING: should only be called right after creating the exchange and on the same async loop as
@@ -387,7 +439,8 @@ def _use_request_counter(identifier: str, ccxt_client: async_ccxt.Exchange):
387
439
  # same as in ccxt.async_support.exchange.py#open()
388
440
  # connector = aiohttp.TCPConnector(ssl=self.ssl_context, loop=self.asyncio_loop, enable_cleanup_closed=True)
389
441
  new_connector = aiohttp.TCPConnector(
390
- ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop, enable_cleanup_closed=True
442
+ ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop,
443
+ enable_cleanup_closed=True, use_dns_cache=not proxy_config.disable_dns_cache
391
444
  )
392
445
  counter_session = aiohttp_util.CounterClientSession(
393
446
  identifier,
@@ -440,7 +493,9 @@ def get_proxy_error_if_any(ccxt_connector, error: Exception) -> typing.Optional[
440
493
  depth = 1
441
494
  cause_error = error
442
495
  while cause_error and depth < max_depth:
443
- if isinstance(cause_error, (aiohttp.ClientProxyConnectionError, aiohttp.ClientHttpProxyError)) or (
496
+ if isinstance(cause_error, (
497
+ aiohttp.ClientProxyConnectionError, aiohttp.ClientHttpProxyError, aiohttp_socks.ProxyConnectionError
498
+ )) or (
444
499
  isinstance(cause_error, aiohttp.ClientConnectorError)
445
500
  and ccxt_connector.exchange_manager.proxy_config.proxy_host in str(cause_error)
446
501
  ):
@@ -18,6 +18,7 @@ import contextlib
18
18
  import decimal
19
19
  import ccxt.async_support as ccxt
20
20
  import ccxt.static_dependencies.ecdsa.der
21
+ import aiohttp_socks
21
22
  import typing
22
23
  import inspect
23
24
  import binascii
@@ -79,7 +80,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
79
80
  self, config, exchange_manager, adapter_class=None, additional_config=None, rest_name=None, force_auth=False
80
81
  ):
81
82
  super().__init__(config, exchange_manager, None)
82
- self.client = None
83
+ self.client: ccxt.Exchange = None
83
84
  self.exchange_type = None
84
85
  self.adapter = self.get_adapter_class(adapter_class)(self)
85
86
  self.all_currencies_price_ticker = None
@@ -1033,11 +1034,16 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
1033
1034
  f"Request timeout: {html_util.get_html_summary_if_relevant(err)}"
1034
1035
  ) from err
1035
1036
  except ccxt.AuthenticationError as err:
1037
+ error_class = (
1038
+ octobot_trading.errors.InvalidAPIKeyIPWhitelistError
1039
+ if self.exchange_manager.exchange.is_ip_whitelist_error(err)
1040
+ else octobot_trading.errors.AuthenticationError
1041
+ )
1036
1042
  self.raise_or_prefix_proxy_error_if_relevant(
1037
1043
  err,
1038
- octobot_trading.errors.AuthenticationError(html_util.get_html_summary_if_relevant(err))
1044
+ error_class(html_util.get_html_summary_if_relevant(err))
1039
1045
  )
1040
- except ccxt.ExchangeNotAvailable as err:
1046
+ except (ccxt.ExchangeNotAvailable, aiohttp_socks.ProxyConnectionError) as err:
1041
1047
  self.raise_or_prefix_proxy_error_if_relevant(
1042
1048
  err,
1043
1049
  octobot_trading.errors.FailedRequest(
@@ -1045,8 +1051,12 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
1045
1051
  )
1046
1052
  )
1047
1053
  except ccxt.ExchangeError as err:
1054
+ error_message = html_util.get_html_summary_if_relevant(err)
1055
+ if self.exchange_manager.exchange.is_ip_whitelist_error(err):
1056
+ # ensure this is not an IP whitelist error
1057
+ raise octobot_trading.errors.InvalidAPIKeyIPWhitelistError(error_message) from err
1048
1058
  if self.exchange_manager.exchange.is_authentication_error(err):
1049
1059
  # ensure this is not an unhandled authentication error
1050
- raise octobot_trading.errors.AuthenticationError(html_util.get_html_summary_if_relevant(err)) from err
1060
+ raise octobot_trading.errors.AuthenticationError(error_message) from err
1051
1061
  # otherwise just forward exception
1052
1062
  raise
@@ -257,6 +257,10 @@ class ExchangeBuilder:
257
257
  self.exchange_manager.without_auth = True
258
258
  return self
259
259
 
260
+ def disable_unauth_retry(self, disabled):
261
+ self.exchange_manager.disable_unauth_retry = disabled
262
+ return self
263
+
260
264
  def is_checking_credentials(self, check_credentials):
261
265
  self.exchange_manager.check_credentials = check_credentials
262
266
  return self
@@ -62,10 +62,13 @@ async def create_real_exchange(exchange_manager, exchange_config_by_exchange: ty
62
62
  return
63
63
  await _initialize_exchange_backend(exchange_manager)
64
64
  except errors.AuthenticationError as err:
65
- if exchange_manager.without_auth or exchange_manager.exchange.REQUIRES_AUTHENTICATION:
65
+ if (
66
+ exchange_manager.without_auth or exchange_manager.exchange.REQUIRES_AUTHENTICATION
67
+ or exchange_manager.disable_unauth_retry
68
+ ):
66
69
  # auth is required or already retried, don't loop
67
70
  exchange_manager.logger.error(
68
- f"Authentication is required and created an error: impossible to connect to "
71
+ f"Authentication is required and raised an error: impossible to connect to "
69
72
  f"{exchange_manager.exchange_name} exchange: {err}"
70
73
  )
71
74
  raise
@@ -57,6 +57,7 @@ class ExchangeManager(util.Initializable):
57
57
  self.is_sandboxed: bool = False
58
58
  self.is_trading: bool = True
59
59
  self.without_auth: bool = False
60
+ self.disable_unauth_retry: bool = False
60
61
  self.check_credentials: bool = True
61
62
  self.enable_storage: bool = True
62
63
  self.proxy_config: exchanges.ProxyConfig = exchanges.ProxyConfig.default_env_var_config()
@@ -183,38 +183,23 @@ class Trader(util.Initializable):
183
183
  previous_exchange_order_id = order.exchange_order_id
184
184
  try:
185
185
  async with order.lock:
186
+ disabled_state_updater = self.exchange_manager.exchange_personal_data \
187
+ .orders_manager.enable_order_auto_synchronization is False
186
188
  # now that we got the lock, ensure we can edit the order
187
- if not self.simulate and not order.is_self_managed() and order.state is not None:
188
- # careful here: make sure we are not editing an order on exchange that is being updated
189
- # somewhere else
190
- async with order.state.refresh_operation():
191
- self.logger.info(f"Editing order: {order} ["
192
- f"edited_quantity: {str(edited_quantity)} "
193
- f"edited_price: {str(edited_price)} "
194
- f"edited_stop_price: {str(edited_stop_price)} "
195
- f"edited_current_price: {str(edited_current_price)}"
196
- f"]")
197
- order_params = self.exchange_manager.exchange.get_order_additional_params(order)
198
- order_params.update(params or {})
199
- # fill in every param as some exchange rely on re-creating the order altogether
200
- edited_order = await self.exchange_manager.exchange.edit_order(
201
- order.exchange_order_id,
202
- order.order_type,
203
- order.symbol,
204
- quantity=order.origin_quantity if edited_quantity is None else edited_quantity,
205
- price=order.origin_price if edited_price is None else edited_price,
206
- stop_price=edited_stop_price,
207
- side=order.side,
208
- current_price=edited_current_price,
209
- params=order_params
189
+ if not self.simulate and not order.is_self_managed() and (
190
+ order.state is not None or disabled_state_updater
191
+ ):
192
+ if disabled_state_updater:
193
+ changed = await self._edit_order_on_exchange(
194
+ order, edited_quantity, edited_price, edited_stop_price, edited_current_price, params
210
195
  )
211
- # apply new values from returned order (even order id might have changed)
212
- self.logger.debug(f"Successfully edited order on {self.exchange_manager.exchange_name}, "
213
- f"new order values: {edited_order}")
214
- changed = order.update_from_raw(edited_order)
215
- # update portfolio from exchange
216
- await self.exchange_manager.exchange_personal_data.\
217
- handle_portfolio_and_position_update_from_order(order)
196
+ else:
197
+ # careful here: make sure we are not editing an order on exchange that is being updated
198
+ # somewhere else
199
+ async with order.state.refresh_operation():
200
+ changed = await self._edit_order_on_exchange(
201
+ order, edited_quantity, edited_price, edited_stop_price, edited_current_price, params
202
+ )
218
203
  else:
219
204
  # consider order as cancelled to release portfolio amounts
220
205
  self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.update_portfolio_available(
@@ -242,6 +227,41 @@ class Trader(util.Initializable):
242
227
  # order id changed: update orders_manager to keep consistency
243
228
  self.exchange_manager.exchange_personal_data.orders_manager.replace_order(order.order_id, order)
244
229
 
230
+ async def _edit_order_on_exchange(
231
+ self, order,
232
+ edited_quantity: decimal.Decimal,
233
+ edited_price: decimal.Decimal,
234
+ edited_stop_price: decimal.Decimal,
235
+ edited_current_price: decimal.Decimal,
236
+ params: dict
237
+ ) -> bool:
238
+ self.logger.info(
239
+ f"Editing order: {order} [edited_quantity: {str(edited_quantity)} edited_price: {str(edited_price)} "
240
+ f"edited_stop_price: {str(edited_stop_price)} edited_current_price: {str(edited_current_price)}]"
241
+ )
242
+ order_params = self.exchange_manager.exchange.get_order_additional_params(order)
243
+ order_params.update(params or {})
244
+ # fill in every param as some exchange rely on re-creating the order altogether
245
+ edited_order = await self.exchange_manager.exchange.edit_order(
246
+ order.exchange_order_id,
247
+ order.order_type,
248
+ order.symbol,
249
+ quantity=order.origin_quantity if edited_quantity is None else edited_quantity,
250
+ price=order.origin_price if edited_price is None else edited_price,
251
+ stop_price=edited_stop_price,
252
+ side=order.side,
253
+ current_price=edited_current_price,
254
+ params=order_params
255
+ )
256
+ # apply new values from returned order (even order id might have changed)
257
+ self.logger.debug(
258
+ f"Successfully edited order on {self.exchange_manager.exchange_name}, new order values: {edited_order}"
259
+ )
260
+ changed = order.update_from_raw(edited_order)
261
+ # update portfolio from exchange
262
+ await self.exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order(order)
263
+ return changed
264
+
245
265
  async def _create_new_order(self, new_order, params: dict,
246
266
  wait_for_creation=True,
247
267
  creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT) -> object:
@@ -124,6 +124,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
124
124
  EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
125
125
  # text content of errors due to unhandled authentication issues
126
126
  EXCHANGE_AUTHENTICATION_ERRORS: typing.List[typing.Iterable[str]] = []
127
+ # text content of errors due to unhandled IP white list issues
128
+ EXCHANGE_IP_WHITELIST_ERRORS: typing.List[typing.Iterable[str]] = []
127
129
  # text content of errors due to a closed position on the exchange. Relevant for reduce-only orders
128
130
  EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
129
131
  # text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
@@ -1063,6 +1065,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
1063
1065
  return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_AUTHENTICATION_ERRORS)
1064
1066
  return False
1065
1067
 
1068
+ def is_ip_whitelist_error(self, error: BaseException) -> bool:
1069
+ if self.EXCHANGE_IP_WHITELIST_ERRORS:
1070
+ return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_IP_WHITELIST_ERRORS)
1071
+ return False
1072
+
1066
1073
  """
1067
1074
  Auto fetched and filled exchanges
1068
1075
  """
@@ -221,6 +221,7 @@ async def get_local_exchange_manager(
221
221
  exchange_name: str, exchange_config: dict, tentacles_setup_config,
222
222
  is_sandboxed: bool, ignore_config=False, builder=None, use_cached_markets=True,
223
223
  is_broker_enabled: bool = False, exchange_config_by_exchange: typing.Optional[dict[str, dict]] = None,
224
+ disable_unauth_retry: bool = False,
224
225
  market_filter: typing.Union[None, typing.Callable[[dict], bool]] = None
225
226
  ):
226
227
  exchange_type = exchange_config.get(common_constants.CONFIG_EXCHANGE_TYPE, get_default_exchange_type(exchange_name))
@@ -230,6 +231,7 @@ async def get_local_exchange_manager(
230
231
  )
231
232
  exchange_manager = await builder.use_tentacles_setup_config(tentacles_setup_config) \
232
233
  .is_checking_credentials(False) \
234
+ .disable_unauth_retry(disable_unauth_retry) \
233
235
  .is_sandboxed(is_sandboxed) \
234
236
  .is_using_exchange_type(exchange_type) \
235
237
  .use_exchange_config_by_exchange(exchange_config_by_exchange) \
@@ -289,6 +291,12 @@ async def is_compatible_account(exchange_name: str, exchange_config: dict, tenta
289
291
  return True, True, None
290
292
  except trading_backend.TimeSyncError:
291
293
  return False, False, _get_time_sync_error_message(exchange_name, "backend.is_valid_account")
294
+ except trading_backend.APIKeyPermissionsError as err:
295
+ return False, False, f"Please update your API Key permissions: {err}"
296
+ except trading_backend.APIKeyIPWhitelistError as err:
297
+ return False, False, f"Please update your API Key IP whitelist: {err}"
298
+ except trading_backend.UnexpectedError as err:
299
+ return False, False, f"Impossible to check API key: {err}"
292
300
  except trading_backend.ExchangeAuthError:
293
301
  message = f"Invalid {exchange_name.capitalize()} authentication details"
294
302
  if is_sandboxed:
@@ -297,8 +305,6 @@ async def is_compatible_account(exchange_name: str, exchange_config: dict, tenta
297
305
  f"{exchange_name.capitalize()} to trade and validate your api key. " \
298
306
  f"Disable sandbox in your accounts configuration if this is not intended."
299
307
  return False, False, message
300
- except trading_backend.APIKeyPermissionsError as err:
301
- return False, False, f"Please update your API Key permissions: {err}"
302
308
  except (AttributeError, Exception) as e:
303
309
  return True, False, f"Error when loading exchange account: {e}"
304
310
 
@@ -116,7 +116,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
116
116
  self.logger.error(f"Skipping order cancel: {err}")
117
117
  updated_orders = True
118
118
  for update_data in take_profit_actions[self.UPDATE] + stop_actions[self.UPDATE]:
119
- self.logger.info(f"Updating order side to {update_data[self.UPDATED_QUANTITY]} to keep balance, "
119
+ self.logger.info(f"Updating order quantity to {update_data[self.UPDATED_QUANTITY]} to keep balance, "
120
120
  f"order: {update_data[self.ORDER]}")
121
121
  order = update_data[self.ORDER]
122
122
  async with signals.remote_signal_publisher(order.trader.exchange_manager, order.symbol, True):
@@ -131,9 +131,11 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
131
131
  self.logger.exception(e, True, f"Error when balancing orders: {e}")
132
132
  finally:
133
133
  # remove locally_balancing_orders from self.balancing_orders
134
- self.balancing_orders = [order
135
- for order in self.balancing_orders
136
- if order not in locally_balancing_orders]
134
+ self.balancing_orders = [
135
+ order
136
+ for order in self.balancing_orders
137
+ if order not in locally_balancing_orders
138
+ ]
137
139
 
138
140
  def _get_balance(self, closed_order, ignored_orders):
139
141
  balance = {
@@ -141,9 +143,11 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
141
143
  self.STOP: _SideBalance()
142
144
  }
143
145
  for order in self.get_group_open_orders():
144
- if order is not closed_order \
145
- and (ignored_orders is None or order not in ignored_orders) \
146
- and order not in self.balancing_orders:
146
+ if (
147
+ order is not closed_order
148
+ and (ignored_orders is None or order not in ignored_orders)
149
+ and order not in self.balancing_orders
150
+ ):
147
151
  if order_util.is_stop_order(order.order_type):
148
152
  balance[self.STOP].add_order(order)
149
153
  else:
@@ -227,7 +227,7 @@ class Order(util.Initializable):
227
227
  should_update_total_cost = True
228
228
 
229
229
  if self.trader.simulate:
230
- if quantity and not self.filled_quantity:
230
+ if quantity and self.filled_quantity != quantity:
231
231
  self.filled_quantity = quantity
232
232
  changed = True
233
233
  should_update_total_cost = True
@@ -433,7 +433,7 @@ def is_stop_trade_order_type(order_type: enums.TradeOrderType):
433
433
  ]
434
434
 
435
435
 
436
- def is_take_profit_order(order_type):
436
+ def is_take_profit_order(order_type: enums.TraderOrderType):
437
437
  return order_type in [
438
438
  enums.TraderOrderType.TAKE_PROFIT, enums.TraderOrderType.TAKE_PROFIT_LIMIT,
439
439
  ]
@@ -5,10 +5,11 @@ OctoBot-Backtesting>=1.9, <1.10
5
5
  Async-Channel>=2.2, <2.3
6
6
  OctoBot-Commons>=1.9.64, <1.10
7
7
  OctoBot-Tentacles-Manager>=2.9, <2.10
8
- trading-backend>=1.2.7
8
+ trading-backend>=1.2.35
9
9
 
10
10
  # Exchange connection requirements
11
11
  ccxt==4.3.85 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
12
+ aiohttp_socks==0.10.1 # used by ccxt socks proxy aiohttp connectors
12
13
 
13
14
  cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)
14
15
 
@@ -18,6 +18,7 @@ import decimal
18
18
  import ccxt
19
19
  import aiohttp
20
20
  import aiohttp.client_reqrep
21
+ import aiohttp_socks
21
22
 
22
23
  import mock
23
24
  from mock import patch
@@ -265,7 +266,13 @@ async def test_error_describer(ccxt_connector):
265
266
  with pytest.raises(octobot_trading.errors.ExchangeProxyError):
266
267
  # proxy connection error
267
268
  with ccxt_connector.error_describer():
268
- raise ccxt.AuthenticationError from aiohttp.ClientProxyConnectionError(
269
+ raise ccxt.AuthenticationError from aiohttp_socks.ProxyConnectionError(
270
+ aiohttp.client_reqrep.ConnectionKey("host", 11, True, True, None, None, None), OSError("plop")
271
+ )
272
+ with pytest.raises(octobot_trading.errors.ExchangeProxyError):
273
+ # proxy connection error
274
+ with ccxt_connector.error_describer():
275
+ raise aiohttp_socks.ProxyConnectionError(
269
276
  aiohttp.client_reqrep.ConnectionKey("host", 11, True, True, None, None, None), OSError("plop")
270
277
  )
271
278
  with mock.patch.object(