OctoBot-Trading 2.4.75__tar.gz → 2.4.77__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/CHANGELOG.md +10 -0
  2. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.75/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.77}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/README.md +1 -1
  5. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/constants.py +3 -1
  7. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/errors.py +6 -0
  8. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/abstract_exchange.py +7 -1
  9. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +9 -1
  10. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +3 -3
  11. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +1 -1
  12. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/rest_exchange.py +11 -6
  13. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/modes_util.py +21 -0
  14. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_config_data.py +13 -5
  15. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/test_modes_util.py +58 -0
  16. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/real_exchange_tester.py +9 -0
  17. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_ascendex.py +1 -4
  18. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_binance.py +2 -4
  19. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_binance_futures.py +1 -4
  20. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bingx.py +1 -4
  21. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitfinex.py +1 -4
  22. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitget.py +1 -4
  23. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bithumb.py +1 -4
  24. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitso.py +1 -4
  25. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitstamp.py +1 -4
  26. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bybit.py +1 -4
  27. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bybit_futures.py +1 -4
  28. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_coinbase.py +1 -4
  29. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_coinex.py +1 -4
  30. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_cryptocom.py +1 -4
  31. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_gateio.py +1 -4
  32. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_hitbtc.py +1 -4
  33. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_hollaex.py +1 -4
  34. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_htx.py +1 -4
  35. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_kraken.py +1 -4
  36. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_kucoin.py +1 -4
  37. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_kucoin_futures.py +1 -4
  38. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_mexc.py +1 -4
  39. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_ndax.py +1 -4
  40. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_okcoin.py +1 -4
  41. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_okx.py +1 -4
  42. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_okx_futures.py +1 -4
  43. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_phemex.py +1 -4
  44. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_poloniex.py +1 -4
  45. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_upbit.py +1 -4
  46. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_wavesexchange.py +1 -4
  47. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/LICENSE +0 -0
  48. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/MANIFEST.in +0 -0
  49. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  50. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  51. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  52. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/requires.txt +0 -0
  53. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  54. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/channels.py +0 -0
  56. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/contracts.py +0 -0
  57. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/exchange.py +0 -0
  58. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/modes.py +0 -0
  59. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/orders.py +0 -0
  60. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/portfolio.py +0 -0
  61. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/positions.py +0 -0
  62. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/profitability.py +0 -0
  63. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/storage.py +0 -0
  64. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/symbol_data.py +0 -0
  65. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/trader.py +0 -0
  66. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/trades.py +0 -0
  67. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/enums.py +0 -0
  68. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_channel.py +0 -0
  69. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/__init__.py +0 -0
  70. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  71. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  72. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  73. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  74. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  75. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  76. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  79. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  80. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  81. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  82. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  85. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  86. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  87. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  88. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  90. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  91. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  93. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  94. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  95. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  96. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  99. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  100. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  101. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  102. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  105. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  106. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  107. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  108. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  109. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  110. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  112. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  113. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  114. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  115. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  117. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  118. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  119. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  120. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  121. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  123. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  125. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/config/__init__.py +0 -0
  126. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  127. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  128. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  129. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  131. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  132. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  133. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  134. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  136. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  137. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  138. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_builder.py +0 -0
  139. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_channels.py +0 -0
  140. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_details.py +0 -0
  141. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_factory.py +0 -0
  142. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_manager.py +0 -0
  143. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  144. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchanges.py +0 -0
  145. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  147. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  148. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  149. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/traders/__init__.py +0 -0
  150. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/traders/trader.py +0 -0
  151. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  152. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  154. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/__init__.py +0 -0
  155. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  156. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  157. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  158. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  159. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  161. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  163. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  164. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/mode.py +0 -0
  165. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/mode_activity.py +0 -0
  166. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/mode_config.py +0 -0
  167. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/modes_factory.py +0 -0
  168. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  169. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  171. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  172. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  173. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  174. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  175. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  176. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  177. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  178. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  179. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  181. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  182. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  183. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  184. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/octobot_channel_consumer.py +0 -0
  185. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  187. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/__init__.py +0 -0
  188. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  190. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  191. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  192. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  193. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  195. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  196. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  197. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order.py +0 -0
  198. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  199. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  200. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_group.py +0 -0
  201. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_state.py +0 -0
  202. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_util.py +0 -0
  203. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  204. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  205. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  207. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  208. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  209. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  210. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  211. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  212. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  213. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  215. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  216. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  217. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  218. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  219. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  220. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  221. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  222. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  224. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  225. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  226. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  228. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  229. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  230. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  231. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  232. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  233. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  235. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  236. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  237. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  239. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  240. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  241. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  242. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  243. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  244. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  245. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  246. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  247. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  248. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  249. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  250. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  251. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  252. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  254. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  255. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  256. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  257. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  259. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  260. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  261. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  262. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position.py +0 -0
  263. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  264. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position_state.py +0 -0
  265. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position_util.py +0 -0
  266. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  267. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  268. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  269. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  270. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  271. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  272. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  274. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  275. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/state.py +0 -0
  276. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  278. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  279. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  280. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trade.py +0 -0
  281. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  282. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  283. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  284. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  285. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  287. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  288. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  289. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  290. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  291. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  292. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  293. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  294. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/__init__.py +0 -0
  295. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/__init__.py +0 -0
  296. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  297. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  298. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/signal_producer.py +0 -0
  299. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/signal_creation.py +0 -0
  300. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  301. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/util.py +0 -0
  302. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/__init__.py +0 -0
  303. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/abstract_storage.py +0 -0
  304. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/candles_storage.py +0 -0
  305. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/orders_storage.py +0 -0
  306. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/portfolio_storage.py +0 -0
  307. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/storage_manager.py +0 -0
  308. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/trades_storage.py +0 -0
  309. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/transactions_storage.py +0 -0
  310. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/util.py +0 -0
  311. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/supervisors/__init__.py +0 -0
  312. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  313. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  314. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/config_util.py +0 -0
  316. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/initializable.py +0 -0
  317. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/initialization_util.py +0 -0
  318. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/simulator_updater_utils.py +0 -0
  319. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  321. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  322. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  323. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  324. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/requirements.txt +0 -0
  325. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/setup.cfg +0 -0
  326. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/setup.py +0 -0
  327. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_channels.py +0 -0
  329. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_exchange.py +0 -0
  330. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_modes.py +0 -0
  331. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_orders.py +0 -0
  332. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_portfolio.py +0 -0
  333. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_profitability.py +0 -0
  334. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_symbol_data.py +0 -0
  335. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_trader.py +0 -0
  336. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_trades.py +0 -0
  337. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/cli/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/__init__.py +0 -0
  339. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/contracts/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  341. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  342. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/funding/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  344. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/kline/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  346. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ohlcv/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  348. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  349. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/order_book/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  351. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/prices/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  353. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  354. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/recent_trades/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  356. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  357. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ticker/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  359. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  362. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  363. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  364. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/implementations/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  366. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  367. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_abstract_exchange.py +0 -0
  368. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  369. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_builder.py +0 -0
  370. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_factory.py +0 -0
  371. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_manager.py +0 -0
  372. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_simulator.py +0 -0
  373. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchanges.py +0 -0
  374. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/traders/__init__.py +0 -0
  375. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/traders/test_trader.py +0 -0
  376. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/types/__init__.py +0 -0
  377. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  378. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/util/__init__.py +0 -0
  379. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  380. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/util/test_exchange_util.py +0 -0
  381. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  384. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  385. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  386. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  387. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  388. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  390. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/test_abstract_mode_consumer.py +0 -0
  391. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/test_abstract_trading_mode.py +0 -0
  392. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/__init__.py +0 -0
  393. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  396. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  397. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  398. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  400. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  401. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  402. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  403. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_order_state.py +0 -0
  404. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  405. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  406. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  407. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  408. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  409. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order.py +0 -0
  410. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order_adapter.py +0 -0
  411. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order_factory.py +0 -0
  412. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order_util.py +0 -0
  413. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_orders_manager.py +0 -0
  414. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  415. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  418. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  419. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  420. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  421. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  422. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  423. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  424. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/market/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  426. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  427. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  428. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  429. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  430. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  431. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  434. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  435. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  436. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/history/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  438. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  439. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_asset.py +0 -0
  440. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  441. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  442. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  443. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  444. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  445. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/__init__.py +0 -0
  446. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  447. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  448. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  449. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/__init__.py +0 -0
  450. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/channel/__init__.py +0 -0
  451. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/states/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/test_position.py +0 -0
  453. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/test_position_factory.py +0 -0
  454. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/test_positions_manager.py +0 -0
  455. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/types/__init__.py +0 -0
  456. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  457. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  458. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/__init__.py +0 -0
  459. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_factory.py +0 -0
  460. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_manager.py +0 -0
  461. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  462. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_util.py +0 -0
  463. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/transactions/__init__.py +0 -0
  464. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  465. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  466. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/signals/__init__.py +0 -0
  467. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  468. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/signals/test_util.py +0 -0
  469. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/test_utils/__init__.py +0 -0
  470. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/test_utils/order_util.py +0 -0
  471. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/test_utils/random_numbers.py +0 -0
  472. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/util/__init__.py +0 -0
  473. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/util/test_config_util.py +0 -0
  474. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/__init__.py +0 -0
  475. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/__init__.py +0 -0
  476. {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
@@ -4,6 +4,16 @@ 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.77] - 2024-04-13
8
+ ### Added
9
+ - [Exchanges] Handle inactive markets
10
+
11
+ ## [2.4.76] - 2024-04-12
12
+ ### Added
13
+ - [Exchanges] Handle order type open status for symbol
14
+ ### Updated
15
+ - [Exchanges] Handle portfolio optimization using limit orders
16
+
7
17
  ## [2.4.75] - 2024-04-11
