OctoBot-Trading 2.4.66__tar.gz → 2.4.68__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 (476) hide show
  1. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/CHANGELOG.md +9 -0
  2. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/OctoBot_Trading.egg-info/SOURCES.txt +1 -0
  4. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/OctoBot_Trading.egg-info/requires.txt +1 -1
  5. {OctoBot-Trading-2.4.66/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.68}/PKG-INFO +2 -2
  6. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/README.md +1 -1
  7. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/__init__.py +1 -1
  8. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/__init__.py +2 -0
  9. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/modes.py +4 -0
  10. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/constants.py +1 -0
  11. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/enums.py +6 -0
  12. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/__init__.py +6 -0
  13. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/abstract_trading_mode.py +4 -1
  14. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/channel/abstract_mode_consumer.py +21 -15
  15. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/channel/abstract_mode_producer.py +13 -0
  16. OctoBot-Trading-2.4.68/octobot_trading/modes/mode_activity.py +24 -0
  17. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -16
  18. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +8 -4
  19. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/order.py +1 -1
  20. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +13 -0
  21. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +46 -11
  22. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/requirements.txt +1 -1
  23. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -18
  24. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/basic_keywords/test_amount.py +21 -12
  25. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/test_abstract_mode_consumer.py +2 -36
  26. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_order_factory.py +48 -24
  27. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_order_util.py +9 -0
  28. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/test_portfolio_value_holder.py +153 -0
  29. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/LICENSE +0 -0
  30. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/MANIFEST.in +0 -0
  31. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  32. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  33. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  34. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/channels.py +0 -0
  35. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/contracts.py +0 -0
  36. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/exchange.py +0 -0
  37. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/orders.py +0 -0
  38. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/portfolio.py +0 -0
  39. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/positions.py +0 -0
  40. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/profitability.py +0 -0
  41. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/storage.py +0 -0
  42. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/symbol_data.py +0 -0
  43. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/trader.py +0 -0
  44. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/api/trades.py +0 -0
  45. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/errors.py +0 -0
  46. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_channel.py +0 -0
  47. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/__init__.py +0 -0
  48. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  49. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  50. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  51. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  52. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  53. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  54. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  57. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  58. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  59. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  60. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  61. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  63. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  64. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  65. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  66. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  68. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  69. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  71. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  72. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  73. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  74. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  77. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  78. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  79. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  80. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  83. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  84. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  86. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  87. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  90. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  91. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  92. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  93. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  96. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  97. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  98. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  99. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  101. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  102. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  104. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/config/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  106. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  107. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  110. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  111. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  112. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  113. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  114. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  115. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  116. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  118. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  119. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  120. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchange_builder.py +0 -0
  121. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchange_channels.py +0 -0
  122. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchange_details.py +0 -0
  123. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchange_factory.py +0 -0
  124. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchange_manager.py +0 -0
  125. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  126. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/exchanges.py +0 -0
  127. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  129. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  130. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  131. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/traders/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/traders/trader.py +0 -0
  133. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  134. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/types/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  136. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  137. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/util/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  139. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  140. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  141. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  142. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/channel/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/channel/mode.py +0 -0
  144. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/mode_config.py +0 -0
  145. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/modes_factory.py +0 -0
  146. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/modes_util.py +0 -0
  147. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  149. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  150. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  151. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  152. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  153. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  154. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  155. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  156. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  157. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  158. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  159. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  161. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/octobot_channel_consumer.py +0 -0
  162. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/__init__.py +0 -0
  163. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  164. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  167. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  168. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  169. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  170. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  172. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  173. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  174. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  175. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  176. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/order_group.py +0 -0
  177. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/order_state.py +0 -0
  178. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/order_util.py +0 -0
  179. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  180. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  181. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  182. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  186. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  187. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  191. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  194. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  195. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  196. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  197. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  198. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  199. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  200. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  201. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  202. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  203. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  204. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  205. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  206. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  207. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  208. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  209. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  211. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  212. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  213. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  215. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  216. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  217. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  218. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  219. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  220. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  221. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  222. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  223. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  224. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  225. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  228. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  230. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  231. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/__init__.py +0 -0
  232. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  233. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  234. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  235. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  236. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/position.py +0 -0
  237. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  238. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/position_state.py +0 -0
  239. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/position_util.py +0 -0
  240. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  241. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  242. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  243. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  244. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  245. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  246. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  247. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  248. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  249. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/state.py +0 -0
  250. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  252. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  253. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  254. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/trade.py +0 -0
  255. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  256. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  257. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  258. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  259. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  260. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  261. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  262. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  263. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  268. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/channel/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  271. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  272. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/channel/signal_producer.py +0 -0
  273. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/signal_creation.py +0 -0
  274. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  275. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/signals/util.py +0 -0
  276. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/abstract_storage.py +0 -0
  278. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/candles_storage.py +0 -0
  279. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/orders_storage.py +0 -0
  280. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/portfolio_storage.py +0 -0
  281. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/storage_manager.py +0 -0
  282. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/trades_storage.py +0 -0
  283. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/transactions_storage.py +0 -0
  284. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/storage/util.py +0 -0
  285. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/supervisors/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  288. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/config_util.py +0 -0
  290. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/initializable.py +0 -0
  291. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/initialization_util.py +0 -0
  292. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/simulator_updater_utils.py +0 -0
  293. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/test_tools/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  295. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  297. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  298. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/setup.cfg +0 -0
  299. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/setup.py +0 -0
  300. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/__init__.py +0 -0
  301. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_channels.py +0 -0
  302. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_exchange.py +0 -0
  303. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_modes.py +0 -0
  304. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_orders.py +0 -0
  305. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_portfolio.py +0 -0
  306. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_profitability.py +0 -0
  307. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_symbol_data.py +0 -0
  308. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_trader.py +0 -0
  309. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/api/test_trades.py +0 -0
  310. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/cli/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/contracts/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  314. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  315. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/funding/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  317. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/kline/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  319. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/ohlcv/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  321. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  322. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/order_book/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  324. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/prices/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  326. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  327. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/recent_trades/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  329. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  330. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/ticker/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  332. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/connectors/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  336. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  337. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/implementations/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_abstract_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  342. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_exchange_builder.py +0 -0
  343. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_exchange_config_data.py +0 -0
  344. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_exchange_factory.py +0 -0
  345. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_exchange_manager.py +0 -0
  346. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_exchange_simulator.py +0 -0
  347. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/test_exchanges.py +0 -0
  348. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/traders/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/traders/test_trader.py +0 -0
  350. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/types/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  352. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/util/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  354. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/exchanges/util/test_exchange_util.py +0 -0
  355. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  359. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  360. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  362. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/test_abstract_trading_mode.py +0 -0
  363. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/modes/test_modes_util.py +0 -0
  364. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/groups/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  368. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  369. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  370. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/__init__.py +0 -0
  371. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  377. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  379. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  380. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  381. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_order.py +0 -0
  382. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_order_adapter.py +0 -0
  383. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_orders_manager.py +0 -0
  384. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  385. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  392. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  394. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/market/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  397. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  398. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  400. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  401. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  404. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  405. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  406. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/history/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  408. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  409. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/test_asset.py +0 -0
  410. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  411. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  412. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  413. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  414. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/types/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/channel/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/states/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/test_position.py +0 -0
  422. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/test_position_factory.py +0 -0
  423. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/test_positions_manager.py +0 -0
  424. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/types/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  426. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  427. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/trades/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/trades/test_trade_factory.py +0 -0
  429. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/trades/test_trade_manager.py +0 -0
  430. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  431. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/trades/test_trade_util.py +0 -0
  432. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/transactions/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  434. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  435. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/signals/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  437. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/signals/test_util.py +0 -0
  438. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/test_utils/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/test_utils/order_util.py +0 -0
  440. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/test_utils/random_numbers.py +0 -0
  441. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/util/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests/util/test_config_util.py +0 -0
  443. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  448. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_binance.py +0 -0
  449. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  450. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bingx.py +0 -0
  451. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  452. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bitget.py +0 -0
  453. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  454. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bitso.py +0 -0
  455. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  456. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bybit.py +0 -0
  457. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  458. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  459. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_coinex.py +0 -0
  460. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  461. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_gateio.py +0 -0
  462. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  463. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  464. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_htx.py +0 -0
  465. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_kraken.py +0 -0
  466. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  467. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  468. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_mexc.py +0 -0
  469. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_ndax.py +0 -0
  470. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  471. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_okx.py +0 -0
  472. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  473. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_phemex.py +0 -0
  474. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  475. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_upbit.py +0 -0
  476. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.68}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,15 @@ 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.68] - 2024-03-25
