OctoBot-Trading 2.4.207__tar.gz → 2.4.209__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 (513) hide show
  1. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/CHANGELOG.md +9 -0
  2. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/OctoBot_Trading.egg-info/SOURCES.txt +1 -0
  4. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/OctoBot_Trading.egg-info/requires.txt +1 -1
  5. {OctoBot-Trading-2.4.207/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.209}/PKG-INFO +2 -2
  6. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/README.md +1 -1
  7. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/__init__.py +1 -1
  8. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/constants.py +1 -1
  9. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/config/proxy_config.py +3 -6
  10. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +2 -17
  11. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/order_factory.py +1 -0
  12. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/portfolio_util.py +12 -0
  13. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/requirements.txt +1 -1
  14. OctoBot-Trading-2.4.209/tests/exchanges/connectors/ccxt/test_ccxt_client_util.py +179 -0
  15. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_order_factory.py +3 -0
  16. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_portfolio_util.py +94 -3
  17. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/real_exchange_tester.py +1 -1
  18. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_ascendex.py +1 -5
  19. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bitfinex.py +1 -1
  20. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bitget.py +1 -1
  21. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_cryptocom.py +2 -2
  22. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_gateio.py +2 -2
  23. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_hollaex.py +1 -1
  24. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_kraken.py +4 -3
  25. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_kucoin_futures.py +1 -1
  26. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_mexc.py +1 -1
  27. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_ndax.py +1 -1
  28. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_wavesexchange.py +1 -1
  29. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/LICENSE +0 -0
  30. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/MANIFEST.in +0 -0
  31. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  32. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  33. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  34. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/__init__.py +0 -0
  35. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/channels.py +0 -0
  36. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/contracts.py +0 -0
  37. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/exchange.py +0 -0
  38. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/modes.py +0 -0
  39. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/orders.py +0 -0
  40. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/portfolio.py +0 -0
  41. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/positions.py +0 -0
  42. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/profitability.py +0 -0
  43. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/storage.py +0 -0
  44. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/symbol_data.py +0 -0
  45. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/trader.py +0 -0
  46. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/api/trades.py +0 -0
  47. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/enums.py +0 -0
  48. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/errors.py +0 -0
  49. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_channel.py +0 -0
  50. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/__init__.py +0 -0
  51. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  52. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  53. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  54. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  55. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  56. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  57. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  60. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  61. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  62. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  63. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  66. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  67. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  68. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  69. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  71. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  72. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  74. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  75. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  76. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  77. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  80. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  81. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  82. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  83. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  86. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  87. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  88. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  89. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  90. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  93. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  94. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  96. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  99. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  100. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  101. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  102. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  104. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  105. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  107. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/config/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  109. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  110. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
  111. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  113. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  114. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  115. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  116. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  117. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  118. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  119. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  121. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  122. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  123. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/connectors/util.py +0 -0
  124. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchange_builder.py +0 -0
  125. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchange_channels.py +0 -0
  126. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchange_details.py +0 -0
  127. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchange_factory.py +0 -0
  128. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchange_manager.py +0 -0
  129. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  130. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/exchanges.py +0 -0
  131. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  133. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  134. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  135. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/traders/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/traders/trader.py +0 -0
  137. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  138. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/types/__init__.py +0 -0
  139. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  140. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  141. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/util/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  143. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  144. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  145. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  146. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  148. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/channel/__init__.py +0 -0
  149. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  150. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  151. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/channel/mode.py +0 -0
  152. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/mode_activity.py +0 -0
  153. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/mode_config.py +0 -0
  154. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/modes_factory.py +0 -0
  155. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/modes_util.py +0 -0
  156. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  159. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  160. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  161. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  162. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  163. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  164. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  165. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  166. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  167. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  169. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  170. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  172. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/octobot_channel_consumer.py +0 -0
  173. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/__init__.py +0 -0
  174. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  175. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/__init__.py +0 -0
  176. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py +0 -0
  178. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py +0 -0
  179. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py +0 -0
  180. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  182. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  183. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  184. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  185. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  187. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  188. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  189. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
  190. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/order.py +0 -0
  191. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  192. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/order_group.py +0 -0
  193. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/order_state.py +0 -0
  194. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/order_util.py +0 -0
  195. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  196. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  197. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  199. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  200. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  201. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  202. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  203. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  204. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  205. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  207. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  208. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  209. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  210. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  211. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/triggers/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/triggers/base_trigger.py +0 -0
  213. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/triggers/price_trigger.py +0 -0
  214. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  215. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  216. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  217. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  218. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  219. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  220. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  221. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  222. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  223. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  225. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  226. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  227. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  228. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  229. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  230. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  231. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  232. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  234. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  235. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  236. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  237. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  238. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  240. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  241. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  242. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  243. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  244. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  245. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  246. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  247. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  248. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  249. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  250. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  251. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/resolved_orders_portfolio_delta.py +0 -0
  252. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  253. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +0 -0
  254. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  255. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  256. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  257. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  258. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  259. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  262. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  263. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  264. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/position.py +0 -0
  265. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  266. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/position_state.py +0 -0
  267. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/position_util.py +0 -0
  268. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  269. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  271. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  272. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  273. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  274. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  276. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  277. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/state.py +0 -0
  278. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/__init__.py +0 -0
  279. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  280. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  281. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  282. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/trade.py +0 -0
  283. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  284. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  285. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  286. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  287. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  289. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  290. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  291. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  292. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  293. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  294. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  295. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  296. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/__init__.py +0 -0
  297. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/channel/__init__.py +0 -0
  298. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  299. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  300. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/channel/signal_producer.py +0 -0
  301. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/signal_creation.py +0 -0
  302. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  303. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/signals/util.py +0 -0
  304. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/__init__.py +0 -0
  305. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/abstract_storage.py +0 -0
  306. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/candles_storage.py +0 -0
  307. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/orders_storage.py +0 -0
  308. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/portfolio_storage.py +0 -0
  309. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/storage_manager.py +0 -0
  310. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/trades_storage.py +0 -0
  311. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/transactions_storage.py +0 -0
  312. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/storage/util.py +0 -0
  313. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/supervisors/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  315. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  316. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/config_util.py +0 -0
  318. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/initializable.py +0 -0
  319. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/initialization_util.py +0 -0
  320. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/simulator_updater_utils.py +0 -0
  321. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/test_tools/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  323. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  324. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  325. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  326. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/setup.cfg +0 -0
  327. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/setup.py +0 -0
  328. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_channels.py +0 -0
  330. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_exchange.py +0 -0
  331. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_modes.py +0 -0
  332. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_orders.py +0 -0
  333. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_portfolio.py +0 -0
  334. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_profitability.py +0 -0
  335. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_symbol_data.py +0 -0
  336. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_trader.py +0 -0
  337. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/api/test_trades.py +0 -0
  338. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/cli/__init__.py +0 -0
  339. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/contracts/__init__.py +0 -0
  341. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  342. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  343. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/funding/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  345. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/kline/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  347. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/ohlcv/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  349. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  350. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/order_book/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  352. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/prices/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  354. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  355. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/recent_trades/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  357. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  358. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/ticker/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  360. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/connectors/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  364. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  365. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/connectors/test_util.py +0 -0
  366. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/implementations/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  368. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  369. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_abstract_exchange.py +0 -0
  370. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  371. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_exchange_builder.py +0 -0
  372. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_exchange_config_data.py +0 -0
  373. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_exchange_factory.py +0 -0
  374. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_exchange_manager.py +0 -0
  375. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_exchange_simulator.py +0 -0
  376. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/test_exchanges.py +0 -0
  377. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/traders/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/traders/test_trader.py +0 -0
  379. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/types/__init__.py +0 -0
  380. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  381. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/util/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  383. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/exchanges/util/test_exchange_util.py +0 -0
  384. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  388. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  389. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  390. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  391. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  392. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  393. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/test_abstract_mode_consumer.py +0 -0
  394. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/test_abstract_trading_mode.py +0 -0
  395. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/modes/test_modes_util.py +0 -0
  396. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/__init__.py +0 -0
  397. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py +0 -0
  400. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py +0 -0
  401. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py +0 -0
  402. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/groups/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  404. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  405. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  406. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
  407. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/__init__.py +0 -0
  408. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  409. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  410. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  411. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  412. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_order_state.py +0 -0
  413. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  414. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  415. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  416. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  417. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  418. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_order.py +0 -0
  419. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_order_adapter.py +0 -0
  420. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_order_util.py +0 -0
  421. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_orders_manager.py +0 -0
  422. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  423. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  425. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  426. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/triggers/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/triggers/test_base_trigger.py +0 -0
  428. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/triggers/test_price_trigger.py +0 -0
  429. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  432. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  433. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  434. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  435. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  436. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  437. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  438. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/market/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  440. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  441. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  442. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  444. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  445. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  447. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  448. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  449. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  450. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/history/__init__.py +0 -0
  451. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  452. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  453. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_asset.py +0 -0
  454. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  455. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  456. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  457. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  458. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
  459. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  460. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/types/__init__.py +0 -0
  461. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  462. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  463. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  464. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/__init__.py +0 -0
  465. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/channel/__init__.py +0 -0
  466. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/states/__init__.py +0 -0
  467. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/test_position.py +0 -0
  468. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/test_position_factory.py +0 -0
  469. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/test_positions_manager.py +0 -0
  470. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/types/__init__.py +0 -0
  471. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  472. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  473. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/trades/__init__.py +0 -0
  474. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/trades/test_trade_factory.py +0 -0
  475. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/trades/test_trade_manager.py +0 -0
  476. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  477. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/trades/test_trade_util.py +0 -0
  478. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/transactions/__init__.py +0 -0
  479. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  480. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  481. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/signals/__init__.py +0 -0
  482. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  483. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/signals/test_util.py +0 -0
  484. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/test_utils/__init__.py +0 -0
  485. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/test_utils/order_util.py +0 -0
  486. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/test_utils/random_numbers.py +0 -0
  487. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/util/__init__.py +0 -0
  488. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests/util/test_config_util.py +0 -0
  489. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/__init__.py +0 -0
  490. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/__init__.py +0 -0
  491. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  492. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_binance.py +0 -0
  493. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  494. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bingx.py +0 -0
  495. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  496. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  497. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  498. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bitso.py +0 -0
  499. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  500. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bybit.py +0 -0
  501. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  502. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  503. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_coinex.py +0 -0
  504. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  505. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_htx.py +0 -0
  506. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
  507. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  508. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  509. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_okx.py +0 -0
  510. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  511. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_phemex.py +0 -0
  512. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  513. {OctoBot-Trading-2.4.207 → OctoBot-Trading-2.4.209}/tests_additional/real_exchanges/test_upbit.py +0 -0