8
18
  ### Fixed
9
19
  - [Exchanges] Properly handle order not found errors
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.75
3
+ Version: 2.4.77
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.75](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.77](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
21
21
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.75
3
+ Version: 2.4.77
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.75](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.77](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.75](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.77](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.75" # major.minor.revision
18
+ VERSION = "2.4.77" # major.minor.revision
@@ -42,6 +42,8 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
42
42
  ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
43
43
  CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
44
44
  CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
45
+ # create instantly filled limit orders 0.5% beyond market
46
+ INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA = decimal.Decimal("0.005")
45
47
  CREATED_ORDER_FORCED_UPDATE_PERIOD = 5
46
48
 
47
49
  # Tentacles
@@ -131,7 +133,7 @@ EXCHANGE_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = [
131
133
 
132
134
  # coinbase ex: coinbase {"error":"PERMISSION_DENIED",
133
135
  # "error_details":"Missing required scopes","message":"Missing required scopes"}
134
- ("permission_denied", )
136
+ ("permission_denied", "required scopes"),
135
137
  ]
136
138
 
137
139
  # text content of errors due to exchange compliancy rules
@@ -93,6 +93,12 @@ class FailedRequest(Exception):
93
93
  """
94
94
 
95
95
 
96
+ class UnavailableOrderTypeForMarketError(Exception):
97
+ """
98
+ Raised when an exchange refuses to create a given type of order that should normally be supported
99
+ """
100
+
101
+
96
102
  class AuthenticationError(Exception):
97
103
  """
98
104
  Raised when an exchange failed to authenticate
@@ -383,7 +383,7 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
383
383
  """
384
384
  raise NotImplementedError("get_bundled_order_parameters is not implemented")
385
385
 
386
- def is_supported_order_type(self, order_type):
386
+ def is_supported_order_type(self, order_type: enums.TraderOrderType) -> bool:
387
387
  """
388
388
  Check if the order type is supported by the current exchange instance
389
389
  Should be used to know if we should simulate this order or create it on the exchange
@@ -392,6 +392,12 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
392
392
  """
393
393
  return order_type not in self.get_supported_elements(enums.ExchangeSupportedElements.UNSUPPORTED_ORDERS)
394
394
 
395
+ def is_market_open_for_order_type(self, symbol: str, order_type: enums.TraderOrderType) -> bool:
396
+ """
397
+ Override if necessary
398
+ """
399
+ return True
400
+
395
401
  def get_trade_fee(self, symbol: str, order_type: enums.TraderOrderType, quantity, price, taker_or_maker):
396
402
  """
397
403
  Calculates fees resulting to a trade
@@ -134,8 +134,16 @@ def get_ccxt_client_login_options(exchange_manager):
134
134
  return {'defaultType': 'spot'}
135
135
 
136
136
 
137
- def get_symbols(client):
137
+ def get_symbols(client, active_only):
138
138
  try:
139
+ if active_only:
140
+ return set(
141
+ symbol
142
+ for symbol in client.symbols
143
+ if client.markets.get(symbol, {}).get(
144
+ enums.ExchangeConstantsMarketStatusColumns.ACTIVE.value, True
145
+ )
146
+ )
139
147
  return set(client.symbols)
140
148
  except (AttributeError, TypeError):
141
149
  # ccxt exchange load_markets failed
@@ -97,7 +97,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
97
97
  )
