OctoBot-Trading 2.4.16__tar.gz → 2.4.18__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 (468) hide show
  1. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/CHANGELOG.md +12 -0
  2. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/OctoBot_Trading.egg-info/SOURCES.txt +1 -0
  4. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/OctoBot_Trading.egg-info/requires.txt +1 -1
  5. {OctoBot-Trading-2.4.16/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.18}/PKG-INFO +2 -2
  6. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/README.md +1 -1
  7. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/__init__.py +1 -1
  8. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/exchange.py +4 -2
  9. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/constants.py +3 -3
  10. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/adapters/abstract_adapter.py +8 -0
  11. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +18 -1
  12. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +15 -0
  13. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +1 -12
  14. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +4 -0
  15. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +7 -10
  16. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/mode_config.py +5 -1
  17. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +16 -0
  18. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +20 -2
  19. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/dsl/values.py +2 -0
  20. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/value_converter.py +27 -21
  21. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/abstract_storage.py +20 -0
  22. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/candles_storage.py +1 -0
  23. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/orders_storage.py +1 -0
  24. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/portfolio_storage.py +1 -0
  25. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/trades_storage.py +2 -0
  26. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/transactions_storage.py +1 -0
  27. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/test_tools/exchange_data.py +3 -0
  28. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/test_tools/exchanges_test_tools.py +7 -6
  29. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/requirements.txt +1 -1
  30. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +18 -0
  31. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/script_keywords/basic_keywords/test_amount.py +54 -0
  32. OctoBot-Trading-2.4.18/tests_additional/real_exchanges/test_bingx.py +171 -0
  33. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bybit.py +2 -2
  34. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bybit_futures.py +3 -3
  35. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_coinbase.py +8 -5
  36. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_hitbtc.py +4 -2
  37. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_okx.py +2 -1
  38. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_okx_futures.py +2 -1
  39. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/LICENSE +0 -0
  40. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/MANIFEST.in +0 -0
  41. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  42. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  43. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  44. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/channels.py +0 -0
  46. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/contracts.py +0 -0
  47. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/modes.py +0 -0
  48. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/orders.py +0 -0
  49. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/portfolio.py +0 -0
  50. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/positions.py +0 -0
  51. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/profitability.py +0 -0
  52. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/storage.py +0 -0
  53. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/symbol_data.py +0 -0
  54. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/trader.py +0 -0
  55. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/api/trades.py +0 -0
  56. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/enums.py +0 -0
  57. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/errors.py +0 -0
  58. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_channel.py +0 -0
  59. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  61. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  62. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  63. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  64. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  65. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  66. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  69. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  70. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  71. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  72. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  75. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  76. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  77. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  78. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  80. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  81. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  83. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  84. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  86. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  89. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  90. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  92. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  94. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  95. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  96. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  97. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  98. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  99. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  102. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  103. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  104. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  105. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  106. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  107. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  108. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  109. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  110. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  111. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/__init__.py +0 -0
  112. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  113. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  114. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/config/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  117. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  118. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  119. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  121. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  122. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  123. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  125. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchange_builder.py +0 -0
  126. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchange_channels.py +0 -0
  127. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchange_details.py +0 -0
  128. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchange_factory.py +0 -0
  129. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchange_manager.py +0 -0
  130. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  131. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/exchanges.py +0 -0
  132. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  133. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  134. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  135. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  136. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/traders/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/traders/trader.py +0 -0
  138. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  139. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/types/__init__.py +0 -0
  140. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  141. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  142. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/util/__init__.py +0 -0
  143. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  144. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  145. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  146. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  148. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/channel/__init__.py +0 -0
  149. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  150. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  151. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/channel/mode.py +0 -0
  152. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/modes_factory.py +0 -0
  153. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/modes_util.py +0 -0
  154. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  155. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  157. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  158. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  159. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  160. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  161. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  163. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  165. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/octobot_channel_consumer.py +0 -0
  166. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/__init__.py +0 -0
  167. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  168. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  171. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  172. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  173. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  175. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  176. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  177. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  178. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/order.py +0 -0
  179. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  180. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  181. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/order_group.py +0 -0
  182. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/order_state.py +0 -0
  183. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/order_util.py +0 -0
  184. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  185. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  186. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  190. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  191. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  192. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  193. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  194. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  196. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  197. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  198. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  201. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  202. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  203. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  205. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  206. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  207. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  208. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  209. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  210. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  211. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  212. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  214. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  215. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  216. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  217. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  218. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  219. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  220. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  221. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  222. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  224. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  225. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  226. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  228. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  229. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  230. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  231. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  232. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  233. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  236. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  237. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  240. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  241. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  242. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/position.py +0 -0
  243. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  244. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/position_state.py +0 -0
  245. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/position_util.py +0 -0
  246. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  247. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  249. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  250. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  251. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  252. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  254. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  255. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/state.py +0 -0
  256. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  259. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  260. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/trade.py +0 -0
  261. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  262. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  263. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  264. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  265. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  267. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  268. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  269. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  271. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  272. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  273. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  274. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/channel/__init__.py +0 -0
  276. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  277. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  278. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/channel/signal_producer.py +0 -0
  279. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/signal_creation.py +0 -0
  280. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  281. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/signals/util.py +0 -0
  282. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/storage_manager.py +0 -0
  284. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/storage/util.py +0 -0
  285. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/supervisors/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  287. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  288. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/config_util.py +0 -0
  290. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/initializable.py +0 -0
  291. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/initialization_util.py +0 -0
  292. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/simulator_updater_utils.py +0 -0
  293. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/test_tools/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  296. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/setup.cfg +0 -0
  297. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/setup.py +0 -0
  298. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_channels.py +0 -0
  300. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_exchange.py +0 -0
  301. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_modes.py +0 -0
  302. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_orders.py +0 -0
  303. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_portfolio.py +0 -0
  304. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_profitability.py +0 -0
  305. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_symbol_data.py +0 -0
  306. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_trader.py +0 -0
  307. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/api/test_trades.py +0 -0
  308. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/cli/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/contracts/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  312. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  313. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/funding/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  315. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/kline/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  317. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/ohlcv/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  319. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  320. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/order_book/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  322. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/prices/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  324. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  325. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/recent_trades/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  327. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  328. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/ticker/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  330. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/connectors/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  334. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  335. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/implementations/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_abstract_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_exchange_builder.py +0 -0
  341. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_exchange_config_data.py +0 -0
  342. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_exchange_factory.py +0 -0
  343. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_exchange_manager.py +0 -0
  344. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_exchange_simulator.py +0 -0
  345. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/test_exchanges.py +0 -0
  346. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/traders/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/traders/test_trader.py +0 -0
  348. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/types/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  350. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/util/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  352. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/exchanges/util/test_exchange_util.py +0 -0
  353. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/script_keywords/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  358. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/test_abstract_mode_consumer.py +0 -0
  359. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/modes/test_abstract_trading_mode.py +0 -0
  360. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/groups/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  364. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  365. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  366. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  368. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  369. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  373. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  375. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  376. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  377. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_order.py +0 -0
  378. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_order_adapter.py +0 -0
  379. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_order_factory.py +0 -0
  380. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_order_util.py +0 -0
  381. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_orders_manager.py +0 -0
  382. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  383. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/__init__.py +0 -0
  384. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  386. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  387. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  389. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  391. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/market/__init__.py +0 -0
  392. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  393. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  394. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  395. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  396. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  397. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  398. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  400. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  401. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  402. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  403. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/history/__init__.py +0 -0
  404. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  405. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  406. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/test_asset.py +0 -0
  407. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  408. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  409. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  410. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  411. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  412. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/types/__init__.py +0 -0
  413. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  414. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  415. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/channel/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/states/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/test_position.py +0 -0
  420. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/test_position_factory.py +0 -0
  421. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/test_positions_manager.py +0 -0
  422. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/types/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  424. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  425. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/trades/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/trades/test_trade_factory.py +0 -0
  427. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/trades/test_trade_manager.py +0 -0
  428. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  429. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/transactions/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  431. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  432. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/signals/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  434. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/signals/test_util.py +0 -0
  435. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/test_utils/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/test_utils/order_util.py +0 -0
  437. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/test_utils/random_numbers.py +0 -0
  438. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/util/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests/util/test_config_util.py +0 -0
  440. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  443. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  444. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  445. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_binance.py +0 -0
  446. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  447. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  448. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bitget.py +0 -0
  449. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  450. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bitso.py +0 -0
  451. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  452. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_bittrex.py +0 -0
  453. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_coinex.py +0 -0
  454. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  455. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_gateio.py +0 -0
  456. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  457. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_huobi.py +0 -0
  458. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_huobipro.py +0 -0
  459. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_kraken.py +0 -0
  460. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  461. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  462. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_mexc.py +0 -0
  463. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_ndax.py +0 -0
  464. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  465. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_phemex.py +0 -0
  466. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  467. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_upbit.py +0 -0
  468. {OctoBot-Trading-2.4.16 → OctoBot-Trading-2.4.18}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,18 @@ 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.18] - 2023-08-17