@@ -4,6 +4,15 @@ 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.209] - 2025-08-21
8
+ ### Updated
9
+ [Portfolio] consider order fees in delta when from exchange
10
+ [Orders] set order_exchange_id in from_dict factory when available
11
+
12
+ ## [2.4.208] - 2025-08-18
13
+ ### Updated
14
+ [CCXT] update to 4.5.0
15
+
7
16
  ## [2.4.207] - 2025-08-16
8
17
  ### Updated
9
18
  [ExchangeData] add exchange_credential_id
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.207
3
+ Version: 2.4.209
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.207](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.209](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)
@@ -353,6 +353,7 @@ tests/exchanges/connectors/__init__.py
353
353
  tests/exchanges/connectors/test_util.py
354
354
  tests/exchanges/connectors/ccxt/__init__.py
355
355
  tests/exchanges/connectors/ccxt/mock_exchanges_data.py
356
+ tests/exchanges/connectors/ccxt/test_ccxt_client_util.py
356
357
  tests/exchanges/connectors/ccxt/test_ccxt_connector.py
357
358
  tests/exchanges/implementations/__init__.py
358
359
  tests/exchanges/implementations/test_default_rest_exchange.py
@@ -4,7 +4,7 @@ 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
6
  trading-backend>=1.2.35
