OctoBot-Trading 2.4.99__tar.gz → 2.4.100__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/CHANGELOG.md +8 -0
  2. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.99/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.100}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/README.md +1 -1
  5. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/exchange.py +2 -3
  7. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/constants.py +6 -2
  8. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchange_builder.py +7 -2
  9. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchanges.py +12 -0
  10. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/types/rest_exchange.py +2 -2
  11. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/abstract_trading_mode.py +3 -3
  12. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/mode_config.py +7 -5
  13. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/octobot_channel_consumer.py +10 -0
  14. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +27 -5
  15. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/abstract_storage.py +1 -2
  16. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/orders_storage.py +19 -9
  17. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/portfolio_storage.py +64 -25
  18. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/requirements.txt +0 -1
  19. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/__init__.py +2 -2
  20. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +12 -1
  21. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/real_exchange_tester.py +13 -0
  22. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_ascendex.py +3 -0
  23. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_binance.py +4 -0
  24. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_binance_futures.py +3 -0
  25. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bingx.py +3 -0
  26. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bitfinex.py +3 -0
  27. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bitget.py +3 -0
  28. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bithumb.py +3 -0
  29. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bitmart.py +3 -0
  30. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bitso.py +3 -0
  31. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bitstamp.py +3 -0
  32. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bybit.py +3 -0
  33. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_bybit_futures.py +3 -0
  34. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_coinbase.py +3 -0
  35. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_coinex.py +3 -0
  36. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_cryptocom.py +3 -0
  37. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_gateio.py +3 -0
  38. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_hitbtc.py +3 -0
  39. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_hollaex.py +3 -0
  40. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_htx.py +3 -0
  41. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_kraken.py +3 -0
  42. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_kucoin.py +3 -0
  43. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_kucoin_futures.py +3 -0
  44. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_mexc.py +3 -0
  45. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_ndax.py +3 -0
  46. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_okcoin.py +3 -0
  47. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_okx.py +3 -0
  48. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_okx_futures.py +3 -0
  49. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_phemex.py +3 -0
  50. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_poloniex.py +3 -0
  51. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_upbit.py +3 -0
  52. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/test_wavesexchange.py +3 -0
  53. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/LICENSE +0 -0
  54. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/MANIFEST.in +0 -0
  55. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  56. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  57. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  58. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/OctoBot_Trading.egg-info/requires.txt +0 -0
  59. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  60. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/__init__.py +0 -0
  61. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/channels.py +0 -0
  62. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/contracts.py +0 -0
  63. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/modes.py +0 -0
  64. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/orders.py +0 -0
  65. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/portfolio.py +0 -0
  66. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/positions.py +0 -0
  67. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/profitability.py +0 -0
  68. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/storage.py +0 -0
  69. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/symbol_data.py +0 -0
  70. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/trader.py +0 -0
  71. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/api/trades.py +0 -0
  72. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/enums.py +0 -0
  73. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/errors.py +0 -0
  74. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_channel.py +0 -0
  75. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  78. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  79. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  80. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  81. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  82. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  85. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  86. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  87. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  88. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  91. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  92. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  94. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  96. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  97. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  99. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  100. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  101. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  102. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  105. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  106. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  107. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  108. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  111. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  112. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  113. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  114. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  115. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  118. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  119. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  120. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  121. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  123. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  124. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  125. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  126. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  127. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  129. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  130. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  132. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/config/__init__.py +0 -0
  133. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  134. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  135. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  138. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  139. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  140. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  141. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  142. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  143. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  144. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  146. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  147. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  148. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchange_channels.py +0 -0
  149. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchange_details.py +0 -0
  150. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchange_factory.py +0 -0
  151. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchange_manager.py +0 -0
  152. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  153. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  154. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  155. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  156. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  157. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/traders/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/traders/trader.py +0 -0
  159. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  160. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/types/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  162. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/util/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  164. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  165. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  166. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  167. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/channel/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  170. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  171. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/channel/mode.py +0 -0
  172. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/mode_activity.py +0 -0
  173. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/modes_factory.py +0 -0
  174. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/modes_util.py +0 -0
  175. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  176. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  178. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  179. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  180. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  181. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  182. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  183. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  184. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  185. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  186. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  188. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  189. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  191. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/__init__.py +0 -0
  192. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  193. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  196. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  197. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  198. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  199. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  200. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  201. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  202. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  203. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/order.py +0 -0
  204. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  205. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  206. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/order_group.py +0 -0
  207. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/order_state.py +0 -0
  208. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/order_util.py +0 -0
  209. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  210. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  211. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  213. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  214. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  215. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  216. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  217. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  218. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  219. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  220. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  222. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  223. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  224. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  225. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  226. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  227. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  228. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  230. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  231. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  232. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  234. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  235. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  236. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  237. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  239. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  240. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  241. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  242. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  243. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  245. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  246. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  247. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  249. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  250. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  251. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  252. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  253. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  254. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  255. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  256. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  257. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  259. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  260. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  261. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  262. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  265. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  266. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  267. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/position.py +0 -0
  268. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  269. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/position_state.py +0 -0
  270. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/position_util.py +0 -0
  271. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  272. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  274. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  275. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  276. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  277. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  278. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  279. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  280. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/state.py +0 -0
  281. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  284. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  285. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/trade.py +0 -0
  286. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  287. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  288. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  289. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  290. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  292. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  293. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  294. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  295. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  296. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  297. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  298. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  299. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/channel/__init__.py +0 -0
  301. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  302. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  303. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/channel/signal_producer.py +0 -0
  304. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/signal_creation.py +0 -0
  305. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  306. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/signals/util.py +0 -0
  307. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/candles_storage.py +0 -0
  309. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/storage_manager.py +0 -0
  310. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/trades_storage.py +0 -0
  311. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/transactions_storage.py +0 -0
  312. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/storage/util.py +0 -0
  313. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/supervisors/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  315. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  316. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/config_util.py +0 -0
  318. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/initializable.py +0 -0
  319. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/initialization_util.py +0 -0
  320. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/simulator_updater_utils.py +0 -0
  321. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/test_tools/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  323. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  324. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  325. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  326. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/setup.cfg +0 -0
  327. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/setup.py +0 -0
  328. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_channels.py +0 -0
  330. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_exchange.py +0 -0
  331. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_modes.py +0 -0
  332. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_orders.py +0 -0
  333. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_portfolio.py +0 -0
  334. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_profitability.py +0 -0
  335. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_symbol_data.py +0 -0
  336. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_trader.py +0 -0
  337. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/api/test_trades.py +0 -0
  338. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/cli/__init__.py +0 -0
  339. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/contracts/__init__.py +0 -0
  341. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  342. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  343. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/funding/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  345. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/kline/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  347. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/ohlcv/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  349. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  350. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/order_book/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  352. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/prices/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  354. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  355. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/recent_trades/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  357. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  358. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/ticker/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  360. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/connectors/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  363. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  364. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/implementations/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  366. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  367. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_abstract_exchange.py +0 -0
  368. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  369. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_exchange_builder.py +0 -0
  370. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_exchange_config_data.py +0 -0
  371. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_exchange_factory.py +0 -0
  372. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_exchange_manager.py +0 -0
  373. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_exchange_simulator.py +0 -0
  374. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/test_exchanges.py +0 -0
  375. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/traders/__init__.py +0 -0
  376. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/traders/test_trader.py +0 -0
  377. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/types/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  379. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/util/__init__.py +0 -0
  380. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  381. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/exchanges/util/test_exchange_util.py +0 -0
  382. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/__init__.py +0 -0
  384. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  386. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  387. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  388. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  389. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  391. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/test_abstract_mode_consumer.py +0 -0
  392. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/test_abstract_trading_mode.py +0 -0
  393. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/modes/test_modes_util.py +0 -0
  394. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/__init__.py +0 -0
  396. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/groups/__init__.py +0 -0
  397. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  398. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  399. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  400. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  402. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  403. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  404. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  405. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_order_state.py +0 -0
  406. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  407. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  408. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  409. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  410. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  411. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_order.py +0 -0
  412. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_order_adapter.py +0 -0
  413. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_order_factory.py +0 -0
  414. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_order_util.py +0 -0
  415. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_orders_manager.py +0 -0
  416. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  417. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  420. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  421. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  422. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  423. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  424. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  425. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  426. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/market/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  428. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  429. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  430. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  432. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  433. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  436. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  437. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  438. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/history/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  440. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/test_asset.py +0 -0
  441. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  442. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  443. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  444. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  445. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  446. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/types/__init__.py +0 -0
  447. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  448. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  449. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  450. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/__init__.py +0 -0
  451. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/channel/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/states/__init__.py +0 -0
  453. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/test_position.py +0 -0
  454. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/test_position_factory.py +0 -0
  455. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/test_positions_manager.py +0 -0
  456. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/types/__init__.py +0 -0
  457. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  458. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  459. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/trades/__init__.py +0 -0
  460. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/trades/test_trade_factory.py +0 -0
  461. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/trades/test_trade_manager.py +0 -0
  462. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  463. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/trades/test_trade_util.py +0 -0
  464. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/transactions/__init__.py +0 -0
  465. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  466. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  467. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/signals/__init__.py +0 -0
  468. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  469. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/signals/test_util.py +0 -0
  470. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/test_utils/__init__.py +0 -0
  471. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/test_utils/order_util.py +0 -0
  472. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/test_utils/random_numbers.py +0 -0
  473. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/util/__init__.py +0 -0
  474. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests/util/test_config_util.py +0 -0
  475. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/__init__.py +0 -0
  476. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/__init__.py +0 -0
  477. {OctoBot-Trading-2.4.99 → OctoBot-Trading-2.4.100}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.4.100] - 2024-08-21
