OctoBot-Trading 2.4.66__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.66 → OctoBot-Trading-2.4.67}/CHANGELOG.md +5 -0
  2. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/requires.txt +1 -1
  4. {OctoBot-Trading-2.4.66/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.67}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/README.md +1 -1
  6. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/__init__.py +2 -0
  8. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/modes.py +4 -0
  9. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/constants.py +1 -0
  10. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/abstract_mode_consumer.py +21 -15
  11. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/abstract_mode_producer.py +10 -0
  12. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -16
  13. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +8 -4
  14. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order.py +1 -1
  15. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +13 -0
  16. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +44 -11
  17. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/requirements.txt +1 -1
  18. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -18
  19. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_amount.py +21 -12
  20. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/test_abstract_mode_consumer.py +2 -36
  21. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order_factory.py +48 -24
  22. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order_util.py +9 -0
  23. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio_value_holder.py +153 -0
  24. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/LICENSE +0 -0
  25. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/MANIFEST.in +0 -0
  26. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  27. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  28. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  29. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  30. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/channels.py +0 -0
  31. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/contracts.py +0 -0
  32. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/exchange.py +0 -0
  33. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/orders.py +0 -0
  34. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/portfolio.py +0 -0
  35. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/positions.py +0 -0
  36. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/profitability.py +0 -0
  37. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/storage.py +0 -0
  38. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/symbol_data.py +0 -0
  39. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/trader.py +0 -0
  40. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/api/trades.py +0 -0
  41. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/enums.py +0 -0
  42. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/errors.py +0 -0
  43. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_channel.py +0 -0
  44. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  46. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  47. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  48. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  49. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  50. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  51. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  52. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  53. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  54. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  55. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  56. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  57. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  60. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  61. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  62. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  63. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  65. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  66. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  68. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  69. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  70. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  71. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  74. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  75. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  76. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  77. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  80. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  81. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  82. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  83. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  84. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  87. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  88. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  89. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  90. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  93. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  94. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  96. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  98. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  99. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  101. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/config/__init__.py +0 -0
  102. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  103. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  104. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  107. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  108. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  109. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  110. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  111. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  112. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  113. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  114. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  115. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  116. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  117. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_builder.py +0 -0
  118. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_channels.py +0 -0
  119. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_details.py +0 -0
  120. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_factory.py +0 -0
  121. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_manager.py +0 -0
  122. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  123. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/exchanges.py +0 -0
  124. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  126. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  127. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  128. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/traders/__init__.py +0 -0
  129. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/traders/trader.py +0 -0
  130. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  131. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/types/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  133. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  134. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  136. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  137. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  138. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  139. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/__init__.py +0 -0
  140. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  141. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/channel/mode.py +0 -0
  143. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/mode_config.py +0 -0
  144. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/modes_factory.py +0 -0
  145. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/modes_util.py +0 -0
  146. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  149. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  150. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  151. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  163. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  166. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  167. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  168. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  169. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.66 → 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.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  172. {OctoBot-Trading-2.4.66 → 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.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  175. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_state.py +0 -0
  177. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/order_util.py +0 -0
  178. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  179. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  180. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  181. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  186. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  187. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  192. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  194. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  195. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  196. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  197. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  198. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  199. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  200. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  201. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  204. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  205. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  206. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  207. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  208. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  210. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  211. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  212. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  214. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  215. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  216. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  218. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  219. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  220. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  221. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  222. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  223. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  224. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  225. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  226. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  228. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  229. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  230. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/__init__.py +0 -0
  231. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  232. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  233. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  234. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  235. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position.py +0 -0
  236. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  237. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position_state.py +0 -0
  238. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/position_util.py +0 -0
  239. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  240. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  243. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  244. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  245. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  247. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  248. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/state.py +0 -0
  249. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/__init__.py +0 -0
  250. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  251. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  252. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  253. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trade.py +0 -0
  254. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  255. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  256. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  257. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  258. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  259. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  260. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  261. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  262. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  266. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  267. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/__init__.py +0 -0
  268. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/__init__.py +0 -0
  269. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  270. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  271. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/channel/signal_producer.py +0 -0
  272. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/signal_creation.py +0 -0
  273. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  274. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/signals/util.py +0 -0
  275. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/__init__.py +0 -0
  276. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/abstract_storage.py +0 -0
  277. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/candles_storage.py +0 -0
  278. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/orders_storage.py +0 -0
  279. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/portfolio_storage.py +0 -0
  280. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/storage_manager.py +0 -0
  281. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/trades_storage.py +0 -0
  282. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/transactions_storage.py +0 -0
  283. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/storage/util.py +0 -0
  284. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/supervisors/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  286. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/config_util.py +0 -0
  289. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/initializable.py +0 -0
  290. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/initialization_util.py +0 -0
  291. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/simulator_updater_utils.py +0 -0
  292. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/__init__.py +0 -0
  293. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  294. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  297. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/setup.cfg +0 -0
  298. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/setup.py +0 -0
  299. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_channels.py +0 -0
  301. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_exchange.py +0 -0
  302. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_modes.py +0 -0
  303. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_orders.py +0 -0
  304. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_portfolio.py +0 -0
  305. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_profitability.py +0 -0
  306. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_symbol_data.py +0 -0
  307. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_trader.py +0 -0
  308. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/api/test_trades.py +0 -0
  309. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/cli/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/contracts/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  313. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  314. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/funding/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  316. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/kline/__init__.py +0 -0
  317. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  318. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/ohlcv/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  320. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  321. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/order_book/__init__.py +0 -0
  322. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  323. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/prices/__init__.py +0 -0
  324. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  325. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  326. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/recent_trades/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  328. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  329. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/ticker/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  331. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  335. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  336. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/implementations/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_abstract_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  341. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_builder.py +0 -0
  342. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_config_data.py +0 -0
  343. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_factory.py +0 -0
  344. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_manager.py +0 -0
  345. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchange_simulator.py +0 -0
  346. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/test_exchanges.py +0 -0
  347. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/traders/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/traders/test_trader.py +0 -0
  349. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/types/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  351. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/util/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  353. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/exchanges/util/test_exchange_util.py +0 -0
  354. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  358. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  359. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  361. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/test_abstract_trading_mode.py +0 -0
  362. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/modes/test_modes_util.py +0 -0
  363. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/groups/__init__.py +0 -0
  366. {OctoBot-Trading-2.4.66 → 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.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  368. {OctoBot-Trading-2.4.66 → 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.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  376. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  378. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  379. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  380. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order.py +0 -0
  381. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_order_adapter.py +0 -0
  382. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_orders_manager.py +0 -0
  383. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  384. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  387. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  391. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  392. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  393. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/market/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  395. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  397. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  399. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  400. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  403. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  404. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  405. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/history/__init__.py +0 -0
  406. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  407. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  408. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_asset.py +0 -0
  409. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  410. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  411. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  412. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  413. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/__init__.py +0 -0
  414. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  415. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/channel/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/states/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/test_position.py +0 -0
  421. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/test_position_factory.py +0 -0
  422. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/test_positions_manager.py +0 -0
  423. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/types/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  425. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  426. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_factory.py +0 -0
  428. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_manager.py +0 -0
  429. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  430. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/trades/test_trade_util.py +0 -0
  431. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/transactions/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  433. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  434. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/signals/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  436. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/signals/test_util.py +0 -0
  437. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/test_utils/__init__.py +0 -0
  438. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/test_utils/order_util.py +0 -0
  439. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/test_utils/random_numbers.py +0 -0
  440. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/util/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests/util/test_config_util.py +0 -0
  442. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  445. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  447. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_binance.py +0 -0
  448. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  449. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bingx.py +0 -0
  450. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  451. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitget.py +0 -0
  452. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  453. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitso.py +0 -0
  454. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  455. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bybit.py +0 -0
  456. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  457. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  458. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_coinex.py +0 -0
  459. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  460. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_gateio.py +0 -0
  461. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  462. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  463. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_htx.py +0 -0
  464. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_kraken.py +0 -0
  465. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  466. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  467. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_mexc.py +0 -0
  468. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_ndax.py +0 -0
  469. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  470. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_okx.py +0 -0
  471. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  472. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_phemex.py +0 -0
  473. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  474. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_upbit.py +0 -0
  475. {OctoBot-Trading-2.4.66 → OctoBot-Trading-2.4.67}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,11 @@ 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
+
7
12
  ## [2.4.66] - 2024-03-19
8
13
  ### Updated
9
14
  - [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.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.66](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,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.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.66](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.66](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.66" # 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,
@@ -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,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.\
@@ -118,31 +118,55 @@ class TestOrderFactory:
118
118
  await self.stop(exchange_manager)
119
119
 
120
120
  async def test_create_order_from_order_storage_details_with_simple_order(self):
121
- _, exchange_manager, trader_inst = await self.init_default()
121
+ _, exchange_manager, trader_inst = await self.init_default()
122
+ try:
122
123
 
123
- order = personal_data.BuyLimitOrder(trader_inst)
124
- order.update(order_type=TraderOrderType.BUY_LIMIT,
125
- symbol="BTC/USDT",
126
- current_price=decimal.Decimal("70"),
127
- quantity=decimal.Decimal("10"),
128
- price=decimal.Decimal("70"))
129
- order_storage_details = orders_storage._format_order(order, exchange_manager)
130
- order_storage_details[StoredOrdersAttr.ENTRIES.value] = ["11111"]
131
-
132
- pending_groups = {}
133
- created_order = await personal_data.create_order_from_order_storage_details(
134
- order_storage_details, exchange_manager, pending_groups
135
- )
136
- assert pending_groups == {}
137
-
138
- assert created_order.exchange_manager is exchange_manager
139
- assert created_order.origin_quantity == order.origin_quantity
140
- assert created_order.origin_price == order.origin_price
141
- assert created_order.__class__ is order.__class__
142
- # associated_entry_ids are added from order_storage_details but not in original order
143
- assert created_order.associated_entry_ids == ["11111"]
144
- assert order.associated_entry_ids is None
145
- await self.stop(exchange_manager)
124
+ order = personal_data.BuyLimitOrder(trader_inst)
125
+ order.update(order_type=TraderOrderType.BUY_LIMIT,
126
+ symbol="BTC/USDT",
127
+ current_price=decimal.Decimal("70"),
128
+ quantity=decimal.Decimal("10"),
129
+ price=decimal.Decimal("70"))
130
+ order_storage_details = orders_storage._format_order(order, exchange_manager)
131
+ order_storage_details[StoredOrdersAttr.ENTRIES.value] = ["11111"]
132
+
133
+ pending_groups = {}
134
+ created_order = await personal_data.create_order_from_order_storage_details(
135
+ order_storage_details, exchange_manager, pending_groups
136
+ )
137
+ assert pending_groups == {}
138
+
139
+ assert created_order.exchange_manager is exchange_manager
140
+ assert created_order.origin_quantity == order.origin_quantity
141
+ assert created_order.timestamp == order.timestamp
142
+ assert created_order.creation_time == order.creation_time
143
+ assert created_order.origin_price == order.origin_price
144
+ assert created_order.__class__ is order.__class__
145
+ # associated_entry_ids are added from order_storage_details but not in original order
146
+ assert created_order.associated_entry_ids == ["11111"]
147
+ assert order.associated_entry_ids is None
148
+
149
+ # updated creation_time (as with chained orders): creation_time is used to restore order
150
+ assert created_order.creation_time != 123
151
+ order.creation_time = 123
152
+
153
+ order_storage_details = orders_storage._format_order(order, exchange_manager)
154
+ created_order = await personal_data.create_order_from_order_storage_details(
155
+ order_storage_details, exchange_manager, pending_groups
156
+ )
157
+ assert pending_groups == {}
158
+ assert created_order.exchange_manager is exchange_manager
159
+ assert created_order.origin_quantity == order.origin_quantity
160
+ assert created_order.timestamp == 123 # aligned with creation time
161
+ assert created_order.creation_time == 123 # aligned with creation time
162
+ assert created_order.origin_price == order.origin_price
163
+ assert created_order.__class__ is order.__class__
164
+ # associated_entry_ids are added from order_storage_details but not in original order
165
+ assert created_order.associated_entry_ids is None
166
+ assert order.associated_entry_ids is None
167
+
168
+ finally:
169
+ await self.stop(exchange_manager)
146
170
 
147
171
  async def test_create_order_from_order_storage_details_with_groups(self):
148
172
  _, exchange_manager, trader_inst = await self.init_default()
@@ -346,16 +346,25 @@ async def test_create_as_chained_order_regular_order(trader_simulator):
346
346
  quantity=decimal.Decimal("10"),
347
347
  price=decimal.Decimal("70"))
348
348
  base_order.is_waiting_for_chained_trigger = True
349
+ base_order.creation_time = 123
350
+ origin_time = base_order.creation_time
351
+ assert base_order.to_dict()[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value] \
352
+ == origin_time
349
353
  # base_order.state is None since no state has been associated to it (not initiliazed)
350
354
  assert base_order.state is None
351
355
  assert base_order.is_initialized is False
352
356
 
353
357
  await personal_data.create_as_chained_order(base_order)
358
+ assert base_order.creation_time > origin_time # creation_time got update using current time
354
359
  assert base_order.is_waiting_for_chained_trigger is False
355
360
  assert base_order.is_created() is True
356
361
  assert base_order.is_initialized is True
357
362
  assert isinstance(base_order.state, personal_data.OpenOrderState)
358
363
 
364
+ # use chained order creation time
365
+ assert base_order.to_dict()[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value] \
366
+ == base_order.creation_time
367
+
359
368
 
360
369
  @pytest.mark.asyncio
361
370
  async def test_create_as_chained_order_bundled_order_no_open_order(trader_simulator):