OctoBot-Trading 2.4.111__tar.gz → 2.4.113__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 (477) hide show
  1. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/CHANGELOG.md +8 -0
  2. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.111/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.113}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/README.md +1 -1
  5. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/__init__.py +2 -0
  7. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/symbol_data.py +8 -1
  8. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/constants.py +1 -1
  9. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/errors.py +6 -0
  10. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +11 -7
  11. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +5 -2
  12. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/traders/trader.py +14 -6
  13. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/channel/orders.py +11 -7
  14. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/channel/orders_updater.py +3 -3
  15. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/order_state.py +35 -13
  16. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/cancel_order_state.py +10 -4
  17. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/fill_order_state.py +7 -2
  18. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +3 -1
  19. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +4 -0
  20. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/position_state.py +1 -0
  21. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/state.py +10 -1
  22. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/trades_manager.py +4 -0
  23. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/LICENSE +0 -0
  24. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/MANIFEST.in +0 -0
  25. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  26. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  27. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  28. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/OctoBot_Trading.egg-info/requires.txt +0 -0
  29. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  30. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/channels.py +0 -0
  31. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/contracts.py +0 -0
  32. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/exchange.py +0 -0
  33. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/modes.py +0 -0
  34. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/orders.py +0 -0
  35. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/portfolio.py +0 -0
  36. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/positions.py +0 -0
  37. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/profitability.py +0 -0
  38. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/storage.py +0 -0
  39. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/trader.py +0 -0
  40. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/api/trades.py +0 -0
  41. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/enums.py +0 -0
  42. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_channel.py +0 -0
  43. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/__init__.py +0 -0
  44. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  46. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  47. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  48. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  49. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  50. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  51. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  52. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  53. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  54. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  55. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  56. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  57. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  59. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  60. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  61. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  62. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  63. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  64. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  65. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  66. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  67. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  68. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  69. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  70. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  73. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  74. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  75. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  76. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  79. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  80. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  81. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  82. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  83. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  86. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  87. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  88. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  89. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  92. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  94. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  96. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  97. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  99. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/config/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  101. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  102. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  105. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  106. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  107. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  108. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  109. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  110. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  112. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  113. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  114. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchange_builder.py +0 -0
  115. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchange_channels.py +0 -0
  116. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchange_details.py +0 -0
  117. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchange_factory.py +0 -0
  118. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchange_manager.py +0 -0
  119. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  120. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/exchanges.py +0 -0
  121. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  123. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  124. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  125. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/traders/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  127. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/types/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  129. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  130. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/util/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  132. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  133. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  134. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  135. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  137. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/channel/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  139. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  140. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/channel/mode.py +0 -0
  141. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/mode_activity.py +0 -0
  142. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/mode_config.py +0 -0
  143. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/modes_factory.py +0 -0
  144. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/modes_util.py +0 -0
  145. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  148. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  149. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  150. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  151. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  152. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  153. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  154. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  155. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  156. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  158. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  159. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  161. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/octobot_channel_consumer.py +0 -0
  162. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  164. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  167. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  168. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  170. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  171. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  172. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/order.py +0 -0
  173. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  175. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/order_util.py +0 -0
  177. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  178. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  179. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  183. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  185. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  187. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  191. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  193. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  195. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  196. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  197. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  200. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  201. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  202. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  203. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  204. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  205. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  206. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  207. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  208. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  210. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  211. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  212. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  214. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  215. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  216. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  217. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  218. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  219. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  220. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  221. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  222. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  224. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  227. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/__init__.py +0 -0
  228. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  230. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  231. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  232. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/position.py +0 -0
  233. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  234. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/position_util.py +0 -0
  235. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  236. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  237. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  238. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  239. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  241. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  242. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  243. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  244. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/__init__.py +0 -0
  245. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  247. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  248. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/trade.py +0 -0
  249. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  250. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  251. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  252. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  254. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  255. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  256. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  258. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  259. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  260. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  261. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/__init__.py +0 -0
  262. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/channel/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  264. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  265. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/channel/signal_producer.py +0 -0
  266. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/signal_creation.py +0 -0
  267. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  268. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/signals/util.py +0 -0
  269. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/abstract_storage.py +0 -0
  271. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/candles_storage.py +0 -0
  272. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/orders_storage.py +0 -0
  273. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/portfolio_storage.py +0 -0
  274. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/storage_manager.py +0 -0
  275. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/trades_storage.py +0 -0
  276. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/transactions_storage.py +0 -0
  277. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/storage/util.py +0 -0
  278. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/supervisors/__init__.py +0 -0
  279. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  280. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  281. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/config_util.py +0 -0
  283. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/initializable.py +0 -0
  284. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/initialization_util.py +0 -0
  285. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/simulator_updater_utils.py +0 -0
  286. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/test_tools/__init__.py +0 -0
  287. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  288. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  289. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  290. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  291. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/requirements.txt +0 -0
  292. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/setup.cfg +0 -0
  293. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/setup.py +0 -0
  294. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/__init__.py +0 -0
  295. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_channels.py +0 -0
  296. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_exchange.py +0 -0
  297. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_modes.py +0 -0
  298. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_orders.py +0 -0
  299. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_portfolio.py +0 -0
  300. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_profitability.py +0 -0
  301. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_symbol_data.py +0 -0
  302. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_trader.py +0 -0
  303. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/api/test_trades.py +0 -0
  304. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/cli/__init__.py +0 -0
  305. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/__init__.py +0 -0
  306. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/contracts/__init__.py +0 -0
  307. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  308. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  309. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/funding/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  311. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/kline/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  313. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/ohlcv/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  315. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  316. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/order_book/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  318. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/prices/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  320. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  321. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/recent_trades/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  323. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  324. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/ticker/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  326. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/connectors/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  330. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  331. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/implementations/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  333. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  334. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_abstract_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  336. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_exchange_builder.py +0 -0
  337. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_exchange_config_data.py +0 -0
  338. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_exchange_factory.py +0 -0
  339. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_exchange_manager.py +0 -0
  340. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_exchange_simulator.py +0 -0
  341. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/test_exchanges.py +0 -0
  342. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/traders/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/traders/test_trader.py +0 -0
  344. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/types/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  346. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/util/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  348. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/exchanges/util/test_exchange_util.py +0 -0
  349. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  353. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  354. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  355. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  356. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  358. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/test_abstract_mode_consumer.py +0 -0
  359. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/test_abstract_trading_mode.py +0 -0
  360. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/modes/test_modes_util.py +0 -0
  361. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/groups/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  365. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  366. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  367. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  369. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  374. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  377. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  378. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_order.py +0 -0
  379. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_order_adapter.py +0 -0
  380. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_order_factory.py +0 -0
  381. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_order_util.py +0 -0
  382. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_orders_manager.py +0 -0
  383. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  384. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  387. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  391. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  393. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/market/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  395. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  397. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  399. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  400. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  403. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  404. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  405. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/history/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  407. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  408. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/test_asset.py +0 -0
  409. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  410. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  411. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  412. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  413. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  414. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/types/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/channel/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/states/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/test_position.py +0 -0
  422. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/test_position_factory.py +0 -0
  423. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/test_positions_manager.py +0 -0
  424. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/types/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  426. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  427. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/trades/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/trades/test_trade_factory.py +0 -0
  429. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/trades/test_trade_manager.py +0 -0
  430. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  431. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/trades/test_trade_util.py +0 -0
  432. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/transactions/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  434. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  435. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/signals/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  437. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/signals/test_util.py +0 -0
  438. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/test_utils/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/test_utils/order_util.py +0 -0
  440. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/test_utils/random_numbers.py +0 -0
  441. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/util/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests/util/test_config_util.py +0 -0
  443. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  448. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_binance.py +0 -0
  449. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  450. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bingx.py +0 -0
  451. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  452. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bitget.py +0 -0
  453. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  454. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  455. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bitso.py +0 -0
  456. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  457. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bybit.py +0 -0
  458. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  459. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  460. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_coinex.py +0 -0
  461. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  462. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_gateio.py +0 -0
  463. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  464. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  465. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_htx.py +0 -0
  466. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_kraken.py +0 -0
  467. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  468. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  469. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_mexc.py +0 -0
  470. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_ndax.py +0 -0
  471. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  472. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_okx.py +0 -0
  473. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  474. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_phemex.py +0 -0
  475. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  476. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_upbit.py +0 -0
  477. {OctoBot-Trading-2.4.111 → OctoBot-Trading-2.4.113}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,14 @@ 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.113] - 2024-10-02