8
+ ### Added
9
+ - [TradingModes] allow starting bot without enabled trading mode
10
+ - [Tests] add active markets count tests
11
+ ### Updated
12
+ - [Exchanges] use classmethods for autofilled exchanges
13
+ - [Portfolio] add time window in history select
14
+
7
15
  ## [2.4.99] - 2024-08-19
8
16
  ### Updated
9
17
  - [CCXT] updated to ccxt 4.3.85
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.99
3
+ Version: 2.4.100
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.99](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.100](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.99
3
+ Version: 2.4.100
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.99](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.100](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.99](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.100](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.99" # major.minor.revision
18
+ VERSION = "2.4.100" # major.minor.revision
@@ -138,9 +138,8 @@ def get_matrix_id_from_exchange_id(exchange_name: str, exchange_id: str) -> str:
138
138
 
139
139
  def get_all_exchange_ids_from_matrix_id(matrix_id) -> list:
140
140
  return [
141
- exchange_configuration.id
142
- for exchange_configuration in exchanges.Exchanges.instance().get_all_exchanges()
143
- if exchange_configuration.matrix_id == matrix_id
141
+ get_exchange_manager_id(exchange_manager)
142
+ for exchange_manager in exchanges.Exchanges.instance().get_exchanges_managers_with_matrix_id(matrix_id)
144
143
  ]
145
144
 
146
145
 
@@ -69,14 +69,18 @@ ENABLE_EXCHANGE_HTTP_PROXY_FROM_ENV = os_util.parse_boolean_environment_var(
69
69
  ENABLE_CCXT_VERBOSE = os_util.parse_boolean_environment_var("ENABLE_CCXT_VERBOSE", "False")
70
70
  ENABLE_CCXT_RATE_LIMIT = os_util.parse_boolean_environment_var("ENABLE_CCXT_RATE_LIMIT", "True")
71
71
  THROTTLED_WS_UPDATES = float(os.getenv("THROTTLED_WS_UPDATES", "0.1")) # avoid spamming CPU
72
- ENABLE_LIVE_CANDLES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_LIVE_CANDLES_STORAGE", "False")
73
- ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE", "False")
74
72
  MAX_CANDLES_IN_RAM = int(os.getenv("MAX_CANDLES_IN_RAM", "3000")) # max candles per CandlesManager
75
73
  STORAGE_ORIGIN_VALUE = "origin_value"
76
74
  DISPLAY_TIME_FRAME = commons_enums.TimeFrames.ONE_HOUR
77
75
  DEFAULT_SUBACCOUNT_ID = "default_subaccount_id"
78
76
  DEFAULT_ACCOUNT_ID = "default_account_id"
79
77
 
78
+ # Storage
79
+ ENABLE_LIVE_CANDLES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_LIVE_CANDLES_STORAGE", "False")
80
+ ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE", "False")
81
+ ENABLE_SIMULATED_ORDERS_STORAGE = os_util.parse_boolean_environment_var("ENABLE_SIMULATED_ORDERS_STORAGE", "False")
82
+ AUTH_UPDATE_DEBOUNCE_DURATION = float(os.getenv("AUTH_UPDATE_DEBOUNCE_DURATION", "10"))
83
+
80
84
  # Decimal default values (decimals are immutable, can be stored as constant)
81
85
  ZERO = decimal.Decimal(0)
82
86
  ONE = decimal.Decimal(1)
@@ -102,8 +102,13 @@ class ExchangeBuilder:
102
102
  raise e
103
103
 
104
104
  def _register_trading_modes_requirements(self, trading_mode_class, tentacles_setup_config):
105
- self.exchange_manager.is_trading = trading_mode_class.get_is_trading_on_exchange(self.exchange_name,
106
- tentacles_setup_config)
105
+ self.exchange_manager.is_trading = trading_mode_class.get_is_trading_on_exchange(
106
+ self.exchange_name, tentacles_setup_config
107
+ )
108
+ if not self.exchange_manager.is_trading:
109
+ self.logger.info(
110
+ f"{self.exchange_manager.exchange_name} exchange is configured not to apply any trading strategy."
111
+ )
107
112
  # take trading modes candles requirements into account if any
108
113
  self.config[commons_constants.CONFIG_TENTACLES_REQUIRED_CANDLES_COUNT] = max(
109
114
  self.config[commons_constants.CONFIG_TENTACLES_REQUIRED_CANDLES_COUNT],
@@ -59,6 +59,18 @@ class Exchanges(singleton.Singleton):
59
59
  def get_exchanges_list(self, exchange_name) -> list:
60
60
  return list(self.exchanges[exchange_name].values())
61
61
 
62
+ def get_exchanges_managers_with_matrix_id(self, matrix_id: str) -> list:
63
+ return [
64
+ exchange_configuration.exchange_manager
65
+ for exchange_configuration in self.get_all_exchanges()
66
+ if exchange_configuration.matrix_id == matrix_id
67
+ ]
68
+
69
+ def get_exchanges_managers_with_same_matrix_id(self, exchange_manager) -> list:
70
+ return self.get_exchanges_managers_with_matrix_id(
71
+ self.get_exchange(exchange_manager.exchange_name, exchange_manager.id).matrix_id
72
+ )
73
+
62
74
  def del_exchange(self, exchange_name, exchange_manager_id, should_warn=True) -> None:
63
75
  try:
64
76
  self.exchanges[exchange_name].pop(exchange_manager_id, None)
@@ -950,8 +950,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
950
950
  ):
951
951
  raise NotImplementedError("fetch_exchange_config")
952
952
 
953
- @staticmethod
954
- def supported_autofill_exchanges(tentacle_config):
953
+ @classmethod
954
+ def supported_autofill_exchanges(cls, tentacle_config):
955
955
  raise NotImplementedError("supported_autofill_exchanges is not implemented")
956
956
 
957
957
  @classmethod
@@ -447,9 +447,9 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
447
447
  """
448
448
 
449
449
  @classmethod
450
- def get_required_strategies_names_and_count(cls,
451
- tentacles_config: tm_configuration.TentaclesSetupConfiguration,
452
- trading_mode_config=None):
450
+ def get_required_strategies_names_and_count(
451
+ cls, tentacles_config: tm_configuration.TentaclesSetupConfiguration, trading_mode_config=None
452
+ ):
453
453
  config = trading_mode_config or tentacles_manager_api.get_tentacle_config(tentacles_config, cls)
454
454
  if constants.TRADING_MODE_REQUIRED_STRATEGIES in config:
455
455
  return config[constants.TRADING_MODE_REQUIRED_STRATEGIES], cls.get_required_strategies_count(config)
@@ -47,12 +47,14 @@ def get_activated_trading_mode(tentacles_setup_config):
47
47
 
48
48
  if trading_mode_class is not None:
49
49
  return trading_mode_class
50
- except ModuleNotFoundError as e:
51
- logging.get_logger("get_activated_trading_mode").error(f"Error when loading "
52
- f"the activated trading mode: {e}")
50
+ except ModuleNotFoundError as err:
51
+ logging.get_logger("get_activated_trading_mode").error(
52
+ f"Error when loading the activated trading mode: {err}"
53
+ )
53
54
 
54
- raise errors.ConfigTradingError(f"Please ensure your tentacles configuration file is valid and "
55
- f"at least one trading mode is activated")
55
+ raise errors.ConfigTradingError(
56
+ "Please ensure your tentacles configuration file is valid and that a trading mode is activated"
57
+ )
56
58
 
57
59
 
58
60
  def should_emit_trading_signals_user_input(trading_mode, inputs: dict):
@@ -20,9 +20,11 @@ import octobot_commons.channels_name as channels_name
20
20
  import octobot_commons.logging as logging
21
21
  import octobot_commons.enums as enums
22
22
  import octobot_commons.constants as commons_constants
23
+ import octobot_commons.errors as commons_errors
23
24
 
24
25
  import octobot_trading.errors as errors
25
26
  import octobot_trading.exchanges as exchanges
27
+ import octobot_trading.modes as modes
26
28
  import octobot_trading.util as util
27
29
 
28
30
  OCTOBOT_CHANNEL_TRADING_CONSUMER_LOGGER_TAG = "OctoBotChannelTradingConsumer"
@@ -70,6 +72,14 @@ async def _handle_creation(bot_id, action, data):
70
72
  .has_matrix(data[OctoBotChannelTradingDataKeys.MATRIX_ID.value]) \
71
73
  .use_tentacles_setup_config(data[OctoBotChannelTradingDataKeys.TENTACLES_SETUP_CONFIG.value]) \
72
74
  .set_bot_id(bot_id)
75
+ try:
76
+ modes.get_activated_trading_mode(data[OctoBotChannelTradingDataKeys.TENTACLES_SETUP_CONFIG.value])
77
+ except commons_errors.ConfigTradingError:
78
+ logging.get_logger(OCTOBOT_CHANNEL_TRADING_CONSUMER_LOGGER_TAG).error(
79
+ f"No configured trading mode. in order to trade, selected a profile with a trading mode."
80
+ )
81
+ # do not raise on missing trading mode
82
+ exchange_builder.disable_trading_mode()
73
83
  _set_exchange_type_details(exchange_builder, config, data[OctoBotChannelTradingDataKeys.BACKTESTING.value])
74
84
  await exchange_builder.build()
75
85
  await channel_instances.get_chan_at_id(
@@ -157,10 +157,13 @@ class HistoricalPortfolioValueManager(util.Initializable):
157
157
  """
158
158
  to_timestamp = to_timestamp or self.portfolio_manager.exchange_manager.exchange.get_exchange_current_time()
159
159
  time_frame_seconds = commons_enums.TimeFramesMinutes[time_frame] * commons_constants.MINUTE_TO_SECONDS
160
+ sorted_available_timestamps = list(self.historical_portfolio_value)
160
161
  relevant_historical_values = [
161
162
  value
162
163
  for timestamp, value in self.historical_portfolio_value.items()
163
- if self._is_historical_timestamp_relevant(timestamp, time_frame_seconds, from_timestamp, to_timestamp)
164
+ if self._is_historical_timestamp_relevant(
165
+ timestamp, time_frame_seconds, from_timestamp, to_timestamp, sorted_available_timestamps
166
+ )
164
167
  ]
165
168
  historical_values = {}
166
169
  for historical_value in relevant_historical_values:
@@ -252,15 +255,34 @@ class HistoricalPortfolioValueManager(util.Initializable):
252
255
  if currency not in self.historical_starting_portfolio_values:
253
256
  self.historical_starting_portfolio_values[currency] = value.get(currency)
254
257
 
255
- def _is_historical_timestamp_relevant(self, timestamp, time_frame_seconds, from_timestamp, to_timestamp):
258
+ def _is_historical_timestamp_relevant(
259
+ self, timestamp, time_frame_seconds, from_timestamp, to_timestamp, sorted_available_timestamps: list
260
+ ):
256
261
  from_timestamp = from_timestamp or 0
257
262
  to_timestamp = to_timestamp or time.time()
258
- return self._is_timestamp_relevant(timestamp, time_frame_seconds) and \
263
+ return self._is_timestamp_relevant(timestamp, time_frame_seconds, sorted_available_timestamps) and \
259
264
  from_timestamp <= timestamp <= to_timestamp
260
265
 
261
266
  @staticmethod
262
- def _is_timestamp_relevant(timestamp, time_frame_seconds):
263
- return timestamp % time_frame_seconds == 0
267
+ def _is_timestamp_relevant(timestamp, time_frame_seconds, sorted_available_timestamps: list):
268
+ if timestamp % time_frame_seconds == 0:
269
+ # timestamp is expected at this time
270
+ return True
271
+ else:
272
+ # timestamp is relevant only if there is no other available timestamp within the given timeframe range
273
+ current_timestamp_index = sorted_available_timestamps.index(timestamp)
274
+ allowed_delta = time_frame_seconds / 2
275
+ previous_timestamp = (
276
+ sorted_available_timestamps[current_timestamp_index - 1]
277
+ if current_timestamp_index > 0
278
+ else 0
279
+ )
280
+ next_timestamp = (
281
+ sorted_available_timestamps[current_timestamp_index + 1]
282
+ if current_timestamp_index < len(sorted_available_timestamps) - 1
283
+ else (timestamp + allowed_delta)
284
+ )
285
+ return previous_timestamp + allowed_delta <= timestamp <= next_timestamp - allowed_delta
264
286
 
265
287
  @staticmethod
266
288
  def convert_to_historical_timestamp(timestamp, time_frame):
@@ -31,7 +31,6 @@ class AbstractStorage:
31
31
  LIVE_CHANNEL = None
32
32
  IS_HISTORICAL = True
33
33
  HISTORY_TABLE = None
34
- AUTH_UPDATE_DEBOUNCE_DURATION = 10
35
34
  FLUSH_DEBOUNCE_DURATION = 5 # avoid disc spam on multiple quick live updated
36
35
 
37
36
  def __init__(self, exchange_manager, plot_settings: commons_display.PlotSettings,
@@ -123,7 +122,7 @@ class AbstractStorage:
123
122
 
124
123
  async def _waiting_update_auth_data(self, reset):
125
124
  try:
126
- await asyncio.sleep(self.AUTH_UPDATE_DEBOUNCE_DURATION)
125
+ await asyncio.sleep(trading_constants.AUTH_UPDATE_DEBOUNCE_DURATION)
127
126
  await self._update_auth_data(reset)
128
127
  except Exception as err:
129
128
  logging.get_logger(self.__class__.__name__).exception(err, True, f"Error when updating auth data: {err}")
@@ -27,6 +27,7 @@ import octobot_trading.enums as enums
27
27
  import octobot_trading.constants as constants
28
28
  import octobot_trading.storage.abstract_storage as abstract_storage
29
29
  import octobot_trading.storage.util as storage_util
30
+ import octobot_trading.exchanges as exchanges
30
31
 
31
32
 
32
33
  class OrdersStorage(abstract_storage.AbstractStorage):
@@ -36,13 +37,16 @@ class OrdersStorage(abstract_storage.AbstractStorage):
36
37
  ENABLE_HISTORICAL_ORDER_UPDATES_STORAGE = constants.ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE
37
38
 
38
39
  def __init__(self, exchange_manager, use_live_consumer_in_backtesting=None, is_historical=None):
39
- super().__init__(exchange_manager, plot_settings=None,
40
- use_live_consumer_in_backtesting=use_live_consumer_in_backtesting, is_historical=is_historical)
40
+ super().__init__(
41
+ exchange_manager, plot_settings=None,
42
+ use_live_consumer_in_backtesting=use_live_consumer_in_backtesting, is_historical=is_historical
43
+ )
41
44
  self.startup_orders = {}
42
45
 
43
46
  def should_store_data(self):
44
- return not self.exchange_manager.is_trader_simulated \
45
- and not self.exchange_manager.is_backtesting
47
+ return (
48
+ constants.ENABLE_SIMULATED_ORDERS_STORAGE or not self.exchange_manager.is_trader_simulated
49
+ ) and not self.exchange_manager.is_backtesting
46
50
 
47
51
  async def on_start(self):
48
52
  await self._load_startup_orders()
@@ -86,13 +90,19 @@ class OrdersStorage(abstract_storage.AbstractStorage):
86
90
 
87
91
  async def _update_auth_data(self, _):
88
92
  authenticator = authentication.Authenticator.instance()
89
- snapshot = [
90
- _format_order(order, self.exchange_manager)
91
- for order in self.exchange_manager.exchange_personal_data.orders_manager.get_open_orders()
92
- ]
93
+
94
+ orders_by_exchange = {
95
+ exchange_manager.exchange_name: [
96
+ _format_order(order, exchange_manager)
97
+ for order in exchange_manager.exchange_personal_data.orders_manager.get_open_orders()
98
+ ]
99
+ for exchange_manager in exchanges.Exchanges.instance().get_exchanges_managers_with_same_matrix_id(
100
+ self.exchange_manager
101
+ )
102
+ }
93
103
  if authenticator.is_initialized():
94
104
  # also update when history is empty to reset trade history
95
- await authenticator.update_orders(snapshot, self.exchange_manager.exchange_name)
105
+ await authenticator.update_orders(orders_by_exchange)
96
106
 
97
107
  async def _store_history(self):
98
108
  await self._update_history()
@@ -17,10 +17,12 @@ import octobot_commons.enums as commons_enums
17
17
  import octobot_commons.authentication as authentication
18
18
  import octobot_commons.databases as commons_databases
19
19
  import octobot_commons.tree as commons_tree
20
+ import octobot_commons.constants as commons_constants
20
21
 
21
22
  import octobot_trading.storage.abstract_storage as abstract_storage
22
23
  import octobot_trading.storage.util as storage_util
23
24
  import octobot_trading.personal_data.portfolios.history as portfolio_history
25
+ import octobot_trading.exchanges as exchanges
24
26
 
25
27
 
26
28
  class PortfolioStorage(abstract_storage.AbstractStorage):
@@ -57,19 +59,22 @@ class PortfolioStorage(abstract_storage.AbstractStorage):
57
59
  await self.trigger_debounced_update_auth_data(reset)
58
60
 
59
61
  async def _update_auth_data(self, reset):
60
- hist_portfolio_values_manager = self.exchange_manager.exchange_personal_data. \
61
- portfolio_manager.historical_portfolio_value_manager
62
62
  authenticator = authentication.Authenticator.instance()
63
- full_history = hist_portfolio_values_manager.get_dict_historical_values()
64
- history = [
65
- history_val
66
- for history_val in full_history
67
- if history_val[portfolio_history.HistoricalAssetValue.TIMESTAMP_KEY] in self._to_update_auth_data_ids_buffer
68
- ]
69
- if full_history and authenticator.is_initialized():
70
- initializing_prices = hist_portfolio_values_manager.portfolio_manager.portfolio_value_holder.\
71
- value_converter.initializing_symbol_prices_pairs
72
- if initializing_prices:
63
+ if not authenticator.is_initialized():
64
+ return
65
+ current_value = 0
66
+ initial_value_by_timestamp = {}
67
+ reference_market = None
68
+ ending_portfolio = {}
69
+ price_by_asset = {}
70
+ historical_value_by_timestamp = {}
71
+ for exchange_manager in exchanges.Exchanges.instance().get_exchanges_managers_with_same_matrix_id(
72
+ self.exchange_manager
73
+ ):
74
+ hist_portfolio_values_manager = exchange_manager.exchange_personal_data. \
75
+ portfolio_manager.historical_portfolio_value_manager
76
+ if initializing_prices := hist_portfolio_values_manager.portfolio_manager.portfolio_value_holder.\
77
+ value_converter.initializing_symbol_prices_pairs:
73
78
  for symbol in initializing_prices:
74
79
  await commons_tree.EventProvider.instance().wait_for_event(
75
80
  self.exchange_manager.bot_id,
@@ -80,20 +85,54 @@ class PortfolioStorage(abstract_storage.AbstractStorage):
80
85
  ),
81
86
  self.PRICE_INIT_TIMEOUT
82
87
  )
83
- # skip portfolio history on simulated trading
84
- histories = {} if self.exchange_manager.is_trader_simulated else {
85
- history_val[portfolio_history.HistoricalAssetValue.TIMESTAMP_KEY]:
86
- history_val[portfolio_history.HistoricalAssetValue.VALUES_KEY]
87
- for history_val in history
88
- }
88
+ full_history = hist_portfolio_values_manager.get_dict_historical_values()
89
+ if not (full_history and hist_portfolio_values_manager.ending_portfolio):
90
+ continue
91
+ reference_market = hist_portfolio_values_manager.portfolio_manager.reference_market
92
+ price_by_asset.update(
93
+ hist_portfolio_values_manager.portfolio_manager.portfolio_value_holder.current_crypto_currencies_values
94
+ )
95
+ if hist_portfolio_values_manager.ending_portfolio:
96
+ for asset, value in hist_portfolio_values_manager.ending_portfolio.items():
97
+ if asset not in ending_portfolio:
98
+ ending_portfolio[asset] = {
99
+ commons_constants.PORTFOLIO_AVAILABLE: 0,
100
+ commons_constants.PORTFOLIO_TOTAL: 0
101
+ }
102
+ ending_portfolio[asset][commons_constants.PORTFOLIO_AVAILABLE] += \
103
+ value[commons_constants.PORTFOLIO_AVAILABLE]
104
+ ending_portfolio[asset][commons_constants.PORTFOLIO_TOTAL] += \
105
+ value[commons_constants.PORTFOLIO_TOTAL]
106
+ current_value += full_history[-1][portfolio_history.HistoricalAssetValue.VALUES_KEY].get(reference_market, 0)
107
+ min_ts = full_history[0][portfolio_history.HistoricalAssetValue.TIMESTAMP_KEY]
108
+ initial_value_by_timestamp[min_ts] = initial_value_by_timestamp.get(min_ts, 0) + \
109
+ full_history[0][portfolio_history.HistoricalAssetValue.VALUES_KEY].get(reference_market, 0)
110
+ history = [
111
+ history_val
112
+ for history_val in hist_portfolio_values_manager.get_dict_historical_values()
113
+ if history_val[portfolio_history.HistoricalAssetValue.TIMESTAMP_KEY] in self._to_update_auth_data_ids_buffer
114
+ ]
115
+ if not self.exchange_manager.is_trader_simulated:
116
+ # skip portfolio history on simulated trading
117
+ for history_val in history:
118
+ ts = history_val[portfolio_history.HistoricalAssetValue.TIMESTAMP_KEY]
119
+ value = history_val[portfolio_history.HistoricalAssetValue.VALUES_KEY]
120
+ if ts in historical_value_by_timestamp:
121
+ historical_value_by_timestamp[ts] += value
122
+ else:
123
+ historical_value_by_timestamp[ts] = value
124
+
125
+ if current_value:
126
+ # only consider the initial value of the min timestamp
127
+ initial_value = initial_value_by_timestamp[min(initial_value_by_timestamp)]
89
128
  await authenticator.update_portfolio(
90
- full_history[-1][portfolio_history.HistoricalAssetValue.VALUES_KEY],
91
- full_history[0][portfolio_history.HistoricalAssetValue.VALUES_KEY],
92
- float(hist_portfolio_values_manager.portfolio_manager.portfolio_profitability.profitability_percent),
93
- hist_portfolio_values_manager.portfolio_manager.reference_market,
94
- hist_portfolio_values_manager.ending_portfolio,
95
- histories,
96
- hist_portfolio_values_manager.portfolio_manager.portfolio_value_holder.current_crypto_currencies_values,
129
+ {reference_market: current_value},
130
+ {reference_market: initial_value},
131
+ (100 * current_value / initial_value) - 100,
132
+ reference_market,
133
+ ending_portfolio,
134
+ historical_value_by_timestamp,
135
+ price_by_asset,
97
136
  reset
98
137
  )
99
138
  self._to_update_auth_data_ids_buffer.clear()
@@ -8,7 +8,6 @@ OctoBot-Tentacles-Manager>=2.9, <2.10
8
8
  trading-backend>=1.2.7
9
9
 
10
10
  # Exchange connection requirements
11
- # issue from 96, need ccxt==4.2.99
12
11
  ccxt==4.3.85 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
13
12
 
14
13
  cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)
@@ -101,8 +101,8 @@ class MockedAutoFillRestExchange(MockedRestExchange):
101
101
  ):
