OctoBot-Trading 2.4.127__tar.gz → 2.4.129__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.127 → OctoBot-Trading-2.4.129}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.127/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.129}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/README.md +1 -1
  5. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/__init__.py +10 -0
  7. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/contracts.py +17 -1
  8. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/positions.py +17 -0
  9. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/constants.py +4 -0
  10. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/enums.py +19 -0
  11. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/__init__.py +4 -0
  12. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/__init__.py +4 -0
  13. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/contract_factory.py +42 -0
  14. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/future_contract.py +16 -0
  15. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/margin_contract.py +10 -0
  16. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/kline_updater.py +1 -1
  17. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +67 -22
  18. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +7 -3
  19. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +24 -7
  20. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +24 -10
  21. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +38 -35
  22. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +9 -2
  23. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +4 -1
  24. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_websocket_factory.py +17 -11
  25. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/exchange_simulator.py +14 -8
  26. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/traders/trader.py +3 -1
  27. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/abstract_trading_mode.py +7 -0
  28. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/abstract_mode_consumer.py +3 -3
  29. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/abstract_mode_producer.py +6 -5
  30. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +13 -1
  31. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/__init__.py +14 -0
  32. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/exchange_personal_data.py +3 -3
  33. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/__init__.py +2 -0
  34. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_util.py +4 -0
  35. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/cancel_order_state.py +4 -1
  36. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/close_order_state.py +4 -1
  37. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/fill_order_state.py +5 -1
  38. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/__init__.py +10 -0
  39. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position.py +44 -10
  40. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position_factory.py +51 -1
  41. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position_util.py +21 -0
  42. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/positions_manager.py +49 -12
  43. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/types/inverse_position.py +9 -6
  44. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/types/linear_position.py +3 -2
  45. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/__init__.py +2 -0
  46. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trade_factory.py +13 -8
  47. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/exchange_data.py +10 -0
  48. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/exchanges_test_tools.py +22 -3
  49. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_amount.py +42 -4
  50. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/test_position.py +13 -0
  51. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/test_positions_manager.py +7 -7
  52. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/types/test_inverse_position.py +4 -6
  53. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/LICENSE +0 -0
  54. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/MANIFEST.in +0 -0
  55. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  56. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  57. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  58. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/requires.txt +0 -0
  59. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  60. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/channels.py +0 -0
  61. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/exchange.py +0 -0
  62. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/modes.py +0 -0
  63. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/orders.py +0 -0
  64. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/portfolio.py +0 -0
  65. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/profitability.py +0 -0
  66. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/storage.py +0 -0
  67. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/symbol_data.py +0 -0
  68. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/trader.py +0 -0
  69. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/api/trades.py +0 -0
  70. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/errors.py +0 -0
  71. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_channel.py +0 -0
  72. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  73. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  74. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  77. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  78. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  79. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  80. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  83. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  84. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  85. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  87. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  88. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  90. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  92. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  95. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  96. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  97. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  98. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  101. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  102. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  103. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  104. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  105. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  107. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  108. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  109. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  110. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  113. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  114. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  115. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  117. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  118. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  119. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  120. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  122. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  123. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  124. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  127. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  128. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  129. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  131. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  132. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  133. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_builder.py +0 -0
  134. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_channels.py +0 -0
  135. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_details.py +0 -0
  136. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_factory.py +0 -0
  137. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_manager.py +0 -0
  138. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchanges.py +0 -0
  139. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  140. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  141. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  142. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/traders/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  144. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/types/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  146. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  147. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  149. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  150. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  151. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  152. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/__init__.py +0 -0
  154. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/mode.py +0 -0
  155. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/mode_activity.py +0 -0
  156. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/mode_config.py +0 -0
  157. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/modes_factory.py +0 -0
  158. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/modes_util.py +0 -0
  159. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  162. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  163. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  164. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  165. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  166. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  167. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  168. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  169. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  171. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  172. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  173. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  174. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/octobot_channel_consumer.py +0 -0
  175. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  176. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  177. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  178. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  179. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  180. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  182. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  183. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  184. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order.py +0 -0
  185. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  186. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  187. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_group.py +0 -0
  188. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_state.py +0 -0
  189. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  190. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  191. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  192. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  193. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  194. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  195. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  196. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  197. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  201. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  202. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  203. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  204. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  205. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  207. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  208. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  209. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  211. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  212. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  213. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  214. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  215. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  216. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  218. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  219. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  220. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  222. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  223. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  224. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  225. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  226. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  227. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  228. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  230. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  231. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  232. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  233. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  234. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  236. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  237. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  238. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  239. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  240. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  242. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  243. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  244. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position_state.py +0 -0
  245. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  247. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  248. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  249. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  250. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/state.py +0 -0
  252. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  254. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  255. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trade.py +0 -0
  256. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  257. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  258. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  259. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  261. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  262. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  263. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  268. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  271. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  272. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/signal_producer.py +0 -0
  273. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/signal_creation.py +0 -0
  274. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  275. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/signals/util.py +0 -0
  276. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/abstract_storage.py +0 -0
  278. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/candles_storage.py +0 -0
  279. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/orders_storage.py +0 -0
  280. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/portfolio_storage.py +0 -0
  281. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/storage_manager.py +0 -0
  282. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/trades_storage.py +0 -0
  283. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/transactions_storage.py +0 -0
  284. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/storage/util.py +0 -0
  285. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/supervisors/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  288. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/config_util.py +0 -0
  290. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/initializable.py +0 -0
  291. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/initialization_util.py +0 -0
  292. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/simulator_updater_utils.py +0 -0
  293. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/requirements.txt +0 -0
  297. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/setup.cfg +0 -0
  298. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/setup.py +0 -0
  299. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_channels.py +0 -0
  301. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_exchange.py +0 -0
  302. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_modes.py +0 -0
  303. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_orders.py +0 -0
  304. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_portfolio.py +0 -0
  305. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_profitability.py +0 -0
  306. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_symbol_data.py +0 -0
  307. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_trader.py +0 -0
  308. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/api/test_trades.py +0 -0
  309. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/cli/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/contracts/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  313. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  314. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/funding/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  316. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/kline/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  318. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/ohlcv/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  320. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  321. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/order_book/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  323. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/prices/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  325. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  326. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/recent_trades/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  328. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  329. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/ticker/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  331. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  335. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  336. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/implementations/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_abstract_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_builder.py +0 -0
  342. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_config_data.py +0 -0
  343. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_factory.py +0 -0
  344. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_manager.py +0 -0
  345. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_simulator.py +0 -0
  346. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchanges.py +0 -0
  347. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/traders/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/traders/test_trader.py +0 -0
  349. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/types/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/util/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  353. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/exchanges/util/test_exchange_util.py +0 -0
  354. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  358. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/test_abstract_mode_consumer.py +0 -0
  363. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/test_abstract_trading_mode.py +0 -0
  364. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/modes/test_modes_util.py +0 -0
  365. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/groups/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  369. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  370. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  371. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  378. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  382. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order.py +0 -0
  383. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order_adapter.py +0 -0
  384. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order_factory.py +0 -0
  385. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order_util.py +0 -0
  386. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_orders_manager.py +0 -0
  387. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  388. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  395. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  396. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  397. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/market/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  399. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  400. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  401. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  403. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  404. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/__init__.py +0 -0
  405. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  407. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  408. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  409. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/history/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  411. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  412. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_asset.py +0 -0
  413. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  414. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  415. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  416. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  417. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  418. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  421. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  422. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/channel/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/states/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/test_position_factory.py +0 -0
  426. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/types/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  428. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_factory.py +0 -0
  430. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_manager.py +0 -0
  431. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  432. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_util.py +0 -0
  433. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/transactions/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  435. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  436. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/signals/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  438. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.127 → OctoBot-Trading-2.4.129}/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.129] - 2023-12-03