98
98
 
99
99
  # initialize symbols and timeframes
100
- self.symbols = self.get_client_symbols()
100
+ self.symbols = self.get_client_symbols(active_only=True)
101
101
  self.time_frames = self.get_client_time_frames()
102
102
 
103
103
  except (ccxt.ExchangeNotAvailable, ccxt.RequestTimeout) as e:
@@ -157,8 +157,8 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
157
157
  else:
158
158
  raise
159
159
 
160
- def get_client_symbols(self):
161
- return ccxt_client_util.get_symbols(self.client)
160
+ def get_client_symbols(self, active_only=True):
161
+ return ccxt_client_util.get_symbols(self.client, active_only)
162
162
 
163
163
  def get_client_time_frames(self):
164
164
  return ccxt_client_util.get_time_frames(self.client)
@@ -766,7 +766,7 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
766
766
  return self.EXCHANGE_FEEDS.get(Feeds.CANDLE, Feeds.UNSUPPORTED.value) != Feeds.UNSUPPORTED.value
767
767
 
768
768
  def _is_supported_pair(self, pair):
769
- return pair in ccxt_client_util.get_symbols(self.client)
769
+ return pair in ccxt_client_util.get_symbols(self.client, True)
770
770
 
771
771
  def _is_pair_independent_feed(self, feed):