102
102
  pass
103
103
 
104
- @staticmethod
105
- def supported_autofill_exchanges(tentacle_config):
104
+ @classmethod
105
+ def supported_autofill_exchanges(cls, tentacle_config):
106
106
  return MockedAutoFillRestExchange._SUPPORTED_EXCHANGE_MOCK
107
107
 
108
108
  @classmethod
@@ -521,7 +521,10 @@ async def test_get_historical_values(historical_portfolio_value_manager):
521
521
  time_manager.current_timestamp = late_timestamp
522
522
  await historical_portfolio_value_manager.on_new_value(late_timestamp, late_values, save_changes=False)
523
523
  assert historical_portfolio_value_manager.get_historical_values("USD", commons_enums.TimeFrames.ONE_DAY) == \
524
- {friday_timestamp: 3010, sunday_timestamp: 3, today_timestamp: 54}
524
+ {
525
+ friday_timestamp: 3010, sunday_timestamp: 3, today_timestamp: 54,
526
+ late_timestamp: 88 # window select include latest value
527
+ }
525
528
  historical_portfolio_value_manager.logger.debug.assert_called_once()
526
529
  historical_portfolio_value_manager.logger.debug.reset_mock()
527
530
  assert historical_portfolio_value_manager.get_historical_values("BTC", commons_enums.TimeFrames.ONE_HOUR) == \
