OctoBot-Trading 2.4.65__tar.gz → 2.4.67__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 (475) hide show
  1. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/CHANGELOG.md +11 -0
  2. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/requires.txt +2 -2
  4. {OctoBot-Trading-2.4.65/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.67}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/README.md +1 -1
  6. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/__init__.py +2 -0
  8. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/modes.py +4 -0
  9. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/constants.py +1 -0
  10. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +9 -2
  11. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +5 -5
  12. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +7 -5
  13. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/types/rest_exchange.py +6 -4
  14. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/abstract_mode_consumer.py +21 -15
  15. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/abstract_mode_producer.py +10 -0
  16. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -16
  17. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +8 -4
  18. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order.py +1 -1
  19. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +13 -0
  20. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +44 -11
  21. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/requirements.txt +2 -2
  22. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -18
  23. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_amount.py +21 -12
  24. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/test_abstract_mode_consumer.py +2 -36
  25. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order_factory.py +48 -24
  26. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order_util.py +9 -0
  27. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio_value_holder.py +153 -0
  28. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/LICENSE +0 -0
  29. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/MANIFEST.in +0 -0
  30. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  31. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  32. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  33. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  34. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/channels.py +0 -0
  35. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/contracts.py +0 -0
  36. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/exchange.py +0 -0
  37. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/orders.py +0 -0
  38. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/portfolio.py +0 -0
  39. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/positions.py +0 -0
  40. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/profitability.py +0 -0
  41. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/storage.py +0 -0
  42. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/symbol_data.py +0 -0
  43. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/trader.py +0 -0
  44. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/api/trades.py +0 -0
  45. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/enums.py +0 -0
  46. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/errors.py +0 -0
  47. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_channel.py +0 -0
  48. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/__init__.py +0 -0
  49. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  50. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  51. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  52. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  53. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  54. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  55. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  56. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  57. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  58. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  59. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  60. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  61. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  63. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  64. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  65. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  66. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  67. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  69. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  70. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  72. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  73. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  74. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  77. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  78. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  79. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  80. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  83. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  84. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  86. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  87. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  90. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  91. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  92. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  93. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  96. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  97. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  98. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  99. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  101. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  102. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  104. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/config/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  106. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  107. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  110. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  111. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  112. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  113. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  114. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  116. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  117. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  118. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_builder.py +0 -0
  119. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_channels.py +0 -0
  120. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_details.py +0 -0
  121. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_factory.py +0 -0
  122. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_manager.py +0 -0
  123. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  124. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchanges.py +0 -0
  125. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  127. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  128. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  129. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/traders/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/traders/trader.py +0 -0
  131. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  132. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/types/__init__.py +0 -0
  133. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  134. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  136. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  137. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  138. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  139. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/__init__.py +0 -0
  140. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  141. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/mode.py +0 -0
  143. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/mode_config.py +0 -0
  144. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/modes_factory.py +0 -0
  145. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/modes_util.py +0 -0
  146. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  149. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  150. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  151. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  163. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  166. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  167. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  168. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  169. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  171. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  172. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  173. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  175. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_state.py +0 -0
  177. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_util.py +0 -0
  178. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  179. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  180. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  186. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  187. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  194. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  195. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  196. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  197. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  199. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  200. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  201. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  204. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  205. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  206. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  207. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  208. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  210. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  211. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  212. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  214. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  215. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  216. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  218. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  219. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  220. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  221. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  222. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  223. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  224. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  226. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  228. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  230. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/__init__.py +0 -0
  231. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  232. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  233. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  234. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  235. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position.py +0 -0
  236. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  237. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position_state.py +0 -0
  238. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position_util.py +0 -0
  239. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  240. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  243. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  244. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  245. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  247. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  248. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/state.py +0 -0
  249. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/__init__.py +0 -0
  250. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  252. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  253. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trade.py +0 -0
  254. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  255. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  256. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  257. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  258. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  259. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  260. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  261. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  262. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/__init__.py +0 -0
  268. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  270. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  271. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/signal_producer.py +0 -0
  272. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/signal_creation.py +0 -0
  273. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  274. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/signals/util.py +0 -0
  275. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/__init__.py +0 -0
  276. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/abstract_storage.py +0 -0
  277. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/candles_storage.py +0 -0
  278. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/orders_storage.py +0 -0
  279. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/portfolio_storage.py +0 -0
  280. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/storage_manager.py +0 -0
  281. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/trades_storage.py +0 -0
  282. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/transactions_storage.py +0 -0
  283. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/storage/util.py +0 -0
  284. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/supervisors/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  286. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/config_util.py +0 -0
  289. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/initializable.py +0 -0
  290. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/initialization_util.py +0 -0
  291. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/simulator_updater_utils.py +0 -0
  292. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/__init__.py +0 -0
  293. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  294. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  297. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/setup.cfg +0 -0
  298. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/setup.py +0 -0
  299. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_channels.py +0 -0
  301. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_exchange.py +0 -0
  302. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_modes.py +0 -0
  303. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_orders.py +0 -0
  304. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_portfolio.py +0 -0
  305. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_profitability.py +0 -0
  306. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_symbol_data.py +0 -0
  307. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_trader.py +0 -0
  308. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/api/test_trades.py +0 -0
  309. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/cli/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/contracts/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  313. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  314. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/funding/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  316. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/kline/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  318. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/ohlcv/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  320. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  321. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/order_book/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  323. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/prices/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  325. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  326. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/recent_trades/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  328. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  329. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/ticker/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  331. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  335. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  336. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/implementations/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_abstract_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_builder.py +0 -0
  342. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_config_data.py +0 -0
  343. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_factory.py +0 -0
  344. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_manager.py +0 -0
  345. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_simulator.py +0 -0
  346. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchanges.py +0 -0
  347. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/traders/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/traders/test_trader.py +0 -0
  349. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/types/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/util/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  353. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/exchanges/util/test_exchange_util.py +0 -0
  354. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  358. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  359. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  361. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/test_abstract_trading_mode.py +0 -0
  362. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/modes/test_modes_util.py +0 -0
  363. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/groups/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  367. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  368. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  369. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  376. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  379. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  380. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order.py +0 -0
  381. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order_adapter.py +0 -0
  382. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_orders_manager.py +0 -0
  383. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  384. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  387. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  391. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  393. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/market/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  395. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  397. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  399. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  400. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  403. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  404. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  405. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/history/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  407. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  408. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_asset.py +0 -0
  409. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  410. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  411. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  412. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  413. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/__init__.py +0 -0
  414. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  415. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/channel/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/states/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/test_position.py +0 -0
  421. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/test_position_factory.py +0 -0
  422. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/test_positions_manager.py +0 -0
  423. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/types/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  425. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  426. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_factory.py +0 -0
  428. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_manager.py +0 -0
  429. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  430. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_util.py +0 -0
  431. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/transactions/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  433. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  434. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/signals/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  436. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/signals/test_util.py +0 -0
  437. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/test_utils/__init__.py +0 -0
  438. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/test_utils/order_util.py +0 -0
  439. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/test_utils/random_numbers.py +0 -0
  440. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/util/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests/util/test_config_util.py +0 -0
  442. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  445. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  447. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_binance.py +0 -0
  448. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  449. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bingx.py +0 -0
  450. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  451. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitget.py +0 -0
  452. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  453. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitso.py +0 -0
  454. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  455. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bybit.py +0 -0
  456. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  457. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  458. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_coinex.py +0 -0
  459. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  460. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_gateio.py +0 -0
  461. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  462. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  463. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_htx.py +0 -0
  464. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_kraken.py +0 -0
  465. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  466. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  467. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_mexc.py +0 -0
  468. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_ndax.py +0 -0
  469. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  470. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_okx.py +0 -0
  471. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  472. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_phemex.py +0 -0
  473. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  474. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_upbit.py +0 -0
  475. {OctoBot-Trading-2.4.65 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,17 @@ 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.67] - 2024-03-23
