OctoBot-Trading 2.4.170__tar.gz → 2.4.171__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 (495) hide show
  1. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/CHANGELOG.md +7 -1
  2. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/OctoBot_Trading.egg-info/SOURCES.txt +2 -0
  4. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/OctoBot_Trading.egg-info/requires.txt +1 -1
  5. {OctoBot-Trading-2.4.170/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.171}/PKG-INFO +2 -2
  6. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/README.md +1 -1
  7. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/__init__.py +1 -1
  8. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/constants.py +3 -2
  9. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +12 -11
  10. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ticker/ticker_manager.py +1 -0
  11. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/__init__.py +2 -0
  12. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -4
  13. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/config/__init__.py +5 -0
  14. OctoBot-Trading-2.4.171/octobot_trading/exchanges/config/exchange_credentials_data.py +39 -0
  15. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +41 -30
  16. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +8 -5
  17. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchange_manager.py +12 -11
  18. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/types/rest_exchange.py +1 -1
  19. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/requirements.txt +1 -1
  20. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/ticker/test_ticker_manager.py +1 -0
  21. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/util/test_exchange_util.py +1 -1
  22. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/real_exchange_tester.py +6 -2
  23. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_ascendex.py +7 -6
  24. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_binance.py +1 -1
  25. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bingx.py +3 -3
  26. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bitfinex.py +3 -3
  27. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bitget.py +2 -2
  28. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_coinbase.py +1 -1
  29. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_gateio.py +1 -1
  30. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_hitbtc.py +1 -1
  31. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_hollaex.py +4 -3
  32. OctoBot-Trading-2.4.171/tests_additional/real_exchanges/test_hyperliquid.py +219 -0
  33. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_kraken.py +2 -2
  34. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_kucoin_futures.py +8 -6
  35. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_ndax.py +7 -10
  36. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_upbit.py +1 -1
  37. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_wavesexchange.py +14 -9
  38. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/LICENSE +0 -0
  39. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/MANIFEST.in +0 -0
  40. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  41. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  42. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  43. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/__init__.py +0 -0
  44. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/channels.py +0 -0
  45. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/contracts.py +0 -0
  46. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/exchange.py +0 -0
  47. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/modes.py +0 -0
  48. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/orders.py +0 -0
  49. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/portfolio.py +0 -0
  50. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/positions.py +0 -0
  51. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/profitability.py +0 -0
  52. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/storage.py +0 -0
  53. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/symbol_data.py +0 -0
  54. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/trader.py +0 -0
  55. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/api/trades.py +0 -0
  56. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/enums.py +0 -0
  57. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/errors.py +0 -0
  58. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_channel.py +0 -0
  59. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  61. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  62. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  63. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  64. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  65. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  66. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  69. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  70. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  71. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  72. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  75. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  76. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  77. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  78. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  80. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  81. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  83. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  84. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  86. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  89. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  90. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  92. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  95. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  96. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  97. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  98. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  99. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  102. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  103. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  104. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  105. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  107. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  108. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  109. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  110. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  112. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  113. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  114. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  115. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  118. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  119. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  120. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  121. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  122. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  123. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  124. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  125. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  126. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchange_builder.py +0 -0
  127. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchange_channels.py +0 -0
  128. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchange_details.py +0 -0
  129. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchange_factory.py +0 -0
  130. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  131. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/exchanges.py +0 -0
  132. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  133. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  134. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  135. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  136. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/traders/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/traders/trader.py +0 -0
  138. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  139. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/types/__init__.py +0 -0
  140. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  141. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/util/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  143. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  144. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  145. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  146. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  148. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/channel/__init__.py +0 -0
  149. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  150. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  151. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/channel/mode.py +0 -0
  152. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/mode_activity.py +0 -0
  153. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/mode_config.py +0 -0
  154. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/modes_factory.py +0 -0
  155. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/modes_util.py +0 -0
  156. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  159. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  160. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  161. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  162. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  163. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  164. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  165. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  166. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  167. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  169. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  170. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  172. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/octobot_channel_consumer.py +0 -0
  173. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/__init__.py +0 -0
  174. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  175. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/__init__.py +0 -0
  176. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  178. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  179. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  180. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  181. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  182. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  183. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  184. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  185. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
  186. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/order.py +0 -0
  187. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  188. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  189. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/order_group.py +0 -0
  190. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/order_state.py +0 -0
  191. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/order_util.py +0 -0
  192. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  193. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  194. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  196. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  197. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  198. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  199. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  200. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  201. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  202. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  203. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  204. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  205. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  206. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  207. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  208. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  211. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  212. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  213. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  214. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  215. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  216. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  217. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  218. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  219. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  220. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  221. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  222. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  223. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  224. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  225. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  226. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  228. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  230. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  231. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  232. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  234. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  235. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  236. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  237. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  238. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  239. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  240. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  241. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  242. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  243. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  244. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  245. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  246. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  247. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +0 -0
  248. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  250. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  251. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  252. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  253. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/__init__.py +0 -0
  254. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  255. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  256. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  257. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  258. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/position.py +0 -0
  259. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  260. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/position_state.py +0 -0
  261. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/position_util.py +0 -0
  262. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  263. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  265. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  266. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  267. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  268. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  270. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  271. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/state.py +0 -0
  272. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  275. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  276. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/trade.py +0 -0
  277. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  278. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  279. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  280. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  281. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  283. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  284. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  285. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  287. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  288. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  289. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  290. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/channel/__init__.py +0 -0
  292. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  293. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  294. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/channel/signal_producer.py +0 -0
  295. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/signal_creation.py +0 -0
  296. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  297. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/signals/util.py +0 -0
  298. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/abstract_storage.py +0 -0
  300. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/candles_storage.py +0 -0
  301. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/orders_storage.py +0 -0
  302. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/portfolio_storage.py +0 -0
  303. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/storage_manager.py +0 -0
  304. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/trades_storage.py +0 -0
  305. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/transactions_storage.py +0 -0
  306. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/storage/util.py +0 -0
  307. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/supervisors/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  309. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  310. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/config_util.py +0 -0
  312. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/initializable.py +0 -0
  313. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/initialization_util.py +0 -0
  314. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/simulator_updater_utils.py +0 -0
  315. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/test_tools/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  317. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  318. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  319. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  320. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/setup.cfg +0 -0
  321. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/setup.py +0 -0
  322. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_channels.py +0 -0
  324. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_exchange.py +0 -0
  325. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_modes.py +0 -0
  326. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_orders.py +0 -0
  327. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_portfolio.py +0 -0
  328. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_profitability.py +0 -0
  329. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_symbol_data.py +0 -0
  330. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_trader.py +0 -0
  331. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/api/test_trades.py +0 -0
  332. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/cli/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/contracts/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  336. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  337. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/funding/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  339. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/kline/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  341. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/ohlcv/__init__.py +0 -0
  342. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  343. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  344. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/order_book/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  346. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/prices/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  348. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  349. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/recent_trades/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  351. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  352. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchange_data/ticker/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/connectors/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  357. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  358. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/implementations/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  360. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  361. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_abstract_exchange.py +0 -0
  362. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  363. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_exchange_builder.py +0 -0
  364. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_exchange_config_data.py +0 -0
  365. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_exchange_factory.py +0 -0
  366. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_exchange_manager.py +0 -0
  367. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_exchange_simulator.py +0 -0
  368. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/test_exchanges.py +0 -0
  369. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/traders/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/traders/test_trader.py +0 -0
  371. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/types/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  373. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/util/__init__.py +0 -0
  374. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  375. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/__init__.py +0 -0
  376. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/__init__.py +0 -0
  377. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  379. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  380. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  381. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  382. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  384. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/test_abstract_mode_consumer.py +0 -0
  385. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/test_abstract_trading_mode.py +0 -0
  386. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/modes/test_modes_util.py +0 -0
  387. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/groups/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  391. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  392. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  393. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
  394. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  396. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  397. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  398. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  399. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_order_state.py +0 -0
  400. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  401. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  402. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  403. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  404. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  405. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_order.py +0 -0
  406. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_order_adapter.py +0 -0
  407. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_order_factory.py +0 -0
  408. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_order_util.py +0 -0
  409. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_orders_manager.py +0 -0
  410. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  411. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  412. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  413. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  414. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  417. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  418. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  419. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  420. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  421. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  422. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  423. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/market/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  425. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  426. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  427. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  429. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  430. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  433. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  434. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  435. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/history/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  437. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  438. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_asset.py +0 -0
  439. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  440. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  441. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  442. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_portfolio_util.py +0 -0
  443. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  444. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
  445. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  446. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/types/__init__.py +0 -0
  447. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  448. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  449. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  450. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/__init__.py +0 -0
  451. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/channel/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/states/__init__.py +0 -0
  453. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/test_position.py +0 -0
  454. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/test_position_factory.py +0 -0
  455. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/test_positions_manager.py +0 -0
  456. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/types/__init__.py +0 -0
  457. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  458. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  459. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/trades/__init__.py +0 -0
  460. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/trades/test_trade_factory.py +0 -0
  461. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/trades/test_trade_manager.py +0 -0
  462. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  463. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/trades/test_trade_util.py +0 -0
  464. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/transactions/__init__.py +0 -0
  465. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  466. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  467. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/signals/__init__.py +0 -0
  468. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  469. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/signals/test_util.py +0 -0
  470. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/test_utils/__init__.py +0 -0
  471. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/test_utils/order_util.py +0 -0
  472. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/test_utils/random_numbers.py +0 -0
  473. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/util/__init__.py +0 -0
  474. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests/util/test_config_util.py +0 -0
  475. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/__init__.py +0 -0
  476. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/__init__.py +0 -0
  477. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  478. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  479. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  480. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  481. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  482. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bitso.py +0 -0
  483. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  484. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bybit.py +0 -0
  485. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  486. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_coinex.py +0 -0
  487. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  488. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_htx.py +0 -0
  489. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  490. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_mexc.py +0 -0
  491. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  492. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_okx.py +0 -0
  493. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  494. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_phemex.py +0 -0
  495. {OctoBot-Trading-2.4.170 → OctoBot-Trading-2.4.171}/tests_additional/real_exchanges/test_poloniex.py +0 -0