8
+ ### Updated
9
+ [Futures] fix simulation numbers and update api
10
+ ### Fixed
11
+ [Exchanges] fix cancelled order status error
12
+
13
+ ## [2.4.128] - 2023-`12-03
14
+ ###` Updated
15
+ [OHLCVUpdater] prevent missing candles spam
16
+
7
17
  ## [2.4.127] - 2023-11-28
8
18
  ### Updated
9
19
  [MarketStatus] fix min cost overriding
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.127
3
+ Version: 2.4.129
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.127](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.129](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.127
3
+ Version: 2.4.129
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.127](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.129](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.127](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.129](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.127" # major.minor.revision
18
+ VERSION = "2.4.129" # major.minor.revision
@@ -201,12 +201,17 @@ from octobot_trading.api.orders import (
201
201
  from octobot_trading.api.positions import (
202
202
  get_positions,
203
203
  close_position,
204
+ set_is_exclusively_using_exchange_position_details,
205
+ update_position_mark_price,
204
206
  )
205
207
  from octobot_trading.api.contracts import (
206
208
  is_inverse_future_contract,
207
209
  is_perpetual_future_contract,
208
210
  get_pair_contracts,
209
211
  is_handled_contract,
212
+ has_pair_future_contract,
213
+ load_pair_contract,
214
+ create_default_future_contract,
210
215
  )
211
216
  from octobot_trading.api.storage import (
212
217
  clear_trades_storage_history,
@@ -380,6 +385,11 @@ __all__ = [
380
385
  "is_perpetual_future_contract",
381
386
  "get_pair_contracts",
382
387
  "is_handled_contract",
388
+ "has_pair_future_contract",
389
+ "load_pair_contract",
390
+ "create_default_future_contract",
391
+ "set_is_exclusively_using_exchange_position_details",
392
+ "update_position_mark_price",
383
393
  "clear_trades_storage_history",
384
394
  "clear_candles_storage_history",
385
395
  "clear_database_storage_history",
@@ -13,8 +13,10 @@
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 octobot_trading.exchange_data as exchange_data
16
+ import decimal
17
17
 
18
+ import octobot_trading.enums as enums
19
+ import octobot_trading.exchange_data as exchange_data
18
20
 
19
21
  def is_inverse_future_contract(contract_type):
20
22
  return exchange_data.FutureContract(None, None, contract_type).is_inverse_contract()
@@ -30,3 +32,17 @@ def get_pair_contracts(exchange_manager) -> dict:
30
32
 
31
33
  def is_handled_contract(contract) -> bool:
32
34
  return contract.is_handled_contract()
35
+
36
+
37
+ def has_pair_future_contract(exchange_manager, pair: str) -> bool:
38
+ return exchange_manager.exchange.has_pair_future_contract(pair)
39
+
40
+
41
+ def load_pair_contract(exchange_manager, contract_dict: dict):
42
+ exchange_data.update_future_contract_from_dict(exchange_manager, contract_dict)
43
+
44
+
45
+ def create_default_future_contract(
46
+ pair: str, leverage: decimal.Decimal, contract_type: enums.FutureContractType
47
+ ) -> exchange_data.FutureContract:
48
+ return exchange_data.create_default_future_contract(pair, leverage, contract_type)
@@ -34,3 +34,20 @@ async def close_position(exchange_manager, symbol: str, side: enums.PositionSide
34
34
  emit_trading_signals=emit_trading_signals
35
35
  ) else 0
36
36
  return 0
37
+
38
+
39
+ def set_is_exclusively_using_exchange_position_details(
40
+ exchange_manager, is_exclusively_using_exchange_position_details: bool
41
+ ):
42
+ exchange_manager.exchange_personal_data.positions_manager.is_exclusively_using_exchange_position_details = (
43
+ is_exclusively_using_exchange_position_details
44
+ )
45
+
46
+
47
+ async def update_position_mark_price(
48
+ exchange_manager, symbol: str, side: enums.PositionSide, mark_price: decimal.Decimal
49
+ ):
50
+ for position in exchange_manager.exchange_personal_data.positions_manager.get_symbol_positions(symbol):
51
+ if position.side is side:
52
+ await position.update(mark_price=mark_price)
53
+ return position
@@ -224,6 +224,10 @@ WEBSOCKET_FEEDS_TO_TRADING_CHANNELS = {
224
224
  FUNDING_CHANNEL: [enums.WebsocketFeeds.FUNDING]
225
225
  }
226
226
 
227
+ ALWAYS_STARTED_REST_PRODUCER_CHANNELS = [
228
+ TICKER_CHANNEL, # use to force mark price update when necessary: should always be reachable
229
+ ]
230
+
227
231
  FILL_ORDER_STATUS_SCOPE = [enums.OrderStatus.CLOSED,
228
232
  enums.OrderStatus.FILLED,
229
233
  enums.OrderStatus.PARTIALLY_FILLED]
@@ -342,6 +342,7 @@ class TradeExtraConstants(enum.Enum):
342
342
 
343
343
  class ExchangeConstantsPositionColumns(enum.Enum):
344
344
  ID = "id"
345
+ LOCAL_ID = "local_id"
345
346
  TIMESTAMP = "timestamp"
346
347
  SYMBOL = "symbol"
347
348
  ENTRY_PRICE = "entry_price"
@@ -355,6 +356,7 @@ class ExchangeConstantsPositionColumns(enum.Enum):
355
356
  SIZE = "size"
356
357
  NOTIONAL = "notional"
357
358
  INITIAL_MARGIN = "initial_margin"
359
+ AUTO_DEPOSIT_MARGIN = "auto_deposit_margin"
358
360
  COLLATERAL = "collateral"
359
361
  LEVERAGE = "leverage"
360
362
  MARGIN_TYPE = "margin_type"
@@ -366,6 +368,23 @@ class ExchangeConstantsPositionColumns(enum.Enum):
366
368
  SIDE = "side"
367
369
 
368
370
 
371
+ class ExchangeConstantsMarginContractColumns(enum.Enum):
372
+ PAIR = "pair"
373
+ MARGIN_TYPE = "margin_type"
374
+ CONTRACT_SIZE = "contract_size"
375
+ MAXIMUM_LEVERAGE = "maximum_leverage"
376
+ CURRENT_LEVERAGE = "current_leverage"
377
+ RISK_LIMIT = "risk_limit"
378
+
379
+
380
+ class ExchangeConstantsFutureContractColumns(enum.Enum):
381
+ CONTRACT_TYPE = "contract_type"
382
+ MINIMUM_TICK_SIZE = "minimum_tick_size"
383
+ POSITION_MODE = "position_mode"
384
+ MAINTENANCE_MARGIN_RATE = "maintenance_margin_rate"
385
+ TAKE_PROFIT_STOP_LOSS_MODE = "take_profit_stop_loss_mode"
386
+
387
+
369
388
  class ExchangeConstantsLiquidationColumns(enum.Enum):
370
389
  ID = "id"
371
390
  TIMESTAMP = "timestamp"
@@ -91,6 +91,8 @@ from octobot_trading.exchange_data.contracts import (
91
91
  MarginContract,
92
92
  FutureContract,
93
93
  update_contracts_from_positions,
94
+ update_future_contract_from_dict,
95
+ create_default_future_contract,
94
96
  )
95
97
  from octobot_trading.exchange_data import exchange_symbol_data
96
98
  from octobot_trading.exchange_data.exchange_symbol_data import (
@@ -193,6 +195,8 @@ __all__ = [
193
195
  "MarginContract",
194
196
  "FutureContract",
195
197
  "update_contracts_from_positions",
198
+ "update_future_contract_from_dict",
199
+ "create_default_future_contract",
196
200
  "ExchangeSymbolsData",
197
201
  "ExchangeSymbolData",
198
202
  "UNAUTHENTICATED_UPDATER_PRODUCERS",
@@ -27,10 +27,14 @@ from octobot_trading.exchange_data.contracts.future_contract import (
27
27
  from octobot_trading.exchange_data.contracts import contract_factory
28
28
  from octobot_trading.exchange_data.contracts.contract_factory import (
29
29
  update_contracts_from_positions,
30
+ update_future_contract_from_dict,
31
+ create_default_future_contract,
30
32
  )
31
33
 
32
34
  __all__ = [
33
35
  "MarginContract",
34
36
  "FutureContract",
35
37
  "update_contracts_from_positions",
38
+ "update_future_contract_from_dict",
39
+ "create_default_future_contract",
36
40
  ]
@@ -13,10 +13,13 @@
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 decimal
17
+
16
18
  import octobot_commons.logging as logging
17
19
 
18
20
  import octobot_trading.enums as enums
19
21
  import octobot_trading.constants as constants
22
+ import octobot_trading.exchange_data.contracts.future_contract as future_contract
20
23
 
21
24
 
22
25
  def update_contracts_from_positions(exchange_manager, positions) -> bool:
@@ -51,5 +54,44 @@ def update_contracts_from_positions(exchange_manager, positions) -> bool:
51
54
  return updated
52
55
 
53
56
 
57
+ def update_future_contract_from_dict(exchange_manager, contract: dict) -> bool:
58
+ return exchange_manager.exchange.create_pair_contract(
59
+ pair=contract[enums.ExchangeConstantsMarginContractColumns.PAIR.value],
60
+ current_leverage=decimal.Decimal(str(
61
+ contract[enums.ExchangeConstantsMarginContractColumns.CURRENT_LEVERAGE.value]
62
+ )),
63
+ contract_size=decimal.Decimal(str(
64
+ contract[enums.ExchangeConstantsMarginContractColumns.CONTRACT_SIZE.value]
65
+ )),
66
+ margin_type=enums.MarginType(contract[enums.ExchangeConstantsMarginContractColumns.MARGIN_TYPE.value]),
67
+ contract_type=enums.FutureContractType(contract[enums.ExchangeConstantsFutureContractColumns.CONTRACT_TYPE.value]),
68
+ position_mode=enums.PositionMode(contract[enums.ExchangeConstantsFutureContractColumns.POSITION_MODE.value])
69
+ if contract[enums.ExchangeConstantsFutureContractColumns.POSITION_MODE.value]
70
+ else contract[enums.ExchangeConstantsFutureContractColumns.POSITION_MODE.value],
71
+ maintenance_margin_rate=decimal.Decimal(str(
72
+ contract[enums.ExchangeConstantsFutureContractColumns.MAINTENANCE_MARGIN_RATE.value]
73
+ )),
74
+ maximum_leverage=None if contract[enums.ExchangeConstantsMarginContractColumns.MAXIMUM_LEVERAGE.value] is None
75
+ else decimal.Decimal(str(
76
+ contract[enums.ExchangeConstantsMarginContractColumns.MAXIMUM_LEVERAGE.value]
77
+ ))
78
+ )
79
+
80
+
81
+ def create_default_future_contract(
82
+ pair: str, leverage: decimal.Decimal, contract_type: enums.FutureContractType
83
+ ) -> future_contract.FutureContract:
84
+ return future_contract.FutureContract(
85
+ pair=pair,
86
+ contract_size=constants.DEFAULT_SYMBOL_CONTRACT_SIZE,
87
+ margin_type=constants.DEFAULT_SYMBOL_MARGIN_TYPE,
88
+ contract_type=contract_type,
89
+ maximum_leverage=constants.DEFAULT_SYMBOL_MAX_LEVERAGE,
90
+ current_leverage=leverage,
91
+ position_mode=constants.DEFAULT_SYMBOL_POSITION_MODE,
92
+ maintenance_margin_rate=constants.DEFAULT_SYMBOL_MAINTENANCE_MARGIN_RATE
93
+ )
94
+
95
+
54
96
  def _get_logger():
55
97
  return logging.get_logger("contract_factory")
@@ -111,3 +111,19 @@ class FutureContract(margin_contract.MarginContract):
111
111
  logging.get_logger(str(self)).debug(f"Changed position mode to {pos_mode}")
112
112
  changed = True
113
113
  return changed
114
+
115
+ def to_dict(self):
116
+ return {
117
+ **super().to_dict(),
118
+ **{
119
+ enums.ExchangeConstantsFutureContractColumns.CONTRACT_TYPE.value:
120
+ self.contract_type.value if self.contract_type else self.contract_type,
121
+ enums.ExchangeConstantsFutureContractColumns.MINIMUM_TICK_SIZE.value: self.minimum_tick_size,
122
+ enums.ExchangeConstantsFutureContractColumns.POSITION_MODE.value:
123
+ self.position_mode.value if self.position_mode else self.position_mode,
124
+ enums.ExchangeConstantsFutureContractColumns.MAINTENANCE_MARGIN_RATE.value:
125
+ self.maintenance_margin_rate,
126
+ enums.ExchangeConstantsFutureContractColumns.TAKE_PROFIT_STOP_LOSS_MODE.value:
127
+ self.take_profit_stop_loss_mode,
128
+ }
129
+ }
@@ -82,3 +82,13 @@ class MarginContract:
82
82
  logging.get_logger(str(self)).debug(f"Changed margin type to {margin_type}")
83
83
  changed = True
84
84
  return changed
85
+
86
+ def to_dict(self):
87
+ return {
88
+ enums.ExchangeConstantsMarginContractColumns.PAIR.value: self.pair,
89
+ enums.ExchangeConstantsMarginContractColumns.MARGIN_TYPE.value: self.margin_type.value,
90
+ enums.ExchangeConstantsMarginContractColumns.CONTRACT_SIZE.value: self.contract_size,
91
+ enums.ExchangeConstantsMarginContractColumns.MAXIMUM_LEVERAGE.value: self.maximum_leverage,
92
+ enums.ExchangeConstantsMarginContractColumns.CURRENT_LEVERAGE.value: self.current_leverage,
93
+ enums.ExchangeConstantsMarginContractColumns.RISK_LIMIT.value: self.risk_limit,
94
+ }
@@ -78,7 +78,7 @@ class KlineUpdater(kline_channel.KlineProducer):
78
78
  except errors.FailedRequest as e:
79
79
  self.logger.warning(str(e))
80
80
  # avoid spamming on disconnected situation
81
- await asyncio.sleep(constants.DEFAULT_FAILED_REQUEST_RETRY_TIME)
81
+ await asyncio.sleep(constants.FAILED_NETWORK_REQUEST_RETRY_ATTEMPTS)
82
82
  except errors.NotSupported:
83
83
  self.logger.warning(f"{self.channel.exchange_manager.exchange_name} is not supporting updates")
84
84
  await self.pause()
@@ -35,7 +35,14 @@ class OHLCVUpdater(ohlcv_channel.OHLCVProducer):
35
35
  OHLCV_OLD_LIMIT = constants.DEFAULT_CANDLE_HISTORY_SIZE # should be <= to candle manager's MAX_CANDLES_COUNT
36
36
  OHLCV_ON_ERROR_TIME = 5
37
37
  OHLCV_MIN_REFRESH_TIME = 1
38
- OHLCV_REFRESH_TIME_THRESHOLD = 1.5 # to prevent spamming at candle closing
38
+ OHLCV_REFRESH_TIME_THRESHOLD_BY_RETRY_ATTEMPT = [
39
+ 2, # retry 1: t+2
40
+ 5, # retry 2: t+7
41
+ 8 , # retry 3: t+15
42
+ 15, # retry 4: t+30
43
+ 15, # retry 5: t+45
44
+ 60 # retry N: every 60s
45
+ ] # to prevent spamming when missing closed candles
39
46
  OHLCV_MISSING_DATA_REFRESH_RETRY_MAX_DELAY = 30 * common_constants.MINUTE_TO_SECONDS
40
47
 
41
48
  OHLCV_INITIALIZATION_TIMEOUT = 60
@@ -206,11 +213,18 @@ class OHLCVUpdater(ohlcv_channel.OHLCVProducer):
206
213
  time_frame_seconds: int = common_enums.TimeFramesMinutes[time_frame] * common_constants.MINUTE_TO_SECONDS
207
214
  time_frame_sleep: int = time_frame_seconds
208
215
  last_candle_timestamp: float = 0
209
- missing_data_sleep_time = min(int(time_frame_seconds / 6), self.OHLCV_MISSING_DATA_REFRESH_RETRY_MAX_DELAY)
210
216
 
217
+ current_candle_start_time = 0
218
+ attempt = 1
211
219
  while not self.should_stop and not self.channel.is_paused:
220
+ start_update_time = time.time()
221
+ iteration_candle_start_time = start_update_time - (start_update_time % time_frame_seconds)
212
222
  try:
213
- start_update_time = time.time()
223
+ if iteration_candle_start_time == current_candle_start_time:
224
+ attempt += 1 # not working?
225
+ else:
226
+ current_candle_start_time = iteration_candle_start_time
227
+ attempt = 1
214
228
  await self._ensure_candles_initialization(pair)
215
229
  # skip uninitialized candles
216
230
  if self.initialized_candles_by_tf_by_symbol[pair][time_frame]:
@@ -225,21 +239,37 @@ class OHLCVUpdater(ohlcv_channel.OHLCVProducer):
225
239
 
226
240
  if last_candle and len(candles) > 1:
227
241
  last_candle_timestamp, sleep_time = await self._refresh_current_candle(
228
- time_frame, pair, candles, last_candle, last_candle_timestamp, time_frame_sleep
242
+ time_frame, pair, candles, last_candle, last_candle_timestamp,
243
+ iteration_candle_start_time, time_frame_seconds, attempt
244
+ )
245
+ updated_sleep_time = self._ensure_correct_sleep_time(
246
+ sleep_time, iteration_candle_start_time, time_frame_seconds
229
247
  )
230
- await asyncio.sleep(self._ensure_correct_sleep_time(sleep_time, time_frame_sleep))
248
+ await asyncio.sleep(updated_sleep_time)
231
249
  else:
232
250
  # not enough candles: retry soon
251
+ sleep_time = self._ensure_correct_sleep_time(
252
+ self._get_missing_candle_retry_sleep_time(attempt),
253
+ iteration_candle_start_time, time_frame_seconds
254
+ )
233
255
  self.logger.debug(f"Missing candles in request results for {pair} on {time_frame}, refreshing "
234
- f"in {missing_data_sleep_time} seconds (available candles: {candles}).")
235
- await asyncio.sleep(missing_data_sleep_time)
256
+ f"in {sleep_time} seconds (available candles: {candles}).")
257
+ await asyncio.sleep(sleep_time)
236
258
  else:
237
259
  # candles on this time frame have not been initialized: sleep until the next candle update
238
260
  await asyncio.sleep(max(0.0, time_frame_sleep - (time.time() - start_update_time)))
239
- except errors.FailedRequest as e:
240
- self.logger.warning(str(e))
261
+ except errors.FailedRequest as err:
241
262
  # avoid spamming on disconnected situation
242
- await asyncio.sleep(constants.DEFAULT_FAILED_REQUEST_RETRY_TIME)
263
+ sleep_time = self._ensure_correct_sleep_time(
264
+ self._get_missing_candle_retry_sleep_time(attempt),
265
+ iteration_candle_start_time, time_frame_seconds
266
+ )
267
+ sleep_time = max(sleep_time, constants.DEFAULT_FAILED_REQUEST_RETRY_TIME)
268
+ self.logger.warning(
269
+ f"Impossible to fetch {time_frame.value} {pair} candles. Retry in {sleep_time} seconds: "
270
+ f"{html_util.get_html_summary_if_relevant(err)}"
271
+ )
272
+ await asyncio.sleep(sleep_time)
243
273
  except errors.NotSupported:
244
274
  self.logger.warning(
245
275
  f"{self.channel.exchange_manager.exchange_name} is not supporting updates")
@@ -253,36 +283,51 @@ class OHLCVUpdater(ohlcv_channel.OHLCVProducer):
253
283
  )
254
284
  await asyncio.sleep(self.OHLCV_ON_ERROR_TIME)
255
285
 
256
- async def _refresh_current_candle(self, time_frame, pair, candles, last_candle,
257
- last_candle_timestamp, time_frame_sleep):
286
+ async def _refresh_current_candle(
287
+ self, time_frame, pair, candles, last_candle, last_candle_timestamp,
288
+ iteration_candle_start_time, time_frame_seconds, attempt
289
+ ):
258
290
  current_candle_timestamp: float = last_candle[common_enums.PriceIndexes.IND_PRICE_TIME.value]
259
- should_sleep_time: float = current_candle_timestamp + time_frame_sleep - time.time()
291
+ should_sleep_time: float = current_candle_timestamp + time_frame_seconds - time.time()
260
292
 
261
293
  # if we're trying to refresh the current candle => useless
262
294
  if last_candle_timestamp == current_candle_timestamp:
263
295
  if should_sleep_time < 0:
264
- # up to date candle is not yet available on exchange: retry in a few seconds
296
+ # up-to-date candle is not yet available on exchange: retry in a few seconds
265
297
  should_sleep_time = self._ensure_correct_sleep_time(
266
- self.OHLCV_REFRESH_TIME_THRESHOLD,
267
- time_frame_sleep
298
+ self._get_missing_candle_retry_sleep_time(attempt),
299
+ iteration_candle_start_time,
300
+ time_frame_seconds
268
301
  )
269
302
  else:
270
303
  should_sleep_time = self._ensure_correct_sleep_time(
271
- should_sleep_time + time_frame_sleep + self.OHLCV_REFRESH_TIME_THRESHOLD,
272
- time_frame_sleep
304
+ should_sleep_time + time_frame_seconds + self._get_missing_candle_retry_sleep_time(attempt),
305
+ iteration_candle_start_time,
306
+ time_frame_seconds
273
307
  )
308
+ self.logger.debug(
309
+ f"Failed to fetch up-to-date candle for {pair} on {time_frame.value}. "
310
+ f"Retrying in {round(should_sleep_time, 2)} seconds"
311
+ )
312
+
274
313
  else:
275
314
  # A fresh candle happened
276
315
  last_candle_timestamp = current_candle_timestamp
277
316
  await self._push_complete_candles(time_frame, pair, candles)
278
317
  return last_candle_timestamp, should_sleep_time
279
318
 
280
- def _ensure_correct_sleep_time(self, sleep_time_candidate, time_frame_sleep):
319
+ def _get_missing_candle_retry_sleep_time(self, attempt):
320
+ if attempt < len(self.OHLCV_REFRESH_TIME_THRESHOLD_BY_RETRY_ATTEMPT):
321
+ return self.OHLCV_REFRESH_TIME_THRESHOLD_BY_RETRY_ATTEMPT[attempt - 1]
322
+ return self.OHLCV_REFRESH_TIME_THRESHOLD_BY_RETRY_ATTEMPT[-1]
323
+
324
+ def _ensure_correct_sleep_time(self, sleep_time_candidate, iteration_candle_start_time, time_frame_seconds):
281
325
  if sleep_time_candidate < OHLCVUpdater.OHLCV_MIN_REFRESH_TIME:
282
326
  return OHLCVUpdater.OHLCV_MIN_REFRESH_TIME
283
- elif sleep_time_candidate > time_frame_sleep:
284
- return time_frame_sleep
285
- return sleep_time_candidate
327
+ else:
328
+ max_sleep_time = max(iteration_candle_start_time + time_frame_seconds - time.time(), 0)
329
+ # ensure does not sleep more than missing time before next candle
330
+ return min(sleep_time_candidate, max_sleep_time)
286
331
 
287
332
  def _set_initialized(self, pair, time_frame, initialized):
288
333
  if pair not in self.initialized_candles_by_tf_by_symbol:
@@ -74,10 +74,14 @@ class RecentTradeUpdater(recent_trade_channel.RecentTradeProducer):
74
74
  except TypeError:
75
75
  pass
76
76
  await asyncio.sleep(self.refresh_time)
77
- except errors.FailedRequest as e:
78
- self.logger.warning(str(e))
77
+ except errors.FailedRequest as err:
78
+ sleep_time = constants.FAILED_NETWORK_REQUEST_RETRY_ATTEMPTS
79
+ self.logger.warning(
80
+ f"Impossible to fetch recent trades. Retry in {sleep_time} seconds: "
81
+ f"{html_util.get_html_summary_if_relevant(err)}"
82
+ )
79
83
  # avoid spamming on disconnected situation
80
- await asyncio.sleep(constants.DEFAULT_FAILED_REQUEST_RETRY_TIME)
84
+ await asyncio.sleep(sleep_time)
81
85
  except errors.NotSupported:
82
86
  self.logger.warning(f"{self.channel.exchange_manager.exchange_name} is not supporting updates")
83
87
  await self.pause()
@@ -23,6 +23,7 @@ import octobot_trading.errors as errors
23
23
  import octobot_trading.constants as constants
24
24
  import octobot_trading.exchange_data.ticker.channel.ticker as ticker_channel
25
25
  import octobot_trading.enums as enums
26
+ import octobot_trading.exchanges.exchange_websocket_factory as exchange_websocket_factory
26
27
 
27
28
 
28
29
  class TickerUpdater(ticker_channel.TickerProducer):
@@ -39,17 +40,24 @@ class TickerUpdater(ticker_channel.TickerProducer):
39
40
  self.updating_pairs = set()
40
41
 
41
42
  async def start(self):
42
- if self._should_use_future():
43
+ use_futures = self._should_use_future()
44
+ if use_futures:
43
45
  self.is_fetching_future_data = True
44
46
  self.refresh_time = self.TICKER_FUTURE_REFRESH_TIME
45
47
  if self.channel.is_paused:
46
48
  await self.pause()
47
49
  else:
48
- # initialize ticker
49
- await asyncio.gather(*[self._fetch_ticker(pair)
50
- for pair in self._get_pairs_to_update()])
51
- await asyncio.sleep(self.refresh_time)
52
- await self.start_update_loop()
50
+ if use_futures or self._should_loop():
51
+ # initialize ticker
52
+ await asyncio.gather(*[self._fetch_ticker(pair)
53
+ for pair in self._get_pairs_to_update()])
54
+ await asyncio.sleep(self.refresh_time)
55
+ await self.start_update_loop()
56
+ else:
57
+ self.logger.debug(
58
+ f"Ticker update loop disabled: update is managed by websocket. "
59
+ f"Updater remains available for forced updates."
60
+ )
53
61
 
54
62
  async def start_update_loop(self):
55
63
  while not self.should_stop and not self.channel.is_paused:
@@ -74,7 +82,7 @@ class TickerUpdater(ticker_channel.TickerProducer):
74
82
  except errors.FailedRequest as e:
75
83
  self.logger.warning(html_util.get_html_summary_if_relevant(e))
76
84
  # avoid spamming on disconnected situation
77
- await asyncio.sleep(constants.DEFAULT_FAILED_REQUEST_RETRY_TIME)
85
+ await asyncio.sleep(constants.FAILED_NETWORK_REQUEST_RETRY_ATTEMPTS)
78
86
 
79
87
  async def fetch_and_push_pair(self, pair: str):
80
88
  with self._single_pair_update(pair) as can_update:
@@ -88,6 +96,7 @@ class TickerUpdater(ticker_channel.TickerProducer):
88
96
  self.logger.debug(f"Skipping {pair} ticker update request: an update is already processing")
89
97
 
90
98
  async def trigger_ticker_update(self, symbol: str):
99
+ self.logger.debug(f"Triggered ticker update for {symbol}")
91
100
  await self.fetch_and_push_pair(symbol)
92
101
 
93
102
  @contextlib.contextmanager
@@ -124,6 +133,14 @@ class TickerUpdater(ticker_channel.TickerProducer):
124
133
  return self.channel.exchange_manager.exchange_config.traded_symbol_pairs + self._added_pairs
125
134
 
126
135
 
136
+ def _should_loop(self):
137
+ """
138
+ Loop when websocket ticker channel not available
139
+ """
140
+ return not exchange_websocket_factory.is_channel_managed_by_websocket(
141
+ self.channel.exchange_manager, constants.TICKER_CHANNEL
142
+ )
143
+
127
144
  """
128
145
  Future data management
129
146
  """
@@ -273,21 +273,36 @@ class CCXTAdapter(adapters.AbstractAdapter):
273
273
  # CCXT standard position parsing logic
274
274
  # if mode is enums.PositionMode.ONE_WAY:
275
275
  original_side = fixed.get(ccxt_enums.ExchangePositionCCXTColumns.SIDE.value)
276
- position_side = enums.PositionSide.BOTH
277
- # todo when handling cross positions
278
- # side = fixed.get(ccxt_enums.ExchangePositionCCXTColumns.SIDE.value, enums.PositionSide.UNKNOWN.value)
279
- # position_side = enums.PositionSide.LONG \
280
- # if side == enums.PositionSide.LONG.value else enums.PositionSide.
281
276
  symbol = fixed.get(ccxt_enums.ExchangePositionCCXTColumns.SYMBOL.value)
282
277
  contract_size = decimal.Decimal(str(fixed.get(ccxt_enums.ExchangePositionCCXTColumns.CONTRACT_SIZE.value, 0)))
283
278
  contracts = constants.ZERO if force_empty \
284
279
  else decimal.Decimal(str(fixed.get(ccxt_enums.ExchangePositionCCXTColumns.CONTRACTS.value, 0)))
285
280
  is_empty = contracts == constants.ZERO
281
+ position_mode = (
282
+ enums.PositionMode.HEDGE if fixed.get(ccxt_enums.ExchangePositionCCXTColumns.HEDGED.value, False)
283
+ else enums.PositionMode.ONE_WAY
284
+ )
285
+ if position_mode is enums.PositionMode.HEDGE:
286
+ # todo when handling hedge positions
287
+ side = fixed.get(ccxt_enums.ExchangePositionCCXTColumns.SIDE.value, enums.PositionSide.UNKNOWN.value)
288
+ position_side = enums.PositionSide.LONG \
289
+ if side == enums.PositionSide.LONG.value else enums.PositionSide.SHORT
290
+ log_func = self.logger.debug
291
+ if is_empty:
292
+ log_func = self.logger.error
293
+ log_func(f"Unhandled {symbol} position mode ({position_mode.value}). This position can't be traded.")
294
+ else:
295
+ # One way position use BOTH side as there is always only one position per symbol.
296
+ # This position can turn long and short
297
+ position_side = enums.PositionSide.BOTH
286
298
  liquidation_price = fixed.get(ccxt_enums.ExchangePositionCCXTColumns.LIQUIDATION_PRICE.value, 0)
287
- if margin_type := fixed.get(ccxt_enums.ExchangePositionCCXTColumns.MARGIN_TYPE.value, None):
299
+ if margin_type := fixed.get(
300
+ ccxt_enums.ExchangePositionCCXTColumns.MARGIN_TYPE.value,
301
+ fixed.get(ccxt_enums.ExchangePositionCCXTColumns.MARGIN_MODE.value, None) # can also be contained in margin mode
302
+ ):
288
303
  margin_type = enums.MarginType(margin_type)
289
304
  if force_empty or liquidation_price is None:
290
- liquidation_price = constants.NaN
305
+ liquidation_price = constants.ZERO
291
306
  else:
292
307
  liquidation_price = decimal.Decimal(str(liquidation_price))
293
308
  try:
@@ -306,9 +321,7 @@ class CCXTAdapter(adapters.AbstractAdapter):
306
321
  enums.ExchangeConstantsPositionColumns.LEVERAGE.value:
307
322
  self.safe_decimal(fixed, ccxt_enums.ExchangePositionCCXTColumns.LEVERAGE.value,
308
323
  constants.DEFAULT_SYMBOL_LEVERAGE),
309
- enums.ExchangeConstantsPositionColumns.POSITION_MODE.value: None if is_empty else
310
- enums.PositionMode.HEDGE if fixed.get(ccxt_enums.ExchangePositionCCXTColumns.HEDGED.value, True)
311
- else enums.PositionMode.ONE_WAY,
324
+ enums.ExchangeConstantsPositionColumns.POSITION_MODE.value: position_mode,
312
325
  # next values are always 0 when the position empty (0 contracts)
313
326
  enums.ExchangeConstantsPositionColumns.COLLATERAL.value: constants.ZERO if is_empty else
314
327
  decimal.Decimal(
@@ -319,6 +332,7 @@ class CCXTAdapter(adapters.AbstractAdapter):
319
332
  enums.ExchangeConstantsPositionColumns.INITIAL_MARGIN.value: constants.ZERO if is_empty else
320
333
  decimal.Decimal(
321
334
  f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.INITIAL_MARGIN.value, 0) or 0}"),
335
+ enums.ExchangeConstantsPositionColumns.AUTO_DEPOSIT_MARGIN.value: False, # default value
322
336
  enums.ExchangeConstantsPositionColumns.UNREALIZED_PNL.value: constants.ZERO if is_empty else
323
337
  decimal.Decimal(
324
338
  f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.UNREALISED_PNL.value, 0) or 0}"),