8
+ ### Updated
9
+ - [CCXT] to version 4.0.65
10
+ ### Fixed
11
+ - [Storage] handle corrupted db files auto fix
12
+
13
+ ## [2.4.17] - 2023-08-16
14
+ ### Added
15
+ - [Orders] %s and %t amounts
16
+ ### Fixed
17
+ - [Backtesting] fees on small amounts
18
+
7
19
  ## [2.4.16] - 2023-08-14
8
20
  ### Fixed
9
21
  - [Exchanges] unwanted market status load
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.16
3
+ Version: 2.4.18
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.16](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.18](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)
@@ -435,6 +435,7 @@ tests_additional/real_exchanges/real_futures_exchange_tester.py
435
435
  tests_additional/real_exchanges/test_ascendex.py
436
436
  tests_additional/real_exchanges/test_binance.py
437
437
  tests_additional/real_exchanges/test_binance_futures.py
438
+ tests_additional/real_exchanges/test_bingx.py
438
439
  tests_additional/real_exchanges/test_bitfinex.py
439
440
  tests_additional/real_exchanges/test_bitget.py
440
441
  tests_additional/real_exchanges/test_bithumb.py
@@ -4,7 +4,7 @@ Async-Channel<2.3,>=2.2
4
4
  OctoBot-Commons<1.10,>=1.9
