OctoBot-Trading 2.4.144__tar.gz → 2.4.146__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.144 → OctoBot-Trading-2.4.146}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.144/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.146}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/README.md +1 -1
  5. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/constants.py +4 -0
  7. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/errors.py +12 -0
  8. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +1 -1
  9. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +1 -1
  10. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchange_manager.py +20 -19
  11. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/traders/trader.py +4 -1
  12. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/types/rest_exchange.py +15 -1
  13. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/exchange_personal_data.py +3 -2
  14. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/cancel_order_state.py +1 -1
  15. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/fill_order_state.py +1 -1
  16. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/portfolio_manager.py +42 -2
  17. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/test_portfolio_manager.py +98 -18
  18. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/real_exchange_tester.py +2 -2
  19. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_mexc.py +1 -1
  20. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/LICENSE +0 -0
  21. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/MANIFEST.in +0 -0
  22. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  23. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  24. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  25. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/OctoBot_Trading.egg-info/requires.txt +0 -0
  26. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  27. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/__init__.py +0 -0
  28. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/channels.py +0 -0
  29. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/contracts.py +0 -0
  30. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/exchange.py +0 -0
  31. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/modes.py +0 -0
  32. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/orders.py +0 -0
  33. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/portfolio.py +0 -0
  34. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/positions.py +0 -0
  35. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/profitability.py +0 -0
  36. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/storage.py +0 -0
  37. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/symbol_data.py +0 -0
  38. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/trader.py +0 -0
  39. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/api/trades.py +0 -0
  40. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/enums.py +0 -0
  41. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_channel.py +0 -0
  42. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/__init__.py +0 -0
  43. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  44. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  45. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  46. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  47. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  48. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  49. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  50. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  51. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  52. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  53. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  54. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  55. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  57. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  58. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  59. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  60. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  61. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  63. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  64. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  65. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  66. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  67. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  68. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  69. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  72. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  73. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  75. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  78. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  79. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  80. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  81. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  82. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  85. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  86. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  87. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  88. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  91. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  92. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  94. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  96. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  97. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  99. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/config/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  101. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  102. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  103. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  106. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  107. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  108. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  109. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  110. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  112. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  113. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  114. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchange_builder.py +0 -0
  115. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchange_channels.py +0 -0
  116. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchange_details.py +0 -0
  117. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchange_factory.py +0 -0
  118. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  119. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/exchanges.py +0 -0
  120. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  122. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  123. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  124. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/traders/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  126. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/types/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  128. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/util/__init__.py +0 -0
  129. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  130. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  131. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  132. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  133. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  135. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/channel/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  137. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  138. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/channel/mode.py +0 -0
  139. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/mode_activity.py +0 -0
  140. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/mode_config.py +0 -0
  141. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/modes_factory.py +0 -0
  142. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/modes_util.py +0 -0
  143. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  144. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  146. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  147. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  148. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  149. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  150. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  151. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  152. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  153. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  154. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  155. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  156. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  157. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  159. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/octobot_channel_consumer.py +0 -0
  160. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  164. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  165. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  166. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  167. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  169. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  170. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  171. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/order.py +0 -0
  172. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  173. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  174. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/order_group.py +0 -0
  175. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/order_state.py +0 -0
  176. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/order_util.py +0 -0
  177. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  178. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  179. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  183. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  192. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  194. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  196. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  197. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  198. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  199. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  201. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  202. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  203. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  205. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  207. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  208. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  209. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  211. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  212. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  213. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  215. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  216. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  217. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  218. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  219. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  220. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  221. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  222. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  223. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  228. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  231. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  232. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  233. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/position.py +0 -0
  234. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  235. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/position_state.py +0 -0
  236. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/position_util.py +0 -0
  237. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  238. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  243. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  245. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  246. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/state.py +0 -0
  247. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  250. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  251. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/trade.py +0 -0
  252. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  253. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  254. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  255. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  256. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  258. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  259. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  260. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/channel/__init__.py +0 -0
  267. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  268. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  269. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/channel/signal_producer.py +0 -0
  270. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/signal_creation.py +0 -0
  271. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  272. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/signals/util.py +0 -0
  273. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/abstract_storage.py +0 -0
  275. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/candles_storage.py +0 -0
  276. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/orders_storage.py +0 -0
  277. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/portfolio_storage.py +0 -0
  278. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/storage_manager.py +0 -0
  279. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/trades_storage.py +0 -0
  280. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/transactions_storage.py +0 -0
  281. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/storage/util.py +0 -0
  282. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/supervisors/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  285. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/config_util.py +0 -0
  287. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/initializable.py +0 -0
  288. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/initialization_util.py +0 -0
  289. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/simulator_updater_utils.py +0 -0
  290. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/test_tools/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  292. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  294. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/requirements.txt +0 -0
  296. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/setup.cfg +0 -0
  297. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/setup.py +0 -0
  298. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_channels.py +0 -0
  300. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_exchange.py +0 -0
  301. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_modes.py +0 -0
  302. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_orders.py +0 -0
  303. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_portfolio.py +0 -0
  304. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_profitability.py +0 -0
  305. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_symbol_data.py +0 -0
  306. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_trader.py +0 -0
  307. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/api/test_trades.py +0 -0
  308. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/cli/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/contracts/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  312. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  313. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/funding/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  315. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/kline/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  317. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/ohlcv/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  319. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  320. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/order_book/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  322. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/prices/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  324. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  325. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/recent_trades/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  327. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  328. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/ticker/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  330. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/connectors/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  334. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  335. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/implementations/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_abstract_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_exchange_builder.py +0 -0
  341. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_exchange_config_data.py +0 -0
  342. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_exchange_factory.py +0 -0
  343. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_exchange_manager.py +0 -0
  344. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_exchange_simulator.py +0 -0
  345. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/test_exchanges.py +0 -0
  346. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/traders/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/traders/test_trader.py +0 -0
  348. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/types/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  350. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/util/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  352. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/exchanges/util/test_exchange_util.py +0 -0
  353. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  357. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  358. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/test_abstract_mode_consumer.py +0 -0
  363. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/test_abstract_trading_mode.py +0 -0
  364. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/modes/test_modes_util.py +0 -0
  365. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/groups/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  369. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  370. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  371. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  378. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  382. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_order.py +0 -0
  383. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_order_adapter.py +0 -0
  384. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_order_factory.py +0 -0
  385. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_order_util.py +0 -0
  386. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_orders_manager.py +0 -0
  387. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  388. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  395. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  396. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  397. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/market/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  399. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  400. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  401. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  403. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  404. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/__init__.py +0 -0
  405. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  407. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  408. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  409. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/history/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  411. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  412. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/test_asset.py +0 -0
  413. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  414. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  415. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  416. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  417. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/types/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  421. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/channel/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/states/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/test_position.py +0 -0
  425. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/test_position_factory.py +0 -0
  426. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/test_positions_manager.py +0 -0
  427. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/types/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  429. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  430. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/trades/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/trades/test_trade_factory.py +0 -0
  432. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/trades/test_trade_manager.py +0 -0
  433. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  434. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/trades/test_trade_util.py +0 -0
  435. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/transactions/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  437. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  438. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/signals/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  440. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/signals/test_util.py +0 -0
  441. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/test_utils/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/test_utils/order_util.py +0 -0
  443. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/test_utils/random_numbers.py +0 -0
  444. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/util/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests/util/test_config_util.py +0 -0
  446. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/__init__.py +0 -0
  447. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/__init__.py +0 -0
  448. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  449. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  450. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_binance.py +0 -0
  451. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  452. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bingx.py +0 -0
  453. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  454. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bitget.py +0 -0
  455. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  456. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  457. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  458. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bitso.py +0 -0
  459. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  460. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bybit.py +0 -0
  461. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  462. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  463. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_coinex.py +0 -0
  464. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  465. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_gateio.py +0 -0
  466. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  467. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  468. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_htx.py +0 -0
  469. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_kraken.py +0 -0
  470. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  471. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  472. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.144 → OctoBot-Trading-2.4.146}/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.146] - 2025-01-12