@@ -529,6 +532,14 @@ async def test_get_historical_values(historical_portfolio_value_manager):
529
532
  late_timestamp: 77}
530
533
  historical_portfolio_value_manager.logger.debug.assert_called_once()
531
534
  historical_portfolio_value_manager.logger.debug.reset_mock()
535
+ # with ask timeframe that doesn't round with stored values: adapt select window
536
+ assert historical_portfolio_value_manager.get_historical_values("BTC", commons_enums.TimeFrames.FOUR_HOURS) == \
537
+ {
538
+ friday_timestamp: 1.1, saturday_timestamp: 1.3, today_timestamp: 11, today_hour_timestamp: 11,
539
+ late_timestamp: 77
540
+ }
541
+ historical_portfolio_value_manager.logger.debug.assert_called_once()
542
+ historical_portfolio_value_manager.logger.debug.reset_mock()
532
543
 
533
544
  # add 1h missing value to convertable pairs
534
545
  convertable_pair = "BTC/USD"
@@ -151,6 +151,19 @@ class RealExchangeTester:
151
151
  async with self.get_exchange_manager() as exchange_manager:
152
152
  return exchange_manager.exchange.time_frames
153
153
 
154
+ async def test_active_symbols(self):
155
+ raise NotImplementedError("test_active_symbols is not implemented")
156
+
157
+ async def inner_test_active_symbols(self, expected_active_symbols_count: int, expected_total_symbols_count: int):
158
+ async with self.get_exchange_manager() as exchange_manager:
159
+ # ensure active symbols are correctly parsed by ccxt
160
+ active_symbols = exchange_manager.exchange.connector.get_client_symbols(active_only=True)
161
+ assert expected_active_symbols_count <= len(active_symbols) <= expected_active_symbols_count * 1.5, \
162
+ f"{len(active_symbols)=}, {expected_active_symbols_count=}"
163
+ all_symbols = exchange_manager.exchange.connector.get_client_symbols(active_only=False)
164
+ assert expected_total_symbols_count <= len(all_symbols) <= expected_total_symbols_count * 1.5, \
165
+ f"{len(all_symbols)=}, {expected_total_symbols_count=}"
166
+
154
167
  async def get_market_statuses(self):
