OctoBot-Trading 2.4.143__tar.gz → 2.4.145__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.143 → OctoBot-Trading-2.4.145}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.143/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.145}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/README.md +1 -1
  5. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/constants.py +4 -0
  7. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/errors.py +6 -0
  8. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +4 -3
  9. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/implementations/exchange_simulator.py +38 -0
  10. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/exchange_personal_data.py +3 -2
  11. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/order.py +2 -2
  12. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/cancel_order_state.py +1 -1
  13. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/fill_order_state.py +1 -1
  14. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/portfolio_manager.py +42 -2
  15. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_order.py +6 -4
  16. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/test_portfolio_manager.py +98 -18
  17. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_mexc.py +1 -1
  18. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/LICENSE +0 -0
  19. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/MANIFEST.in +0 -0
  20. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  21. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  22. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  23. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/OctoBot_Trading.egg-info/requires.txt +0 -0
  24. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  25. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/__init__.py +0 -0
  26. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/channels.py +0 -0
  27. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/contracts.py +0 -0
  28. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/exchange.py +0 -0
  29. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/modes.py +0 -0
  30. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/orders.py +0 -0
  31. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/portfolio.py +0 -0
  32. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/positions.py +0 -0
  33. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/profitability.py +0 -0
  34. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/storage.py +0 -0
  35. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/symbol_data.py +0 -0
  36. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/trader.py +0 -0
  37. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/api/trades.py +0 -0
  38. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/enums.py +0 -0
  39. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_channel.py +0 -0
  40. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/__init__.py +0 -0
  41. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  42. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  43. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  44. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  45. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  46. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  47. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  48. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  49. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  50. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  51. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  52. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  53. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  56. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  57. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  58. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  59. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  61. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  62. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  63. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  64. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  65. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  66. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  67. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  69. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  70. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  71. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  72. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  73. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  76. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  77. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  78. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  79. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  80. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  83. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  84. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  86. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  89. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  90. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  92. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  94. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  95. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  97. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/config/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  99. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  100. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  101. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  102. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  104. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  105. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  106. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  107. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  108. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  109. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  110. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  112. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  113. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchange_builder.py +0 -0
  114. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchange_channels.py +0 -0
  115. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchange_details.py +0 -0
  116. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchange_factory.py +0 -0
  117. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchange_manager.py +0 -0
  118. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  119. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/exchanges.py +0 -0
  120. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  122. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  123. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/traders/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/traders/trader.py +0 -0
  125. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  126. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/types/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  128. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  129. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/util/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  131. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  132. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  133. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  134. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  136. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/channel/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  138. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  139. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/channel/mode.py +0 -0
  140. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/mode_activity.py +0 -0
  141. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/mode_config.py +0 -0
  142. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/modes_factory.py +0 -0
  143. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/modes_util.py +0 -0
  144. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  147. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  148. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  149. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  150. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  151. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  165. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  166. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  167. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  168. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  170. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  171. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  172. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  173. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  174. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/order_group.py +0 -0
  175. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/order_state.py +0 -0
  176. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/order_util.py +0 -0
  177. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  178. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  179. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  183. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  192. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  194. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  196. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  197. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  198. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  199. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  201. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  202. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  203. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  205. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  207. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  208. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  209. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  211. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  212. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  213. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  215. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  216. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  217. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  218. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  219. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  220. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  221. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  222. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  223. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  228. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  231. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  232. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  233. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/position.py +0 -0
  234. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  235. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/position_state.py +0 -0
  236. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/position_util.py +0 -0
  237. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  238. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  243. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  245. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  246. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/state.py +0 -0
  247. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  250. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  251. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/trade.py +0 -0
  252. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  253. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  254. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  255. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  256. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  258. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  259. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  260. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/channel/__init__.py +0 -0
  267. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  268. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  269. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/channel/signal_producer.py +0 -0
  270. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/signal_creation.py +0 -0
  271. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  272. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/signals/util.py +0 -0
  273. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/abstract_storage.py +0 -0
  275. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/candles_storage.py +0 -0
  276. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/orders_storage.py +0 -0
  277. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/portfolio_storage.py +0 -0
  278. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/storage_manager.py +0 -0
  279. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/trades_storage.py +0 -0
  280. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/transactions_storage.py +0 -0
  281. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/storage/util.py +0 -0
  282. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/supervisors/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  285. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/config_util.py +0 -0
  287. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/initializable.py +0 -0
  288. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/initialization_util.py +0 -0
  289. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/simulator_updater_utils.py +0 -0
  290. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/test_tools/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  292. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  294. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/requirements.txt +0 -0
  296. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/setup.cfg +0 -0
  297. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/setup.py +0 -0
  298. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_channels.py +0 -0
  300. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_exchange.py +0 -0
  301. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_modes.py +0 -0
  302. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_orders.py +0 -0
  303. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_portfolio.py +0 -0
  304. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_profitability.py +0 -0
  305. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_symbol_data.py +0 -0
  306. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_trader.py +0 -0
  307. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/api/test_trades.py +0 -0
  308. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/cli/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/contracts/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  312. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  313. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/funding/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  315. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/kline/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  317. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/ohlcv/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  319. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  320. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/order_book/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  322. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/prices/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  324. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  325. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/recent_trades/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  327. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  328. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/ticker/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  330. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/connectors/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  334. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  335. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/implementations/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_abstract_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_exchange_builder.py +0 -0
  341. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_exchange_config_data.py +0 -0
  342. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_exchange_factory.py +0 -0
  343. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_exchange_manager.py +0 -0
  344. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_exchange_simulator.py +0 -0
  345. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/test_exchanges.py +0 -0
  346. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/traders/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/traders/test_trader.py +0 -0
  348. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/types/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  350. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/util/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  352. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/exchanges/util/test_exchange_util.py +0 -0
  353. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  357. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  358. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/test_abstract_mode_consumer.py +0 -0
  363. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/test_abstract_trading_mode.py +0 -0
  364. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/modes/test_modes_util.py +0 -0
  365. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/groups/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  369. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  370. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  371. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  378. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  382. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_order_adapter.py +0 -0
  383. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_order_factory.py +0 -0
  384. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_order_util.py +0 -0
  385. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_orders_manager.py +0 -0
  386. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  387. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  394. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  395. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  396. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/market/__init__.py +0 -0
  397. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  398. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  399. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  400. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  402. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  403. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/__init__.py +0 -0
  404. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  405. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  406. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  407. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  408. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/history/__init__.py +0 -0
  409. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  410. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  411. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/test_asset.py +0 -0
  412. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  413. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  414. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  415. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  416. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/types/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  419. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/channel/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/states/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/test_position.py +0 -0
  424. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/test_position_factory.py +0 -0
  425. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/test_positions_manager.py +0 -0
  426. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/types/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  428. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  429. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/trades/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/trades/test_trade_factory.py +0 -0
  431. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/trades/test_trade_manager.py +0 -0
  432. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  433. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/trades/test_trade_util.py +0 -0
  434. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/transactions/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  436. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  437. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/signals/__init__.py +0 -0
  438. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  439. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/signals/test_util.py +0 -0
  440. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/test_utils/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/test_utils/order_util.py +0 -0
  442. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/test_utils/random_numbers.py +0 -0
  443. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/util/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests/util/test_config_util.py +0 -0
  445. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/__init__.py +0 -0
  447. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  449. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  450. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_binance.py +0 -0
  451. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  452. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bingx.py +0 -0
  453. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  454. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bitget.py +0 -0
  455. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  456. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  457. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  458. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bitso.py +0 -0
  459. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  460. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bybit.py +0 -0
  461. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  462. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  463. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_coinex.py +0 -0
  464. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  465. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_gateio.py +0 -0
  466. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  467. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  468. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_htx.py +0 -0
  469. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_kraken.py +0 -0
  470. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  471. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  472. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.143 → OctoBot-Trading-2.4.145}/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.145] - 2025-01-11