8
+ ### Added
9
+ - [TradingMode] last_activity
10
+
11
+ ## [2.4.67] - 2024-03-23
12
+ ### Updated
13
+ - [TradingMode] Requirements for indexes
14
+ - [Orders] Use creation_time in to_dict
15
+
7
16
  ## [2.4.66] - 2024-03-19
8
17
  ### Updated
9
18
  - [CCXT] to 4.2.77
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.66
3
+ Version: 2.4.68
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.66](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.68](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)
@@ -126,6 +126,7 @@ octobot_trading/exchanges/util/symbol_details.py
126
126
  octobot_trading/exchanges/util/websockets_util.py
127
127
  octobot_trading/modes/__init__.py
128
128
  octobot_trading/modes/abstract_trading_mode.py
129
+ octobot_trading/modes/mode_activity.py
129
130
  octobot_trading/modes/mode_config.py
130
131
  octobot_trading/modes/modes_factory.py
131
132
  octobot_trading/modes/modes_util.py
@@ -1,7 +1,7 @@
1
1
  numpy==1.26.3
2
2
  OctoBot-Backtesting<1.10,>=1.9
3
3
  Async-Channel<2.3,>=2.2
4
- OctoBot-Commons<1.10,>=1.9
4
+ OctoBot-Commons<1.10,>=1.9.43
5
5
  OctoBot-Tentacles-Manager<2.10,>=2.9