8
+ ### Updated
9
+ - [TradingMode] Requirements for indexes
10
+ - [Orders] Use creation_time in to_dict
11
+
12
+ ## [2.4.66] - 2024-03-19
13
+ ### Updated
14
+ - [CCXT] to 4.2.77
15
+ ### Fixed
16
+ - non trading exchange error
17
+
7
18
  ## [2.4.65] - 2024-03-19
8
19
  ### Updated
9
20
  - [CCXT] to 4.2.76
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.65
3
+ Version: 2.4.67
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.65](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.67](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,10 +1,10 @@
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
- ccxt==4.2.76
7
+ ccxt==4.2.77
8
8
  cryptography
9
9
  sortedcontainers==2.4.0
10
10
  tinydb==4.5.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.65
3
+ Version: 2.4.67
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.65](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.67](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.65](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.67](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.65" # major.minor.revision
18
+ VERSION = "2.4.67" # 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,
@@ -170,8 +170,15 @@ class OHLCVUpdater(ohlcv_channel.OHLCVProducer):
170
170
  price,
171
171
  enums.MarkPriceSources.TICKER_CLOSE_PRICE.value
172
172
  )
173
- self.channel.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.value_converter.\
174
- update_last_price(pair, price)
173
+ if self.channel.exchange_manager.exchange_personal_data.portfolio_manager is None:
174
+ if self.channel.exchange_manager.is_trading:
175
+ self.logger.error(
176
+ f"Trading exchange manager without portfolio_manager "
177
+ f"on {self.channel.exchange_manager.exchange_name}"
178
+ )
179
+ else:
180
+ self.channel.exchange_manager.exchange_personal_data.portfolio_manager.portfolio_value_holder.\
181
+ value_converter.update_last_price(pair, price)
175
182
 