772
772
  return feed in self.PAIR_INDEPENDENT_CHANNELS
@@ -196,30 +196,35 @@ class RestExchange(abstract_exchange.AbstractExchange):
196
196
  self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
197
197
  if self.__class__.PRINT_DEBUG_LOGS:
198
198
  self.logger.warning(str(e))
199
- raise errors.MissingFunds(e)
200
- except ccxt.NotSupported:
201
- raise errors.NotSupported
199
+ raise errors.MissingFunds(e) from e
200
+ except ccxt.NotSupported as err:
201
+ raise errors.NotSupported from err
202
202
  except ccxt.AuthenticationError as err:
203
203
  # invalid api key or missing trading rights
204
204
  raise errors.AuthenticationError(
205
205
  f"Error when handling order {err}. Please make sure that trading permissions are on for this API key."
206
- )
206
+ ) from err
207
207
  except ccxt.DDoSProtection as e:
208
208
  # raised upon rate limit issues, last response data might have details on what is happening
209
209
  if self.should_log_on_ddos_exception(e):
210
210
  self.connector.log_ddos_error(e)
211
211
  raise errors.FailedRequest(f"Failed to order operation: {e.__class__.__name__} {e}") from e
212
212
  except Exception as e:
213
+ if not self.is_market_open_for_order_type(symbol, order_type):
214
+ raise errors.UnavailableOrderTypeForMarketError(
215
+ f"Error when handling order {e}. "
216
+ f"Exchange currently refuses to create orders of type {order_type} on {symbol}."
217
+ ) from e
213
218
  if exchanges_util.is_api_permission_error(e):
214
219
  # invalid api key or missing trading rights
215
220
  raise errors.AuthenticationError(
216
221
  f"Error when handling order {e}. Please make sure that trading permissions are on for this API key."
217
- )
222
+ ) from e
218
223
  if exchanges_util.is_exchange_rules_compliancy_error(e):
219
224
  raise errors.ExchangeCompliancyError(
220
225
  f"Error when handling order {e}. Exchange is refusing this order request on this account because "
221
226
  f"of its compliancy requirements."
222
- )
227
+ ) from e
223
228
  self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
224
229
  print(traceback.format_exc(), file=sys.stderr)
225
230
  self.logger.exception(e, False, f"Unexpected error during order operation: {e}")
@@ -120,6 +120,18 @@ async def convert_asset_to_target_asset(
120
120
  )
121
121
  return created_orders
122
122
 
123
+ if trading_personal_data.get_trade_order_type(order_type) is not trading_enums.TradeOrderType.MARKET:
124
+ # can't use market orders: use limit orders with price a bit under the current price to instant fill it.
125
+ price_delta = price * constants.INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA
126
+ if order_type is trading_enums.TraderOrderType.SELL_LIMIT:
127
+ price -= price_delta
128
+ elif order_type is trading_enums.TraderOrderType.BUY_LIMIT:
129
+ price += price_delta
130
+ else:
131
+ trading_mode.logger.error(
132
+ f"Unhandled order type in convertor limit order price adapter: {order_type}"
133
+ )
134
+
123
135
  # get order quantity
124
136
  quantity = _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount)
125
137
  symbol_market = trading_mode.exchange_manager.exchange.get_market_status(symbol, with_fixer=False)