5
5
  OctoBot-Tentacles-Manager<2.10,>=2.9
6
6
  trading-backend>=1.2.7
7
- ccxt==3.1.52
7
+ ccxt==4.0.65
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.16
3
+ Version: 2.4.18
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.16](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.18](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.16](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.18](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.16" # major.minor.revision
18
+ VERSION = "2.4.18" # major.minor.revision
@@ -19,6 +19,8 @@ import contextlib
19
19
 
20
20
  import trading_backend
21
21
 
22
+ import octobot_commons.symbols as commons_symbols
23
+
22
24
  import octobot_trading.constants
23
25
  import octobot_trading.enums
24
26
  import octobot_trading.exchanges.connectors.ccxt.enums
@@ -204,7 +206,7 @@ def supports_websockets(exchange_name: str, tentacles_setup_config) -> bool:
204
206
  return exchanges.supports_websocket(exchange_name, tentacles_setup_config)
205
207
 
206
208
 
207
- def get_trading_pairs(exchange_manager) -> list:
209
+ def get_trading_pairs(exchange_manager) -> list[str]:
208
210
  return exchange_manager.exchange_config.traded_symbol_pairs
209
211
 
210
212
 
@@ -216,7 +218,7 @@ def get_all_exchange_time_frames(exchange_manager) -> list:
216
218
  return exchange_manager.client_time_frames
217
219
 
218
220
 
219
- def get_trading_symbols(exchange_manager) -> list:
221
+ def get_trading_symbols(exchange_manager) -> list[commons_symbols.Symbol]:
220
222
  return exchange_manager.exchange_config.traded_symbols
221
223
 
222
224
 
@@ -78,7 +78,7 @@ FULL_CANDLE_HISTORY_EXCHANGES = [
78
78
  "bitstamp",
79
79
  "bybit",
80
80
  "gateio",
81
- "hitbtc",
81
+ "bingx",
82
82
  "hollaex",
83
83
  "huobi",
84
84
  "huobipro",
@@ -103,8 +103,8 @@ TESTED_EXCHANGES = [
103
103
  "hollaex",
104
104
  "mexc",
105
105
  ]
106
- DEFAULT_FUTURE_EXCHANGES = ["binanceusdm", "bybit"]
107
- SIMULATOR_TESTED_EXCHANGES = ["bitfinex2", "bithumb", "bitstamp", "bittrex", "coinex",
106
+ DEFAULT_FUTURE_EXCHANGES = ["bybit"]
107
+ SIMULATOR_TESTED_EXCHANGES = ["bingx", "bitfinex2", "bithumb", "bitstamp", "bittrex", "coinex",
108
108
  "hitbtc", "kraken", "poloniex", "bitso", "ndax", "upbit",
109
109
  "wavesexchange"]
110
110
 
@@ -69,6 +69,11 @@ class AbstractAdapter:
69
69
  fixed = self.fix_ticker(raw, **kwargs)
70
70
  return self.parse_ticker(fixed, **kwargs)
71
71
 
72
+ @_adapter
73
+ def adapt_ticker_from_kline(self, raw, symbol, **kwargs):
74
+ fixed = self.create_ticker_from_kline(raw, symbol, **kwargs)
75
+ return self.parse_ticker(fixed, **kwargs)
76
+
72
77
  @_adapter
73
78
  def adapt_balance(self, raw, **kwargs):
74
79
  fixed = self.fix_balance(raw, **kwargs)
@@ -166,6 +171,9 @@ class AbstractAdapter:
166
171
  def parse_ticker(self, fixed, **kwargs):
167
172
  raise NotImplementedError("parse_ticker is not implemented")
168
173
 
174
+ def create_ticker_from_kline(self, kline, symbol, **kwargs):
175
+ raise NotImplementedError("create_ticker_from_kline is not implemented")
176
+
169
177
  def fix_balance(self, raw, **kwargs):
170
178
  # add generic logic if necessary
171
179
  return raw
@@ -109,6 +109,23 @@ class CCXTAdapter(adapters.AbstractAdapter):
109
109
  # CCXT standard ticker parsing logic
110
110
  return fixed
111
111
 
112
+ def create_ticker_from_kline(self, kline, symbol, **kwargs):
113
+ return {
114
+ enums.ExchangeConstantsTickersColumns.SYMBOL.value: symbol,
115
+ enums.ExchangeConstantsTickersColumns.TIMESTAMP.value: kline[common_enums.PriceIndexes.IND_PRICE_TIME.value],
116
+ enums.ExchangeConstantsTickersColumns.OPEN.value: kline[common_enums.PriceIndexes.IND_PRICE_OPEN.value],
117
+ enums.ExchangeConstantsTickersColumns.HIGH.value: kline[common_enums.PriceIndexes.IND_PRICE_HIGH.value],
118
+ enums.ExchangeConstantsTickersColumns.LOW.value: kline[common_enums.PriceIndexes.IND_PRICE_LOW.value],
119
+ enums.ExchangeConstantsTickersColumns.CLOSE.value: kline[common_enums.PriceIndexes.IND_PRICE_CLOSE.value],
120
+ enums.ExchangeConstantsTickersColumns.BASE_VOLUME.value: kline[common_enums.PriceIndexes.IND_PRICE_VOL.value],
121
+ enums.ExchangeConstantsTickersColumns.LAST.value: kline[common_enums.PriceIndexes.IND_PRICE_CLOSE.value],
122
+ enums.ExchangeConstantsTickersColumns.BID.value: None,
123
+ enums.ExchangeConstantsTickersColumns.BID_VOLUME.value: None,
124
+ enums.ExchangeConstantsTickersColumns.ASK.value: None,
125
+ enums.ExchangeConstantsTickersColumns.ASK_VOLUME.value: None,
126
+ enums.ExchangeConstantsTickersColumns.PREVIOUS_CLOSE.value: None,
127
+ }
128
+
112
129
  def fix_balance(self, raw, **kwargs):
113
130
  fixed = super().fix_balance(raw, **kwargs)
114
131
  # remove not currency specific keys
@@ -237,7 +254,7 @@ class CCXTAdapter(adapters.AbstractAdapter):
237
254
  f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.UNREALISED_PNL.value, 0)}"),
238
255
  enums.ExchangeConstantsPositionColumns.REALISED_PNL.value: constants.ZERO if is_empty else
239
256
  decimal.Decimal(
240
- f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.REALISED_PNL.value, 0)}"),
257
+ f"{fixed.get(ccxt_enums.ExchangePositionCCXTColumns.REALISED_PNL.value, 0) or 0}"),
241
258
  enums.ExchangeConstantsPositionColumns.LIQUIDATION_PRICE.value: liquidation_price,