8
+ ### Added
9
+ [Orders] improve canceled & filled order error recovery
10
+
11
+ ## [2.4.112] - 2024-09-18
12
+ ### Added
13
+ [API] compute_base_and_quote_volume
14
+
7
15
  ## [2.4.111] - 2024-09-16
8
16
  ### Updated
9
17
  [MarkPrice] trigger manual mark price update when missing
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.111
3
+ Version: 2.4.113
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.111](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.113](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.111
3
+ Version: 2.4.113
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.111](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.113](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.111](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.113](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.111" # major.minor.revision
18
+ VERSION = "2.4.113" # major.minor.revision
@@ -44,6 +44,7 @@ from octobot_trading.api.symbol_data import (
44
44
  get_symbol_volume_candles,
45
45
  get_daily_base_and_quote_volume,
46
46
  get_daily_base_and_quote_volume_from_ticker,
47
+ compute_base_and_quote_volume,
47
48
  get_symbol_time_candles,
48
49
  create_new_candles_manager,
49
50
  force_set_mark_price,
@@ -237,6 +238,7 @@ __all__ = [
237
238
  "get_symbol_volume_candles",
238
239
  "get_daily_base_and_quote_volume",
239
240
  "get_daily_base_and_quote_volume_from_ticker",
241
+ "compute_base_and_quote_volume",
240
242
  "get_symbol_time_candles",
241
243
  "create_new_candles_manager",
242
244
  "force_set_mark_price",
@@ -115,6 +115,13 @@ def get_daily_base_and_quote_volume_from_ticker(
115
115
  reference_price = reference_price or decimal.Decimal(str(
116
116
  ticker[octobot_trading.enums.ExchangeConstantsTickersColumns.CLOSE.value]
117
117
  ))
118
+ return compute_base_and_quote_volume(base_volume, quote_volume, reference_price)
119
+
120
+ def compute_base_and_quote_volume(
121
+ base_volume: decimal.Decimal,
122
+ quote_volume: decimal.Decimal,
123
+ reference_price: decimal.Decimal
124
+ ) -> (decimal.Decimal, decimal.Decimal):
118
125
  if base_volume:
119
126
  base_volume = decimal.Decimal(str(base_volume))
120
127
  if not quote_volume or decimal.Decimal(str(quote_volume)).is_nan():
@@ -125,7 +132,7 @@ def get_daily_base_and_quote_volume_from_ticker(
125
132
  if not base_volume or decimal.Decimal(str(base_volume)).is_nan():
126
133
  # compute from the other if missing
127
134
  base_volume = quote_volume / reference_price
128
- if not (base_volume and quote_volume):
135
+ if not (base_volume and quote_volume) or (base_volume.is_nan() or quote_volume.is_nan()):
129
136
  raise ValueError(
130
137
  f"Missing volume {base_volume=} {quote_volume=}"
131
138
  )
@@ -189,7 +189,7 @@ BALANCE_CHANNEL = "Balance"
189
189
  BALANCE_PROFITABILITY_CHANNEL = "BalanceProfitability"
190
190
  POSITIONS_CHANNEL = "Positions"
191
191
  INDIVIDUAL_ORDER_SYNC_TIMEOUT = 1 * commons_constants.MINUTE_TO_SECONDS
192
- MAX_TRADES_COUNT = int(os.getenv("MAX_TRADES_COUNT", "6000")) # larger values can use a large part of ram
192
+ MAX_TRADES_COUNT = int(os.getenv("MAX_TRADES_COUNT", "10000")) # larger values can use a large part of ram
193
193
 
194
194
  # History
195
195
  DEFAULT_SAVED_HISTORICAL_TIMEFRAMES = [commons_enums.TimeFrames.ONE_DAY]
@@ -51,6 +51,12 @@ class OrderCancelError(Exception):
51
51
  """
52
52
 
53
53
 
54
+ class OrderNotFoundOnCancelError(OrderCancelError):
55
+ """
56
+ Raised upon a failed order cancel because order is not found
57
+ """
58
+
59
+
54
60
  class UnexpectedExchangeSideOrderStateError(Exception):
55
61
  """
56
62
  Raised when an order is in an unexpected state when fetched from exchange
@@ -100,13 +100,17 @@ class TickerUpdater(ticker_channel.TickerProducer):
100
100
  def _is_valid(ticker):
101
101
  try:
102
102
  # at least require close, volume and timestamp
103
- return ticker and \
104
- all(ticker[field] is not None
105
- for field in (
106
- enums.ExchangeConstantsTickersColumns.CLOSE.value,
107
- enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value,
108
- enums.ExchangeConstantsTickersColumns.TIMESTAMP.value
109
- ))
103
+ return (
104
+ ticker and all(
105
+ ticker[field] is not None
106
+ for field in (
107
+ enums.ExchangeConstantsTickersColumns.CLOSE.value,
108
+ enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value,
109
+ enums.ExchangeConstantsTickersColumns.TIMESTAMP.value
110
+ )
111
+ )
112
+ )
113
+
110
114
  except KeyError:
111
115
  return False
112
116
 
@@ -654,8 +654,11 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
654
654
  # get a cancelled order).
655
655
  return enums.OrderStatus.CANCELED
656
656
  except ccxt.OrderNotFound as e:
657
- self.logger.debug(f"Trying to cancel order with id {exchange_order_id} but order was not found")
658
- raise octobot_trading.errors.OrderCancelError(e) from e
657
+ self.logger.debug(
658
+ f"Trying to cancel order with id {exchange_order_id} but order was not found. It might have "
659
+ f"already been cancelled or be filled."
660
+ )
661
+ raise octobot_trading.errors.OrderNotFoundOnCancelError(e) from e
659
662
  except (ccxt.NotSupported, octobot_trading.errors.NotSupported) as e:
660
663
  raise octobot_trading.errors.NotSupported(e) from e
661
664
  except Exception as e:
@@ -369,8 +369,9 @@ class Trader(util.Initializable):
369
369
  wait_for_cancelling, cancelling_timeout)
370
370
  return False
371
371
 
372
- async def _handle_order_cancellation(self, order, ignored_order,
373
- wait_for_cancelling: bool, cancelling_timeout: float) -> bool:
372
+ async def _handle_order_cancellation(
373
+ self, order, ignored_order, wait_for_cancelling: bool, cancelling_timeout: float
374
+ ) -> bool:
374
375
  success = True
375
376
  if order.is_waiting_for_chained_trigger:
376
377
  # order will just never get created
@@ -386,17 +387,19 @@ class Trader(util.Initializable):
386
387
  )
387
388
  except errors.NotSupported:
388
389
  raise
389
- except (errors.OrderCancelError, Exception) as err:
390
+ except (errors.OrderCancelError, Exception) as inner_err:
390
391
  # retry to cancel order
391
- self.logger.debug(f"Failed to cancel order ({err} {err.__class__.__name__}), retrying")
392
+ self.logger.info(
393
+ f"Failed to cancel order ({inner_err} {inner_err.__class__.__name__}), retrying"
394
+ )
392
395
  order_status = await self.exchange_manager.exchange.cancel_order(
393
396
  order.exchange_order_id, order.symbol, order.order_type
394
397
  )
395
398
  except errors.OrderCancelError as err:
396
399
  if await self._handle_order_cancel_error(order, err, wait_for_cancelling, cancelling_timeout):
397
400
  return True
398
- except Exception as e:
399
- self.logger.exception(e, True, f"Failed to cancel order {order}")
401
+ except Exception as err:
402
+ self.logger.exception(err, True, f"Failed to cancel order {order}")
400
403
  return False
401
404
  if order_status is enums.OrderStatus.CANCELED:
402
405
  order.status = octobot_trading.enums.OrderStatus.CANCELED
@@ -446,6 +449,11 @@ class Trader(util.Initializable):
446
449
  await self._wait_for_order_cancel(order, cancelling_timeout)
447
450
  return True
448
451
  elif order.is_open():
452
+ if isinstance(err, errors.OrderNotFoundOnCancelError):
453
+ raise errors.OrderNotFoundOnCancelError(
454
+ f"Tried to cancel an order that can't be found, it might be cancelled or filled already ({err}). "
455
+ f"Order: {order}"
456
+ ) from err
449
457
  raise errors.OpenOrderError(
450
458
  f"Order is open, but can't be cancelled. This is unexpected. Order: {order}"
451
459
  ) from err
@@ -29,7 +29,7 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
29
29
 
30
30
  async def perform(self, orders, is_from_bot=False, are_closed=False):
31
31
  try:
32
- self.logger.debug(f"Received order update for {len(orders)} {'closed' if are_closed else ''}orders.")
32
+ self.logger.debug(f"Received order update for {len(orders)} {'closed' if are_closed else ''} orders.")
33
33
  has_new_order = False
34
34
  waiting_complete_init_orders = []
35
35
  symbols = set()
@@ -245,8 +245,10 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
245
245
  )
246
246
  )
247
247
  if missing_exchange_order_ids:
248
- self.logger.debug(f"{len(missing_exchange_order_ids)} open orders are missing on exchange, "
249
- f"synchronizing with exchange (exchange ids: {missing_exchange_order_ids})...")
248
+ self.logger.info(
249
+ f"{len(missing_exchange_order_ids)} open orders are missing on exchange, "
250
+ f"synchronizing with exchange (exchange ids: {missing_exchange_order_ids})..."
251
+ )
250
252
  synchronize_tasks = []
251
253
  for missing_order_id in missing_exchange_order_ids:
252
254
  try:
@@ -254,11 +256,13 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
254
256
  get_order(None, exchange_order_id=missing_order_id)
255
257
  if order_to_update.state is not None:
256
258
  # catch exception not to prevent multiple synchronize to be cancelled in asyncio.gather
257
- synchronize_tasks.append(order_to_update.state.synchronize(force_synchronization=True,
258
- catch_exception=True))
259
+ synchronize_tasks.append(
260
+ order_to_update.state.synchronize(force_synchronization=True, catch_exception=True)
261
+ )
259
262
  except KeyError:
260
- self.logger.error(f"Order with id {missing_order_id} could not be synchronized: "
261
- f"missing from order manager")
263
+ self.logger.error(
264
+ f"Order with id {missing_order_id} could not be synchronized: missing from order manager"
265
+ )
262
266
  await asyncio.gather(*synchronize_tasks)
263
267
 
264
268
  async def send(
@@ -194,17 +194,17 @@ class OrdersUpdater(orders_channel.OrdersProducer):
194
194
  :return: True if the order was updated
195
195
  """
196
196
  exchange_name = self.channel.exchange_manager.exchange_name
197
- self.logger.debug(f"Requested update for {order} on {exchange_name}")
197
+ self.logger.info(f"Requested update for {order} on {exchange_name}")
198
198
  raw_order = await self.channel.exchange_manager.exchange.get_order(order.exchange_order_id, order.symbol)
199
199
 
200
200
  if raw_order is not None:
201
- self.logger.debug(f"Received update for {order} on {exchange_name}: {raw_order}")
201
+ self.logger.info(f"Received update for {order} on {exchange_name}: {raw_order}")
202
202
 
203
203
  await self.channel.exchange_manager.exchange_personal_data.handle_order_update_from_raw(
204
204
  order.exchange_order_id, raw_order, should_notify=should_notify
205
205
  )
206
206
  else:
207
- self.logger.debug(f"Can't received update for {order} on {exchange_name}: received order is None")
207
+ self.logger.info(f"Can't received update for {order} on {exchange_name}: received order is None")
208
208
 
209
209
  async def stop(self) -> None:
210
210
  """
@@ -13,6 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
+ import asyncio
16
17
 
17
18
  import octobot_commons.logging as logging
18
19
 
@@ -24,6 +25,8 @@ import octobot_trading.personal_data.state as state_class
24
25
 
25
26
 
26
27
  class OrderState(state_class.State):
28
+ MAX_SYNCHRONIZATION_ATTEMPTS = -1 # implement self._force_final_state() when this is enabled
29
+
27
30
  def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
28
31
  super().__init__(is_from_exchange_data)
29
32
 
@@ -59,6 +62,12 @@ class OrderState(state_class.State):
59
62
  """
60
63
  return False
61
64
 
65
+ def is_max_synchronization_attempts_reached(self) -> bool:
66
+ """
67
+ :return: True if the MAX_SYNCHRONIZATION_ATTEMPTS is set and has been reached
68
+ """
69
+ return -1 < self.__class__.MAX_SYNCHRONIZATION_ATTEMPTS <= self.synchronization_attempts
70
+
62
71
  def get_logger(self):
63
72
  """
64
73
  :return: the order logger
@@ -98,27 +107,40 @@ class OrderState(state_class.State):
98
107
  self.order = new_order
99
108
  self.order.state = self
100
109
 
110
+ def _force_final_state(self):
111
+ raise NotImplementedError("_force_final_state is not implemented")
112
+
101
113
  async def _synchronize_with_exchange(self, force_synchronization: bool = False) -> None:
102
114
  """
103
115
  Ask OrdersChannel Internal producer to refresh the order from the exchange
104
116
  :param force_synchronization: When True, for the update of the order from the exchange
105
117
  :return: the result of OrdersProducer.update_order_from_exchange()
106
118
  """
107
- try:
108
- self.ensure_not_cleared(self.order)
119
+ if self.is_max_synchronization_attempts_reached():
109
120
  self.get_logger().info(
110
- f"Synchronizing order {self.order} with {self.order.exchange_manager.exchange_name} exchange"
111
- )
112
- await exchange_channel.get_chan(
113
- octobot_trading.constants.ORDERS_CHANNEL,
114
- self.order.exchange_manager.id
115
- ).get_internal_producer().update_order_from_exchange(
116
- order=self.order,
117
- wait_for_refresh=True,
118
- force_job_execution=force_synchronization,
121
+ f"Forcing {self.__class__.__name__} final state after {self.MAX_SYNCHRONIZATION_ATTEMPTS} "
122
+ f"synchronization attempts for order {self.order}"
119
123
  )
120
- except octobot_trading.errors.InvalidOrderState:
121
- self.get_logger().debug(f"Skipping exchange synchronisation as order has already been closed.")
124
+ self._force_final_state()
125
+ asyncio.create_task(self.on_refresh_successful())
126
+ else:
127
+ try:
128
+ self.ensure_not_cleared(self.order)
129
+ self.get_logger().info(
130
+ f"Synchronizing [{self._underlying_refreshed_state.value}] order {self.order} "
131
+ f"with {self.order.exchange_manager.exchange_name} exchange"
132
+ )
133
+ self.synchronization_attempts += 1
134
+ await exchange_channel.get_chan(
135
+ octobot_trading.constants.ORDERS_CHANNEL,
136
+ self.order.exchange_manager.id
137
+ ).get_internal_producer().update_order_from_exchange(
138
+ order=self.order,
139
+ wait_for_refresh=True,
140
+ force_job_execution=force_synchronization,
141
+ )
142
+ except octobot_trading.errors.InvalidOrderState:
143
+ self.get_logger().debug(f"Skipping exchange synchronisation as order has already been closed.")
122
144
 
123
145
  async def wait_for_next_state(self, timeout) -> None:
124
146
  # terminate is called at the end of the state for most order states
@@ -22,6 +22,8 @@ import octobot_trading.personal_data.orders.states.order_state_factory as order_
22
22
 
23
23
 
24
24
  class CancelOrderState(order_state.OrderState):
25
+ MAX_SYNCHRONIZATION_ATTEMPTS = 5
26
+
25
27
  def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
26
28
  super().__init__(
27
29
  order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
@@ -32,8 +34,7 @@ class CancelOrderState(order_state.OrderState):
32
34
 
33
35
  async def initialize_impl(self, forced=False, ignored_order=None) -> None:
34
36
  if forced:
35
- self.state = enums.OrderStates.CANCELED
36
- self.order.status = enums.OrderStatus.CANCELED
37
+ self._force_final_state()
37
38
 
38
39
  if self.order.order_group and self.enable_associated_orders_creation:
39
40
  await self.order.order_group.on_cancel(self.order, ignored_orders=[ignored_order])
@@ -52,6 +53,10 @@ class CancelOrderState(order_state.OrderState):
52
53
  def is_status_cancelled(self) -> bool:
53
54
  return not self.is_status_pending() and self.order.status in constants.CANCEL_ORDER_STATUS_SCOPE
54
55
 
56
+ def _force_final_state(self):
57
+ self.state = enums.OrderStates.CANCELED
58
+ self.order.status = enums.OrderStatus.CANCELED
59
+
55
60
  def allows_new_status(self, status) -> bool:
56
61
  """
57
62
  Don't allow going from canceling to open
@@ -68,8 +73,9 @@ class CancelOrderState(order_state.OrderState):
68
73
  if not self.has_already_been_synchronized_once:
69
74
  # If we want to sync this state, it means the order is being canceled by the exchange but is not
70
75
  # fully canceled yet. Giving some time to the exchange before re-requesting it.
71
- self.get_logger().debug(f"{self.__class__.__name__} still pending, "
72
- f"synchronizing in {self.PENDING_REFRESH_INTERVAL}s")
76
+ self.get_logger().info(
77
+ f"{self.__class__.__name__} still pending, synchronizing in {self.PENDING_REFRESH_INTERVAL}s"
78
+ )
73
79
  await asyncio.sleep(self.PENDING_REFRESH_INTERVAL)
74
80
  await super()._synchronize_with_exchange(force_synchronization=force_synchronization)
75
81
 
@@ -21,6 +21,8 @@ import octobot_trading.personal_data.orders.states.order_state_factory as order_
21
21
 
22
22
 
23
23
  class FillOrderState(order_state.OrderState):
24
+ MAX_SYNCHRONIZATION_ATTEMPTS = 5
25
+
24
26
  def __init__(self, order, is_from_exchange_data, enable_associated_orders_creation=True):
25
27
  super().__init__(
26
28
  order, is_from_exchange_data, enable_associated_orders_creation=enable_associated_orders_creation
@@ -34,10 +36,13 @@ class FillOrderState(order_state.OrderState):
34
36
 
35
37
  async def initialize_impl(self, forced=False) -> None:
36
38
  if forced:
37
- self.state = enums.OrderStates.FILLED
38
- self.order.status = enums.OrderStatus.FILLED
39
+ self._force_final_state()
39
40
  return await super().initialize_impl()
40
41
 
42
+ def _force_final_state(self):
43
+ self.state = enums.OrderStates.FILLED
44
+ self.order.status = enums.OrderStatus.FILLED
45
+
41
46
  def is_pending(self) -> bool:
42
47
  return self.state is enums.OrderStates.FILLING
43
48
 
@@ -47,11 +47,13 @@ class PendingCreationOrderState(order_state.OrderState):
47
47
  # open orders refresh.
48
48
  self.ensure_not_cleared(self.order)
49
49
  self.get_logger().info(
50
- f"Synchronizing order {self.order} with {self.order.exchange_manager.exchange_name} exchange"
50
+ f"Synchronizing [{self._underlying_refreshed_state.value}] order {self.order} "
51
+ f"with {self.order.exchange_manager.exchange_name} exchange"
51
52
  )
52
53
  while self.order.is_pending_creation() \
53
54
  and time.time() - t0 < octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT:
54
55
  iteration += 1
56
+ self.synchronization_attempts += 1
55
57
  await exchange_channel.get_chan(
56
58
  octobot_trading.constants.ORDERS_CHANNEL,
57
59
  self.order.exchange_manager.id
@@ -192,6 +192,10 @@ class HistoricalPortfolioValueManager(util.Initializable):
192
192
 
193
193
  def _add_historical_portfolio_value(self, timestamp, value_by_currency):
194
194
  if len(self.historical_portfolio_value) >= self.max_history_size:
195
+ self.logger.info(
196
+ f"Clearing oldest historical portfolio value as the maximum historical values ({self.max_history_size}) "
197
+ f"has been reached"
198
+ )
195
199
  # remove the oldest element
196
200
  self.historical_portfolio_value.popitem(0)
197
201
  self.historical_portfolio_value[timestamp] = \
@@ -61,6 +61,7 @@ class PositionState(state_class.State):
61
61
  :param force_synchronization: When True, for the update of the position from the exchange
62
62
  :return: the result of PositionsProducer.update_position_from_exchange()
63
63
  """
64
+ self.synchronization_attempts += 1
64
65
  return self.position.exchange_manager.exchange_personal_data.positions_manager.\
65
66
  refresh_real_trader_position(self.position, force_job_execution=force_synchronization)
66
67
 
@@ -29,7 +29,10 @@ class State(util.Initializable):
29
29
  super().__init__()
30
30
 
31
31
  # default state
32
- self.state = enums.States.UNKNOWN
32
+ self.state: enums.States = enums.States.UNKNOWN
33
+
34
+ # state when refreshing, is only indicative and can be outdated du to avoid concurrency issues
35
+ self._underlying_refreshed_state: enums.States = enums.States.UNKNOWN
33
36
 
34
37
  # if this state has been created from exchange data or OctoBot internal mechanism
35
38
  self.is_from_exchange_data = is_from_exchange_data
@@ -43,6 +46,9 @@ class State(util.Initializable):
43
46
  # set at True after synchronize has been called
44
47
  self.has_already_been_synchronized_once = False
45
48
 
49
+ # how many times this state has been synchronized
50
+ self.synchronization_attempts = 0
51
+
46
52
  def is_pending(self) -> bool:
47
53
  """
48
54
  :return: True if the state is pending for update
@@ -179,6 +185,8 @@ class State(util.Initializable):
179
185
  async def refresh_operation(self):
180
186
  self.get_logger().debug("Starting refresh_operation")
181
187
  previous_state = self.state
188
+ # don't rely on self._underlying_refreshed_state only to avoid concurrency issues (use local variable instead)
189
+ self._underlying_refreshed_state = previous_state
182
190
  async with self.lock:
183
191
  self.state = enums.States.REFRESHING
184
192
  try:
@@ -187,6 +195,7 @@ class State(util.Initializable):
187
195
  async with self.lock:
188
196
  if self.state is enums.States.REFRESHING:
189
197
  self.state = previous_state
198
+ self._underlying_refreshed_state = enums.States.UNKNOWN
190
199
  self.get_logger().debug("Completed refresh_operation")
191
200
 
192
201
  async def _synchronize_with_exchange(self, force_synchronization: bool = False) -> None:
@@ -184,6 +184,10 @@ class TradesManager(util.Initializable):
184
184
  self.logger.exception(err, True, f"Error when loading local trade history {err}")
185
185
 
186
186
  def _remove_oldest_trades(self, nb_to_remove):
187
+ self.logger.info(
188
+ f"Clearing the {nb_to_remove} oldest historical trades as the maximum count of trades ("
189
+ f"{self.MAX_TRADES_COUNT}) has been reached"
190
+ )
187
191
  for _ in range(nb_to_remove):
188
192
  self.trades.popitem(last=False)
189
193