OctoBot-Trading 2.4.128__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.128 → OctoBot-Trading-2.4.129}/CHANGELOG.md +7 -1
  2. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.128/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.129}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/README.md +1 -1
  5. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/__init__.py +10 -0
  7. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/contracts.py +17 -1
  8. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/positions.py +17 -0
  9. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/constants.py +4 -0
  10. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/enums.py +19 -0
  11. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/__init__.py +4 -0
  12. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/__init__.py +4 -0
  13. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/contract_factory.py +42 -0
  14. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/future_contract.py +16 -0
  15. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/contracts/margin_contract.py +10 -0
  16. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +23 -6
  17. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +24 -10
  18. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +38 -35
  19. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +5 -1
  20. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +4 -1
  21. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_websocket_factory.py +17 -11
  22. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/exchange_simulator.py +14 -8
  23. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/traders/trader.py +3 -1
  24. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/abstract_trading_mode.py +7 -0
  25. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/abstract_mode_consumer.py +3 -3
  26. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/abstract_mode_producer.py +6 -5
  27. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +13 -1
  28. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/__init__.py +12 -0
  29. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/exchange_personal_data.py +3 -3
  30. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/cancel_order_state.py +4 -1
  31. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/close_order_state.py +4 -1
  32. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/fill_order_state.py +5 -1
  33. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/__init__.py +10 -0
  34. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position.py +44 -10
  35. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position_factory.py +51 -1
  36. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position_util.py +21 -0
  37. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/positions_manager.py +49 -12
  38. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/types/inverse_position.py +9 -6
  39. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/types/linear_position.py +3 -2
  40. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/__init__.py +2 -0
  41. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trade_factory.py +13 -8
  42. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/exchange_data.py +10 -0
  43. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/exchanges_test_tools.py +22 -3
  44. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_amount.py +42 -4
  45. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/test_position.py +13 -0
  46. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/test_positions_manager.py +7 -7
  47. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/types/test_inverse_position.py +4 -6
  48. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/LICENSE +0 -0
  49. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/MANIFEST.in +0 -0
  50. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  51. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  52. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  53. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/requires.txt +0 -0
  54. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  55. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/channels.py +0 -0
  56. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/exchange.py +0 -0
  57. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/modes.py +0 -0
  58. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/orders.py +0 -0
  59. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/portfolio.py +0 -0
  60. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/profitability.py +0 -0
  61. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/storage.py +0 -0
  62. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/symbol_data.py +0 -0
  63. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/trader.py +0 -0
  64. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/api/trades.py +0 -0
  65. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/errors.py +0 -0
  66. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_channel.py +0 -0
  67. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  68. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  69. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  72. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  73. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  74. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  75. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  78. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  79. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  80. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  81. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  83. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  84. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  86. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  87. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  88. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  89. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  92. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  93. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  94. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  95. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  98. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  99. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  100. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  101. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  102. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  105. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  106. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  107. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  108. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  111. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  112. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  113. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/__init__.py +0 -0
  114. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  115. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  116. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  118. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/__init__.py +0 -0
  119. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  120. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  121. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  122. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  123. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  125. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  126. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  127. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  129. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  130. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  131. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_builder.py +0 -0
  132. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_channels.py +0 -0
  133. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_details.py +0 -0
  134. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_factory.py +0 -0
  135. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchange_manager.py +0 -0
  136. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/exchanges.py +0 -0
  137. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  139. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  140. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/traders/__init__.py +0 -0
  141. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  142. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/types/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  144. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  145. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  147. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  148. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  149. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  150. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/__init__.py +0 -0
  151. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/__init__.py +0 -0
  152. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/channel/mode.py +0 -0
  153. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/mode_activity.py +0 -0
  154. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/mode_config.py +0 -0
  155. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/modes_factory.py +0 -0
  156. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/modes_util.py +0 -0
  157. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  160. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  161. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  162. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  163. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  164. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  165. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  166. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  167. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  169. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  170. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  172. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/octobot_channel_consumer.py +0 -0
  173. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/__init__.py +0 -0
  174. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  175. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  176. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  177. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  178. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  179. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  181. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  182. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  183. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order.py +0 -0
  184. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  185. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  186. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_group.py +0 -0
  187. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_state.py +0 -0
  188. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/order_util.py +0 -0
  189. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  190. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  191. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  192. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  193. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  194. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  195. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  196. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  197. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  201. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  202. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  203. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  204. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  205. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  207. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  208. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  209. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  211. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  212. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  213. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  214. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  215. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  216. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  218. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  219. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  220. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  222. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  223. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  224. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  225. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  226. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  227. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  228. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  230. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  231. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  232. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  233. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  234. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  236. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  237. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  238. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  239. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  240. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  242. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  243. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  244. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/position_state.py +0 -0
  245. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  247. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  248. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  249. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  250. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/state.py +0 -0
  252. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  254. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  255. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trade.py +0 -0
  256. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  257. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  258. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  259. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  261. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  262. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  263. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  268. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  271. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  272. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/channel/signal_producer.py +0 -0
  273. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/signal_creation.py +0 -0
  274. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  275. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/signals/util.py +0 -0
  276. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/abstract_storage.py +0 -0
  278. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/candles_storage.py +0 -0
  279. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/orders_storage.py +0 -0
  280. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/portfolio_storage.py +0 -0
  281. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/storage_manager.py +0 -0
  282. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/trades_storage.py +0 -0
  283. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/transactions_storage.py +0 -0
  284. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/storage/util.py +0 -0
  285. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/supervisors/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  288. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/config_util.py +0 -0
  290. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/initializable.py +0 -0
  291. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/initialization_util.py +0 -0
  292. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/simulator_updater_utils.py +0 -0
  293. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/requirements.txt +0 -0
  297. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/setup.cfg +0 -0
  298. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/setup.py +0 -0
  299. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_channels.py +0 -0
  301. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_exchange.py +0 -0
  302. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_modes.py +0 -0
  303. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_orders.py +0 -0
  304. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_portfolio.py +0 -0
  305. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_profitability.py +0 -0
  306. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_symbol_data.py +0 -0
  307. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_trader.py +0 -0
  308. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/api/test_trades.py +0 -0
  309. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/cli/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/contracts/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  313. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  314. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/funding/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  316. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/kline/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  318. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/ohlcv/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  320. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  321. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/order_book/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  323. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/prices/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  325. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  326. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/recent_trades/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  328. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  329. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/ticker/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  331. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  335. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  336. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/implementations/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_abstract_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_builder.py +0 -0
  342. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_config_data.py +0 -0
  343. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_factory.py +0 -0
  344. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_manager.py +0 -0
  345. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchange_simulator.py +0 -0
  346. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/test_exchanges.py +0 -0
  347. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/traders/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/traders/test_trader.py +0 -0
  349. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/types/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/util/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  353. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/exchanges/util/test_exchange_util.py +0 -0
  354. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  358. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/test_abstract_mode_consumer.py +0 -0
  363. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/test_abstract_trading_mode.py +0 -0
  364. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/modes/test_modes_util.py +0 -0
  365. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/groups/__init__.py +0 -0
  368. {OctoBot-Trading-2.4.128 → 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.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  370. {OctoBot-Trading-2.4.128 → 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.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  378. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  380. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  382. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order.py +0 -0
  383. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order_adapter.py +0 -0
  384. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order_factory.py +0 -0
  385. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_order_util.py +0 -0
  386. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_orders_manager.py +0 -0
  387. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  388. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  395. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  396. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  397. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/market/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  399. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  400. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  401. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  403. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  404. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/__init__.py +0 -0
  405. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  407. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  408. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  409. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/history/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  411. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  412. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_asset.py +0 -0
  413. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  414. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  415. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  416. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  417. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  418. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  420. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  421. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  422. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/channel/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/states/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/test_position_factory.py +0 -0
  426. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/types/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  428. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_factory.py +0 -0
  430. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_manager.py +0 -0
  431. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  432. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/trades/test_trade_util.py +0 -0
  433. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/transactions/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  435. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  436. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/signals/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  438. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/signals/test_util.py +0 -0
  439. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/test_utils/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/test_utils/order_util.py +0 -0
  441. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/test_utils/random_numbers.py +0 -0
  442. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/util/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests/util/test_config_util.py +0 -0
  444. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  448. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  449. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_binance.py +0 -0
  450. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  451. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bingx.py +0 -0
  452. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  453. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitget.py +0 -0
  454. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  455. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  456. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  457. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitso.py +0 -0
  458. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  459. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bybit.py +0 -0
  460. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  461. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  462. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_coinex.py +0 -0
  463. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  464. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_gateio.py +0 -0
  465. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  466. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  467. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_htx.py +0 -0
  468. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_kraken.py +0 -0
  469. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  470. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  471. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_mexc.py +0 -0
  472. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_ndax.py +0 -0
  473. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  474. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_okx.py +0 -0
  475. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  476. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_phemex.py +0 -0
  477. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  478. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_upbit.py +0 -0
  479. {OctoBot-Trading-2.4.128 → OctoBot-Trading-2.4.129}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,8 +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.128] - 2023-12-03
7
+ ## [2.4.129] - 2023-12-03
8
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
9
15
  [OHLCVUpdater] prevent missing candles spam
10
16
 
11
17
  ## [2.4.127] - 2023-11-28
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.128
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.128](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.128
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.128](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.128](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.128" # 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
+ }
@@ -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:
@@ -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}"),
@@ -37,7 +37,7 @@ import octobot_trading.exchanges.util.exchange_util as exchange_util
37
37
  def create_client(
38
38
  exchange_class, exchange_manager, logger, options, headers,
39
39
  additional_config, should_authenticate, unauthenticated_exchange_fallback=None,
40
- keys_adapter=None
40
+ keys_adapter=None, allow_request_counter: bool = True
41
41
  ):