242
259
  enums.ExchangeConstantsPositionColumns.MARK_PRICE.value: constants.ZERO if is_empty else
243
260
  decimal.Decimal(
@@ -19,6 +19,7 @@ import ccxt.pro as ccxt_pro
19
19
 
20
20
  import octobot_commons.time_frame_manager as time_frame_manager
21
21
  import octobot_trading.constants as constants
22
+ import octobot_trading.enums as enums
22
23
  import octobot_trading.exchanges.connectors.ccxt.enums as ccxt_enums
23
24
  import octobot_trading.exchanges.util.exchange_util as exchange_util
24
25
 
@@ -172,6 +173,20 @@ def get_contract_size(client, pair) -> float:
172
173
  return client.markets[pair][ccxt_enums.ExchangeConstantsMarketStatusCCXTColumns.CONTRACT_SIZE.value]
173
174
 
174
175
 
176
+ def get_fees(market_status) -> dict:
177
+ return {
178
+ enums.ExchangeConstantsMarketPropertyColumns.TAKER.value:
179
+ market_status.get(enums.ExchangeConstantsMarketPropertyColumns.TAKER.value,
180
+ constants.CONFIG_DEFAULT_FEES),
181
+ enums.ExchangeConstantsMarketPropertyColumns.MAKER.value:
182
+ market_status.get(enums.ExchangeConstantsMarketPropertyColumns.MAKER.value,
183
+ constants.CONFIG_DEFAULT_FEES),
184
+ enums.ExchangeConstantsMarketPropertyColumns.FEE.value:
185
+ market_status.get(enums.ExchangeConstantsMarketPropertyColumns.FEE.value,
186
+ constants.CONFIG_DEFAULT_FEES)
187
+ }
188
+
189
+
175
190
  def add_headers(client, headers_dict):
176
191
  """
177
192
  Add new headers to ccxt client
@@ -613,18 +613,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
613
613
 
614
614
  def get_fees(self, symbol):
615
615
  try:
616
- market_status = self.client.market(symbol)
617
- return {
618
- enums.ExchangeConstantsMarketPropertyColumns.TAKER.value:
619
- market_status.get(enums.ExchangeConstantsMarketPropertyColumns.TAKER.value,
620
- constants.CONFIG_DEFAULT_FEES),
621
- enums.ExchangeConstantsMarketPropertyColumns.MAKER.value:
622
- market_status.get(enums.ExchangeConstantsMarketPropertyColumns.MAKER.value,
623
- constants.CONFIG_DEFAULT_FEES),
624
- enums.ExchangeConstantsMarketPropertyColumns.FEE.value:
625
- market_status.get(enums.ExchangeConstantsMarketPropertyColumns.FEE.value,
626
- constants.CONFIG_DEFAULT_FEES)
627
- }
616
+ return ccxt_client_util.get_fees(self.client.market(symbol))
628
617
  except ccxt.NotSupported:
629
618
  raise octobot_trading.errors.NotSupported
630
619
  except Exception as e:
@@ -21,3 +21,7 @@ def parse_markets(exchange_name, forced_markets: list) -> dict:
21
21
  client = getattr(ccxt.async_support, exchange_name)()
22
22
  ccxt_client_util.set_markets_from_forced_markets(client, forced_markets)
23
23
  return client.markets
24
+
25
+
26
+ def get_fees(market_status) -> dict:
27
+ return ccxt_client_util.get_fees(market_status)
@@ -18,7 +18,6 @@ import decimal
18
18
  import octobot_backtesting.api as backtesting_api
19
19
  import octobot_backtesting.importers as importers
20
20
 
21
- import octobot_commons.number_util as number_util
22
21
  import octobot_commons.symbols as symbol_util
23
22
  import octobot_commons.time_frame_manager as time_frame_manager
24
23
  import octobot_commons.constants as commons_constants
@@ -180,6 +179,10 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
180
179
  return timestamp / 1000
181
180
 
182
181
  def get_fees(self, symbol):
182
+ if self._forced_market_statuses and symbol in self._forced_market_statuses:
183
+ # use self._forced_market_statuses when possible
184
+ return ccxt_client_simulation.get_fees(self._forced_market_statuses[symbol])
185
+
183
186
  result_fees = {
184
187
  enums.ExchangeConstantsMarketPropertyColumns.TAKER.value: constants.CONFIG_DEFAULT_SIMULATOR_FEES,
185
188
  enums.ExchangeConstantsMarketPropertyColumns.MAKER.value: constants.CONFIG_DEFAULT_SIMULATOR_FEES,
@@ -226,23 +229,17 @@ class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
226
229
  rate = symbol_fees[taker_or_maker]
227
230
  currency, market = symbol_util.parse_symbol(symbol).base_and_quote()
228
231
  fee_currency = currency
229
-
230
- precision = self.get_market_status(
231
- symbol, with_fixer=False
232
- )[enums.ExchangeConstantsMarketStatusColumns.PRECISION.value][
233
- enums.ExchangeConstantsMarketStatusColumns.PRECISION_PRICE.value
234
- ]
235
- cost = float(number_util.round_into_str_with_max_digits(float(quantity) * rate, precision))
232
+ cost = quantity * decimal.Decimal(str(rate))
236
233
 
237
234
  if util.get_order_side(order_type) == enums.TradeOrderSide.SELL.value:
238
- cost = float(number_util.round_into_str_with_max_digits(cost * float(price), precision))
235
+ cost = cost * price
239
236
  fee_currency = market
240
237
 
241
238
  return {
242
239
  enums.FeePropertyColumns.TYPE.value: taker_or_maker,
243
240
  enums.FeePropertyColumns.CURRENCY.value: fee_currency,
244
241
  enums.FeePropertyColumns.RATE.value: rate,
245
- enums.FeePropertyColumns.COST.value: decimal.Decimal(str(cost)),
242
+ enums.FeePropertyColumns.COST.value: cost,
246
243
  enums.FeePropertyColumns.IS_FROM_EXCHANGE.value: False,
247
244
  }
248
245
 
@@ -95,7 +95,11 @@ def get_order_amount_value_desc():
95
95
  f"0.1 to trade 0.1 BTC on BTC/USD (amount in base currency); " \
96
96
  f"25q to trade 25 USD worth of BTC on BTC/USD (amount in quote currency); " \
97
97
  f"2{dsl.QuantityType.PERCENT.value} to trade 2% of the total holdings of the asset; " \
98
- f"12{dsl.QuantityType.AVAILABLE_PERCENT.value} to trade 12% of the available holdings. " \
98
+ f"12{dsl.QuantityType.AVAILABLE_PERCENT.value} to trade 12% of the available holdings; " \
99
+ f"5{dsl.QuantityType.CURRENT_SYMBOL_ASSETS_PERCENT.value} to trade 5% of the available " \
100
+ f"holdings associated to the current traded symbol; " \
101
+ f"5{dsl.QuantityType.TRADED_SYMBOLS_ASSETS_PERCENT.value} to trade 5% of the available " \
102
+ f"holdings associated to all configured trading pairs. " \
99
103
  f"Leave empty to auto-compute the amount."
100
104
 
101
105
 
@@ -71,6 +71,22 @@ 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
+
74
90
  def _get_locked_amount_in_stop_orders(context, side):
75
91
  locked_amount = trading_constants.ZERO
76
92
  for order in context.exchange_manager.exchange_personal_data.orders_manager.get_open_orders(context.symbol):
@@ -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
 
17
+ import octobot_commons.symbols as commons_symbols
17
18
  import octobot_trading.modes.script_keywords.dsl as dsl
18
19
  import octobot_trading.modes.script_keywords.basic_keywords.account_balance as account_balance
19
20
  import octobot_trading.personal_data as trading_personal_data
@@ -48,11 +49,28 @@ async def get_amount_from_input_amount(
48
49
  elif amount_type is dsl.QuantityType.PERCENT:
49
50
  amount_value = await account_balance.available_account_balance(
50
51
  context, side, use_total_holding=True, reduce_only=reduce_only
51
- ) * amount_value / 100
52
+ ) * amount_value / trading_constants.ONE_HUNDRED
52
53
  elif amount_type is dsl.QuantityType.AVAILABLE_PERCENT:
53
54
  amount_value = await account_balance.available_account_balance(
54
55
  context, side, use_total_holding=False, reduce_only=reduce_only
55
- ) * amount_value / 100
56
+ ) * amount_value / trading_constants.ONE_HUNDRED
57
+ elif amount_type is dsl.QuantityType.CURRENT_SYMBOL_ASSETS_PERCENT:
58
+ if not context.symbol:
59
+ raise trading_errors.InvalidArgumentError(f"{amount_type} input types requires context.symbol to be set")
60
+ base, quote = commons_symbols.parse_symbol(context.symbol).base_and_quote()
61
+ total_symbol_assets_holdings_value = account_balance.get_holdings_value(context, (base, quote), base)
62
+ amount_value = total_symbol_assets_holdings_value * amount_value / trading_constants.ONE_HUNDRED
63
+ elif amount_type is dsl.QuantityType.TRADED_SYMBOLS_ASSETS_PERCENT:
64
+ if not context.symbol:
65
+ raise trading_errors.InvalidArgumentError(f"{amount_type} input types requires context.symbol to be set")
66
+ assets = set()
67
+ for symbol in context.exchange_manager.exchange_config.traded_symbols:
68
+ assets.add(symbol.base)
69
+ assets.add(symbol.quote)
70
+ total_symbol_assets_holdings_value = account_balance.get_holdings_value(
71
+ context, assets, commons_symbols.parse_symbol(context.symbol).base
72
+ )
73
+ amount_value = total_symbol_assets_holdings_value * amount_value / trading_constants.ONE_HUNDRED
56
74
  elif amount_type is dsl.QuantityType.POSITION_PERCENT:
57
75
  raise NotImplementedError(amount_type)
58
76
  else:
@@ -27,6 +27,8 @@ class QuantityType(enum.Enum):
27
27
  AVAILABLE_PERCENT = "a%"
28
28
  POSITION_PERCENT = "p%"
29
29
  ENTRY_PERCENT = "e%"
30
+ CURRENT_SYMBOL_ASSETS_PERCENT = "s%"
31
+ TRADED_SYMBOLS_ASSETS_PERCENT = "t%"
30
32
  FLAT = "@"
31
33
  UNKNOWN = "?"
32
34
 
@@ -55,18 +55,23 @@ class ValueConverter:
55
55
  self.logger.debug(f"Initialized last price for {symbol}")
56
56
  self.last_prices_by_trading_pair[symbol] = price
57
57
 
58
- def evaluate_value(self, currency, quantity, raise_error=True):
58
+ def evaluate_value(self, currency, quantity, raise_error=True, target_currency=None, init_price_fetchers=True):
59
59
  """
60
60
  Evaluate value returns the currency quantity value in the reference (attribute) currency
61
61
  :param currency: the currency to evaluate
62
62
  :param quantity: the currency quantity
63
63
  :param raise_error: will catch exception if False
64
+ :param target_currency: asset to evaluate currency into, defaults to self.portfolio_manager.reference_market
65
+ :param init_price_fetchers: will ask for missing ticker if price can't be converted if False
64
66
  :return: the currency value
65
67
  """
68
+ target_currency = target_currency or self.portfolio_manager.reference_market
66
69
  # easy case --> the current currency is the reference currency or the quantity is 0
67
- if currency == self.portfolio_manager.reference_market or quantity == constants.ZERO:
70
+ if currency == target_currency or quantity == constants.ZERO:
68
71
  return quantity
69
- currency_value = self._try_get_value_of_currency(currency, quantity, raise_error)
72
+ currency_value = self._try_get_value_of_currency(
73
+ currency, quantity, target_currency, raise_error, init_price_fetchers
74
+ )
70
75
  return self._check_currency_initialization(currency, currency_value)
71
76
 
72
77
  def _check_currency_initialization(self, currency, currency_value):
@@ -80,7 +85,7 @@ class ValueConverter:
80
85
  self.initializing_symbol_prices.remove(currency)
81
86
  return currency_value
82
87
 
83
- def _try_get_value_of_currency(self, currency, quantity, raise_error):
88
+ def _try_get_value_of_currency(self, currency, quantity, target_currency, raise_error, init_price_fetchers):
84
89
  """
85
90
  try_get_value_of_currency will try to get the value of the given currency quantity in reference market.
86
91
  It will try to get it from a trading pair that fit with the exchange availability.
@@ -92,7 +97,7 @@ class ValueConverter:
92
97
  # 1. try from existing pairs (as is and reversed)
93
98
  return self.convert_currency_value_using_last_prices(
94
99
  quantity, currency,
95
- self.portfolio_manager.reference_market,
100
+ target_currency,
96
101
  settlement_asset=settlement_asset
97
102
  )
98
103
  except errors.MissingPriceDataError as missing_data_exception:
@@ -100,29 +105,30 @@ class ValueConverter:
100
105
  try:
101
106
  # 2. try from existing indirect pairs
102
107
  value = self.try_convert_currency_value_using_multiple_pairs(
103
- currency, self.portfolio_manager.reference_market, quantity, []
108
+ currency, target_currency, quantity, []
104
109
  )
105
110
  if value is not None:
106
111
  return value
107
112
  except (errors.MissingPriceDataError, errors.PendingPriceDataError):
108
113
  pass
109
114
  symbol = symbol_util.merge_currencies(
110
- currency, self.portfolio_manager.reference_market, settlement_asset=settlement_asset
115
+ currency, target_currency, settlement_asset=settlement_asset
111
116
  )
112
117
  reversed_symbol = symbol_util.merge_currencies(
113
- self.portfolio_manager.reference_market, currency, settlement_asset=settlement_asset
118
+ target_currency, currency, settlement_asset=settlement_asset
114
119
  )
115
- # 3. if the pair or reversed pair is traded on exchange, use it to price "currency"
116
- if not any(
117
- self.portfolio_manager.exchange_manager.symbol_exists(s)
118
- for s in (symbol, reversed_symbol)
119
- ) and currency not in self.missing_currency_data_in_exchange:
120
- self._inform_no_matching_symbol(currency)
121
- self.missing_currency_data_in_exchange.add(currency)
122
- if not self.portfolio_manager.exchange_manager.is_backtesting:
123
- self._try_to_ask_ticker_missing_symbol_data(currency, symbol, reversed_symbol)
124
- if raise_error:
125
- raise missing_data_exception
120
+ if init_price_fetchers:
121
+ # 3. if the pair or reversed pair is traded on exchange, use it to price "currency"
122
+ if not any(
123
+ self.portfolio_manager.exchange_manager.symbol_exists(s)
124
+ for s in (symbol, reversed_symbol)
125
+ ) and currency not in self.missing_currency_data_in_exchange:
126
+ self._inform_no_matching_symbol(currency, target_currency)
127
+ self.missing_currency_data_in_exchange.add(currency)
128
+ if not self.portfolio_manager.exchange_manager.is_backtesting:
129
+ self._try_to_ask_ticker_missing_symbol_data(currency, symbol, reversed_symbol)
130
+ if not self.portfolio_manager.exchange_manager.is_backtesting and raise_error:
131
+ raise missing_data_exception
126
132
  return constants.ZERO
127
133
 
128
134
  def _try_to_ask_ticker_missing_symbol_data(self, currency, symbol, reversed_symbol):
@@ -170,14 +176,14 @@ class ValueConverter:
170
176
  self._bot_main_loop
171
177
  )