8
+ ### Added
9
+ [Exceptions] add UntradableSymbolError
10
+
11
+ ## [2.4.145] - 2025-01-11
12
+ ### Added
13
+ [Exceptions] add UnsupportedOrderTypeError
14
+ ### Fixed
15
+ [Orders] avoid portfolio desync after filled order
16
+
7
17
  ## [2.4.144] - 2025-01-10
8
18
  ### Fixed
9
19
  [Backtesting] fix default market status + adapter issues
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.144
3
+ Version: 2.4.146
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.144](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.146](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
21
21
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.144
3
+ Version: 2.4.146
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.144](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.146](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.144](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.146](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.144" # major.minor.revision
18
+ VERSION = "2.4.146" # major.minor.revision
@@ -46,6 +46,10 @@ CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5
46
46
  INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA = decimal.Decimal("0.005")
47
47
  CREATED_ORDER_FORCED_UPDATE_PERIOD = 5
48
48
 
49
+ # Portfolio
50
+ MAX_PORTFOLIO_SYNC_ATTEMPTS = 1
51
+ SYNC_ATTEMPTS_INTERVAL = 20
52
+
49
53
  # Tentacles
50
54
  TRADING_MODE_REQUIRED_STRATEGIES = "required_strategies"
51
55
  TRADING_MODE_REQUIRED_STRATEGIES_MIN_COUNT = "required_strategies_min_count"
@@ -45,6 +45,18 @@ class OrderCreationError(OctoBotExchangeError):
45
45
  """
46
46
 
47
47
 
48
+ class UnsupportedOrderTypeError(OrderCreationError):
49
+ """
50
+ Raised when asking for an order type that is not supported by the exchange
51
+ """
52
+
53
+
54
+ class UntradableSymbolError(OrderCreationError):
55
+ """
56
+ Raised when a symbol can't currently be traded on the exchange (not in exchange.get_all_tradable_symbols)
57
+ """
58
+
59
+
48
60
  class OrderEditError(OctoBotExchangeError):
49
61
  """
50
62
  Raised upon a failed order edition
@@ -181,7 +181,7 @@ def get_ccxt_client_login_options(exchange_manager):
181
181
  return {'defaultType': 'spot'}
182
182
 
183
183
 
184
- def get_symbols(client, active_only):
184
+ def get_symbols(client, active_only) -> set[str]:
185
185
  try:
186
186
  if active_only:
187
187
  return set(
@@ -207,7 +207,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
207
207
  else:
208
208
  raise
209
209
 
210
- def get_client_symbols(self, active_only=True):
210
+ def get_client_symbols(self, active_only=True) -> set[str]:
211
211
  return ccxt_client_util.get_symbols(self.client, active_only)
212
212
 
213
213
  def get_client_time_frames(self):
@@ -30,20 +30,21 @@ import octobot_trading.enums as enums
30
30
  import octobot_trading.util as util
31
31
  import octobot_trading.errors as errors
32
32
  import octobot_trading.storage as storage
33
+ import trading_backend.exchanges
33
34
 
34
35
 
35
36
  class ExchangeManager(util.Initializable):
36
37
  def __init__(self, config, exchange_class_string):
37
38
  super().__init__()
38
- self.id = str(uuid.uuid4())
39
- self.bot_id = None
40
- self.config = config
39
+ self.id : str= str(uuid.uuid4())
40
+ self.bot_id: str = None
41
+ self.config: dict = config
41
42
  self.tentacles_setup_config = None
42
- self.exchange_class_string = exchange_class_string
43
- self.exchange_name = exchange_class_string
43
+ self.exchange_class_string: str = exchange_class_string
44
+ self.exchange_name: str = exchange_class_string
44
45
  self.logger = logging.get_logger(self.__class__.__name__)
45
46
 
46
- self.is_ready = False
47
+ self.is_ready: bool = False
47
48
  self.is_simulated: bool = False
48
49
  self.is_backtesting: bool = False
49
50
  self.rest_only: bool = False
@@ -65,24 +66,24 @@ class ExchangeManager(util.Initializable):
65
66
 
66
67
  self.backtesting = None
67
68
 
68
- self.is_trader_simulated = util.is_trader_simulator_enabled(self.config)
69
- self.has_websocket = False
69
+ self.is_trader_simulated: bool = util.is_trader_simulator_enabled(self.config)
70
+ self.has_websocket: bool = False
70
71
 
71
- self.trader = None
72
- self.exchange = None
73
- self.exchange_backend = None
74
- self.is_broker_enabled = False
75
- self.trading_modes = []
72
+ self.trader: exchanges.Trader = None
73
+ self.exchange: exchanges.RestExchange = None
74
+ self.exchange_backend: trading_backend.exchanges.Exchange = None
75
+ self.is_broker_enabled: bool = False
76
+ self.trading_modes: list = []
76
77
 
77
78
  self.exchange_web_socket = None
78
79
 
79
- self.client_symbols = []
80
- self.client_time_frames = []
80
+ self.client_symbols: list[str] = []
81
+ self.client_time_frames: list[str] = []
81
82
 
82
- self.storage_manager = storage.StorageManager(self)
83
- self.exchange_config = exchanges.ExchangeConfig(self)
84
- self.exchange_personal_data = personal_data.ExchangePersonalData(self)
85
- self.exchange_symbols_data = exchange_data.ExchangeSymbolsData(self)
83
+ self.storage_manager: storage.StorageManager = storage.StorageManager(self)
84
+ self.exchange_config: exchanges.ExchangeConfig = exchanges.ExchangeConfig(self)
85
+ self.exchange_personal_data: personal_data.ExchangePersonalData = personal_data.ExchangePersonalData(self)
86
+ self.exchange_symbols_data: exchange_data.ExchangeSymbolsData = exchange_data.ExchangeSymbolsData(self)
86
87
 
87
88
  self.debug_info = {}
88
89
 
@@ -122,7 +122,10 @@ class Trader(util.Initializable):
122
122
  self.logger.warning(f"Order not created on {self.exchange_manager.exchange_name} "
123
123
  f"(failed attempt to create: {order}). This is likely due to "
124
124
  f"the order being refused by the exchange.")
125
- except (errors.MissingFunds, errors.AuthenticationError, errors.ExchangeCompliancyError):
125
+ except (
126
+ errors.MissingFunds, errors.AuthenticationError,
127
+ errors.ExchangeCompliancyError, errors.OrderCreationError
128
+ ):
126
129
  # forward errors that require actions to fix the situation
127
130
  raise
128
131
  except Exception as e:
@@ -1,3 +1,4 @@
1
+ # pylint: disable=W0706
1
2
  # Drakkar-Software OctoBot-Trading
2
3
  # Copyright (c) Drakkar-Software, All rights reserved.
3
4
  #
@@ -263,7 +264,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
263
264
  raise errors.FailedRequest(
264
265
  f"Failed order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
265
266
  ) from e
266
- except errors.OctoBotExchangeError:
267
+ except (errors.OctoBotExchangeError, errors.OrderCreationError):
267
268
  # custom error: forward it
268
269
  raise
269
270
  except Exception as e:
@@ -726,6 +727,19 @@ class RestExchange(abstract_exchange.AbstractExchange):
726
727
  def get_rate_limit(self):
727
728
  return self.connector.get_rate_limit()
728
729
 
730
+ def get_all_available_symbols(self, active_only=True) -> set[str]:
731
+ """
732
+ :return: the list of all symbols supported by the exchange
733
+ """
734
+ return self.connector.get_client_symbols(active_only=active_only)
735
+
736
+ async def get_all_tradable_symbols(self, active_only=True) -> set[str]:
737
+ """
738
+ Override if the exchange is not allowing trading for all available symbols (ex: MEXC)
739
+ :return: the list of all symbols supported by the exchange that can currently be traded through API
740
+ """
741
+ return self.get_all_available_symbols(active_only=active_only)
742
+
729
743
  async def switch_to_account(self, account_type: enums.AccountTypes):
730
744
  return await self.connector.switch_to_account(account_type=account_type)
731
745
 
@@ -84,11 +84,12 @@ class ExchangePersonalData(util.Initializable):
84
84
  return False
85
85
 
86
86
  async def handle_portfolio_and_position_update_from_order(
87
- self, order, require_exchange_update: bool = True, should_notify: bool = True
87
+ self, order, require_exchange_update: bool = True, expect_filled_order_update: bool = False,
88
+ should_notify: bool = True
88
89
  ) -> bool:
89
90
  try:
90
91
  changed: bool = await self.portfolio_manager.handle_balance_update_from_order(
91
- order, require_exchange_update
92
+ order, require_exchange_update, expect_filled_order_update
92
93
  )
93
94
  if self.exchange_manager.is_future:
94
95
  changed = await self.positions_manager.handle_position_update_from_order(
@@ -109,7 +109,7 @@ class CancelOrderState(order_state.OrderState):
109
109
  async with self.order.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.lock:
110
110
  self.ensure_not_cleared(self.order)
111
111
  await self.order.exchange_manager.exchange_personal_data.\
112
- handle_portfolio_and_position_update_from_order(self.order, False)
112
+ handle_portfolio_and_position_update_from_order(self.order, require_exchange_update=False)
113
113
 
114
114
  # notify order cancelled
115
115
  await self.order.exchange_manager.exchange_personal_data.handle_order_update_notification(
@@ -120,7 +120,7 @@ class FillOrderState(order_state.OrderState):
120
120
  async with self.order.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.lock:
121
121
  self.ensure_not_cleared(self.order)
122
122
  await self.order.exchange_manager.exchange_personal_data.\
123
- handle_portfolio_and_position_update_from_order(self.order)
123
+ handle_portfolio_and_position_update_from_order(self.order, expect_filled_order_update=True)
124
124
 
125
125
  # notify order filled
126
126
  await self.order.exchange_manager.exchange_personal_data.handle_order_update_notification(
@@ -15,10 +15,14 @@
15
15
  # License along with this library.
16
16
  import contextlib
17
17
  import copy
18
+ import decimal
19
+ import time
20
+ import asyncio
18
21
 
19
22
  import octobot_commons.logging as logging
20
23
  import octobot_commons.constants as commons_constants
21
24
  import octobot_commons.tree as commons_tree
25
+ import octobot_commons.symbols as commons_symbols
22
26
  import octobot_commons.enums as commons_enums
23
27
 
24
28
  import octobot_trading.exchange_channel as exchange_channel
@@ -77,7 +81,9 @@ class PortfolioManager(util.Initializable):
77
81
  self._is_initialized_event_set = True
78
82
  return changed
79
83
 
80
- async def handle_balance_update_from_order(self, order, require_exchange_update: bool) -> bool:
84
+ async def handle_balance_update_from_order(
85
+ self, order, require_exchange_update: bool, expect_filled_order_update: bool
86
+ ) -> bool:
81
87
  """
82
88
  Handle a balance update from an order update
83
89
  :param order: the order
@@ -91,9 +97,43 @@ class PortfolioManager(util.Initializable):
91
97
  return self._refresh_simulated_trader_portfolio_from_order(order)
92
98
  # on real trading only:
93
99
  # reload portfolio to ensure portfolio sync
94
- return await self._refresh_real_trader_portfolio()
100
+ return await self._refresh_real_trader_portfolio_until_order_update_applied(
101
+ order, expect_filled_order_update
102
+ )
95
103
  return False
96
104
 
105
+ async def _refresh_real_trader_portfolio_until_order_update_applied(self, order, expect_filled_order_update):
106
+ t0 = time.time()
107
+ refreshed = await self._refresh_real_trader_portfolio()
108
+ if not expect_filled_order_update:
109
+ return refreshed
110
+ if self._has_filled_order_been_applied(order):
111
+ return refreshed
112
+ for i in range(constants.MAX_PORTFOLIO_SYNC_ATTEMPTS):
113
+ await asyncio.sleep(constants.SYNC_ATTEMPTS_INTERVAL)
114
+ refreshed = await self._refresh_real_trader_portfolio()
115
+ # + 2 since 1st attempt is before looping
116
+ self.logger.info(f"Updated portfolio fetched after {i + 2} attempts")
117
+ if self._has_filled_order_been_applied(order):
118
+ return refreshed
119
+ self.logger.error(f"Filled order has not be counted in portfolio after {time.time() - t0} seconds")
120
+ return refreshed
121
+
122
+ def _has_filled_order_been_applied(self, order):
123
+ if self.exchange_manager.is_future:
124
+ # implement futures if necessary
125
+ return True
126
+ # in spot, consider order fill if the portfolio contains at least the order's executed amount
127
+ base, quote = commons_symbols.parse_symbol(order.symbol).base_and_quote()
128
+ checked_asset = base if order.side == enums.TradeOrderSide.BUY else quote
129
+ checked_amount = (
130
+ order.origin_quantity
131
+ if order.side == enums.TradeOrderSide.BUY else (order.origin_quantity * order.origin_price)
132
+ ) * decimal.Decimal("0.95") # consider a 5% error margin
133
+ available_amount = self.portfolio.get_currency_portfolio(checked_asset).available
134
+ # if available_amount > checked_amount, then the order fill is most likely taken into account in portfolio
135
+ return available_amount > checked_amount
136
+
97
137
  async def handle_balance_update_from_funding(self, position, funding_rate, require_exchange_update: bool) -> bool:
98
138
  """
99
139
  Handle a balance update from a funding update
@@ -15,12 +15,15 @@
15
15
  # License along with this library.
16
16
  import decimal
17
17
  import os
18
+ import asyncio
18
19
 
19
20
  import mock
20
21
  import pytest
21
22
  from mock import patch, Mock, AsyncMock
22
23
  import octobot_commons.constants as commons_constants
23
24
  import octobot_trading.personal_data as personal_data
25
+ import octobot_trading.constants as constants
26
+ from octobot_trading.personal_data import SellLimitOrder
24
27
  from octobot_trading.personal_data.orders import BuyMarketOrder, BuyLimitOrder
25
28
 
26
29
  from tests.exchanges import backtesting_trader, backtesting_config, backtesting_exchange_manager, fake_backtesting
@@ -63,46 +66,123 @@ async def test_handle_balance_update_from_order(backtesting_trader):
63
66
  trader.simulate = False
64
67
  order = BuyMarketOrder(trader)
65
68
 
66
- with patch.object(portfolio_manager, '_refresh_real_trader_portfolio',
67
- new=AsyncMock()) as _refresh_real_trader_portfolio_mock, \
69
+ with patch.object(portfolio_manager, '_refresh_real_trader_portfolio_until_order_update_applied',
70
+ new=AsyncMock()) as _refresh_real_trader_portfolio_until_order_update_applied_mock, \
68
71
  patch.object(portfolio_manager, '_refresh_simulated_trader_portfolio_from_order',
69
72
  new=Mock()) as _refresh_simulated_trader_portfolio_from_order_mock:
70
- _refresh_real_trader_portfolio_mock.assert_not_called()
71
- await portfolio_manager.handle_balance_update_from_order(order, True)
72
- _refresh_real_trader_portfolio_mock.assert_called_once()
73
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.assert_not_called()
74
+ await portfolio_manager.handle_balance_update_from_order(order, True, False)
75
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.assert_called_once_with(order, False)
76
+ _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
77
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.reset_mock()
78
+ await portfolio_manager.handle_balance_update_from_order(order, True, True)
79
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.assert_called_once_with(order, True)
73
80
  _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
74
- _refresh_real_trader_portfolio_mock.reset_mock()
81
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.reset_mock()
75
82
  with portfolio_manager.disabled_portfolio_update_from_order():
76
- await portfolio_manager.handle_balance_update_from_order(order, False)
77
- _refresh_real_trader_portfolio_mock.assert_not_called()
83
+ await portfolio_manager.handle_balance_update_from_order(order, False, False)
84
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.assert_not_called()
78
85
  _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
79
- await portfolio_manager.handle_balance_update_from_order(order, True)
80
- _refresh_real_trader_portfolio_mock.assert_not_called()
86
+ await portfolio_manager.handle_balance_update_from_order(order, True, False)
87
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.assert_not_called()
81
88
  _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
82
- await portfolio_manager.handle_balance_update_from_order(order, False)
83
- _refresh_real_trader_portfolio_mock.assert_not_called()
89
+ await portfolio_manager.handle_balance_update_from_order(order, False, False)
90
+ _refresh_real_trader_portfolio_until_order_update_applied_mock.assert_not_called()
84
91
  _refresh_simulated_trader_portfolio_from_order_mock.assert_called_once()
85
92
 
86
93
  trader.simulate = True
87
94
  with patch.object(portfolio_manager, '_refresh_simulated_trader_portfolio_from_order',
88
95
  new=Mock()) as _refresh_simulated_trader_portfolio_from_order_mock:
89
96
  _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
90
- await portfolio_manager.handle_balance_update_from_order(order, True)
97
+ await portfolio_manager.handle_balance_update_from_order(order, True, False)
91
98
  _refresh_simulated_trader_portfolio_from_order_mock.assert_called_once()
92
99
  _refresh_simulated_trader_portfolio_from_order_mock.reset_mock()
93
100
  with portfolio_manager.disabled_portfolio_update_from_order():
94
- await portfolio_manager.handle_balance_update_from_order(order, True)
101
+ await portfolio_manager.handle_balance_update_from_order(order, True, False)
95
102
  _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
96
- await portfolio_manager.handle_balance_update_from_order(order, False)
103
+ await portfolio_manager.handle_balance_update_from_order(order, False, False)
97
104
  _refresh_simulated_trader_portfolio_from_order_mock.assert_not_called()
98
105
  # ensure no side effect with require_exchange_update param
99
- await portfolio_manager.handle_balance_update_from_order(order, False)
106
+ await portfolio_manager.handle_balance_update_from_order(order, False, False)
100
107
  _refresh_simulated_trader_portfolio_from_order_mock.assert_called_once()
101
108
 
102
109
  trader.is_enabled = False
103
110
  trader.simulate = False
104
- assert not await portfolio_manager.handle_balance_update_from_order(order, True)
105
- assert not await portfolio_manager.handle_balance_update_from_order(order, False)
111
+ assert not await portfolio_manager.handle_balance_update_from_order(order, True, False)
112
+ assert not await portfolio_manager.handle_balance_update_from_order(order, False, False)
113
+
114
+
115
+ async def test_refresh_real_trader_portfolio_until_order_update_applied(backtesting_trader):
116
+ config, exchange_manager, trader = backtesting_trader
117
+ portfolio_manager = exchange_manager.exchange_personal_data.portfolio_manager
118
+
119
+ trader.simulate = False
120
+ order = BuyMarketOrder(trader)
121
+ with patch.object(portfolio_manager, '_refresh_real_trader_portfolio',
122
+ new=AsyncMock(return_value=True)) as _refresh_real_trader_portfolio_mock, \
123
+ patch.object(asyncio, 'sleep', AsyncMock()) as sleep_mock:
124
+ with patch.object(portfolio_manager, '_has_filled_order_been_applied',
125
+ new=Mock(return_value=True)) as _has_filled_order_been_applied_mock:
126
+ assert await portfolio_manager._refresh_real_trader_portfolio_until_order_update_applied(order, False) is True
127
+ _has_filled_order_been_applied_mock.assert_not_called()
128
+ _refresh_real_trader_portfolio_mock.assert_called_once()
129
+ sleep_mock.assert_not_called()
130
+ _refresh_real_trader_portfolio_mock.reset_mock()
131
+ assert await portfolio_manager._refresh_real_trader_portfolio_until_order_update_applied(order, True) is True
132
+ _has_filled_order_been_applied_mock.assert_called_once_with(order)
133
+ sleep_mock.assert_not_called()
134
+ _refresh_real_trader_portfolio_mock.reset_mock()
135
+ with patch.object(portfolio_manager, '_has_filled_order_been_applied',
136
+ new=Mock(return_value=False)) as _has_filled_order_been_applied_mock:
137
+ assert await portfolio_manager._refresh_real_trader_portfolio_until_order_update_applied(order, True) is True
138
+ assert _has_filled_order_been_applied_mock.call_count == 1 + constants.MAX_PORTFOLIO_SYNC_ATTEMPTS
139
+ assert _refresh_real_trader_portfolio_mock.call_count == 1 + constants.MAX_PORTFOLIO_SYNC_ATTEMPTS
140
+ assert sleep_mock.call_count == constants.MAX_PORTFOLIO_SYNC_ATTEMPTS
141
+ _has_filled_order_been_applied_mock.reset_mock()
142
+ _refresh_real_trader_portfolio_mock.reset_mock()
143
+ sleep_mock.reset_mock()
144
+ calls = []
145
+
146
+ # retry once
147
+ def _has_filled_order_been_applied(*args):
148
+ if calls:
149
+ return True
150
+ calls.append(1)
151
+ return False
152
+ with patch.object(portfolio_manager, '_has_filled_order_been_applied',
153
+ new=Mock(side_effect=_has_filled_order_been_applied)) as _has_filled_order_been_applied_mock:
154
+ assert await portfolio_manager._refresh_real_trader_portfolio_until_order_update_applied(order, True) is True
155
+ assert _has_filled_order_been_applied_mock.call_count == 2
156
+ assert _refresh_real_trader_portfolio_mock.call_count == 2
157
+ assert sleep_mock.call_count == 1
158
+
159
+
160
+ async def test_has_filled_order_been_applied(backtesting_trader):
161
+ config, exchange_manager, trader = backtesting_trader
162
+ portfolio_manager = exchange_manager.exchange_personal_data.portfolio_manager
163
+
164
+ trader.simulate = False
165
+ order = BuyMarketOrder(trader)
166
+ order.update("BTC/USDT", quantity=decimal.Decimal(10), price=decimal.Decimal(100))
167
+
168
+ # 10 BTC in PF
169
+ assert portfolio_manager._has_filled_order_been_applied(order) is True
170
+
171
+ order.update("BTC/USDT", quantity=decimal.Decimal(15), price=decimal.Decimal(100))
172
+ assert portfolio_manager._has_filled_order_been_applied(order) is False
173
+
174
+ order = SellLimitOrder(trader)
175
+ order.update("BTC/USDT", quantity=decimal.Decimal(10), price=decimal.Decimal(100))
176
+ # 1000 USDT in PF
177
+ assert portfolio_manager._has_filled_order_been_applied(order) is True
178
+
179
+ order.update("BTC/USDT", quantity=decimal.Decimal(10), price=decimal.Decimal(200))
180
+ assert portfolio_manager._has_filled_order_been_applied(order) is False
181
+
182
+ trader.exchange_manager.is_future = True
183
+ # always True on futures
184
+ assert portfolio_manager._has_filled_order_been_applied(order) is True
185
+ trader.exchange_manager.is_future = False
106
186
 
107
187
 
108
188
  async def test_refresh_simulated_trader_portfolio_from_order(backtesting_trader):
@@ -277,10 +277,10 @@ class RealExchangeTester:
277
277
  async def inner_test_active_symbols(self, expected_active_symbols_count: int, expected_total_symbols_count: int):
278
278
  async with self.get_exchange_manager() as exchange_manager:
279
279
  # ensure active symbols are correctly parsed by ccxt
280
- active_symbols = exchange_manager.exchange.connector.get_client_symbols(active_only=True)
280
+ active_symbols = exchange_manager.exchange.get_all_available_symbols(active_only=True)
281
281
  assert expected_active_symbols_count <= len(active_symbols) <= expected_active_symbols_count * 1.5, \
282
282
  f"{len(active_symbols)=}, {expected_active_symbols_count=}"
283
- all_symbols = exchange_manager.exchange.connector.get_client_symbols(active_only=False)
283
+ all_symbols = exchange_manager.exchange.get_all_available_symbols(active_only=False)
284
284
  assert expected_total_symbols_count <= len(all_symbols) <= expected_total_symbols_count * 1.5, \
285
285
  f"{len(all_symbols)=}, {expected_total_symbols_count=}"
286
286
 
@@ -54,7 +54,7 @@ class TestMEXCRealExchangeTester(RealExchangeTester):
54
54
  async def test_get_market_status(self):
55
55
  for market_status in await self.get_market_statuses():
56
56
  self.ensure_required_market_status_values(market_status)
57
- assert 1e-06 <= market_status[Ecmsc.PRECISION.value][
57
+ assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
58
58
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in tentacle
59
59
  assert 1e-09 <= market_status[Ecmsc.PRECISION.value][
60
60
  Ecmsc.PRECISION_PRICE.value] <= 1 # to be fixed in tentacle