42
42
  """
43
43
  Exchange instance creation
@@ -71,7 +71,8 @@ def create_client(
71
71
  auth_token=auth_token, auth_token_header_prefix=auth_token_header_prefix
72
72
  ),
73
73
  exchange_manager.exchange_name,
74
- exchange_manager.proxy_config
74
+ exchange_manager.proxy_config,
75
+ allow_request_counter=allow_request_counter
75
76
  )
76
77
  is_authenticated = True
77
78
  if exchange_manager.check_credentials:
@@ -81,7 +82,8 @@ def create_client(
81
82
  exchange_class,
82
83
  _get_client_config(options, headers, additional_config),
83
84
  exchange_manager.exchange_name,
84
- exchange_manager.proxy_config
85
+ exchange_manager.proxy_config,
86
+ allow_request_counter=allow_request_counter
85
87
  )
86
88
  except (ccxt.AuthenticationError, Exception) as e:
87
89
  if unauthenticated_exchange_fallback is None:
@@ -131,11 +133,13 @@ def get_unauthenticated_exchange(
131
133
 
132
134
 
133
135
  def instantiate_exchange(
134
- exchange_class, config: dict, identifier: str, proxy_config: proxy_config_import.ProxyConfig
136
+ exchange_class, config: dict, identifier: str, proxy_config: proxy_config_import.ProxyConfig,
137
+ allow_request_counter: bool = True
135
138
  ) -> async_ccxt.Exchange:
136
139
  client = exchange_class(config)
137
140
  _use_proxy_if_necessary(client, proxy_config)
138
- _use_request_counter_if_enabled(identifier, client)
141
+ if constants.ENABLE_CCXT_REQUESTS_COUNTER and allow_request_counter:
142
+ _use_request_counter(identifier, client)
139
143
  return client
140
144
 
141
145
 
@@ -320,39 +324,38 @@ def _get_client_config(
320
324
  return config
321
325
 
322
326
 
323
- def _use_request_counter_if_enabled(identifier: str, ccxt_client: async_ccxt.Exchange):
327
+ def _use_request_counter(identifier: str, ccxt_client: async_ccxt.Exchange):
324
328
  """