6
6
  trading-backend>=1.2.7
7
7
  ccxt==4.2.77
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.66
3
+ Version: 2.4.68
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.66](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.68](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.66](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.68](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.66" # major.minor.revision
18
+ VERSION = "2.4.68" # major.minor.revision
@@ -126,6 +126,7 @@ from octobot_trading.api.exchange import (
126
126
  from octobot_trading.api.modes import (
127
127
  get_trading_modes,
128
128
  get_trading_mode_symbol,
129
+ is_trading_mode_symbol_wildcard,
129
130
  get_trading_mode_followed_strategy_signals_identifier,
130
131
  get_trading_mode_current_state,
131
132
  get_activated_trading_mode,
@@ -301,6 +302,7 @@ __all__ = [
301
302
  "stop_exchange",
302
303
  "get_trading_modes",
303
304
  "get_trading_mode_symbol",
305
+ "is_trading_mode_symbol_wildcard",
304
306
  "get_trading_mode_followed_strategy_signals_identifier",
305
307
  "get_trading_mode_current_state",
306
308
  "get_activated_trading_mode",
@@ -26,6 +26,10 @@ def get_trading_mode_symbol(trading_mode) -> list:
26
26
  return trading_mode.symbol
27
27
 
28
28
 
29
+ def is_trading_mode_symbol_wildcard(trading_mode) -> bool:
30
+ return trading_mode.get_is_symbol_wildcard()
31
+
32
+
29
33
  def get_trading_mode_followed_strategy_signals_identifier(trading_mode) -> str:
30
34
  if trading_mode.is_following_trading_signals():
31
35
  return trading_mode.trading_config.get(commons_constants.CONFIG_TRADING_SIGNALS_STRATEGY, "")
@@ -195,6 +195,7 @@ CANCEL_ORDER_STATUS_SCOPE = [enums.OrderStatus.PENDING_CANCEL,
195
195
 
196
196
  DEFAULT_INITIALIZATION_EVENT_TOPICS = [
197
197
  commons_enums.InitializationEventExchangeTopics.BALANCE,
198
+ commons_enums.InitializationEventExchangeTopics.PROFITABILITY,
198
199
  commons_enums.InitializationEventExchangeTopics.ORDERS,
199
200
  commons_enums.InitializationEventExchangeTopics.TRADES,
200
201
  commons_enums.InitializationEventExchangeTopics.CANDLES,
@@ -575,3 +575,9 @@ class OrderUpdateType(enum.Enum):
575
575
  class ExchangeSupportedElements(enum.Enum):
576
576
  UNSUPPORTED_ORDERS = "unsupported_orders"
577
577
  SUPPORTED_BUNDLED_ORDERS = "supported_bundled_orders"
578
+
579
+
580
+ class TradingModeActivityType(enum.Enum):
581
+ CREATED_ORDERS = "created_orders"
582
+ NOTHING_TO_DO = "nothing_to_do"
583
+ NO_ACTIVITY = None
@@ -58,6 +58,11 @@ from octobot_trading.modes.modes_factory import (
58
58
  create_temporary_trading_mode_with_local_config,
59
59
  )
60
60
 
61
+ from octobot_trading.modes import mode_activity
62
+ from octobot_trading.modes.mode_activity import (
63
+ TradingModeActivity,
64
+ )
65
+
61
66
  from octobot_trading.modes import modes_util
62
67
  from octobot_trading.modes.modes_util import (
63
68
  get_required_candles_count,
@@ -81,6 +86,7 @@ __all__ = [
81
86
  "create_trading_modes",
82
87
  "create_trading_mode",
83
88
  "create_temporary_trading_mode_with_local_config",
89
+ "TradingModeActivity",
84
90
  "get_activated_trading_mode",
85
91
  "should_emit_trading_signals_user_input",
86
92
  "is_trading_signal_emitter",
@@ -71,9 +71,12 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
71
71
  # The id of the OctoBot using this trading mode
72
72
  self.bot_id: str = None
73
73
 
74
- # Evaluator specific config (Is loaded from tentacle specific file)
74
+ # Trading Mode specific config (Is loaded from tentacle specific file)
75
75
  self.trading_config: dict = None
76
76
 
77
+ # Trading Mode specific config snapshot before a config update
78
+ self.previous_trading_config: dict = None
79
+
77
80
  # If this mode is enabled
78
81
  self.enabled: bool = True
79
82
 
@@ -69,17 +69,24 @@ class AbstractTradingModeConsumer(modes_channel.ModeChannelConsumer):
69
69
  f"the order being refused by the exchange.")
70
70
 
71
71
  def get_minimal_funds_error(self, symbol, final_note):
72
- market_status = self.exchange_manager.exchange.get_market_status(symbol, price_example=None, with_fixer=False)
73
- try:
74
- base, quote = symbol_util.parse_symbol(symbol).base_and_quote()
75
- portfolio = self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio
76
- funds = {
77
- base: portfolio.get_currency_portfolio(base),
78
- quote: portfolio.get_currency_portfolio(quote)
79
- }
80
- except Exception as err:
81
- self.logger.error(f"Error when getting funds for {symbol}: {err}")
82
- funds = {}
72
+ if symbol is None:
73
+ return (
74
+ f"Not enough funds to create new orders after {final_note} evaluation: "
75
+ f"{self.exchange_manager.exchange_name} exchange minimal order "
76
+ f"volume has not been reached."
77
+ )
78
+ else:
79
+ market_status = self.exchange_manager.exchange.get_market_status(symbol, price_example=None, with_fixer=False)
80
+ try:
81
+ base, quote = symbol_util.parse_symbol(symbol).base_and_quote()
82
+ portfolio = self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio
83
+ funds = {
84
+ base: portfolio.get_currency_portfolio(base),
85
+ quote: portfolio.get_currency_portfolio(quote)
86
+ }
87
+ except Exception as err:
88
+ self.logger.error(f"Error when getting funds for {symbol}: {err}")
89
+ funds = {}
83
90
  return (
84
91
  f"Not enough funds to create a new {symbol} order after {final_note} evaluation: "
85
92
  f"{self.exchange_manager.exchange_name} exchange minimal order "
@@ -135,6 +142,9 @@ class AbstractTradingModeConsumer(modes_channel.ModeChannelConsumer):
135
142
 
136
143
  # Can be overwritten
137
144
  async def can_create_order(self, symbol, state):
145
+ if symbol is None:
146
+ # can't check
147
+ return True
138
148
  currency, market = symbol_util.parse_symbol(symbol).base_and_quote()
139
149
  portfolio = self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio
140
150
 
@@ -191,10 +201,6 @@ class AbstractTradingModeConsumer(modes_channel.ModeChannelConsumer):
191
201
  self.logger.debug("can_create_order: return False")
192
202
  return False
193
203
 
194
- def get_holdings_ratio(self, currency):
195
- return self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder \
196
- .get_currency_holding_ratio(currency)
197
-
198
204
  def get_number_of_traded_assets(self):
199
205
  return len(self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder
200
206
  .origin_crypto_currencies_values)
@@ -35,6 +35,7 @@ import octobot_trading.exchanges.exchanges as exchanges
35
35
  import octobot_trading.exchange_channel as exchanges_channel
36
36
  import octobot_trading.modes.channel as modes_channel
37
37
  import octobot_trading.modes.script_keywords as script_keywords
38
+ import octobot_trading.modes.mode_activity as mode_activity
38
39
  import octobot_trading.storage.util as storage_util
39
40
 
40
41
 
@@ -95,6 +96,8 @@ class AbstractTradingModeProducer(modes_channel.ModeChannelProducer):
95
96
  self._is_trigger_completed = asyncio.Event()
96
97
  self._is_trigger_completed.set()
97
98
 
99
+ self.last_activity: mode_activity.TradingModeActivity = mode_activity.TradingModeActivity()
100
+
98
101
  def on_reload_config(self):
99
102
  """
100
103
  Called at constructor and after the associated trading mode's reload_config.
@@ -508,6 +511,16 @@ class AbstractTradingModeProducer(modes_channel.ModeChannelProducer):
508
511
  common_enums.InitializationEventExchangeTopics.CONTRACTS.value)
509
512
  await script_keywords.set_leverage(context, await script_keywords.user_select_leverage(context))
510
513
 
514
+ async def _wait_for_symbol_prices_and_profitability_init(self, timeout) -> bool:
515
+ try:
516
+ await util.wait_for_topic_init(self.exchange_manager, timeout,
517
+ common_enums.InitializationEventExchangeTopics.PRICE.value)
518
+ await util.wait_for_topic_init(self.exchange_manager, timeout,
519
+ common_enums.InitializationEventExchangeTopics.PROFITABILITY.value)
520
+ except (asyncio.TimeoutError, concurrent.futures.TimeoutError):
521
+ self.logger.error(f"Symbol price initialization took more than {timeout} seconds")
522
+ return False
523
+
511
524
  @classmethod
512
525
  def producer_exchange_wide_lock(cls, exchange_manager) -> asyncio_tools.RLock():
513
526
  try:
@@ -0,0 +1,24 @@
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 enum
18
+ import octobot_trading.enums
19
+
20
+
21
+ @dataclasses.dataclass
22
+ class TradingModeActivity:
23
+ type: enum.Enum = octobot_trading.enums.TradingModeActivityType.NO_ACTIVITY
24
+ details: dict = dataclasses.field(default_factory=dict)
@@ -71,22 +71,6 @@ async def available_account_balance(context, side=trading_enums.TradeOrderSide.B
71
71
  - already_locked_amount
72
72
 
73
73
 
74
- def get_holdings_value(context, assets, target_unit):
75
- total_value = trading_constants.ZERO
76
- portfolio = context.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio
77
- converter = context.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.value_converter
78
- for asset, asset_holdings in portfolio.items():
79
- if asset not in assets:
80
- continue
81
- try:
82
- total_value += converter.evaluate_value(
83
- asset, asset_holdings.total, raise_error=True, target_currency=target_unit, init_price_fetchers=False
84
- )
85
- except trading_errors.MissingPriceDataError:
86
- context.logger.info(f"Missing {asset} price conversion, ignoring {float(asset_holdings.total)} holdings.")
87
- return total_value
88
-
89
-
90
74
  def _get_locked_amount_in_stop_orders(context, side):
91
75
  locked_amount = trading_constants.ZERO
92
76
  for order in context.exchange_manager.exchange_personal_data.orders_manager.get_open_orders(context.symbol):
@@ -59,7 +59,10 @@ async def get_amount_from_input_amount(
59
59
  if not context.symbol:
60
60
  raise trading_errors.InvalidArgumentError(f"{amount_type} input types requires context.symbol to be set")
61
61
  base, quote = commons_symbols.parse_symbol(context.symbol).base_and_quote()
62
- total_symbol_assets_holdings_value = account_balance.get_holdings_value(context, (base, quote), base)
62
+ total_symbol_assets_holdings_value = context.exchange_manager.exchange_personal_data.portfolio_manager.\
63
+ portfolio_value_holder.get_assets_holdings_value(
64
+ (base, quote), commons_symbols.parse_symbol(context.symbol).base
65
+ )
63
66
  amount_value = total_symbol_assets_holdings_value * amount_value / trading_constants.ONE_HUNDRED
64
67
  elif amount_type is dsl.QuantityType.TRADED_SYMBOLS_ASSETS_PERCENT:
65
68
  if not context.symbol:
@@ -68,9 +71,10 @@ async def get_amount_from_input_amount(
68
71
  for symbol in context.exchange_manager.exchange_config.traded_symbols:
69
72
  assets.add(symbol.base)
70
73
  assets.add(symbol.quote)
71
- total_symbol_assets_holdings_value = account_balance.get_holdings_value(
72
- context, assets, commons_symbols.parse_symbol(context.symbol).base
73
- )
74
+ total_symbol_assets_holdings_value = context.exchange_manager.exchange_personal_data.portfolio_manager.\
75
+ portfolio_value_holder.get_assets_holdings_value(
76
+ assets, commons_symbols.parse_symbol(context.symbol).base
77
+ )
74
78
  amount_value = total_symbol_assets_holdings_value * amount_value / trading_constants.ONE_HUNDRED
75
79
  elif amount_type is dsl.QuantityType.POSITION_PERCENT:
76
80
  raise NotImplementedError(amount_type)
@@ -784,7 +784,7 @@ class Order(util.Initializable):
784
784
  enums.ExchangeConstantsOrderColumns.SYMBOL.value: self.symbol,
785
785
  enums.ExchangeConstantsOrderColumns.PRICE.value: filled_price,
786
786
  enums.ExchangeConstantsOrderColumns.STATUS.value: self.status.value,
787
- enums.ExchangeConstantsOrderColumns.TIMESTAMP.value: self.timestamp,
787
+ enums.ExchangeConstantsOrderColumns.TIMESTAMP.value: self.creation_time or self.timestamp,
788
788
  enums.ExchangeConstantsOrderColumns.TYPE.value: self.exchange_order_type.value
789
789
  if self.exchange_order_type else None,
790
790
  enums.ExchangeConstantsOrderColumns.SIDE.value: self.side.value,
@@ -15,6 +15,8 @@
15
15
  # License along with this library.
16
16
  import octobot_commons.logging as logging
17
17
  import octobot_commons.symbols as symbol_util
18
+ import octobot_commons.tree as commons_tree
19
+ import octobot_commons.enums as commons_enums
18
20
 
19
21
  import octobot_trading.util as util
20
22
  import octobot_trading.constants as constants
@@ -66,14 +68,25 @@ class PortfolioProfitability:
66
68
  """
67
69
  self._reset_before_profitability_calculation()
68
70
  try:
71
+ set_init_event = self.portfolio_manager.portfolio_value_holder.portfolio_current_value == constants.ZERO
69
72
  self.portfolio_manager.handle_profitability_recalculation(force_recompute_origin_portfolio)
70
73
  self._update_profitability_calculation()
74
+ if set_init_event:
75
+ self._set_initialized_event()
71
76
  return self.profitability_diff != constants.ZERO
72
77
  except KeyError as missing_data_exception:
73
78
  self.logger.warning(f"Missing {missing_data_exception} ticker data to calculate profitability")
74
79
  except Exception as missing_data_exception:
75
80
  self.logger.exception(missing_data_exception, True, str(missing_data_exception))
76
81
 
82
+ def _set_initialized_event(self):
83
+ commons_tree.EventProvider.instance().trigger_event(
84
+ self.portfolio_manager.exchange_manager.bot_id, commons_tree.get_exchange_path(
85
+ self.portfolio_manager.exchange_manager.exchange_name,
86
+ commons_enums.InitializationEventExchangeTopics.PROFITABILITY.value
87
+ )
88
+ )
89
+
77
90
  def _reset_before_profitability_calculation(self):
78
91
  """
79
92
  Prepare profitability calculation
@@ -20,6 +20,7 @@ import octobot_commons.symbols as symbol_util
20
20
 
21
21
  import octobot_trading.constants as constants
22
22
  import octobot_trading.errors as errors
23
+ import octobot_trading.enums as enums
23
24
  import octobot_trading.personal_data.portfolios.value_converter as value_converter
24
25
 
25
26
 
@@ -116,17 +117,51 @@ class PortfolioValueHolder:
116
117
  for currency in holdings.keys()
117
118
  }
118
119
 
119
- def get_currency_holding_ratio(self, currency):
120
- """
121
- Return the holdings ratio for the specified currency
122
- :return: the holdings ratio
123
- """
124
- if self.portfolio_current_value:
125
- return self.value_converter.evaluate_value(
126
- currency,
127
- self.portfolio_manager.portfolio.get_currency_portfolio(currency).total
128
- ) / self.portfolio_current_value
129
- return constants.ZERO
120
+ def get_assets_holdings_value(self, assets, target_unit, init_price_fetchers=False):
121
+ total_value = constants.ZERO
122
+ for asset, asset_holdings in self.portfolio_manager.portfolio.portfolio.items():
123
+ if asset not in assets:
124
+ continue
125
+ try:
126
+ total_value += self.value_converter.evaluate_value(
127
+ asset, asset_holdings.total, raise_error=True,
128
+ target_currency=target_unit, init_price_fetchers=init_price_fetchers
129
+ )
130
+ except errors.MissingPriceDataError:
131
+ self.logger.info(f"Missing {asset} price conversion, ignoring {float(asset_holdings.total)} holdings.")
132
+ return total_value
133
+
134
+ def get_traded_assets_holdings_value(self, unit):
135
+ assets = set()
136
+ for symbol in self.portfolio_manager.exchange_manager.exchange_config.traded_symbols:
137
+ assets.add(symbol.base)
138
+ assets.add(symbol.quote)
139
+ return self.get_assets_holdings_value(
140
+ assets, unit
141
+ )
142
+
143
+ def get_holdings_ratio(self, currency, traded_symbols_only=False, include_assets_in_open_orders=False):
144
+ if traded_symbols_only:
145
+ total_holdings_value = self.get_traded_assets_holdings_value(self.portfolio_manager.reference_market)
146
+ else:
147
+ # consider all assets for total_holdings_value
148
+ total_holdings_value = self.portfolio_current_value
149
+ if not total_holdings_value:
150
+ return constants.ZERO
151
+ currency_holdings = self.portfolio_manager.portfolio.get_currency_portfolio(currency).total
152
+ if include_assets_in_open_orders:
153
+ # add assets in open orders to currency_holdings
154
+ assets_in_open_orders = constants.ZERO
155
+ for order in self.portfolio_manager.exchange_manager.exchange_personal_data.orders_manager.get_open_orders():
156
+ symbol = symbol_util.parse_symbol(order.symbol)
157
+ if order.side is enums.TradeOrderSide.BUY and symbol.base == currency:
158
+ assets_in_open_orders += order.origin_quantity
159
+ elif order.side is enums.TradeOrderSide.SELL and symbol.quote == currency:
160
+ assets_in_open_orders += order.total_cost
161
+ currency_holdings += assets_in_open_orders
162
+ # compute ratio
163
+ current_holdings_value = self.value_converter.evaluate_value(currency, currency_holdings)
164
+ return current_holdings_value / total_holdings_value
130
165
 
131
166
  def handle_profitability_recalculation(self, force_recompute_origin_portfolio):
132
167
  """
@@ -3,7 +3,7 @@ numpy==1.26.3
3
3
  # Drakkar-Software requirements
4
4
  OctoBot-Backtesting>=1.9, <1.10
5
5
  Async-Channel>=2.2, <2.3
6
- OctoBot-Commons>=1.9, <1.10
6
+ OctoBot-Commons>=1.9.43, <1.10
7
7
  OctoBot-Tentacles-Manager>=2.9, <2.10
8
8
  trading-backend>=1.2.7
9
9
 
@@ -92,24 +92,6 @@ async def test_available_account_balance(mock_context):
92
92
  _get_locked_amount_in_stop_orders_mock.reset_mock()
93
93
 
94
94
 
95
- async def test_get_holdings_value(mock_context):
96
- portfolio = mock_context.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio
97
- last_prices = mock_context.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.\
98
- value_converter.last_prices_by_trading_pair
99
- # no provided input asset
100
- assert account_balance.get_holdings_value(mock_context, (), "USDT") == trading_constants.ZERO
101
- # missing currency
102
- assert account_balance.get_holdings_value(mock_context, {"BTC", "ETH"}, "PLOP") == trading_constants.ZERO
103
- assert account_balance.get_holdings_value(mock_context, ("BTC"), "BTC") == portfolio["BTC"].total
104
- assert account_balance.get_holdings_value(mock_context, ("BTC"), "BTC") != portfolio["BTC"].available
105
- assert account_balance.get_holdings_value(mock_context, ("BTC"), "USDT") == \
106
- portfolio["BTC"].total * last_prices["BTC/USDT"]
107
- assert account_balance.get_holdings_value(mock_context, {"BTC", "ETH"}, "USDT") == \
108
- portfolio["BTC"].total * last_prices["BTC/USDT"] + portfolio["ETH"].total * last_prices["ETH/USDT"]
109
- assert account_balance.get_holdings_value(mock_context, {"BTC", "ETH"}, "ETH") == \
110
- portfolio["BTC"].total / last_prices["ETH/BTC"] + portfolio["ETH"].total
111
-
112
-
113
95
  async def test_adapt_amount_to_holdings(null_context):
114
96
  with mock.patch.object(account_balance, "available_account_balance",
115
97
  mock.AsyncMock(return_value=decimal.Decimal(1))) as available_account_balance_mock:
@@ -33,6 +33,13 @@ pytestmark = pytest.mark.asyncio
33
33
 
34
34
 
35
35
  async def test_get_amount_from_input_amount(null_context):
36
+ null_context.exchange_manager = mock.Mock(
37
+ exchange_personal_data=mock.Mock(
38
+ portfolio_manager=mock.Mock(
39
+ portfolio_value_holder=mock.Mock()
40
+ )
41
+ )
42
+ )
36
43
  with pytest.raises(errors.InvalidArgumentError):
37
44
  await script_keywords.get_amount_from_input_amount(null_context, "-1")
38
45
 
@@ -175,10 +182,10 @@ async def test_get_amount_from_input_amount(null_context):
175
182
  with mock.patch.object(dsl, "parse_quantity",
176
183
  mock.Mock(return_value=(
177
184
  script_keywords.QuantityType.CURRENT_SYMBOL_ASSETS_PERCENT, decimal.Decimal(75)))) \
178
- as parse_quantity_mock, \
179
- mock.patch.object(account_balance, "get_holdings_value",
180
- mock.Mock(return_value=decimal.Decimal(2))) \
181
- as get_holdings_value_mock:
185
+ as parse_quantity_mock, mock.patch.object(
186
+ null_context.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder,
187
+ "get_assets_holdings_value", mock.Mock(return_value=decimal.Decimal(2))
188
+ ) as get_holdings_value_mock:
182
189
  null_context.symbol = None
183
190
  with pytest.raises(errors.InvalidArgumentError):
184
191
  # context.symbol is None
@@ -191,16 +198,16 @@ async def test_get_amount_from_input_amount(null_context):
191
198
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("1.5"), "buy",
192
199
  False, True, False, target_price=None)
193
200
  parse_quantity_mock.assert_called_once_with("50")
194
- get_holdings_value_mock.assert_called_once_with(null_context, ("BTC", "USDT"), "BTC")
201
+ get_holdings_value_mock.assert_called_once_with(("BTC", "USDT"), "BTC")
195
202
  adapt_amount_to_holdings_mock.reset_mock()
196
203
 
197
204
  with mock.patch.object(dsl, "parse_quantity",
198
205
  mock.Mock(return_value=(
199
206
  script_keywords.QuantityType.TRADED_SYMBOLS_ASSETS_PERCENT, decimal.Decimal(75)))) \
200
- as parse_quantity_mock, \
201
- mock.patch.object(account_balance, "get_holdings_value",
202
- mock.Mock(return_value=decimal.Decimal(10))) \
203
- as get_holdings_value_mock:
207
+ as parse_quantity_mock, mock.patch.object(
208
+ null_context.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder,
209
+ "get_assets_holdings_value", mock.Mock(return_value=decimal.Decimal(10))
210
+ ) as get_holdings_value_mock:
204
211
  null_context.symbol = None
205
212
  with pytest.raises(errors.InvalidArgumentError):
206
213
  # context.symbol is None
@@ -208,19 +215,21 @@ async def test_get_amount_from_input_amount(null_context):
208
215
  1)
209
216
  parse_quantity_mock.reset_mock()
210
217
  null_context.symbol = "BTC/USDT"
218
+ exchange_personal_data = null_context.exchange_manager.exchange_personal_data
211
219
  null_context.exchange_manager = mock.Mock(
212
220
  exchange_config=mock.Mock(
213
221
  traded_symbols=[
214
222
  commons_symbols.parse_symbol("BTC/USDT"),
215
223
  commons_symbols.parse_symbol("ETH/BTC"),
216
224
  commons_symbols.parse_symbol("SOL/USDT"),
217
- ]
218
- )
225
+ ],
226
+ ),
227
+ exchange_personal_data=exchange_personal_data
219
228
  )
220
229
 
221
230
  assert await script_keywords.get_amount_from_input_amount(null_context, "50", "buy") == decimal.Decimal(1)
222
231
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("7.5"), "buy",
223
232
  False, True, False, target_price=None)
224
233
  parse_quantity_mock.assert_called_once_with("50")
225
- get_holdings_value_mock.assert_called_once_with(null_context, {'BTC', 'ETH', 'SOL', 'USDT'}, "BTC")
234
+ get_holdings_value_mock.assert_called_once_with({'BTC', 'ETH', 'SOL', 'USDT'}, "BTC")
226
235
  adapt_amount_to_holdings_mock.reset_mock()
@@ -14,6 +14,7 @@
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
16
  import decimal
17
+ import mock
17
18
  import pytest
18
19
 
19
20
  import octobot_commons.constants as commons_constants
@@ -24,6 +25,7 @@ from octobot_trading.modes.channel.abstract_mode_consumer import AbstractTrading
24
25
  from octobot_trading.enums import EvaluatorStates
25
26
  import octobot_trading.constants as constants
26
27
  import octobot_trading.errors as errors
28
+ import octobot_trading.enums as enums
27
29
  from octobot_trading.exchanges.exchange_manager import ExchangeManager
28
30
  from octobot_trading.modes import AbstractTradingMode
29
31
  import octobot_trading.personal_data.portfolios.assets as portfolio_assets
@@ -133,42 +135,6 @@ async def test_valid_create_new_order():
133
135
  await consumer.create_new_orders(symbol, -1, EvaluatorStates.LONG, xyz=1, aaa="bbb")
134
136
 
135
137
 
136
- async def test_get_holdings_ratio():
137
- exchange_manager, symbol, consumer = await _get_tools()
138
- exchange_manager.client_symbols = [symbol]
139
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.\
140
- value_converter.last_prices_by_trading_pair[symbol] = decimal.Decimal("1000")
141
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.\
142
- portfolio_current_value = decimal.Decimal("11")
143
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio = {}
144
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio["BTC"] = \
145
- portfolio_assets.SpotAsset(name="BTC", available=decimal.Decimal("10"), total=decimal.Decimal("10"))
146
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio["USDT"] = \
147
- portfolio_assets.SpotAsset(name="USDT", available=decimal.Decimal("1000"), total=decimal.Decimal("1000"))
148
-
149
- assert consumer.get_holdings_ratio("BTC") == decimal.Decimal('0.9090909090909090909090909091')
150
- assert consumer.get_holdings_ratio("USDT") == decimal.Decimal('0.09090909090909090909090909091')
151
-
152
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio.pop("USDT")
153
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.\
154
- portfolio_current_value = decimal.Decimal("10")
155
- assert consumer.get_holdings_ratio("BTC") == constants.ONE
156
- # add ETH and try to get ratio without symbol price
157
- exchange_manager.exchange_personal_data.portfolio_manager.portfolio.\
158
- get_currency_portfolio("ETH").total = decimal.Decimal(10)
159
- # force not backtesting mode
160
- exchange_manager.is_backtesting = False
161
- # force add symbol in exchange symbols
162
- exchange_manager.client_symbols.append("ETH/BTC")
163
- with pytest.raises(errors.MissingPriceDataError):
164
- ratio = consumer.get_holdings_ratio("ETH")
165
- # let channel register proceed
166
- await wait_asyncio_next_cycle()
167
- assert consumer.get_holdings_ratio("BTC") == constants.ONE
168
- assert consumer.get_holdings_ratio("USDT") == constants.ZERO
169
- assert consumer.get_holdings_ratio("XYZ") == constants.ZERO
170
-
171
-
172
138
  async def test_get_number_of_traded_assets():
173
139
  exchange_manager, symbol, consumer = await _get_tools()
174
140
  exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.\