172
178
 
173
- def _inform_no_matching_symbol(self, currency):
179
+ def _inform_no_matching_symbol(self, currency, target_currency):
174
180
  """
175
181
  Log a missing currency pair to calculate the portfolio profitability
176
182
  :param currency: the concerned currency
177
183
  """
178
184
  # do not log warning in backtesting or tests
179
185
  if not self.portfolio_manager.exchange_manager.is_backtesting:
180
- self.logger.warning(f"No trading pair including {currency} and {self.portfolio_manager.reference_market} on"
186
+ self.logger.warning(f"No trading pair including {currency} and {target_currency} on"
181
187
  f" {self.portfolio_manager.exchange_manager.exchange_name}. {currency} "
182
188
  f"can't be valued for portfolio and profitability.")
183
189
 
@@ -169,3 +169,23 @@ class AbstractStorage:
169
169
  elif isinstance(val, types.FunctionType):
170
170
  raise ValueError(f"{val.__name__} is a function, it can't be serialized")
171
171
  return sanitized
172
+
173
+ @staticmethod
174
+ def hard_reset_and_retry_if_necessary(fn):
175
+ """
176
+ Will retry the given function if a database hard reset error is raised
177
+ Warning: when it happens, will also completely reset the database
178
+ """
179
+ async def wrapper(*args, **kwargs):
180
+ try:
181
+ return await fn(*args, **kwargs)
182
+ except Exception as err:
183
+ database = args[0]._get_db() # pylint: disable=protected-access
184
+ if database.is_hard_reset_error(err):
185
+ logging.get_logger(args[0].__class__.__name__).warning(
186
+ f"Resetting database due to [{err}] error"
187
+ )
188
+ await database.hard_reset()
189
+ return await fn(*args, **kwargs)
190
+ raise
191
+ return wrapper
@@ -51,6 +51,7 @@ class CandlesStorage(abstract_storage.AbstractStorage):
51
51
  commons_enums.InitializationEventExchangeTopics.CANDLES.value)