@@ -4,13 +4,19 @@ 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.171] - 2025-04-15
8
+ ### Added
9
+ [Exchanges] DEXes support
10
+ ### Updated
11
+ [CCXT] update ccxt to 4.4.72
12
+
7
13
  ## [2.4.170] - 2025-04-15
8
14
  ### Fixed
9
15
  [CCXT] fix cache issue on forced auth exchanges
10
16
 
11
17
  ## [2.4.169] - 2025-04-11
12
18
  ### Fixed
13
- [Subportfolio] handle fees hedge cases for filled oreders deltas
19
+ [Subportfolio] handle fees hedge cases for filled orders deltas
14
20
 
15
21
  ## [2.4.168] - 2025-04-01
16
22
  ### Updated
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.170
3
+ Version: 2.4.171
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.170](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.171](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)
@@ -96,6 +96,7 @@ octobot_trading/exchanges/adapters/abstract_adapter.py
96
96
  octobot_trading/exchanges/config/__init__.py
97
97
  octobot_trading/exchanges/config/backtesting_exchange_config.py
98
98
  octobot_trading/exchanges/config/exchange_config_data.py
99
+ octobot_trading/exchanges/config/exchange_credentials_data.py
99
100
  octobot_trading/exchanges/config/proxy_config.py
100
101
  octobot_trading/exchanges/connectors/__init__.py