155
168
  # return 2 different market status with different traded pairs to reduce possible
156
169
  # side effects using only one pair.
@@ -50,6 +50,9 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
50
50
  TimeFrames.ONE_MONTH.value
51
51
  ))
52
52
 
53
+ async def test_active_symbols(self):
54
+ await self.inner_test_active_symbols(500, 1000)
55
+
53
56
  async def test_get_market_status(self):
54
57
  for market_status in await self.get_market_statuses():
55
58
  self.ensure_required_market_status_values(market_status)
@@ -54,6 +54,10 @@ class TestBinanceRealExchangeTester(RealExchangeTester):
54
54
  TimeFrames.ONE_MONTH.value
55
55
  ))
56
56
 
57
+ async def test_active_symbols(self):
58
+ # binanceus numbers
59
+ await self.inner_test_active_symbols(150, 500)
60
+
57
61
  async def test_get_market_status(self):
58
62
  for market_status in await self.get_market_statuses():
59
63
  self.ensure_required_market_status_values(market_status)
@@ -57,6 +57,9 @@ class TestBinanceFuturesRealExchangeTester(RealFuturesExchangeTester):
57
57
  TimeFrames.ONE_MONTH.value
58
58
  ))
59
59
 
60
+ async def test_active_symbols(self):
61
+ await self.inner_test_active_symbols(1500, 3000)
62
+
60
63
  async def test_get_market_status(self):