7
- ccxt==4.4.85
7
+ ccxt==4.5.0
8
8
  cryptography
9
9
  sortedcontainers==2.4.0
10
10
  tinydb==4.5.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.207
3
+ Version: 2.4.209
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.207](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.209](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.207](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.209](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.207" # major.minor.revision
18
+ VERSION = "2.4.209" # major.minor.revision
@@ -113,7 +113,7 @@ NaN = decimal.Decimal("nan")
113
113
 
114
114
  # exchanges where test_get_historical_symbol_prices is successful can be listed here
115
115
  FULL_CANDLE_HISTORY_EXCHANGES = [
116
- # "ascendex", broken since ccxt==4.4.85
116
+ "ascendex",
117
117
  "binance",
118
118
  "bitfinex",
119
119
  "bitstamp",
@@ -22,12 +22,12 @@ import octobot_trading.constants
22
22
  class ProxyConfig:
23
23
  # REST proxy
24
24
  http_proxy: typing.Optional[str] = None
25
- http_proxy_callback: typing.Optional[typing.Callable] = None
25
+ http_proxy_callback: typing.Optional[typing.Callable[[str, str, dict, typing.Any], typing.Optional[str]]] = None
26
26
  https_proxy: typing.Optional[str] = None
27
- https_proxy_callback: typing.Optional[typing.Callable] = None
27
+ https_proxy_callback: typing.Optional[typing.Callable[[str, str, dict, typing.Any], typing.Optional[str]]] = None
28
28
  # Websocket proxy
29
29
  socks_proxy : typing.Optional[str] = None
30
- socks_proxy_callback: typing.Optional[typing.Callable] = None
30
+ socks_proxy_callback: typing.Optional[typing.Callable[[str, str, dict, typing.Any], typing.Optional[str]]] = None
31
31
  # enable trust_env in exchange's aiohttp.ClientSession
32
32
  aiohttp_trust_env: bool = octobot_trading.constants.ENABLE_EXCHANGE_HTTP_PROXY_FROM_ENV
33
33
  # if set, will be called when exchange stops
@@ -37,9 +37,6 @@ class ProxyConfig:
37
37
  get_proxy_url: typing.Optional[typing.Callable[[], str]] = None
38
38
  # the host of this proxy, used to identify proxy connexion errors
39
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
43
40
 
44
41
  @classmethod
45
42
  def default_env_var_config(cls):
@@ -328,7 +328,6 @@ def _use_proxy_if_necessary(client, proxy_config: proxy_config_import.ProxyConfi
328
328
  # extra args copied from self.open()
329
329
  ssl=client.ssl_context,
330
330
  loop=client.asyncio_loop,
331
- use_dns_cache=not proxy_config.disable_dns_cache,
332
331
  enable_cleanup_closed=True
333
332
  )
334
333
  client.socks_proxy_sessions[proxy_url] = aiohttp.ClientSession(
@@ -342,21 +341,6 @@ def _use_proxy_if_necessary(client, proxy_config: proxy_config_import.ProxyConfi
342
341
  raise ImportError(
343
342
  "The aiohttp_socks python library is not installed and is required to use a socks proxy"
344
343
  ) from err
345
- elif proxy_config.disable_dns_cache:
346
- # rewrite of async_ccxt.exchange.client.open()
347
- _init_ccxt_client_session_requirements(client)
348
- if client.session:
349
- # should not happen
350
- asyncio.create_task(client.session.close())
351
- connector = aiohttp.TCPConnector(
352
- ssl=client.ssl_context, loop=client.asyncio_loop, enable_cleanup_closed=True,
353
- # local overrides
354
- use_dns_cache=False
355
- # end local overrides
356
- )
357
- client.session = aiohttp.ClientSession(
358
- loop=client.asyncio_loop, connector=connector, trust_env=client.aiohttp_trust_env
359
- )
360
344
 
361
345
 
362
346
  def _init_ccxt_client_session_requirements(client):
@@ -468,7 +452,7 @@ def _use_request_counter(
468
452
  # connector = aiohttp.TCPConnector(ssl=self.ssl_context, loop=self.asyncio_loop, enable_cleanup_closed=True)
469
453
  ccxt_client.tcp_connector = aiohttp.TCPConnector(
470
454
  ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop,
471
- enable_cleanup_closed=True, use_dns_cache=not proxy_config.disable_dns_cache
455
+ enable_cleanup_closed=True
472
456
  )
473
457
  counter_session = aiohttp_util.CounterClientSession(
474
458
  identifier,
@@ -490,6 +474,7 @@ def _use_request_counter(
490
474
  def ccxt_exchange_class_factory(exchange_name):
491
475
  return getattr(async_ccxt, exchange_name)
492
476
 
477
+
493
478
  def reraise_with_proxy_prefix_if_relevant(
494
479
  ccxt_connector, cause_error: Exception, raised_error: typing.Optional[Exception]
495
480
  ):
@@ -134,6 +134,7 @@ def create_order_from_dict(trader, order_dict):
134
134
  price=order_dict[enums.ExchangeConstantsOrderColumns.PRICE.value],
135
135
  status=enums.OrderStatus(order_dict[enums.ExchangeConstantsOrderColumns.STATUS.value]),
136
136
  order_id=order_dict[enums.ExchangeConstantsOrderColumns.ID.value],
137
+ exchange_order_id=order_dict.get(enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value),
137
138
  quantity_filled=order_dict[enums.ExchangeConstantsOrderColumns.FILLED.value],
138
139
  timestamp=order_dict[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value],
139
140
  side=enums.TradeOrderSide(order_dict[enums.ExchangeConstantsOrderColumns.SIDE.value]),
@@ -860,6 +860,18 @@ def get_assets_delta_from_orders(orders: list[order_import.Order]) -> (
860
860
  asset_deltas[unit_and_amount[0]] = unit_and_amount[1] * multiplier
861
861
  else:
862
862
  asset_deltas[unit_and_amount[0]] += unit_and_amount[1] * multiplier
863
+ if actual_fees := order.fee:
864
+ if (
865
+ actual_fees[enums.FeePropertyColumns.IS_FROM_EXCHANGE.value]
866
+ and actual_fees[enums.FeePropertyColumns.COST.value]
867
+ ):
868
+ # order fees are from exchange: add them to asset deltas as they are confirmed
869
+ fee_asset = actual_fees[enums.FeePropertyColumns.CURRENCY.value]
870
+ if fee_asset not in asset_deltas:
871
+ # always substract fees
872
+ asset_deltas[fee_asset] = -decimal.Decimal(str(actual_fees[enums.FeePropertyColumns.COST.value]))
873
+ else:
874
+ asset_deltas[fee_asset] -= decimal.Decimal(str(actual_fees[enums.FeePropertyColumns.COST.value]))
863
875
  # order "probable" related deltas (account for worse case fees)
864
876
  expected_forecasted_fees = order.get_computed_fee(use_origin_quantity_and_price=True)
865
877
  possible_forecasted_fees = _get_other_asset_forecasted_fees(
@@ -8,7 +8,7 @@ OctoBot-Tentacles-Manager>=2.9, <2.10
8
8
  trading-backend>=1.2.35
9
9
 
10
10
  # Exchange connection requirements
11
- ccxt==4.4.85 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
11
+ ccxt==4.5.0 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
12
12
 
13
13
  cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)
14
14
 
@@ -0,0 +1,179 @@
1
+ # Drakkar-Software OctoBot-Trading
2
+ # Copyright (c) Drakkar-Software, All rights reserved.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 3.0 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library.
16
+ import contextlib
17
+ import pytest
18
+ import mock
19
+ import aiohttp
20
+ import ccxt.async_support as ccxt
21
+
22
+ import octobot_commons.aiohttp_util as aiohttp_util
23
+
24
+ import octobot_trading.exchanges as exchanges
25
+ import octobot_trading.exchanges.connectors.ccxt.ccxt_client_util as ccxt_client_util
26
+ import octobot_trading.constants as constants
27
+
28
+
29
+ @pytest.mark.asyncio
30
+ async def test_proxies():
31
+ with mock.patch.object(aiohttp.ClientSession, "_request", mock.AsyncMock()) as _request_mock:
32
+
33
+ # no proxy
34
+ proxy_config = exchanges.ProxyConfig()
35
+ async with _exchange_with_proxy_config(proxy_config) as exchange:
36
+ _request_mock.assert_not_called()
37
+ await exchange.load_markets()
38
+ assert _request_mock.call_count > 0
39
+ assert all(
40
+ call.kwargs["proxy"] is None
41
+ for call in _request_mock.call_args_list
42
+ )
43
+ _request_mock.reset_mock()
44
+
45
+ # http proxy
46
+ proxy_config = exchanges.ProxyConfig(
47
+ http_proxy="http://127.0.0.1:9090",
48
+ )
49
+ async with _exchange_with_proxy_config(proxy_config) as exchange:
50
+ _request_mock.assert_not_called()
51
+ await exchange.load_markets()
52
+ assert _request_mock.call_count > 0
53
+ assert all(
54
+ call.kwargs["proxy"] == "http://127.0.0.1:9090"
55
+ for call in _request_mock.call_args_list
56
+ )
57
+ _request_mock.reset_mock()
58
+
59
+ # http proxy callback
60
+ proxy_config = exchanges.ProxyConfig(
61
+ http_proxy_callback=lambda url, method, headers, body: "http://9.9.9.9:9090",
62
+ )
63
+ async with _exchange_with_proxy_config(proxy_config) as exchange:
64
+ _request_mock.assert_not_called()
65
+ await exchange.load_markets()
66
+ assert _request_mock.call_count > 0
67
+ assert all(
68
+ call.kwargs["proxy"] == "http://9.9.9.9:9090"
69
+ for call in _request_mock.call_args_list
70
+ )
71
+ _request_mock.reset_mock()
72
+
73
+ # https proxy
74
+ proxy_config = exchanges.ProxyConfig(
75
+ https_proxy="https://127.0.0.1:9090",
76
+ )
77
+ async with _exchange_with_proxy_config(proxy_config) as exchange:
78
+ _request_mock.assert_not_called()
79
+ await exchange.load_markets()
80
+ assert _request_mock.call_count > 0
81
+ assert all(
82
+ call.kwargs["proxy"] == "https://127.0.0.1:9090"
83
+ for call in _request_mock.call_args_list
84
+ )
85
+ _request_mock.reset_mock()
86
+
87
+ # https proxy callback
88
+ proxy_config = exchanges.ProxyConfig(
89
+ https_proxy_callback=lambda url, method, headers, body: "https://9.9.9.9:9090",
90
+ )
91
+ async with _exchange_with_proxy_config(proxy_config) as exchange:
92
+ _request_mock.assert_not_called()
93
+ await exchange.load_markets()
94
+ assert _request_mock.call_count > 0
95
+ assert all(
96
+ call.kwargs["proxy"] == "https://9.9.9.9:9090"
97
+ for call in _request_mock.call_args_list
98
+ )
99
+ _request_mock.reset_mock()
100
+
101
+ # https proxy callback
102
+ proxy_config = exchanges.ProxyConfig(
103
+ https_proxy_callback=lambda url, method, headers, body: "https://9.9.9.9:9090",
104
+ )
105
+ async with _exchange_with_proxy_config(proxy_config) as exchange:
106
+ _request_mock.assert_not_called()
107
+ await exchange.load_markets()
108
+ assert _request_mock.call_count > 0
109
+ assert all(
110
+ call.kwargs["proxy"] == "https://9.9.9.9:9090"
111
+ for call in _request_mock.call_args_list
112
+ )
113
+ _request_mock.reset_mock()
114
+
115
+
116
+ @pytest.mark.asyncio
117
+ async def test_request_counter():
118
+ with mock.patch.object(aiohttp.ClientSession, "_request", mock.AsyncMock()) as _request_mock:
119
+ # without proxy
120
+ proxy_config = exchanges.ProxyConfig()
121
+ with mock.patch.object(constants, "ENABLE_CCXT_REQUESTS_COUNTER", True):
122
+ async with _exchange_with_proxy_config(proxy_config, allow_request_counter=True) as exchange:
123
+ await exchange.load_markets()
124
+ assert _request_mock.call_count > 0
125
+ assert all(
126
+ call.kwargs["proxy"] is None
127
+ for call in _request_mock.call_args_list
128
+ )
129
+ assert isinstance(exchange.session, aiohttp_util.CounterClientSession)
130
+ # requests are counted by session counter
131
+ assert len(exchange.session.per_min.paths) > 0
132
+ assert exchange.session.per_min.paths[next(iter(exchange.session.per_min.paths))] > 0
133
+ _request_mock.reset_mock()
134
+
135
+ # with http proxy
136
+ proxy_config = exchanges.ProxyConfig(http_proxy="http://127.0.0.1:9090")
137
+ with mock.patch.object(constants, "ENABLE_CCXT_REQUESTS_COUNTER", True):
138
+ async with _exchange_with_proxy_config(proxy_config, allow_request_counter=True) as exchange:
139
+ await exchange.load_markets()
140
+ assert _request_mock.call_count > 0
141
+ assert all(
142
+ call.kwargs["proxy"] == "http://127.0.0.1:9090"
143
+ for call in _request_mock.call_args_list
144
+ )
145
+ assert isinstance(exchange.session, aiohttp_util.CounterClientSession)
146
+ # requests are counted by session counter
147
+ assert len(exchange.session.per_min.paths) > 0
148
+ assert exchange.session.per_min.paths[next(iter(exchange.session.per_min.paths))] > 0
149
+ _request_mock.reset_mock()
150
+
151
+ # with http proxy callback
152
+ proxy_config = exchanges.ProxyConfig(
153
+ http_proxy_callback=lambda url, method, headers, body: "http://9.9.9.9:9090"
154
+ )
155
+ with mock.patch.object(constants, "ENABLE_CCXT_REQUESTS_COUNTER", True):
156
+ async with _exchange_with_proxy_config(proxy_config, allow_request_counter=True) as exchange:
157
+ await exchange.load_markets()
158
+ assert _request_mock.call_count > 0
159
+ assert all(
160
+ call.kwargs["proxy"] == "http://9.9.9.9:9090"
161
+ for call in _request_mock.call_args_list
162
+ )
163
+ assert isinstance(exchange.session, aiohttp_util.CounterClientSession)
164
+ # requests are counted by session counter
165
+ assert len(exchange.session.per_min.paths) > 0
166
+ assert exchange.session.per_min.paths[next(iter(exchange.session.per_min.paths))] > 0
167
+ _request_mock.reset_mock()
168
+
169
+
170
+ @contextlib.asynccontextmanager
171
+ async def _exchange_with_proxy_config(proxy_config: exchanges.ProxyConfig, allow_request_counter=False):
172
+ exchange = None
173
+ try:
174
+ exchange = ccxt_client_util.instantiate_exchange(ccxt.kraken, {"enableRateLimit": False}, "test", proxy_config, allow_request_counter=allow_request_counter)
175
+ yield exchange
176
+ finally:
177
+ if exchange:
178
+ exchange.timeout_on_exit = 0 # avoid waiting for the exchange to close
179
+ await exchange.close()
@@ -134,6 +134,7 @@ class TestOrderFactory:
134
134
  # associated_entry_ids are not copied
135
135
  assert created_from_dict.associated_entry_ids is None
136
136
  assert created_from_dict.trigger_above is limit_order.trigger_above is True
137
+ assert created_from_dict.exchange_order_id # ensure exchange_order_id is generated
137
138
  assert limit_order.associated_entry_ids == ["1"]
138
139
 
139
140
 
@@ -146,6 +147,7 @@ class TestOrderFactory:
146
147
  quantity,
147
148
  price=price,
148
149
  trigger_above=False,
150
+ exchange_order_id="123",
149
151
  )
150
152
  order_dict = limit_order.to_dict()
151
153
  created_from_dict = personal_data.create_order_from_dict(trader_inst, order_dict)
@@ -160,6 +162,7 @@ class TestOrderFactory:
160
162
  # associated_entry_ids are not copied
161
163
  assert created_from_dict.associated_entry_ids is None
162
164
  assert created_from_dict.trigger_above is limit_order.trigger_above is False
165
+ assert created_from_dict.exchange_order_id == "123"
163
166
  assert limit_order.associated_entry_ids is None
164
167
 
165
168
  await self.stop(exchange_manager)
@@ -1028,6 +1028,90 @@ def test_get_portfolio_filled_orders_deltas_considering_local_exchange_fees():
1028
1028
  error_log.assert_not_called()
1029
1029
 
1030
1030
 
1031
+ def test_get_portfolio_filled_orders_deltas_with_exchange_fetched_fees():
1032
+ pre_trade_content = _content({"BTC": 0.1, "USDT": 600.2})
1033
+ post_trade_content = _content({"BTC": 0.2, "USDT": 50.2}) # paid 50 USDT in fees
1034
+ error_log = mock.Mock()
1035
+ with mock.patch.object(octobot_commons.logging, "get_logger", mock.Mock(return_value=mock.Mock(error=error_log))):
1036
+ # no filled order
1037
+ assert personal_data.get_portfolio_filled_orders_deltas(pre_trade_content, post_trade_content, [], []) == _resolved(
1038
+ {}, {}
1039
+ )
1040
+ error_log.assert_not_called()
1041
+
1042
+ # with fees: delta is found
1043
+ filled_orders = [
1044
+ _order("BTC/USDT", 0.06, 100, "buy", {"USDT": 25}, is_exchange_fetched_fee=True),
1045
+ _order("BTC/USDT", 0.05, 450, "buy", {"USDT": 25}, is_exchange_fetched_fee=True),
1046
+ _order("BTC/USDT", 0.01, 50, "sell", {"BTC": 0.0000001}, is_exchange_fetched_fee=True),
1047
+ ]
1048
+ assert personal_data.get_portfolio_filled_orders_deltas(
1049
+ pre_trade_content, post_trade_content, filled_orders, []
1050
+ ) == _resolved(
1051
+ # all orders found in deltas because fees have been taken into account
1052
+ _content({"BTC": 0.1, "USDT": -550}),
1053
+ )
1054
+ for order in filled_orders:
1055
+ assert order.get_computed_fee.call_count > 0
1056
+ error_log.assert_not_called()
1057
+
1058
+ # now with unknown orders
1059
+ assert personal_data.get_portfolio_filled_orders_deltas(
1060
+ pre_trade_content, post_trade_content, [], filled_orders
1061
+ ) == _resolved(
1062
+ # all orders found in deltas because fees have been taken into account
1063
+ explained_orders_deltas=_content({"BTC": 0.1, "USDT": -550}),
1064
+ inferred_filled_orders=filled_orders,
1065
+ )
1066
+ error_log.assert_not_called()
1067
+
1068
+ # same test but fees will be much lower and won't explain all detlas
1069
+ filled_orders = [
1070
+ _order("BTC/USDT", 0.06, 100, "buy", {"USDT": 0.1}, is_exchange_fetched_fee=True),
1071
+ _order("BTC/USDT", 0.05, 450, "buy", {"USDT": 0.1}, is_exchange_fetched_fee=True),
1072
+ _order("BTC/USDT", 0.01, 50, "sell", {"BTC": 0.0000001}, is_exchange_fetched_fee=True),
1073
+ ]
1074
+ assert personal_data.get_portfolio_filled_orders_deltas(
1075
+ pre_trade_content, post_trade_content, filled_orders, []
1076
+ ) == _resolved(
1077
+ # only the part actually explained by fetched fees are taken into account in deltas (instead of -550 USDT)
1078
+ _content({"BTC": 0.1, "USDT": -500.2}),
1079
+ )
1080
+ error_log.assert_not_called()
1081
+
1082
+ # now with unknown orders
1083
+ unknown_orders = [
1084
+ _order("BTC/USDT", 0.06, 100, "buy", {"USDT": 0.1}, is_exchange_fetched_fee=True),
1085
+ _order("BTC/USDT", 0.05, 450, "buy", {"USDT": 0.1}, is_exchange_fetched_fee=True),
1086
+ _order("BTC/USDT", 0.01, 50, "sell", {"BTC": 0.0000001}, is_exchange_fetched_fee=True),
1087
+ ]
1088
+ assert personal_data.get_portfolio_filled_orders_deltas(
1089
+ pre_trade_content, post_trade_content, [], unknown_orders
1090
+ ) == _resolved(
1091
+ # only the part actually explained by fetched fees are taken into account in deltas (instead of -550 USDT)
1092
+ explained_orders_deltas=_content({"BTC": 0.1, "USDT": -500.2}),
1093
+ inferred_filled_orders=unknown_orders,
1094
+ )
1095
+ error_log.assert_not_called()
1096
+
1097
+ # with an order that is not explained in deltas at all
1098
+ unknown_orders = [
1099
+ _order("BTC/USDT", 0.06, 100, "buy", {"USDT": 0.1}, is_exchange_fetched_fee=True),
1100
+ _order("BTC/USDT", 0.05, 450, "buy", {"USDT": 0.1}, is_exchange_fetched_fee=True),
1101
+ _order("BTC/USDT", 0.01, 50, "sell", {"BTC": 0.0000001}, is_exchange_fetched_fee=True),
1102
+ _order("BTC/USDT", 0.05, 50, "sell", {"BTC": 0.0000001}, is_exchange_fetched_fee=True), # not explained
1103
+ ]
1104
+ assert personal_data.get_portfolio_filled_orders_deltas(
1105
+ pre_trade_content, post_trade_content, [], unknown_orders
1106
+ ) == _resolved(
1107
+ # only the part actually explained by fetched fees are taken into account in deltas (instead of -550 USDT)
1108
+ explained_orders_deltas=_content({"BTC": 0.1, "USDT": -500.2}),
1109
+ inferred_filled_orders=unknown_orders[:-1],
1110
+ inferred_cancelled_orders=[unknown_orders[-1]],
1111
+ )
1112
+ error_log.assert_not_called()
1113
+
1114
+
1031
1115
  def test_get_accepted_missed_deltas():
1032
1116
  # with no delta
1033
1117
  post_trade_content = _content({"XRP": 40, "USDT": 129.2474232})
@@ -1353,7 +1437,7 @@ def _missing_funds(funds: dict[str, float]) -> dict[str, decimal.Decimal]:
1353
1437
  for key, val in funds.items()
1354
1438
  }
1355
1439
 
1356
- def _order(symbol: str, quantity: float, cost: float, side: str, fee: dict = None, local_fees_currencies: list[str] = []) -> personal_data.Order:
1440
+ def _order(symbol: str, quantity: float, cost: float, side: str, fee: dict = None, local_fees_currencies: list[str] = [], is_exchange_fetched_fee: bool = False) -> personal_data.Order:
1357
1441
  trader = mock.Mock(exchange_manager=mock.Mock(exchange=mock.Mock(LOCAL_FEES_CURRENCIES=local_fees_currencies)))
1358
1442
  order = personal_data.Order(trader)
1359
1443
  order.symbol = symbol
@@ -1361,9 +1445,16 @@ def _order(symbol: str, quantity: float, cost: float, side: str, fee: dict = Non
1361
1445
  order.total_cost = decimal.Decimal(str(cost))
1362
1446
  order.origin_price = order.total_cost / order.origin_quantity
1363
1447
  order.side = enums.TradeOrderSide(side)
1448
+ if is_exchange_fetched_fee:
1449
+ order.fee = {
1450
+ enums.FeePropertyColumns.COST.value: decimal.Decimal(str(next(iter(fee.values())) if fee else 0)),
1451
+ enums.FeePropertyColumns.CURRENCY.value: next(iter(fee.keys())) if fee else None,
1452
+ enums.FeePropertyColumns.IS_FROM_EXCHANGE.value: True,
1453
+ }
1454
+ # get_computed_fee returns empty fees when is_exchange_fetched_fee is True to avoid side effects with predicted fees
1364
1455
  order.get_computed_fee = mock.Mock(return_value={
1365
- enums.FeePropertyColumns.COST.value: decimal.Decimal(str(next(iter(fee.values())) if fee else 0)),
1366
- enums.FeePropertyColumns.CURRENCY.value: next(iter(fee.keys())) if fee else None,
1456
+ enums.FeePropertyColumns.COST.value: decimal.Decimal(str(next(iter(fee.values())) if fee and not is_exchange_fetched_fee else 0)),
1457
+ enums.FeePropertyColumns.CURRENCY.value: next(iter(fee.keys())) if fee and not is_exchange_fetched_fee else None,
1367
1458
  enums.FeePropertyColumns.IS_FROM_EXCHANGE.value: False,
1368
1459
  })
1369
1460
  return order
@@ -123,7 +123,7 @@ class RealExchangeTester:
123
123
  async def test_get_historical_ohlcv(self):
124
124
  # common implementation, should always work if candles history is supported
125
125
  historical_ohlcv = await self.get_historical_ohlcv()
126
- assert len(historical_ohlcv) > 500 # should be around 650
126
+ assert len(historical_ohlcv) > 500, f"{len(historical_ohlcv)=} < 500" # should be around 650
127
127
  self.ensure_elements_order(historical_ohlcv, commons_enums.PriceIndexes.IND_PRICE_TIME.value)
128
128
  self.ensure_unique_elements(historical_ohlcv, commons_enums.PriceIndexes.IND_PRICE_TIME.value)
129
129
  start, end = self.get_historical_ohlcv_start_and_end_times()
@@ -95,9 +95,6 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
95
95
  # try with since and limit (used in data collector)
96
96
  for limit in (500, None):
97
97
  symbol_prices = await self.get_symbol_prices(since=self.CANDLE_SINCE, limit=limit)
98
- # broken since ccxt==4.4.85
99
- assert symbol_prices == []
100
- continue
101
98
  if limit:
102
99
  assert len(symbol_prices) == limit
103
100
  else:
@@ -111,8 +108,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
111
108
  assert self.CANDLE_SINCE_SEC <= candle[PriceIndexes.IND_PRICE_TIME.value] <= max_candle_time
112
109
 
113
110
  async def test_get_historical_ohlcv(self):
114
- # broken since ccxt==4.4.85
115
- assert await self.get_historical_ohlcv() == []
111
+ await super().test_get_historical_ohlcv()
116
112
 
117
113
  async def test_get_kline_price(self):
118
114
  kline_price = await self.get_kline_price()
@@ -54,7 +54,7 @@ class TestBitfinexRealExchangeTester(RealExchangeTester):
54
54
  ))
55
55
 
56
56
  async def test_active_symbols(self):
57
- await self.inner_test_active_symbols(400, 400)
57
+ await self.inner_test_active_symbols(350, 350)
58
58
 
59
59
  async def test_get_market_status(self):
60
60
  for market_status in await self.get_market_statuses():
@@ -81,7 +81,7 @@ class TestBitgetRealExchangeTester(RealExchangeTester):
81
81
  async def test_get_symbol_prices(self):
82
82
  # without limit
83
83
  symbol_prices = await self.get_symbol_prices()
84
- assert len(symbol_prices) == 100
84
+ assert len(symbol_prices) >=500, f"{len(symbol_prices)=} < 500"
85
85
  # check candles order (oldest first)
86
86
  self.ensure_elements_order(symbol_prices, PriceIndexes.IND_PRICE_TIME.value)
87
87
  # check last candle is the current candle
@@ -170,10 +170,10 @@ class TestCryptoComRealExchangeTester(RealExchangeTester):
170
170
  assert ticker[Ectc.BID_VOLUME.value] is None
171
171
  assert ticker[Ectc.ASK.value]
172
172
  assert ticker[Ectc.ASK_VOLUME.value] is None
173
- assert ticker[Ectc.OPEN.value] is None
173
+ assert ticker[Ectc.OPEN.value]
174
174
  assert ticker[Ectc.CLOSE.value]
175
175
  assert ticker[Ectc.LAST.value]
176
176
  assert ticker[Ectc.PREVIOUS_CLOSE.value] is None
177
177
  assert ticker[Ectc.BASE_VOLUME.value]
178
178
  assert ticker[Ectc.TIMESTAMP.value]
179
- RealExchangeTester.check_ticker_typing(ticker, check_open=False)
179
+ RealExchangeTester.check_ticker_typing(ticker)
@@ -160,10 +160,10 @@ class TestGateIORealExchangeTester(RealExchangeTester):
160
160
  assert ticker[Ectc.BID_VOLUME.value] is None
161
161
  assert ticker[Ectc.ASK.value]
162
162
  assert ticker[Ectc.ASK_VOLUME.value] is None
163
- assert ticker[Ectc.OPEN.value] is None
163
+ assert ticker[Ectc.OPEN.value]
164
164
  assert ticker[Ectc.CLOSE.value]
165
165
  assert ticker[Ectc.LAST.value]
166
166
  assert ticker[Ectc.PREVIOUS_CLOSE.value] is None
167
167
  assert ticker[Ectc.BASE_VOLUME.value]
168
168
  assert ticker[Ectc.TIMESTAMP.value] is None # will trigger an 'Ignored incomplete ticker'
169
- RealExchangeTester.check_ticker_typing(ticker, check_open=False, check_timestamp=False)
169
+ RealExchangeTester.check_ticker_typing(ticker, check_timestamp=False)
@@ -72,7 +72,7 @@ class TestHollaexRealExchangeTester(RealExchangeTester):
72
72
  # without limit is not supported replaced by a 500 default limit in hollaex tentacle
73
73
  symbol_prices = await self.get_symbol_prices(limit=500)
74
74
  # warning: large candle gaps, allow it in check
75
- assert 30 <= len(symbol_prices) <= 500
75
+ assert len(symbol_prices) == 500
76
76
  # check candles order (oldest first)
77
77
  self.ensure_elements_order(symbol_prices, PriceIndexes.IND_PRICE_TIME.value)
78
78
  # check last candle is the current candle