101
102
  octobot_trading/exchanges/connectors/ccxt/__init__.py
@@ -477,6 +478,7 @@ tests_additional/real_exchanges/test_gateio.py
477
478
  tests_additional/real_exchanges/test_hitbtc.py
478
479
  tests_additional/real_exchanges/test_hollaex.py
479
480
  tests_additional/real_exchanges/test_htx.py
481
+ tests_additional/real_exchanges/test_hyperliquid.py
480
482
  tests_additional/real_exchanges/test_kraken.py
481
483
  tests_additional/real_exchanges/test_kucoin.py
482
484
  tests_additional/real_exchanges/test_kucoin_futures.py
@@ -4,7 +4,7 @@ Async-Channel<2.3,>=2.2
4
4
  OctoBot-Commons<1.10,>=1.9.64
5
5
  OctoBot-Tentacles-Manager<2.10,>=2.9
6
6
  trading-backend>=1.2.35
7
- ccxt==4.3.85
7
+ ccxt==4.4.72
8
8
  aiohttp_socks==0.10.1
9
9
  cryptography
10
10
  sortedcontainers==2.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.170
3
+ Version: 2.4.171
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.170](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.171](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.170](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.171](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.170" # major.minor.revision
18
+ VERSION = "2.4.171" # major.minor.revision
@@ -86,6 +86,7 @@ CCXT_TRADES_CACHE_LIMIT = int(os.getenv("CCXT_TRADES_CACHE_LIMIT", str(CCXT_DEFA
86
86
  CCXT_ORDERS_CACHE_LIMIT = int(os.getenv("CCXT_ORDERS_CACHE_LIMIT", str(CCXT_DEFAULT_CACHE_LIMIT)))
87
87
  CCXT_OHLCV_CACHE_LIMIT = int(os.getenv("CCXT_OHLCV_CACHE_LIMIT", str(CCXT_DEFAULT_CACHE_LIMIT)))
88
88
  CCXT_WATCH_ORDER_BOOK_LIMIT = int(os.getenv("CCXT_WATCH_ORDER_BOOK_LIMIT", str(CCXT_DEFAULT_CACHE_LIMIT)))
89
+ CCXT_TIMEOUT_ON_EXIT_MS = 100
89
90
  THROTTLED_WS_UPDATES = float(os.getenv("THROTTLED_WS_UPDATES", "0.1")) # avoid spamming CPU
90
91
  MAX_CANDLES_IN_RAM = int(os.getenv("MAX_CANDLES_IN_RAM", "3000")) # max candles per CandlesManager
91
92
  STORAGE_ORIGIN_VALUE = "origin_value"
@@ -109,7 +110,7 @@ NaN = decimal.Decimal("nan")
109
110
  FULL_CANDLE_HISTORY_EXCHANGES = [
110
111
  "ascendex",
111
112
  "binance",
112
- "bitfinex2",
113
+ "bitfinex",
113
114
  "bitstamp",
114
115
  "bybit",
115
116
  "bingx",
@@ -147,7 +148,7 @@ TESTED_EXCHANGES = [
147
148
  "bitmart",
148
149
  ])
149
150
  DEFAULT_FUTURE_EXCHANGES = sorted(["bybit"])
150
- SIMULATOR_TESTED_EXCHANGES = sorted(["bitfinex2", "bithumb", "bitstamp", "bitmex",
151
+ SIMULATOR_TESTED_EXCHANGES = sorted(["bitfinex", "bithumb", "bitstamp", "bitmex",
151
152
  "hitbtc", "kraken", "poloniex", "bitso", "ndax", "upbit",
152
153
  "wavesexchange",])
153
154
 
@@ -115,17 +115,18 @@ class TickerUpdater(ticker_channel.TickerProducer):
115
115
  def _is_valid(ticker):
116
116
  try:
117
117
  # at least require close, volume and timestamp
118
- return (
119
- ticker and all(
120
- ticker[field] is not None
121
- for field in (
122
- enums.ExchangeConstantsTickersColumns.CLOSE.value,
123
- enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value,
124
- enums.ExchangeConstantsTickersColumns.TIMESTAMP.value
125
- )
126
- )
127
- )
128
-
118
+ if not (
119
+ ticker.get(enums.ExchangeConstantsTickersColumns.CLOSE.value)
120
+ and ticker.get(enums.ExchangeConstantsTickersColumns.TIMESTAMP.value)
121
+ ):
122
+ return False
123
+ if not (
124
+ ticker.get(enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value)
125
+ or ticker.get(enums.ExchangeConstantsTickersColumns.QUOTE_VOLUME.value)
126
+ ):
127
+ # require either base or quote volume
128
+ return False
129
+ return True
129
130
  except KeyError:
130
131
  return False
131
132
 
@@ -56,6 +56,7 @@ class TickerManager(util.Initializable):
56
56
  enums.ExchangeConstantsTickersColumns.LAST.value: math.nan,
57
57
  enums.ExchangeConstantsTickersColumns.AVERAGE.value: math.nan,
58
58
  enums.ExchangeConstantsTickersColumns.SYMBOL.value: math.nan,
59
+ enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value: math.nan,
59
60
  enums.ExchangeConstantsTickersColumns.QUOTE_VOLUME.value: math.nan,
60
61
  enums.ExchangeConstantsTickersColumns.TIMESTAMP.value: 0,
61
62
  enums.ExchangeConstantsTickersColumns.VWAP.value: math.nan
@@ -95,6 +95,7 @@ from octobot_trading.exchanges.config import (
95
95
  ExchangeConfig,
96
96
  BacktestingExchangeConfig,
97
97
  ProxyConfig,
98
+ ExchangeCredentialsData,
98
99
  )
99
100
  from octobot_trading.exchanges import traders
100
101
  from octobot_trading.exchanges.traders import (
@@ -135,6 +136,7 @@ __all__ = [
135
136
  "ExchangeConfig",
136
137
  "BacktestingExchangeConfig",
137
138
  "ProxyConfig",
139
+ "ExchangeCredentialsData",
138
140
  "ExchangeManager",
139
141
  "ExchangeBuilder",
140
142
  "create_exchange_builder_instance",
@@ -92,10 +92,6 @@ class AbstractWebsocketExchange:
92
92
  raise NotImplementedError("is_time_frame_supported is not implemented")
93
93
 
94
94
  def get_exchange_credentials(self):
95
- """
96
- Exchange credentials
97
- :return: key, secret, password, uid
98
- """
99
95
  return self.exchange_manager.get_exchange_credentials(self.exchange_manager.exchange_name)
100
96
 
101
97
  async def push_to_channel(self, channel_name, *args, **kwargs):
@@ -27,9 +27,14 @@ from octobot_trading.exchanges.config import proxy_config
27
27
  from octobot_trading.exchanges.config.proxy_config import (
28
28
  ProxyConfig,
29
29
  )
30
+ from octobot_trading.exchanges.config import proxy_config
31
+ from octobot_trading.exchanges.config.exchange_credentials_data import (
32
+ ExchangeCredentialsData,
33
+ )
30
34
 
31
35
  __all__ = [
32
36
  "ExchangeConfig",
33
37
  "BacktestingExchangeConfig",
34
38
  "ProxyConfig",
39
+ "ExchangeCredentialsData",
35
40
  ]
@@ -0,0 +1,39 @@
1
+ # Drakkar-Software OctoBot-Trading
2
+ # Copyright (c) Drakkar-Software, All rights reserved.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 3.0 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library.
16
+ import dataclasses
17
+ import typing
18
+
19
+
20
+ @dataclasses.dataclass
21
+ class ExchangeCredentialsData:
22
+ # CEXes
23
+ api_key: typing.Optional[str] = None
24
+ secret: typing.Optional[str] = None
25
+ password: typing.Optional[str] = None
26
+ uid: typing.Optional[str] = None
27
+ # Oauth
28
+ auth_token: typing.Optional[str] = None
29
+ auth_token_header_prefix: typing.Optional[str] = None
30
+ # DEXes
31
+ wallet_address: typing.Optional[str] = None
32
+ private_key: typing.Optional[str] = None
33
+
34
+ def has_credentials(self) -> bool:
35
+ return bool(
36
+ (self.api_key and self.secret) # CEX
37
+ or (self.wallet_address and self.private_key) # DEX
38
+ )
39
+
@@ -34,6 +34,7 @@ import octobot_trading.errors as errors
34
34
  import octobot_trading.exchanges.connectors.ccxt.enums as ccxt_enums
35
35
  import octobot_trading.exchanges.connectors.ccxt.ccxt_clients_cache as ccxt_clients_cache
36
36
  import octobot_trading.exchanges.config.proxy_config as proxy_config_import
37
+ import octobot_trading.exchanges.config.exchange_credentials_data as exchange_credentials_data
37
38
  import octobot_trading.exchanges.util.exchange_util as exchange_util
38
39
 
39
40
 
@@ -57,24 +58,19 @@ def create_client(
57
58
  )
58
59
  if exchange_manager.ignore_config or exchange_manager.check_config(exchange_manager.exchange_name):
59
60
  try:
60
- auth_token_header_prefix = None
61
- key, secret, password, uid, auth_token = exchange_manager.get_exchange_credentials(
62
- exchange_manager.exchange_name
61
+ creds: exchange_credentials_data.ExchangeCredentialsData = (
62
+ exchange_manager.get_exchange_credentials(exchange_manager.exchange_name)
63
63
  )
64
64
  if keys_adapter:
65
- key, secret, password, uid, auth_token, auth_token_header_prefix = keys_adapter(
66
- key, secret, password, uid, auth_token
67
- )
68
- if not (key and secret) and not exchange_manager.is_simulated and not exchange_manager.ignore_config:
65
+ creds = keys_adapter(creds)
66
+ if not (creds.has_credentials()) and not exchange_manager.is_simulated and not exchange_manager.ignore_config:
69
67
  logger.warning(f"No exchange API key set for {exchange_manager.exchange_name}. "
70
68
  f"Enter your account details to enable real trading on this exchange.")
71
69
  if should_be_authenticated_exchange:
72
70
  client = instantiate_exchange(
73
71
  exchange_class,
74
72
  _get_client_config(
75
- exchange_class, options, headers, additional_config,
76
- api_key=key, secret=secret, password=password, uid=uid,
77
- auth_token=auth_token, auth_token_header_prefix=auth_token_header_prefix
73
+ exchange_class, options, headers, additional_config, creds,
78
74
  ),
79
75
  exchange_manager.exchange_name,
80
76
  exchange_manager.proxy_config,
@@ -319,7 +315,8 @@ def _use_proxy_if_necessary(client, proxy_config: proxy_config_import.ProxyConfi
319
315
  if (client.socks_proxy_sessions is None):
320
316
  client.socks_proxy_sessions = {}
321
317
  if (proxy_url not in client.socks_proxy_sessions):
322
- connector = aiohttp_socks.ProxyConnector.from_url(
318
+ previous_aiohttp_socks_connector = client.aiohttp_socks_connector
319
+ client.aiohttp_socks_connector = aiohttp_socks.ProxyConnector.from_url(
323
320
  proxy_url,
324
321
  # extra args copied from self.open()
325
322
  ssl=client.ssl_context,
@@ -328,8 +325,10 @@ def _use_proxy_if_necessary(client, proxy_config: proxy_config_import.ProxyConfi
328
325
  enable_cleanup_closed=True
329
326
  )
330
327
  client.socks_proxy_sessions[proxy_url] = aiohttp.ClientSession(
331
- loop=client.asyncio_loop, connector=connector, trust_env=client.aiohttp_trust_env
328
+ loop=client.asyncio_loop, connector=client.aiohttp_socks_connector,
329
+ trust_env=client.aiohttp_trust_env
332
330
  )
331
+ asyncio.create_task(_close_previous_session_and_connector(None, previous_aiohttp_socks_connector))
333
332
  elif proxy_config.disable_dns_cache:
334
333
  # rewrite of async_ccxt.exchange.client.open()
335
334
  _init_ccxt_client_session_requirements(client)
@@ -351,7 +350,7 @@ def _init_ccxt_client_session_requirements(client):
351
350
  # from async_ccxt.exchange.client.open()
352
351
  if client.asyncio_loop is None:
353
352
  client.asyncio_loop = asyncio.get_running_loop()
354
- client.throttle.loop = client.asyncio_loop
353
+ client.throttler.loop = client.asyncio_loop
355
354
 
356
355
  if client.ssl_context is None:
357
356
  # Create our SSL context object with our CA cert file
@@ -360,27 +359,31 @@ def _init_ccxt_client_session_requirements(client):
360
359
 
361
360
 
362
361
  def _get_client_config(
363
- exchange_class, options, headers, additional_config,
364
- api_key=None, secret=None, password=None, uid=None,
365
- auth_token=None, auth_token_header_prefix=None
362
+ exchange_class, options, headers, additional_config, creds: exchange_credentials_data.ExchangeCredentialsData=None
366
363
  ):
367
- if auth_token:
368
- headers["Authorization"] = f"{auth_token_header_prefix or ''}{auth_token}"
364
+ if creds and creds.auth_token:
365
+ headers["Authorization"] = f"{creds.auth_token_header_prefix or ''}{creds.auth_token}"
369
366
  config = {
370
367
  'verbose': constants.ENABLE_CCXT_VERBOSE,
371
368
  'enableRateLimit': constants.ENABLE_CCXT_RATE_LIMIT,
372
369
  'timeout': constants.DEFAULT_REQUEST_TIMEOUT,
373
370
  'options': options,
374
- 'headers': headers
371
+ 'headers': headers,
372
+ 'timeout_on_exit': constants.CCXT_TIMEOUT_ON_EXIT_MS,
375
373
  }
376
- if api_key is not None:
377
- config['apiKey'] = api_key
378
- if secret is not None:
379
- config['secret'] = secret
380
- if password is not None:
381
- config['password'] = password
382
- if uid is not None:
383
- config['uid'] = uid
374
+ if creds:
375
+ if creds.api_key is not None:
376
+ config['apiKey'] = creds.api_key
377
+ if creds.secret is not None:
378
+ config['secret'] = creds.secret
379
+ if creds.password is not None:
380
+ config['password'] = creds.password
381
+ if creds.uid is not None:
382
+ config['uid'] = creds.uid
383
+ if creds.wallet_address is not None:
384
+ config['walletAddress'] = creds.wallet_address
385
+ if creds.private_key is not None:
386
+ config['privateKey'] = creds.private_key
384
387
  config.update({**_get_custom_domain_config(exchange_class), **(additional_config or {})})
385
388
  return config
386
389
 
@@ -425,6 +428,13 @@ def _get_patched_url_config(url_config: dict, old: str, new: str):
425
428
  return updated_config
426
429
 
427
430
 
431
+ async def _close_previous_session_and_connector(session, connector):
432
+ if connector is not None:
433
+ await connector.close()
434
+ if session is not None:
435
+ await session.close()
436
+
437
+
428
438
  def _use_request_counter(
429
439
  identifier: str, ccxt_client: async_ccxt.Exchange, proxy_config: proxy_config_import.ProxyConfig
430
440
  ):
@@ -438,23 +448,24 @@ def _use_request_counter(
438
448
  # 1. create ssl context and other required elements if necessary
439
449
  ccxt_client.open()
440
450
  previous_session = ccxt_client.session
451
+ previous_connector = ccxt_client.tcp_connector
441
452
  # 2. create patched session using the same params as a normal one
442
453
  # same as in ccxt.async_support.exchange.py#open()
443
454
  # connector = aiohttp.TCPConnector(ssl=self.ssl_context, loop=self.asyncio_loop, enable_cleanup_closed=True)
444
- new_connector = aiohttp.TCPConnector(
455
+ ccxt_client.tcp_connector = aiohttp.TCPConnector(
445
456
  ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop,
446
457
  enable_cleanup_closed=True, use_dns_cache=not proxy_config.disable_dns_cache
447
458
  )
448
459
  counter_session = aiohttp_util.CounterClientSession(
449
460
  identifier,
450
461
  loop=ccxt_client.asyncio_loop,
451
- connector=new_connector,
462
+ connector=ccxt_client.tcp_connector,
452
463
  trust_env=previous_session.trust_env,
453
464
  )
454
465
  # 3. replace session
455
466
  ccxt_client.session = counter_session
456
467
  # 4. close replaced session in task to avoid making this function a coroutine
457
- asyncio.create_task(previous_session.close())
468
+ asyncio.create_task(_close_previous_session_and_connector(previous_session, previous_connector))
458
469
  commons_logging.get_logger(__name__).info(f"Request counter enabled for {identifier}")
459
470
  except Exception as err:
460
471
  commons_logging.get_logger(__name__).exception(
@@ -34,6 +34,7 @@ import octobot_trading.enums as enums
34
34
  import octobot_trading.errors
35
35
  import octobot_trading.exchanges as exchanges
36
36
  import octobot_trading.exchanges.abstract_exchange as abstract_exchange
37
+ import octobot_trading.exchanges.config.exchange_credentials_data as exchange_credentials_data
37
38
  import octobot_trading.exchanges.connectors.ccxt.ccxt_adapter as ccxt_adapter
38
39
  import octobot_trading.exchanges.connectors.ccxt.ccxt_client_util as ccxt_client_util
39
40
  import octobot_trading.exchanges.connectors.ccxt.enums as ccxt_enums
@@ -262,7 +263,11 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
262
263
  def _create_client(self, force_unauth=False):
263
264
  self.client, self.is_authenticated = self._client_factory(force_unauth)
264
265
 
265
- def _client_factory(self, force_unauth, keys_adapter=None) -> tuple:
266
+ def _client_factory(
267
+ self,
268
+ force_unauth,
269
+ keys_adapter: typing.Callable[[exchange_credentials_data.ExchangeCredentialsData], exchange_credentials_data.ExchangeCredentialsData]=None
270
+ ) -> tuple:
266
271
  return ccxt_client_util.create_client(
267
272
  self.exchange_type, self.exchange_manager, self.logger,
268
273
  self.options, self.headers, self.additional_config,
@@ -397,8 +402,8 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
397
402
  return self.adapter.adapt_public_recent_trades(
398
403
  await self.client.fetch_trades(symbol, limit=limit, params=kwargs)
399
404
  )
400
- except ccxt.NotSupported:
401
- raise octobot_trading.errors.NotSupported
405
+ except (ccxt.NotSupported, ccxt.ArgumentsRequired) as err:
406
+ raise octobot_trading.errors.NotSupported(err)
402
407
  except ccxt.BaseError as e:
403
408
  raise octobot_trading.errors.FailedRequest(
404
409
  f"Failed to get_recent_trades {html_util.get_html_summary_if_relevant(e)}"
@@ -553,7 +558,6 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
553
558
  symbol=symbol, quantity=quantity
554
559
  )
555
560
 
556
-
557
561
  @ccxt_client_util.converted_ccxt_common_errors
558
562
  async def create_market_buy_order_with_cost(self, symbol, cost: float, quantity: float, params=None) -> dict:
559
563
  return self.adapter.adapt_order(
@@ -562,7 +566,6 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
562
566
  symbol=symbol, quantity=quantity
563
567
  )
564
568
 
565
-
566
569
  @ccxt_client_util.converted_ccxt_common_errors
567
570
  async def create_limit_buy_order(self, symbol, quantity, price=None, params=None) -> dict:
568
571
  return self.adapter.adapt_order(
@@ -30,6 +30,7 @@ import octobot_trading.enums as enums
30
30
  import octobot_trading.util as util
31
31
  import octobot_trading.errors as errors
32
32
  import octobot_trading.storage as storage
33
+ import octobot_trading.exchanges.config.exchange_credentials_data as exchange_credentials_data
33
34
  import trading_backend.exchanges
34
35
 
35
36
 
@@ -313,9 +314,10 @@ class ExchangeManager(util.Initializable):
313
314
  return False
314
315
  return True
315
316
 
316
- def get_exchange_credentials(self, exchange_name):
317
+ def get_exchange_credentials(self, exchange_name) -> exchange_credentials_data.ExchangeCredentialsData:
318
+ creds = exchange_credentials_data.ExchangeCredentialsData()
317
319
  if self.ignore_config or not self.should_decrypt_token() or self.without_auth:
318
- return "", "", "", "", ""
320
+ return creds
319
321
  config_exchange = self.config[common_constants.CONFIG_EXCHANGES][exchange_name]
320
322
  key = configuration.decrypt_element_if_possible(
321
323
  common_constants.CONFIG_EXCHANGE_KEY, config_exchange, None
@@ -323,16 +325,15 @@ class ExchangeManager(util.Initializable):
323
325
  secret = configuration.decrypt_element_if_possible(
324
326
  common_constants.CONFIG_EXCHANGE_SECRET, config_exchange, None
325
327
  )
326
- return (
327
- # remove leading and trailing ", ', newlines and whitespaces if any
328
- key.strip(' "').strip("'").strip("\n") if key else key,
329
- secret.strip(' "').strip("'").strip("\n") if secret else secret,
330
- configuration.decrypt_element_if_possible(
331
- common_constants.CONFIG_EXCHANGE_PASSWORD, config_exchange, None
332
- ),
333
- config_exchange.get(common_constants.CONFIG_EXCHANGE_UID, ""),
334
- config_exchange.get(common_constants.CONFIG_EXCHANGE_ACCESS_TOKEN, "")
328
+ # remove leading and trailing ", ', newlines and whitespaces if any
329
+ creds.api_key = key.strip(' "').strip("'").strip("\n") if key else key
330
+ creds.secret = secret.strip(' "').strip("'").strip("\n") if secret else secret
331
+ creds.password = configuration.decrypt_element_if_possible(
332
+ common_constants.CONFIG_EXCHANGE_PASSWORD, config_exchange, None
335
333
  )
334
+ creds.uid = config_exchange.get(common_constants.CONFIG_EXCHANGE_UID, "")
335
+ creds.auth_token = config_exchange.get(common_constants.CONFIG_EXCHANGE_ACCESS_TOKEN, "")
336
+ return creds
336
337
 
337
338
  def get_exchange_sub_account_id(self, exchange_name):
338
339
  config_exchange = self.config[common_constants.CONFIG_EXCHANGES][exchange_name]
@@ -457,7 +457,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
457
457
  ) -> dict:
458
458
  return await self.connector.create_limit_buy_order(
459
459
  symbol, quantity, price, params=params
460
- )
460
+ )
461
461
 
462
462
  async def _create_market_sell_order(
463
463
  self, symbol, quantity, price=None, reduce_only: bool = False, params=None
@@ -8,7 +8,7 @@ OctoBot-Tentacles-Manager>=2.9, <2.10
8
8
  trading-backend>=1.2.35
9
9
 
10
10
  # Exchange connection requirements
11
- ccxt==4.3.85 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
11
+ ccxt==4.4.72 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
12
12
  aiohttp_socks==0.10.1 # used by ccxt socks proxy aiohttp connectors
13
13
 
14
14
  cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)
@@ -66,6 +66,7 @@ async def test_update_and_reset_ticker(ticker_manager):
66
66
  ExchangeConstantsTickersColumns.AVERAGE.value: nan,
67
67
  ExchangeConstantsTickersColumns.SYMBOL.value: nan,
68
68
  ExchangeConstantsTickersColumns.QUOTE_VOLUME.value: nan,
69
+ ExchangeConstantsTickersColumns.BASE_VOLUME.value: nan,
69
70
  ExchangeConstantsTickersColumns.TIMESTAMP.value: 0,
70
71
  ExchangeConstantsTickersColumns.VWAP.value: nan
71
72
  }
@@ -226,7 +226,7 @@ async def test_get_exchange_details(tentacles_setup_config, supported_exchanges)
226
226
  assert details.name == "Binance"
227
227
  assert details.url == "https://www.binance.com"
228
228
  assert len(details.api) > 1
229
- assert "https://user-images.githubusercontent.com/" in details.logo_url
229
+ assert "https://github.com/user-attachments/assets" in details.logo_url
230
230
  assert details.has_websocket is False # default value
231
231
  get_tentacle_config_mock.assert_not_called()
232
232
 
@@ -412,8 +412,12 @@ class RealExchangeTester:
412
412
  # => set expect_invalid_price_limit_values to True in call and
413
413
  # remove price limit in exchange tentacle market status fixer if this is the case
414
414
  if has_price_limit_value:
415
- assert (not has_price_limit_value) or low_price_max >= min_price >= low_price_min
416
- assert (not has_cost_limit_value) or low_cost_max >= min_cost >= low_cost_min
415
+ assert (not has_price_limit_value) or low_price_max >= min_price >= low_price_min, (
416
+ f"FALSE: {low_price_max} >= {min_price} >= {low_price_min}"
417
+ )
418
+ assert (not has_cost_limit_value) or low_cost_max >= min_cost >= low_cost_min, (
419
+ f"FALSE: {low_cost_max} >= {min_cost} >= {min_cost}"
420
+ )
417
421
  else:
418
422
  if has_price_limit_value:
419
423
  assert (not has_price_limit_value) or normal_price_max >= min_price >= normal_price_min
@@ -31,7 +31,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
31
31
  EXCHANGE_NAME = "ascendex"
32
32
  SYMBOL = "BTC/USDT"
33
33
  SYMBOL_2 = "ETH/BTC"
34
- SYMBOL_3 = "XRP/BTC"
34
+ SYMBOL_3 = "KAI/USDT"
35
35
 
36
36
  async def test_time_frames(self):
37
37
  time_frames = await self.time_frames()
@@ -51,7 +51,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
51
51
  ))
52
52
 
53
53
  async def test_active_symbols(self):
54
- await self.inner_test_active_symbols(500, 1000)
54
+ await self.inner_test_active_symbols(800, 1200)
55
55
 
56
56
  async def test_get_market_status(self):
57
57
  for market_status in await self.get_market_statuses():
@@ -65,7 +65,10 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
65
65
  for elem in (Ecmsc.LIMITS_AMOUNT.value,
66
66
  Ecmsc.LIMITS_PRICE.value,
67
67
  Ecmsc.LIMITS_COST.value))
68
- self.check_market_status_limits(market_status, expect_invalid_price_limit_values=False)
68
+ self.check_market_status_limits(
69
+ market_status, expect_invalid_price_limit_values=False,
70
+ low_cost_max=5, low_price_min=1e-12
71
+ )
69
72
 
70
73
  async def test_get_symbol_prices(self):
71
74
  # without limit
@@ -101,9 +104,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
101
104
  assert self.CANDLE_SINCE_SEC <= candle[PriceIndexes.IND_PRICE_TIME.value] <= max_candle_time
102
105
 
103
106
  async def test_get_historical_ohlcv(self):
104
- with pytest.raises(AssertionError):
105
- # seems temporarily broken (exchange side)
106
- await super().test_get_historical_ohlcv()
107
+ await super().test_get_historical_ohlcv()
107
108
 
108
109
  async def test_get_kline_price(self):
109
110
  kline_price = await self.get_kline_price()
@@ -56,7 +56,7 @@ class TestBinanceRealExchangeTester(RealExchangeTester):
56
56
 
57
57
  async def test_active_symbols(self):
58
58
  # binanceus numbers
59
- await self.inner_test_active_symbols(150, 500)
59
+ await self.inner_test_active_symbols(200, 500)
60
60
 
61
61
  async def test_get_market_status(self):
62
62
  for market_status in await self.get_market_statuses():
@@ -32,7 +32,7 @@ class TestBingxRealExchangeTester(RealExchangeTester):
32
32
  SYMBOL = "BTC/USDT"
33
33
  SYMBOL_2 = "ETH/BTC"
34
34
  SYMBOL_3 = "SHIB/USDT"
35
- CANDLE_SINCE = 1703005232000 # Thursday, October 19, 2023 5:00:32 PM UTC (large differences not supported)
35
+ CANDLE_SINCE = 1729505232000 # Sunday, August 18, 2024 6:20:32 PM GMT (large differences not supported)
36
36
  CANDLE_SINCE_SEC = CANDLE_SINCE / 1000
37
37
 
38
38
  async def _test_time_frames(self):
@@ -55,7 +55,7 @@ class TestBingxRealExchangeTester(RealExchangeTester):
55
55
  ))
56
56
 
57
57
  async def test_active_symbols(self):
58
- await self.inner_test_active_symbols(1000, 1200)
58
+ await self.inner_test_active_symbols(1300, 1900)
59
59
 
60
60
  async def test_get_market_status(self):
61
61
  for market_status in await self.get_market_statuses():
@@ -128,7 +128,7 @@ class TestBingxRealExchangeTester(RealExchangeTester):
128
128
  )
129
129
  # ensure fetch data are just moved to the 1st available candles but are still making sense
130
130
  assert (
131
- self.CANDLE_SINCE_SEC
131
+ super().CANDLE_SINCE_SEC
132
132
  <= candle[PriceIndexes.IND_PRICE_TIME.value]
133
133
  <= max_theoretical_bingx_candle_time
134
134
  )