61
64
  for market_status in await self.get_market_statuses():
62
65
  self.ensure_required_market_status_values(market_status)
@@ -54,6 +54,9 @@ class TestBingxRealExchangeTester(RealExchangeTester):
54
54
  TimeFrames.ONE_MONTH.value
55
55
  ))
56
56
 
57
+ async def test_active_symbols(self):
58
+ await self.inner_test_active_symbols(1000, 1200)
59
+
57
60
  async def test_get_market_status(self):
58
61
  for market_status in await self.get_market_statuses():
59
62
  # on Bingx, precision is a decimal instead of a number of digits
@@ -53,6 +53,9 @@ class TestBitfinexRealExchangeTester(RealExchangeTester):
53
53
  TimeFrames.ONE_MONTH.value
54
54
  ))
55
55
 
56
+ async def test_active_symbols(self):
57
+ await self.inner_test_active_symbols(500, 500)
58
+
56
59
  async def test_get_market_status(self):
57
60
  for market_status in await self.get_market_statuses():
58
61
  self.ensure_required_market_status_values(market_status)
@@ -55,6 +55,9 @@ class TestBitgetRealExchangeTester(RealExchangeTester):
55
55
  # TimeFrames.ONE_MONTH.value
56
56
  ))
57
57
 
58
+ async def test_active_symbols(self):
59
+ await self.inner_test_active_symbols(1000, 1200)
60
+
58
61
  async def test_get_market_status(self):