@@ -147,6 +159,15 @@ def _get_associated_symbol_and_order_type(trading_mode, asset: str, target_asset
147
159
  symbol, reversed_symbol = exchange_util.get_associated_symbol(trading_mode.exchange_manager, asset, target_asset)
148
160
  order_type = trading_enums.TraderOrderType.BUY_MARKET if reversed_symbol else \
149
161
  trading_enums.TraderOrderType.SELL_MARKET
162
+ if not trading_mode.exchange_manager.exchange.is_market_open_for_order_type(symbol, order_type):
163
+ # can't use market orders: use limit orders instead
164
+ order_type = trading_enums.TraderOrderType.BUY_LIMIT if order_type is trading_enums.TraderOrderType.BUY_MARKET \
165
+ else trading_enums.TraderOrderType.SELL_LIMIT
166
+ if not trading_mode.exchange_manager.exchange.is_market_open_for_order_type(symbol, order_type):
167
+ # can't convert asset: still try with limit orders but it will probably fail
168
+ trading_mode.logger.error(
169
+ f"Both market and {order_type} order are currently unsupported. Trying limit orders anyway."
170
+ )
150
171
  return symbol, order_type
151
172
 
152
173
 
@@ -80,7 +80,6 @@ class TestExchangeConfig:
80
80
  }
81
81
  _, exchange_manager = await self.init_default(config=config)
82
82
 
83
- assert "UNI/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
84
83
  assert "AVAX/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
85
84
  assert "ADA/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
86
85
  assert "MATIC/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
@@ -90,6 +89,9 @@ class TestExchangeConfig:
90
89
  assert "AVAX/BNB" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
91
90
  assert "ETH/BTC" in exchange_manager.exchange_config.traded_symbol_pairs
92
91
 
92
+ # inactive markets
93
+ assert "UNI/BTC" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
94
+
93
95
  # disabled
94
96
  assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies
95
97
  assert "ADA/ETH" not in exchange_manager.exchange_config.traded_symbol_pairs
@@ -113,10 +115,12 @@ class TestExchangeConfig:
113
115
  }
114
116
  _, exchange_manager = await self.init_default(config=config)
115
117
 
116
- assert "TRX/BTC" in exchange_manager.exchange_config.traded_symbol_pairs
117
118
  assert "ADA/BTC" in exchange_manager.exchange_config.traded_symbol_pairs
118
119
  assert "Bitcoin" in exchange_manager.exchange_config.traded_cryptocurrencies
119
120
 
121
+ # inactive markets
122
+ assert "TRX/BTC" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
123
+
120
124
  # invalid ETH wildcard config
121
125
  assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies
122
126
 
@@ -141,7 +145,6 @@ class TestExchangeConfig:
141
145
 
142
146
  _, exchange_manager = await self.init_default(config=config)
143
147
 
144
- assert "UNI/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
145
148
  assert "AVAX/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
146
149
  assert "ADA/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
147
150
  assert "MATIC/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
@@ -152,6 +155,9 @@ class TestExchangeConfig:
152
155
  assert "AVAX/BNB" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
153
156
  assert "BTC/USDT" in exchange_manager.exchange_config.traded_symbol_pairs
154
157
 
158
+ # inactive markets
159
+ assert "UNI/BTC" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
160
+
155
161
  # disabled
156
162
  assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies
157
163
  assert "ADA/ETH" not in exchange_manager.exchange_config.traded_symbol_pairs
@@ -189,11 +195,13 @@ class TestExchangeConfig:
189
195
  _, exchange_manager = await self.init_default(config=config)
190
196
 
191
197
  assert exchange_manager.exchange_config.traded_cryptocurrencies["Binance Coin"] == ["BNB/USDT"]
192
- assert exchange_manager.exchange_config.traded_cryptocurrencies["Binance USD"] == ["BNB/BUSD"]
193
198
  assert exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"] == ["BNB/BTC"]
194
199
  assert exchange_manager.exchange_config.traded_cryptocurrencies["Tether"] == ["BNB/USDT"]
195
200
 
196
- sorted_pairs_without_redundancy = sorted(["BNB/USDT", "BNB/BUSD", "BNB/BTC"])
201
+ # inactive markets
202
+ assert exchange_manager.exchange_config.traded_cryptocurrencies["Binance USD"] == []
203
+
204
+ sorted_pairs_without_redundancy = sorted(["BNB/USDT", "BNB/BTC"])
197
205
  assert sorted(exchange_manager.exchange_config.traded_symbol_pairs) == sorted_pairs_without_redundancy
198
206
 
199
207
  cancel_ccxt_throttle_task()
@@ -243,6 +243,64 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
243
243
  trading_mode.create_order.assert_called_once()
244
244
  trading_mode.create_order.reset_mock()