325
329
  Replaces the given exchange async session by an aiohttp_util.CounterClientSession
326
- WARNING: should only be called right after creating the exchange (to avoid interrupting
327
- open requests from current session)
330
+ WARNING: should only be called right after creating the exchange and on the same async loop as
331
+ the one the exchange will be using (to avoid interrupting open requests from current session and loop errors)
328
332
  """
329
- if constants.ENABLE_CCXT_REQUESTS_COUNTER:
330
- # use session with request counter
331
- try:
332
- # 1. create ssl context and other required elements if necessary
333
- ccxt_client.open()
334
- previous_session = ccxt_client.session
335
- # 2. create patched session using the same params as a normal one
336
- # same as in ccxt.async_support.exchange.py#open()
337
- # connector = aiohttp.TCPConnector(ssl=self.ssl_context, loop=self.asyncio_loop, enable_cleanup_closed=True)
338
- new_connector = aiohttp.TCPConnector(
339
- ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop, enable_cleanup_closed=True
340
- )
341
- counter_session = aiohttp_util.CounterClientSession(
342
- identifier,
343
- loop=ccxt_client.asyncio_loop,
344
- connector=new_connector,
345
- trust_env=previous_session.trust_env,
346
- )
347
- # 3. replace session
348
- ccxt_client.session = counter_session
349
- # 4. close replaced session in task to avoid making this function a coroutine
350
- asyncio.create_task(previous_session.close())
351
- commons_logging.get_logger(__name__).info(f"Request counter enabled for {identifier}")
352
- except Exception as err:
353
- commons_logging.get_logger(__name__).exception(
354
- err, True, f"Error when initializing {identifier} request counter: {err}"
355
- )
333
+ # use session with request counter
334
+ try:
335
+ # 1. create ssl context and other required elements if necessary
336
+ ccxt_client.open()
337
+ previous_session = ccxt_client.session
338
+ # 2. create patched session using the same params as a normal one
339
+ # same as in ccxt.async_support.exchange.py#open()
340
+ # connector = aiohttp.TCPConnector(ssl=self.ssl_context, loop=self.asyncio_loop, enable_cleanup_closed=True)
341
+ new_connector = aiohttp.TCPConnector(
342
+ ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop, enable_cleanup_closed=True
343
+ )
344
+ counter_session = aiohttp_util.CounterClientSession(
345
+ identifier,
346
+ loop=ccxt_client.asyncio_loop,
347
+ connector=new_connector,
348
+ trust_env=previous_session.trust_env,
349
+ )
350
+ # 3. replace session
351
+ ccxt_client.session = counter_session
352
+ # 4. close replaced session in task to avoid making this function a coroutine
353
+ asyncio.create_task(previous_session.close())
354
+ commons_logging.get_logger(__name__).info(f"Request counter enabled for {identifier}")
355
+ except Exception as err:
356
+ commons_logging.get_logger(__name__).exception(
357
+ err, True, f"Error when initializing {identifier} request counter: {err}"
358
+ )
356
359
 
357
360
 
358
361
  def ccxt_exchange_class_factory(exchange_name):
@@ -157,7 +157,11 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
157
157
  except KeyError:
158
158
  load_markets = True
159
159
  if load_markets:
160
- self.logger.info(f"Loading {self.exchange_manager.exchange_name} exchange markets")
160
+ self.logger.info(
161
+ f"Loading {self.exchange_manager.exchange_name} "
162
+ f"{exchanges.get_exchange_type(self.exchange_manager).value}"
163
+ f"{' sandbox' if self.exchange_manager.is_sandboxed else ''} exchange markets"
164
+ )
161
165
  try:
162
166
  await self._load_markets(self.client, reload)
163
167
  ccxt_client_util.set_markets_cache(self.client)
@@ -257,7 +257,10 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
257
257
  self.client, self.is_authenticated = ccxt_client_util.create_client(
258
258
  client_class, self.exchange_manager, self.logger,
259
259
  self.options, self.headers, self.additional_config,
260
- self._should_authenticate()
260
+ self._should_authenticate(),
261
+ # Always disable request counter: ws exchange will be started in a different async loop,
262
+ # which is not yet supported
263
+ allow_request_counter=False
261
264
  )
262
265
  if self.exchange_manager.exchange.is_supporting_sandbox():
263
266
  ccxt_client_util.set_sandbox_mode(self, self.exchange_manager.is_sandboxed)
@@ -33,17 +33,23 @@ def is_channel_managed_by_websocket(exchange_manager, channel):
33
33
 
34
34
  def is_channel_fully_managed_by_websocket(exchange_manager, channel):
35
35
  return (
36
- not any([
37
- # no associated feed is related to a time frame
38
- exchange_manager.exchange_web_socket.is_time_frame_related_feed(feed)
39
- for feed in octobot_trading.constants.WEBSOCKET_FEEDS_TO_TRADING_CHANNELS[channel]
40
- ])
41
- or all([
42
- # all required time frames are supported
43
- exchange_manager.exchange_web_socket.is_time_frame_supported(time_frame)
44
- for time_frame in exchange_manager.exchange_config.available_time_frames
45
- ])
46
- ) and not exchange_manager.exchange_config.has_forced_updater(channel)
36
+ (
37
+ channel not in octobot_trading.constants.ALWAYS_STARTED_REST_PRODUCER_CHANNELS
38
+ ) and (
39
+ not any([
40
+ # no associated feed is related to a time frame
41
+ exchange_manager.exchange_web_socket.is_time_frame_related_feed(feed)
42
+ for feed in octobot_trading.constants.WEBSOCKET_FEEDS_TO_TRADING_CHANNELS[channel]
43
+ ])
44
+ or all([
45
+ # all required time frames are supported
46
+ exchange_manager.exchange_web_socket.is_time_frame_supported(time_frame)
47
+ for time_frame in exchange_manager.exchange_config.available_time_frames
48
+ ])
49
+ ) and (
50
+ not exchange_manager.exchange_config.has_forced_updater(channel)
51
+ )
52
+ )
47
53
 
48
54
 
49
55
  def is_websocket_feed_requiring_init(exchange_manager, channel):