8
+ ### Added
9
+ [Exceptions] add UnsupportedOrderTypeError
10
+ ### Fixed
11
+ [Orders] avoid portfolio desync after filled order
12
+
13
+ ## [2.4.144] - 2025-01-10
14
+ ### Fixed
15
+ [Backtesting] fix default market status + adapter issues
16
+
7
17
  ## [2.4.143] - 2025-01-08
8
18
  ### Fixed
9
19
  [Orders] properly handle trigger above
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.143
3
+ Version: 2.4.145
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.143](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.145](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.143
3
+ Version: 2.4.145
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.143](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.145](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.143](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.145](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.143" # major.minor.revision
18
+ VERSION = "2.4.145" # 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,12 @@ 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
+
48
54
  class OrderEditError(OctoBotExchangeError):
49
55
  """
50
56
  Raised upon a failed order edition
@@ -88,7 +88,8 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
88
88
  return self.exchange_manager.use_cached_markets
89
89
 
90
90
  def get_contract_size(self, symbol: str):
91
- return ccxt_client_simulation.get_contract_size(self.get_market_status(symbol, with_fixer=False))
91
+ market_status, _ = self.get_market_status(symbol, with_fixer=False)
92
+ return ccxt_client_simulation.get_contract_size(market_status)
92
93
 
93
94
  @classmethod
94
95
  def load_user_inputs_from_class(cls, tentacles_setup_config, tentacle_config):
@@ -157,7 +158,7 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
157
158
  return util.ExchangeMarketStatusFixer(
158
159
  self._forced_market_statuses[symbol], price_example
159
160
  ).market_status
160
- return self._forced_market_statuses[symbol]
161
+ return self._forced_market_statuses[symbol], True
161
162
  except KeyError:
162
163
  self._missing_market_statuses.add(symbol)
163
164
  if len(self._missing_market_statuses) >= len(self.symbols) - 1:
@@ -168,7 +169,7 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
168
169
  )
169
170
  else:
170
171
  self.logger.warning(f"Missing cached market status for {symbol}: using default market status")
171
- return self._get_default_market_status()
172
+ return self._get_default_market_status(), False
172
173
 
173
174
  def _get_default_market_status(self):
174
175
  return {
@@ -14,6 +14,7 @@
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
16
  import typing
17
+ import copy
17
18
 
18
19
  import octobot_trading.constants as constants
19
20
  import octobot_trading.exchanges.util as exchange_util
@@ -115,6 +116,43 @@ class ExchangeSimulator(rest_exchange.RestExchange):
115
116
  def get_backtesting_data_files(self):
116
117
  return self.connector.get_backtesting_data_files()
117
118
 
119
+ def get_market_status(self, symbol, price_example=None, with_fixer=True):
120
+ """
121
+ Override of the RESTExchange get_fixed_market_status to handle different get_market_status return values
122
+ """
123
+ if self._should_fix_market_status():
124
+ return self.get_fixed_market_status(
125
+ symbol,
126
+ price_example=price_example,
127
+ with_fixer=with_fixer,
128
+ remove_price_limits=self._should_remove_market_status_limits(),
129
+ adapt_for_contract_size=self._should_adapt_market_status_for_contract_size()
130
+ )
131
+ market_status, _ = self.connector.get_market_status(
132
+ symbol, price_example=price_example, with_fixer=with_fixer
133
+ )
134
+ return market_status
135
+
136
+ def get_fixed_market_status(self, symbol, price_example=None, with_fixer=True, remove_price_limits=False,
137
+ adapt_for_contract_size=False):
138
+ """
139
+ Override of the RESTExchange get_fixed_market_status to call adapt_market_status only on fetch market statuses
140
+ (should not be call on default market status)
141
+ """
142
+ market_status, is_real = self.connector.get_market_status(symbol, with_fixer=False)
143
+ market_status = copy.deepcopy(market_status)
144
+ if is_real:
145
+ # only use adapter on real market status (not default simulator values)
146
+ market_status = self.connector.adapter.adapt_market_status(
147
+ market_status,
148
+ remove_price_limits=remove_price_limits
149
+ )
150
+ if adapt_for_contract_size and self.exchange_manager.is_future:
151
+ self._adapt_market_status_for_contract_size(market_status, self.get_contract_size(symbol))
152
+ if with_fixer:
153
+ return exchange_util.ExchangeMarketStatusFixer(market_status, price_example).market_status
154
+ return market_status
155
+
118
156
  async def load_pair_future_contract(self, pair: str):
119
157
  """
120
158
  Create a new FutureContract for the pair
@@ -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(
@@ -525,10 +525,10 @@ class Order(util.Initializable):
525
525
  continue
526
526
  can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
527
527
  if can_be_created and order.should_be_created():
528
- logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
528
+ logger.info(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
529
529
  await self._create_triggered_chained_order(order, enable_associated_orders_creation)
530
530
  else:
531
- logger.debug(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
531
+ logger.info(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
532
532
 
533
533
  async def _create_triggered_chained_order(self, order, enable_associated_orders_creation):
534
534
  logger = logging.get_logger(self.get_logger_name())
@@ -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
@@ -307,13 +307,13 @@ async def test_trigger_chained_orders(trader_simulator):
307
307
  # with chained orders
308
308
  order_mock_1 = mock.Mock(
309
309
  update_price_if_outdated=mock.AsyncMock(),
310
- update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
310
+ update_quantity_with_order_fees=mock.Mock(return_value=True),
311
311
  should_be_created=mock.Mock(return_value=True),
312
312
  is_cleared=mock.Mock(return_value=False)
313
313
  )
314
314
  order_mock_2 = mock.Mock(
315
315
  update_price_if_outdated=mock.AsyncMock(),
316
- update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
316
+ update_quantity_with_order_fees=mock.Mock(return_value=True),
317
317
  should_be_created=mock.Mock(return_value=False),
318
318
  is_cleared=mock.Mock(return_value=False)
319
319
  )
@@ -399,7 +399,7 @@ async def test_create_triggered_chained_order_mock(trader_simulator):
399
399
  base_order = personal_data.Order(trader_inst)
400
400
  eq_chained_order_1 = mock.Mock(get_name=mock.Mock(return_value="plop"))
401
401
  chained_order_1 = personal_data.Order(trader_inst)
402
- chained_order_1.create_triggered_equivalent_order=mock.AsyncMock(return_value=eq_chained_order_1)
402
+ chained_order_1.create_triggered_equivalent_order = mock.AsyncMock(return_value=eq_chained_order_1)
403
403
 
404
404
  # normal call
405
405
  with mock.patch.object(order_util, "create_as_chained_order", mock.AsyncMock()) as create_as_chained_order_mock:
@@ -443,7 +443,9 @@ async def test_create_triggered_chained_order_mock(trader_simulator):
443
443
  with mock.patch.object(
444
444
  order_util, "create_as_chained_order", mock.AsyncMock(side_effect=_create_as_chained_order)
445
445
  ) as create_as_chained_order_mock, mock.patch.object(
446
- chained_order_1, "create_on_filled_artificial_order", mock.AsyncMock()
446
+ chained_order_1, "create_on_filled_artificial_order", mock.AsyncMock(
447
+ return_value=mock.Mock(get_name=mock.Mock(return_value="plop"))
448
+ )
447
449
  ) as create_on_filled_artificial_order_mock:
448
450
  await base_order._create_triggered_chained_order(chained_order_1, True)
449
451
  create_as_chained_order_mock.assert_called_once_with(chained_order_1)
@@ -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):
@@ -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