245
245
 
246
+ # using limit orders
247
+ def _is_market_open_for_order_type(symbol: str, order_type: trading_enums.TraderOrderType):
248
+ return (
249
+ True if order_type in (trading_enums.TraderOrderType.SELL_LIMIT, trading_enums.TraderOrderType.BUY_LIMIT)
250
+ else False
251
+ )
252
+
253
+ with mock.patch.object(
254
+ exchange_manager.exchange, "is_market_open_for_order_type",
255
+ mock.Mock(side_effect=_is_market_open_for_order_type)
256
+ ) as is_market_open_for_order_type_mock:
257
+ # cast 1: buying
258
+ orders = await modes_util.convert_asset_to_target_asset(
259
+ trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(450)
260
+ )
261
+ assert len(orders) == 1
262
+ order = orders[0]
263
+ assert order.order_type == trading_enums.TraderOrderType.BUY_LIMIT
264
+ assert order.symbol == "ETH/USDT"
265
+ # a bit lower than 0.3 because of the price change
266
+ assert order.origin_quantity == decimal.Decimal("0.29850746")
267
+ adapted_price = decimal.Decimal(1500) * (
268
+ constants.ONE + constants.INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA
269
+ )
270
+ assert order.origin_price == adapted_price
271
+ assert order.created_last_price == adapted_price
272
+ assert is_market_open_for_order_type_mock.call_count == 2
273
+ assert is_market_open_for_order_type_mock.mock_calls[0].args == \
274
+ ("ETH/USDT", trading_enums.TraderOrderType.BUY_MARKET)
275
+ assert is_market_open_for_order_type_mock.mock_calls[1].args == \
276
+ ("ETH/USDT", trading_enums.TraderOrderType.BUY_LIMIT)
277
+ is_market_open_for_order_type_mock.reset_mock()
278
+ trading_mode.create_order.assert_called_once()
279
+ trading_mode.create_order.reset_mock()
280
+
281
+ # cast 2: selling
282
+ orders = await modes_util.convert_asset_to_target_asset(
283
+ trading_mode, "ETH", "USDT", tickers, asset_amount=decimal.Decimal(2)
284
+ )
285
+ assert len(orders) == 1
286
+ order = orders[0]
287
+ assert order.order_type == trading_enums.TraderOrderType.SELL_LIMIT
288
+ assert order.symbol == "ETH/USDT"
289
+ assert order.origin_quantity == decimal.Decimal("2")
290
+ adapted_price = decimal.Decimal(1500) * (
291
+ constants.ONE - constants.INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA
292
+ )
293
+ assert order.origin_price == adapted_price
294
+ assert order.created_last_price == adapted_price
295
+ assert is_market_open_for_order_type_mock.call_count == 2
296
+ assert is_market_open_for_order_type_mock.mock_calls[0].args == \
297
+ ("ETH/USDT", trading_enums.TraderOrderType.SELL_MARKET)
298
+ assert is_market_open_for_order_type_mock.mock_calls[1].args == \
299
+ ("ETH/USDT", trading_enums.TraderOrderType.SELL_LIMIT)
300
+ is_market_open_for_order_type_mock.reset_mock()
301
+ trading_mode.create_order.assert_called_once()
302
+ trading_mode.create_order.reset_mock()
303
+
246
304
 
247
305
  def _get_trading_mode(exchange_manager):