59
62
  for market_status in await self.get_market_statuses():
60
63
  self.ensure_required_market_status_values(market_status)
@@ -48,6 +48,9 @@ class TestBithumbRealExchangeTester(RealExchangeTester):
48
48
  TimeFrames.ONE_DAY.value,
49
49
  ))
50
50
 
51
+ async def test_active_symbols(self):
52
+ await self.inner_test_active_symbols(300, 300)
53
+
51
54
  async def test_get_market_status(self):
52
55
  for market_status in await self.get_market_statuses():
53
56
  self.ensure_required_market_status_values(market_status)
@@ -50,6 +50,9 @@ class TestBitMartRealExchangeTester(RealExchangeTester):
50
50
  TimeFrames.ONE_MONTH.value,
51
51
  ))
52
52
 
53
+ async def test_active_symbols(self):
54
+ await self.inner_test_active_symbols(1700, 1700)
55
+
53
56
  async def test_get_market_status(self):
54
57
  for market_status in await self.get_market_statuses():
55
58
  self.ensure_required_market_status_values(market_status)
@@ -47,6 +47,9 @@ class TestBitsoRealExchangeTester(RealExchangeTester):
47
47
  TimeFrames.ONE_WEEK.value,
48
48
  ))
49
49
 
50
+ async def test_active_symbols(self):
51
+ await self.inner_test_active_symbols(90, 90)
52
+
50
53
  async def test_get_market_status(self):
51
54
  for market_status in await self.get_market_statuses():
52
55
  self.ensure_required_market_status_values(market_status)