52
52
  await self.store_candles()
53
53
 
54
+ @abstract_storage.AbstractStorage.hard_reset_and_retry_if_necessary
54
55
  async def store_candles(self):
55
56
  if not self.enabled:
56
57
  return
@@ -66,6 +66,7 @@ class OrdersStorage(abstract_storage.AbstractStorage):
66
66
  await self._add_historical_open_orders(order, update_type)
67
67
  await self.trigger_debounced_flush()
68
68
 
69
+ @abstract_storage.AbstractStorage.hard_reset_and_retry_if_necessary
69
70
  async def _update_history(self):
70
71
  await self._get_db().replace_all(
71
72
  self.HISTORY_TABLE,
@@ -29,6 +29,7 @@ class PortfolioStorage(abstract_storage.AbstractStorage):
29
29
  PRICE_INIT_TIMEOUT = 30
30
30
  HISTORY_TABLE = commons_enums.RunDatabases.HISTORICAL_PORTFOLIO_VALUE.value
31
31
 
32
+ @abstract_storage.AbstractStorage.hard_reset_and_retry_if_necessary
32
33
  async def store_history(self, reset=False):
33
34
  if not self.enabled:
34
35
  return
@@ -28,6 +28,7 @@ class TradesStorage(abstract_storage.AbstractStorage):
28
28
  LIVE_CHANNEL = channels_name.OctoBotTradingChannelsName.TRADES_CHANNEL.value
29
29
  HISTORY_TABLE = commons_enums.DBTables.TRADES.value
30
30
 
31
+ @abstract_storage.AbstractStorage.hard_reset_and_retry_if_necessary
31
32
  async def _live_callback(
32
33
  self,
33
34
  exchange: str,
@@ -65,6 +66,7 @@ class TradesStorage(abstract_storage.AbstractStorage):
65
66
  await authenticator.update_trades(history, self.exchange_manager.exchange_name, reset)
66
67
  self._to_update_auth_data_ids_buffer.clear()
67
68
 
69
+ @abstract_storage.AbstractStorage.hard_reset_and_retry_if_necessary
68
70
  async def _store_history(self):
69
71
  database = self._get_db()
70
72
  await database.replace_all(
@@ -24,6 +24,7 @@ class TransactionsStorage(abstract_storage.AbstractStorage):
24
24
  IS_LIVE_CONSUMER = False
25
25
  HISTORY_TABLE = commons_enums.DBTables.TRANSACTIONS.value
26
26
 
27
+ @abstract_storage.AbstractStorage.hard_reset_and_retry_if_necessary
27
28
  async def _store_history(self):
28
29
  transactions = [
29
30
  transaction
@@ -48,6 +48,9 @@ class MarketDetails(updatable_dataclass.UpdatableDataclass):
48
48
  volume: list[float] = dataclasses.field(default_factory=list)
49
49
  time: list[float] = dataclasses.field(default_factory=list)
50
50
 
51
+ def has_full_candles(self):
52
+ return self.close and self.open and self.high and self.low and self.time
53
+
51
54
 
52
55
  @dataclasses.dataclass
53
56
  class OrdersDetails(updatable_dataclass.UpdatableDataclass):
@@ -83,7 +83,7 @@ def _update_symbol_market(exchange_manager, market_details: exchange_data_import
83
83
 
84
84
  async def add_symbols_details(
85
85
  exchange_manager, symbols: list, time_frame: str, exchange_data: exchange_data_import.ExchangeData,
86
- history_size=1, forced_markets=None, start_time=0, end_time=0
86
+ history_size=1, forced_markets=None, start_time=0, end_time=0, close_price_only=False
87
87
  ) -> exchange_data_import.ExchangeData:
88
88
  parsed_tf = common_enums.TimeFrames(time_frame)
89
89
 
@@ -101,13 +101,14 @@ async def add_symbols_details(
101
101
  symbol=symbol,
102
102
  time_frame=time_frame,
103
103
  close=[ohlcv[common_enums.PriceIndexes.IND_PRICE_CLOSE.value] for ohlcv in ohlcvs],
104
- open=[ohlcv[common_enums.PriceIndexes.IND_PRICE_OPEN.value] for ohlcv in ohlcvs],
105
- high=[ohlcv[common_enums.PriceIndexes.IND_PRICE_HIGH.value] for ohlcv in ohlcvs],
106
- low=[ohlcv[common_enums.PriceIndexes.IND_PRICE_LOW.value] for ohlcv in ohlcvs],
107
- volume=[ohlcv[common_enums.PriceIndexes.IND_PRICE_VOL.value] for ohlcv in ohlcvs],
104
+ open=[ohlcv[common_enums.PriceIndexes.IND_PRICE_OPEN.value] for ohlcv in ohlcvs] if not close_price_only else [],
105
+ high=[ohlcv[common_enums.PriceIndexes.IND_PRICE_HIGH.value] for ohlcv in ohlcvs] if not close_price_only else [],
106
+ low=[ohlcv[common_enums.PriceIndexes.IND_PRICE_LOW.value] for ohlcv in ohlcvs] if not close_price_only else [],
107
+ volume=[ohlcv[common_enums.PriceIndexes.IND_PRICE_VOL.value] for ohlcv in ohlcvs] if not close_price_only else [],
108
108
  time=[ohlcv[common_enums.PriceIndexes.IND_PRICE_TIME.value] for ohlcv in ohlcvs],
109
109
  )
110
- _update_symbol_market(exchange_manager, details)
110
+ if not close_price_only:
111
+ _update_symbol_market(exchange_manager, details)
111
112
  exchange_data.markets.append(details)
112
113
 
113
114
  await exchange_manager.exchange.connector.load_symbol_markets(forced_markets=forced_markets)
@@ -8,7 +8,7 @@ OctoBot-Tentacles-Manager>=2.9, <2.10
8
8
  trading-backend>=1.2.7
9
9
 
10
10
  # Exchange connection requirements
11
- ccxt==3.1.52 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
11
+ ccxt==4.0.65 # 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