248
306
  return mock.Mock(
@@ -35,6 +35,7 @@ class RealExchangeTester:
35
35
  SYMBOL = None
36
36
  SYMBOL_2 = None
37
37
  SYMBOL_3 = None
38
+ INACTIVE_MARKETS = []
38
39
  # default is 1h, change if necessary
39
40
  TIME_FRAME = commons_enums.TimeFrames.ONE_HOUR
40
41
  ALLOWED_TIMEFRAMES_WITHOUT_CANDLE = 0
@@ -102,6 +103,14 @@ class RealExchangeTester:
102
103
  # async def test_create_order(self):
103
104
  # pass
104
105
 
106
+ def ensure_required_market_status_values(self, market_status):
107
+ assert market_status
108
+ assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
109
+ assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
110
+ assert market_status[Ecmsc.ACTIVE.value] \
111
+ is False if market_status[Ecmsc.SYMBOL.value] in self.INACTIVE_MARKETS else True
112
+ assert market_status[Ecmsc.PRECISION.value]
113
+
105
114
  async def test_get_historical_ohlcv(self):
106
115
  # common implementation, should always work if candles history is supported
107
116
  historical_ohlcv = await self.get_historical_ohlcv()
@@ -52,10 +52,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
52
52
 
53
53
  async def test_get_market_status(self):
54
54
  for market_status in await self.get_market_statuses():
55
- assert market_status
56
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
57
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
58
- assert market_status[Ecmsc.PRECISION.value]
55
+ self.ensure_required_market_status_values(market_status)
59
56
  # on AscendEx, precision is a decimal instead of a number of digits
60
57
  assert 0 < market_status[Ecmsc.PRECISION.value][
61
58
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in AscendEx tentacle
@@ -32,6 +32,7 @@ class TestBinanceRealExchangeTester(RealExchangeTester):
32
32
  SYMBOL = "BTC/USDT"
33
33
  SYMBOL_2 = "ETH/BTC"
34
34
  SYMBOL_3 = "XRP/BTC"
35
+ INACTIVE_MARKETS = [SYMBOL_3]
35
36
 
36
37
  async def test_time_frames(self):
37
38
  time_frames = await self.time_frames()
@@ -55,10 +56,7 @@ class TestBinanceRealExchangeTester(RealExchangeTester):
55
56
 
56
57
  async def test_get_market_status(self):
57
58
  for market_status in await self.get_market_statuses():
58
- assert market_status
59
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
60
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
61
- assert market_status[Ecmsc.PRECISION.value]
59
+ self.ensure_required_market_status_values(market_status)
62
60
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
63
61
  market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
64
62
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
@@ -59,10 +59,7 @@ class TestBinanceFuturesRealExchangeTester(RealFuturesExchangeTester):
59
59
 
60
60
  async def test_get_market_status(self):
61
61
  for market_status in await self.get_market_statuses():
62
- assert market_status
63
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
64
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
65
- assert market_status[Ecmsc.PRECISION.value]
62
+ self.ensure_required_market_status_values(market_status)
66
63
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
67
64
  market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
68
65
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
@@ -56,10 +56,7 @@ class TestBingxRealExchangeTester(RealExchangeTester):
56
56
 
57
57
  async def test_get_market_status(self):
58
58
  for market_status in await self.get_market_statuses():
59
- assert market_status
60
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
61
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
62
- assert market_status[Ecmsc.PRECISION.value]
59
+ self.ensure_required_market_status_values(market_status)
63
60
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
64
61
  market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
65
62
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
@@ -55,10 +55,7 @@ class TestBitfinexRealExchangeTester(RealExchangeTester):
55
55
 
56
56
  async def test_get_market_status(self):
57
57
  for market_status in await self.get_market_statuses():
58
- assert market_status
59
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
60
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
61
- assert market_status[Ecmsc.PRECISION.value]
58
+ self.ensure_required_market_status_values(market_status)
62
59
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
63
60
  market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
64
61
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
@@ -57,10 +57,7 @@ class TestBitgetRealExchangeTester(RealExchangeTester):
57
57
 
58
58
  async def test_get_market_status(self):
59
59
  for market_status in await self.get_market_statuses():
60
- assert market_status
61
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
62
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
63
- assert market_status[Ecmsc.PRECISION.value]
60
+ self.ensure_required_market_status_values(market_status)
64
61
  # on Bitget, precision is a decimal instead of a number of digits
65
62
  assert 0 < market_status[Ecmsc.PRECISION.value][
66
63
  Ecmsc.PRECISION_AMOUNT.value] < 1 # to be fixed in Bitget tentacle
@@ -50,10 +50,7 @@ class TestBithumbRealExchangeTester(RealExchangeTester):
50
50
 
51
51
  async def test_get_market_status(self):
52
52
  for market_status in await self.get_market_statuses():
53
- assert market_status
54
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
55
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
56
- assert market_status[Ecmsc.PRECISION.value]
53
+ self.ensure_required_market_status_values(market_status)
57
54
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
58
55
  market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
59
56
  assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
@@ -49,10 +49,7 @@ class TestBitsoRealExchangeTester(RealExchangeTester):
49
49
 
50
50
  async def test_get_market_status(self):
51
51
  for market_status in await self.get_market_statuses():
52
- assert market_status
53
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
54
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
55
- assert market_status[Ecmsc.PRECISION.value]
52
+ self.ensure_required_market_status_values(market_status)
56
53
  # on this exchange, precision is a decimal instead of a number of digits
57
54
  assert 0 < market_status[Ecmsc.PRECISION.value][
58
55
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in this exchange tentacle
@@ -53,10 +53,7 @@ class TestBitstampRealExchangeTester(RealExchangeTester):
53
53
 
54
54
  async def test_get_market_status(self):
55
55
  for market_status in await self.get_market_statuses():
56
- assert market_status
57
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
58
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
59
- assert market_status[Ecmsc.PRECISION.value]
56
+ self.ensure_required_market_status_values(market_status)
60
57
  # on this exchange, precision is a decimal instead of a number of digits
61
58
  assert 0 < market_status[Ecmsc.PRECISION.value][
62
59
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in this exchange tentacle
@@ -53,10 +53,7 @@ class TestBybitRealExchangeTester(RealExchangeTester):
53
53
 
54
54
  async def test_get_market_status(self):
55
55
  for market_status in await self.get_market_statuses():
56
- assert market_status
57
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
58
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
59
- assert market_status[Ecmsc.PRECISION.value]
56
+ self.ensure_required_market_status_values(market_status)
60
57
  # on Bybit, precision is a decimal instead of a number of digits
61
58
  assert 0 < market_status[Ecmsc.PRECISION.value][
62
59
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in Bybit tentacle
@@ -59,10 +59,7 @@ class TestBybitRealExchangeTester(RealFuturesExchangeTester):
59
59
 
60
60
  async def test_get_market_status(self):
61
61
  for market_status in await self.get_market_statuses():
62
- assert market_status
63
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
64
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
65
- assert market_status[Ecmsc.PRECISION.value]
62
+ self.ensure_required_market_status_values(market_status)
66
63
  # on Bybit, precision is a decimal instead of a number of digits
67
64
  assert 0 < market_status[Ecmsc.PRECISION.value][
68
65
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in Bybit tentacle
@@ -50,10 +50,7 @@ class TestCoinbaseRealExchangeTester(RealExchangeTester):
50
50
 
51
51
  async def test_get_market_status(self):
52
52
  for market_status in await self.get_market_statuses():
53
- assert market_status
54
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
55
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
56
- assert market_status[Ecmsc.PRECISION.value]
53
+ self.ensure_required_market_status_values(market_status)
57
54
  assert 0 < market_status[Ecmsc.PRECISION.value][
58
55
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in coinbase tentacle
59
56
  assert 0 < market_status[Ecmsc.PRECISION.value][
@@ -53,10 +53,7 @@ class TestCoinexRealExchangeTester(RealExchangeTester):
53
53
 
54
54
  async def test_get_market_status(self):
55
55
  for market_status in await self.get_market_statuses():
56
- assert market_status
57
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
58
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
59
- assert market_status[Ecmsc.PRECISION.value]
56
+ self.ensure_required_market_status_values(market_status)
60
57
  # on this exchange, precision is a decimal instead of a number of digits
61
58
  assert 0 < market_status[Ecmsc.PRECISION.value][
62
59
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in this exchange tentacle
@@ -51,10 +51,7 @@ class TestCryptoComRealExchangeTester(RealExchangeTester):
51
51
 
52
52
  async def test_get_market_status(self):
53
53
  for market_status in await self.get_market_statuses():
54
- assert market_status
55
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
56
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
57
- assert market_status[Ecmsc.PRECISION.value]
54
+ self.ensure_required_market_status_values(market_status)
58
55
  # on CryptoCom, precision is a decimal instead of a number of digits
59
56
  assert 0 < market_status[Ecmsc.PRECISION.value][
60
57
  Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in CryptoCom tentacle
@@ -49,10 +49,7 @@ class TestGateIORealExchangeTester(RealExchangeTester):
49
49
 
50
50
  async def test_get_market_status(self):
51
51
  for market_status in await self.get_market_statuses():
52
- assert market_status
53
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
54
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
55
- assert market_status[Ecmsc.PRECISION.value]
52
+ self.ensure_required_market_status_values(market_status)
56
53
  assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
57
54
  Ecmsc.PRECISION_AMOUNT.value] < 1 # to be fixed in tentacle
58
55
  assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
@@ -50,10 +50,7 @@ class TestHitBtcRealExchangeTester(RealExchangeTester):
50
50
 
51
51
  async def test_get_market_status(self):
52
52
  for market_status in await self.get_market_statuses():
53
- assert market_status
54
- assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
55
- assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
56
- assert market_status[Ecmsc.PRECISION.value]
53
+ self.ensure_required_market_status_values(market_status)
57
54
  assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
58
55
  Ecmsc.PRECISION_AMOUNT.value] < 1 # to be fixed in hitbtc tentacle
59
56
  assert 1e-09 <= market_status[Ecmsc.PRECISION.value][