176
183
  async def _push_initial_candles(self, initial_candles_data):
177
184
  self.logger.debug("Pushing completed initialization candles")
@@ -276,23 +276,23 @@ class CCXTAdapter(adapters.AbstractAdapter):
276
276
  # next values are always 0 when the position empty (0 contracts)
277
277
  enums.ExchangeConstantsPositionColumns.COLLATERAL.value: constants.ZERO if is_empty else
278
278
  decimal.Decimal(
279
- f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.COLLATERAL.value, 0)}"),
279
+ f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.COLLATERAL.value, 0) or 0}"),
280
280
  enums.ExchangeConstantsPositionColumns.NOTIONAL.value: constants.ZERO if is_empty else
281
281
  decimal.Decimal(
282
- f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.NOTIONAL.value, 0)}"),
282
+ f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.NOTIONAL.value, 0) or 0}"),
283
283
  enums.ExchangeConstantsPositionColumns.INITIAL_MARGIN.value: constants.ZERO if is_empty else
284
284
  decimal.Decimal(
285
- f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.INITIAL_MARGIN.value, 0)}"),
285
+ f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.INITIAL_MARGIN.value, 0) or 0}"),
286
286
  enums.ExchangeConstantsPositionColumns.UNREALIZED_PNL.value: constants.ZERO if is_empty else
287
287
  decimal.Decimal(
288
- f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.UNREALISED_PNL.value, 0)}"),
288
+ f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.UNREALISED_PNL.value, 0) or 0}"),
289
289
  enums.ExchangeConstantsPositionColumns.REALISED_PNL.value: constants.ZERO if is_empty else
290
290
  decimal.Decimal(
291
291
  f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.REALISED_PNL.value, 0) or 0}"),
292
292
  enums.ExchangeConstantsPositionColumns.LIQUIDATION_PRICE.value: liquidation_price,
293
293
  enums.ExchangeConstantsPositionColumns.MARK_PRICE.value: constants.ZERO if is_empty else
294
294
  decimal.Decimal(
295
- f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.MARK_PRICE.value, 0)}"),
295
+ f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.MARK_PRICE.value, 0) or 0}"),
296
296
  enums.ExchangeConstantsPositionColumns.ENTRY_PRICE.value: constants.ZERO if is_empty else
297
297
  decimal.Decimal(
298
298
  f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.ENTRY_PRICE.value, 0)}"),
@@ -354,11 +354,13 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
354
354
  # something went wrong and ccxt did not expect it
355
355
  raise octobot_trading.errors.FailedRequest(e) from e
356
356
  else:
357
- # When fetch_order is not supported, uses get_open_orders and extract order id
358
- open_orders = await self.get_open_orders(symbol=symbol)
359
- for order in open_orders:
360
- if order.get(ecoc.EXCHANGE_ID.value, None) == exchange_order_id:
361
- return order
357
+ # When fetch_order is not supported, uses get_open_orders or get_closed_orders and extract order id
358
+ for method in (self.get_open_orders, self.get_closed_orders):
359
+ orders = await method(symbol=symbol)
360
+ for order in orders:
361
+ if order.get(ecoc.EXCHANGE_ID.value, None) == exchange_order_id:
362
+ return order
363
+
362
364
  return None # OrderNotFound
363
365
 
364
366
  async def get_all_orders(self, symbol: str = None, since: int = None,
@@ -704,10 +704,12 @@ class RestExchange(abstract_exchange.AbstractExchange):
704
704
  if symbols is None:
705
705
  raise NotImplementedError(f"The symbols param is required to get multiple positions at once")
706
706
  # force get_position when symbols is set as ccxt get_positions is only returning open positions
707
- return [
708
- await self.get_position(symbol, **kwargs)
709
- for symbol in symbols
710
- ]
707
+ return list(
708
+ await asyncio.gather(*(
709
+ self.get_position(symbol, **kwargs)
710
+ for symbol in symbols
711
+ ))
712
+ )
711
713
 
712
714
  async def get_mocked_empty_position(self, symbol: str, **kwargs: dict) -> dict:
713
715
  """
@@ -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)
@@ -508,6 +508,16 @@ class AbstractTradingModeProducer(modes_channel.ModeChannelProducer):
508
508
  common_enums.InitializationEventExchangeTopics.CONTRACTS.value)
509
509
  await script_keywords.set_leverage(context, await script_keywords.user_select_leverage(context))
510
510
 
511
+ async def _wait_for_symbol_prices_and_profitability_init(self, timeout) -> bool:
512
+ try:
513
+ await util.wait_for_topic_init(self.exchange_manager, timeout,
514
+ common_enums.InitializationEventExchangeTopics.PRICE.value)
515
+ await util.wait_for_topic_init(self.exchange_manager, timeout,
516
+ common_enums.InitializationEventExchangeTopics.PROFITABILITY.value)
517
+ except (asyncio.TimeoutError, concurrent.futures.TimeoutError):
518
+ self.logger.error(f"Symbol price initialization took more than {timeout} seconds")
519
+ return False
520
+
511
521
  @classmethod
512
522
  def producer_exchange_wide_lock(cls, exchange_manager) -> asyncio_tools.RLock():
513
523
  try:
@@ -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,49 @@ 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_holdings_ratio(self, currency, traded_symbols_only=False, include_assets_in_open_orders=False):
135
+ if traded_symbols_only:
136
+ # only consider traded assets for total_holdings_value
137
+ assets = set()
138
+ for symbol in self.portfolio_manager.exchange_manager.exchange_config.traded_symbols:
139
+ assets.add(symbol.base)
140
+ assets.add(symbol.quote)
141
+ total_holdings_value = self.get_assets_holdings_value(
142
+ assets, self.portfolio_manager.reference_market
143
+ )
144
+ else:
145
+ # consider all assets for total_holdings_value
146
+ total_holdings_value = self.portfolio_current_value
147
+ if not total_holdings_value:
148
+ return constants.ZERO
149
+ currency_holdings = self.portfolio_manager.portfolio.get_currency_portfolio(currency).total
150
+ if include_assets_in_open_orders:
151
+ # add assets in open orders to currency_holdings
152
+ assets_in_open_orders = constants.ZERO
153
+ for order in self.portfolio_manager.exchange_manager.exchange_personal_data.orders_manager.get_open_orders():
154
+ symbol = symbol_util.parse_symbol(order.symbol)
155
+ if order.side is enums.TradeOrderSide.BUY and symbol.base == currency:
156
+ assets_in_open_orders += order.origin_quantity
157
+ elif order.side is enums.TradeOrderSide.SELL and symbol.quote == currency:
158
+ assets_in_open_orders += order.total_cost
159
+ currency_holdings += assets_in_open_orders
160
+ # compute ration
161
+ current_holdings_value = self.value_converter.evaluate_value(currency, currency_holdings)
162
+ return current_holdings_value / total_holdings_value
130
163
 
131
164
  def handle_profitability_recalculation(self, force_recompute_origin_portfolio):
132
165
  """
@@ -3,12 +3,12 @@ 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
 
10
10
  # Exchange connection requirements
11
- ccxt==4.2.76 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
11
+ ccxt==4.2.77 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
12
12
 
13
13
  cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)
14
14
 
@@ -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.\