OctoBot-Trading 2.4.50__tar.gz → 2.4.52__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 (470) hide show
  1. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/CHANGELOG.md +14 -3
  2. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.50/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.52}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/README.md +1 -1
  5. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/__init__.py +8 -2
  7. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/exchange.py +2 -2
  8. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/portfolio.py +4 -0
  9. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/trades.py +18 -1
  10. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/constants.py +12 -8
  11. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/enums.py +1 -0
  12. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/candles_manager.py +2 -1
  13. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +4 -2
  14. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +1 -0
  15. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_builder.py +4 -0
  16. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_factory.py +6 -41
  17. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_manager.py +1 -2
  18. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/trader.py +1 -1
  19. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/rest_exchange.py +4 -1
  20. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/exchange_util.py +2 -0
  21. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order.py +10 -0
  22. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_factory.py +5 -1
  23. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +6 -1
  24. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade.py +6 -0
  25. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/exchange_data.py +1 -0
  26. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order.py +3 -0
  27. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/real_exchange_tester.py +42 -1
  28. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_ascendex.py +3 -0
  29. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_binance.py +3 -0
  30. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_binance_futures.py +3 -0
  31. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bingx.py +38 -18
  32. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitfinex.py +3 -0
  33. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitget.py +5 -0
  34. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bithumb.py +3 -0
  35. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitso.py +3 -0
  36. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitstamp.py +3 -0
  37. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bybit.py +3 -0
  38. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bybit_futures.py +3 -0
  39. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_coinbase.py +3 -0
  40. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_coinex.py +4 -0
  41. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_cryptocom.py +4 -0
  42. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_gateio.py +3 -0
  43. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_hitbtc.py +4 -0
  44. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_hollaex.py +3 -0
  45. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_htx.py +3 -0
  46. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_kraken.py +5 -0
  47. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_kucoin.py +3 -0
  48. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_kucoin_futures.py +3 -0
  49. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_mexc.py +3 -0
  50. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_ndax.py +3 -0
  51. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_okx.py +3 -0
  52. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_okx_futures.py +3 -0
  53. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_phemex.py +5 -0
  54. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_poloniex.py +4 -0
  55. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_upbit.py +3 -0
  56. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_wavesexchange.py +3 -0
  57. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/LICENSE +0 -0
  58. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/MANIFEST.in +0 -0
  59. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  60. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  61. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  62. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/requires.txt +0 -0
  63. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  64. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/channels.py +0 -0
  65. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/contracts.py +0 -0
  66. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/modes.py +0 -0
  67. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/orders.py +0 -0
  68. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/positions.py +0 -0
  69. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/profitability.py +0 -0
  70. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/storage.py +0 -0
  71. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/symbol_data.py +0 -0
  72. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/trader.py +0 -0
  73. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/errors.py +0 -0
  74. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_channel.py +0 -0
  75. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/__init__.py +0 -0
  76. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  77. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  78. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  79. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  80. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  81. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  82. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  85. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  86. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  87. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  88. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  91. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  92. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  94. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  96. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  98. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  99. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  100. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  101. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  102. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  104. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  105. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  106. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  107. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  110. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  111. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  112. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  113. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  114. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  116. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  117. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  118. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  119. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  120. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  123. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  124. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  125. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  126. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  128. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  129. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  131. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/config/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  133. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  134. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  137. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  138. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  139. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  140. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  141. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  143. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  144. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  145. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_channels.py +0 -0
  146. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_details.py +0 -0
  147. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  148. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchanges.py +0 -0
  149. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  150. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  151. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  152. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  153. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/__init__.py +0 -0
  154. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  155. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  157. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  159. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  160. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  161. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  163. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  165. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  166. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/mode.py +0 -0
  167. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/mode_config.py +0 -0
  168. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/modes_factory.py +0 -0
  169. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/modes_util.py +0 -0
  170. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  171. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  172. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  173. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  174. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  175. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  176. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  177. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  178. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  179. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  181. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  182. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  183. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  184. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/octobot_channel_consumer.py +0 -0
  185. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  187. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/__init__.py +0 -0
  188. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  190. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  191. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  192. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  193. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  195. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  196. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  197. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  198. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_group.py +0 -0
  199. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_state.py +0 -0
  200. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_util.py +0 -0
  201. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  202. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  203. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  205. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  206. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  207. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  208. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  209. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  210. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  211. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  212. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  214. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  215. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  216. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  217. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  218. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  219. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  220. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  222. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  223. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  224. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  225. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  226. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  227. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  228. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  229. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  231. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  232. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  233. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  234. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  235. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  236. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  237. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  238. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  240. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  241. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  242. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  243. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  244. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  245. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  246. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  247. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  248. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  249. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  250. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  251. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  252. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  253. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  254. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/__init__.py +0 -0
  255. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  257. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  258. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  259. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position.py +0 -0
  260. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  261. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position_state.py +0 -0
  262. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position_util.py +0 -0
  263. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  264. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  266. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  267. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  268. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  269. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  271. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  272. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/state.py +0 -0
  273. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  276. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  277. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  278. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  279. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  280. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  281. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  282. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  283. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  284. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  285. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  287. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  288. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  289. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  290. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/__init__.py +0 -0
  292. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  293. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  294. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/signal_producer.py +0 -0
  295. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/signal_creation.py +0 -0
  296. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  297. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/util.py +0 -0
  298. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/abstract_storage.py +0 -0
  300. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/candles_storage.py +0 -0
  301. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/orders_storage.py +0 -0
  302. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/portfolio_storage.py +0 -0
  303. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/storage_manager.py +0 -0
  304. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/trades_storage.py +0 -0
  305. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/transactions_storage.py +0 -0
  306. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/util.py +0 -0
  307. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/supervisors/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  309. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  310. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/config_util.py +0 -0
  312. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/initializable.py +0 -0
  313. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/initialization_util.py +0 -0
  314. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/simulator_updater_utils.py +0 -0
  315. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  317. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  318. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  319. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/requirements.txt +0 -0
  320. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/setup.cfg +0 -0
  321. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/setup.py +0 -0
  322. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_channels.py +0 -0
  324. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_exchange.py +0 -0
  325. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_modes.py +0 -0
  326. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_orders.py +0 -0
  327. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_portfolio.py +0 -0
  328. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_profitability.py +0 -0
  329. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_symbol_data.py +0 -0
  330. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_trader.py +0 -0
  331. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_trades.py +0 -0
  332. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/cli/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/__init__.py +0 -0
  334. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/contracts/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  336. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  337. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/funding/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  339. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/kline/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  341. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ohlcv/__init__.py +0 -0
  342. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  343. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  344. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/order_book/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  346. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/prices/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  348. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  349. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/recent_trades/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  351. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  352. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ticker/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  354. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  357. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  358. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  359. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/implementations/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  361. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  362. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_abstract_exchange.py +0 -0
  363. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  364. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_builder.py +0 -0
  365. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_config_data.py +0 -0
  366. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_factory.py +0 -0
  367. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_manager.py +0 -0
  368. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_simulator.py +0 -0
  369. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchanges.py +0 -0
  370. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/traders/__init__.py +0 -0
  371. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/traders/test_trader.py +0 -0
  372. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/types/__init__.py +0 -0
  373. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  374. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/util/__init__.py +0 -0
  375. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  376. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/util/test_exchange_util.py +0 -0
  377. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/__init__.py +0 -0
  379. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  380. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  381. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  382. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  384. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/test_abstract_mode_consumer.py +0 -0
  385. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/test_abstract_trading_mode.py +0 -0
  386. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/test_modes_util.py +0 -0
  387. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/__init__.py +0 -0
  388. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  391. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  392. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  393. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/__init__.py +0 -0
  394. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  395. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  396. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  397. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  398. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_order_state.py +0 -0
  399. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  400. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  401. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  402. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  403. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  404. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order_adapter.py +0 -0
  405. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order_factory.py +0 -0
  406. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order_util.py +0 -0
  407. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_orders_manager.py +0 -0
  408. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  409. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  411. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  412. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  413. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  414. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  415. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  416. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  417. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/market/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  419. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  420. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  421. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  423. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  424. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  426. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  427. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  428. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  429. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/history/__init__.py +0 -0
  430. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  431. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  432. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_asset.py +0 -0
  433. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  434. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  435. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  436. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  437. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  438. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  440. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  441. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  442. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/channel/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/states/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/test_position.py +0 -0
  446. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/test_position_factory.py +0 -0
  447. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/test_positions_manager.py +0 -0
  448. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/types/__init__.py +0 -0
  449. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  450. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  451. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_factory.py +0 -0
  453. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_manager.py +0 -0
  454. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  455. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_util.py +0 -0
  456. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/transactions/__init__.py +0 -0
  457. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  458. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  459. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/signals/__init__.py +0 -0
  460. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  461. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/signals/test_util.py +0 -0
  462. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/test_utils/__init__.py +0 -0
  463. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/test_utils/order_util.py +0 -0
  464. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/test_utils/random_numbers.py +0 -0
  465. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/util/__init__.py +0 -0
  466. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/util/test_config_util.py +0 -0
  467. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/__init__.py +0 -0
  468. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/__init__.py +0 -0
  469. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  470. {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_okcoin.py +0 -0
@@ -4,11 +4,22 @@ 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.50] - 2023-01-18
7
+ ## [2.4.52] - 2024-01-30
8
+ ### Added
9
+ - [API] Trades utility
10
+ ### Fixed
11
+ - [Exchanges] Unidentified auth error in market status loading
12
+ - [Exchanges] Fetch balance error spam on auth error
13
+
14
+ ## [2.4.51] - 2024-01-18
15
+ ### Added
16
+ - [CoinEx] Support CoinEx exchange
17
+
18
+ ## [2.4.50] - 2024-01-18
8
19
  ### Updated
9
- - [Websocket] Fix websocket reconnection after binance auto disconect
20
+ - [Websocket] Fix websocket reconnection after binance auto disconnect
10
21
 
11
- ## [2.4.49] - 2023-01-08
22
+ ## [2.4.49] - 2024-01-08
12
23
  ### Updated
13
24
  - [Exchanges] replace Huobi by HTX
14
25
  - [CCXT] 4.2.10
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.50
3
+ Version: 2.4.52
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.50](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.52](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.50
3
+ Version: 2.4.52
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.50](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.52](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.50](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.52](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.50" # major.minor.revision
18
+ VERSION = "2.4.52" # major.minor.revision
@@ -51,6 +51,8 @@ from octobot_trading.api.symbol_data import (
51
51
  from octobot_trading.api.trades import (
52
52
  get_trade_history,
53
53
  get_completed_pnl_history,
54
+ is_executed_trade,
55
+ is_trade_after_or_at,
54
56
  get_total_paid_trading_fees,
55
57
  get_trade_exchange_name,
56
58
  parse_trade_type,
@@ -97,7 +99,7 @@ from octobot_trading.api.exchange import (
97
99
  get_new_ccxt_client,
98
100
  get_default_exchange_type,
99
101
  is_sponsoring,
100
- is_valid_account,
102
+ is_broker_enabled,
101
103
  get_historical_ohlcv,
102
104
  get_bot_id,
103
105
  get_supported_exchange_types,
@@ -154,6 +156,7 @@ from octobot_trading.api.portfolio import (
154
156
  set_simulated_portfolio_initial_config,
155
157
  refresh_real_trader_portfolio,
156
158
  format_portfolio,
159
+ parse_decimal_portfolio,
157
160
  get_draw_down,
158
161
  get_coefficient_of_determination,
159
162
  get_usd_like_symbol_from_symbols,
@@ -229,6 +232,8 @@ __all__ = [
229
232
  "get_config_symbols",
230
233
  "get_trade_history",
231
234
  "get_completed_pnl_history",
235
+ "is_executed_trade",
236
+ "is_trade_after_or_at",
232
237
  "get_total_paid_trading_fees",
233
238
  "get_trade_exchange_name",
234
239
  "parse_trade_type",
@@ -271,7 +276,7 @@ __all__ = [
271
276
  "get_new_ccxt_client",
272
277
  "get_default_exchange_type",
273
278
  "is_sponsoring",
274
- "is_valid_account",
279
+ "is_broker_enabled",
275
280
  "get_historical_ohlcv",
276
281
  "get_bot_id",
277
282
  "get_supported_exchange_types",
@@ -330,6 +335,7 @@ __all__ = [
330
335
  "get_origin_portfolio_value",
331
336
  "get_profitability_stats",
332
337
  "format_portfolio",
338
+ "parse_decimal_portfolio",
333
339
  "get_current_portfolio_value",
334
340
  "get_currency_ref_market_value",
335
341
  "get_current_holdings_values",
@@ -281,8 +281,8 @@ def is_sponsoring(exchange_name: str) -> bool:
281
281
  return trading_backend.is_sponsoring(exchange_name)
282
282
 
283
283
 
284
- def is_valid_account(exchange_manager) -> bool:
285
- return exchange_manager.is_valid_account
284
+ def is_broker_enabled(exchange_manager) -> bool:
285
+ return exchange_manager.is_broker_enabled
286
286
 
287
287
 
288
288
  def get_historical_ohlcv(
@@ -73,6 +73,10 @@ def format_portfolio(portfolio, as_decimal) -> dict:
73
73
  return personal_data.portfolio_to_float(portfolio)
74
74
 
75
75
 
76
+ def parse_decimal_portfolio(portfolio, as_decimal) -> dict:
77
+ return personal_data.parse_decimal_portfolio(portfolio, as_decimal=as_decimal)
78
+
79
+
76
80
  async def refresh_real_trader_portfolio(exchange_manager) -> bool:
77
81
  return await exchange_channel.get_chan(octobot_trading.constants.BALANCE_CHANNEL, exchange_manager.id). \
78
82
  get_internal_producer(). \
@@ -50,7 +50,24 @@ def _trade_filter(trade, quote=None, symbol=None, timestamp=None, include_cancel
50
50
  return True
51
51
 
52
52
 
53
- def _is_trade_after_or_at(trade, timestamp) -> bool:
53
+ def is_executed_trade(trade: dict) -> bool:
54
+ try:
55
+ return trade[octobot_trading.enums.ExchangeConstantsOrderColumns.STATUS.value] not in (
56
+ octobot_trading.enums.OrderStatus.CANCELED.value,
57
+ octobot_trading.enums.OrderStatus.EXPIRED.value,
58
+ )
59
+ except KeyError:
60
+ return False
61
+
62
+
63
+ def is_trade_after_or_at(trade: dict, timestamp: float) -> bool:
64
+ try:
65
+ return trade[octobot_trading.enums.ExchangeConstantsOrderColumns.TIMESTAMP.value] >= timestamp
66
+ except KeyError:
67
+ return False
68
+
69
+
70
+ def _is_trade_after_or_at(trade: personal_data.Trade, timestamp: float) -> bool:
54
71
  return trade.executed_time >= timestamp or trade.canceled_time >= timestamp
55
72
 
56
73
 
@@ -64,6 +64,7 @@ ENABLE_CCXT_RATE_LIMIT = os_util.parse_boolean_environment_var("ENABLE_CCXT_RATE
64
64
  THROTTLED_WS_UPDATES = float(os.getenv("THROTTLED_WS_UPDATES", "0.1")) # avoid spamming CPU
65
65
  ENABLE_LIVE_CANDLES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_LIVE_CANDLES_STORAGE", "False")
66
66
  ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE", "False")
67
+ MAX_CANDLES_IN_RAM = int(os.getenv("MAX_CANDLES_IN_RAM", "3000")) # max candles per CandlesManager
67
68
  STORAGE_ORIGIN_VALUE = "origin_value"
68
69
  DISPLAY_TIME_FRAME = commons_enums.TimeFrames.ONE_HOUR
69
70
  DEFAULT_SUBACCOUNT_ID = "default_subaccount_id"
@@ -94,23 +95,26 @@ FULL_CANDLE_HISTORY_EXCHANGES = [
94
95
  DEFAULT_FUTURE_EXCHANGES = ["binanceusdm", "bybit"]
95
96
  TESTED_EXCHANGES = [
96
97
  "binance",
98
+ "kucoin",
97
99
  "okx",
98
- "gateio",
100
+ ] + sorted([
101
+ "coinbase",
102
+ "cryptocom",
99
103
  "htx",
100
104
  "bitget",
105
+ "gateio",
101
106
  "ascendex",
102
- "kucoin",
103
- "coinbase",
104
107
  "bybit",
105
- "cryptocom",
106
108
  "phemex",
107
109
  "hollaex",
108
110
  "mexc",
109
- ]
110
- DEFAULT_FUTURE_EXCHANGES = ["bybit"]
111
- SIMULATOR_TESTED_EXCHANGES = ["bingx", "bitfinex2", "bithumb", "bitstamp", "bittrex", "coinex",
111
+ "bingx",
112
+ "coinex",
113
+ ])
114
+ DEFAULT_FUTURE_EXCHANGES = sorted(["bybit"])
115
+ SIMULATOR_TESTED_EXCHANGES = sorted(["bitfinex2", "bithumb", "bitstamp", "bittrex",
112
116
  "hitbtc", "kraken", "poloniex", "bitso", "ndax", "upbit",
113
- "wavesexchange"]
117
+ "wavesexchange"])
114
118
 
115
119
  CONFIG_DEFAULT_FEES = 0.001
116
120
  CONFIG_DEFAULT_SIMULATOR_FEES = 0
@@ -333,6 +333,7 @@ class ExchangeConstantsOrderColumns(enum.Enum):
333
333
  SELF_MANAGED = "self-managed"
334
334
  ENTRIES = "entries"
335
335
  VOLUME = "volume"
336
+ BROKER_APPLIED = "broker_applied"
336
337
 
337
338
 
338
339
  class TradeExtraConstants(enum.Enum):
@@ -20,10 +20,11 @@ import octobot_commons.enums as enums
20
20
  import octobot_commons.logging as logging
21
21
 
22
22
  import octobot_trading.util as util
23
+ import octobot_trading.constants as constants
23
24
 
24
25
 
25
26
  class CandlesManager(util.Initializable):
26
- MAX_CANDLES_COUNT = 1000
27
+ MAX_CANDLES_COUNT = constants.MAX_CANDLES_IN_RAM
27
28
 
28
29
  def __init__(self, max_candles_count=None):
29
30
  super().__init__()
@@ -125,6 +125,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
125
125
  except KeyError:
126
126
  load_markets = True
127
127
  if load_markets:
128
+ self.logger.info(f"Loading {self.exchange_manager.exchange_name} exchange markets")
128
129
  try:
129
130
  await self.client.load_markets(reload=reload)
130
131
  ccxt_client_util.set_markets_cache(self.client)
@@ -132,8 +133,9 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
132
133
  raise octobot_trading.errors.FailedRequest(
133
134
  f"Failed to load_symbol_markets: {err.__class__.__name__} on {err}"
134
135
  ) from err
135
- except ccxt.AuthenticationError:
136
- if not self.force_authentication:
136
+ except ccxt.ExchangeError:
137
+ # includes AuthenticationError but also auth error not identified as such by ccxt
138
+ if not self.force_authentication and self.is_authenticated:
137
139
  self.logger.debug(
138
140
  f"Credentials check enabled when fetching exchange market status, trying with "
139
141
  f"unauthenticated client."
@@ -276,6 +276,7 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
276
276
  """
277
277
  try:
278
278
  self.initialized_event = asyncio.Event()
279
+ self.logger.info(f"Loading {self.exchange_manager.exchange_name} websocket exchange markets")
279
280
  await self.client.load_markets()
280
281
  self._filter_exchange_pairs_and_timeframes()
281
282
  self._subscribe_feeds()
@@ -230,6 +230,10 @@ class ExchangeBuilder:
230
230
  self.exchange_manager.ignore_config = ignore_config
231
231
  return self
232
232
 
233
+ def is_broker_enabled(self, is_broker_enabled=False):
234
+ self.exchange_manager.is_broker_enabled = is_broker_enabled
235
+ return self
236
+
233
237
  def is_without_auth(self):
234
238
  self.exchange_manager.without_auth = True
235
239
  return self
@@ -59,7 +59,6 @@ async def create_real_exchange(exchange_manager) -> None:
59
59
  if exchange_manager.exchange_only:
60
60
  return
61
61
  await _initialize_exchange_backend(exchange_manager)
62
- _ensure_exchange_validity(exchange_manager)
63
62
  except errors.AuthenticationError:
64
63
  exchange_manager.logger.error("Authentication error, retrying without authentication...")
65
64
  exchange_manager.without_auth = True
@@ -78,21 +77,6 @@ async def initialize_real_exchange(exchange_manager):
78
77
  await exchanges.search_and_create_websocket(exchange_manager)
79
78
 
80
79
 
81
- def _ensure_exchange_validity(exchange_manager):
82
- if exchange_manager.is_future and \
83
- not exchange_manager.is_trader_simulated and \
84
- not exchange_manager.is_valid_account:
85
- error_message = f"Impossible to check exchange sponsoring due to" \
86
- f" {exchange_manager.init_error.__class__.__name__}." \
87
- if isinstance(exchange_manager.init_error, trading_backend.TimeSyncError) \
88
- else \
89
- f"Impossible to start futures trading for {exchange_manager.exchange.name.capitalize()}: " \
90
- f"incompatible account with no registered donation. Your OctoBot will work normally " \
91
- f"for spot trading but will be *limited to backtesting for futures trading. " \
92
- f"Please select spot trading on your exchange configuration."
93
- raise errors.NotSupported(error_message)
94
-
95
-
96
80
  def _create_exchange_backend(exchange_manager):
97
81
  try:
98
82
  exchange_manager.exchange_backend = trading_backend.exchange_factory.create_exchange_backend(
@@ -106,32 +90,13 @@ async def _initialize_exchange_backend(exchange_manager):
106
90
  if exchange_manager.exchange_backend is not None and exchange_manager.exchange.authenticated() \
107
91
  and not exchange_manager.is_trader_simulated:
108
92
  exchange_manager.logger.debug(await exchange_manager.exchange_backend.initialize())
109
- return
110
- # disabled
111
- try: # pylint: disable=W0101
112
- exchange_manager.is_valid_account = await _is_supporting_octobot()
113
- if exchange_manager.is_valid_account:
114
- return True
115
- exchange_manager.is_valid_account, message = await exchange_manager.exchange_backend.is_valid_account()
116
- if not exchange_manager.is_valid_account:
117
- exchange_manager.logger.error(
118
- f"Incompatible {exchange_manager.exchange.name.capitalize()} account to use futures trading: "
119
- f"{message}. OctoBot relies on exchanges profits sharing to remain 100% free, please create a "
120
- f"new {exchange_manager.exchange.name.capitalize()} account or register a donation to support "
121
- f"the project. {exchanges.get_partners_explanation_message()}")
122
- except trading_backend.TimeSyncError as err:
123
- exchanges.log_time_sync_error(exchange_manager.logger, exchange_manager.exchange.name,
124
- err, "exchange_backend.is_valid_account")
125
- exchange_manager.is_valid_account = False
126
- exchange_manager.init_error = err
93
+ initial_is_broker_enabled = exchange_manager.is_broker_enabled
94
+ try:
95
+ exchange_manager.is_broker_enabled, _ = await exchange_manager.exchange_backend.is_valid_account()
96
+ exchange_manager.logger.debug(f"Broker rebate enabled: {exchange_manager.is_broker_enabled}")
127
97
  except Exception as err:
128
- exchange_manager.is_valid_account = False
129
- exchange_manager.init_error = err
130
- exchange_manager.logger.exception(err, True, f"Error when loading exchange account: {err}")
131
- finally:
132
- if exchange_manager.is_valid_account:
133
- exchange_manager.logger.info("On behalf of the OctoBot team, thank you for "
134
- "actively supporting the project !")
98
+ exchange_manager.is_broker_enabled = initial_is_broker_enabled
99
+ exchange_manager.logger.debug(f"Error when checking account broker state: {err}")
135
100
 
136
101
 
137
102
  async def _is_supporting_octobot() -> bool:
@@ -70,8 +70,7 @@ class ExchangeManager(util.Initializable):
70
70
  self.trader = None
71
71
  self.exchange = None
72
72
  self.exchange_backend = None
73
- self.is_valid_account = True
74
- self.init_error = None
73
+ self.is_broker_enabled = False
75
74
  self.trading_modes = []
76
75
 
77
76
  self.exchange_web_socket = None
@@ -257,7 +257,7 @@ class Trader(util.Initializable):
257
257
 
258
258
  # get real order from exchange
259
259
  updated_order = order_factory.create_order_instance_from_raw(
260
- self, created_order, force_open_or_pending_creation=True
260
+ self, created_order, force_open_or_pending_creation=True, has_just_been_created=True
261
261
  )
262
262
  is_pending_creation = updated_order.status == enums.OrderStatus.PENDING_CREATION
263
263
 
@@ -447,7 +447,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
447
447
  raise NotImplementedError(f"get_account_id is not implemented on {self.exchange_manager.exchange_name}")
448
448
 
449
449
  async def get_balance(self, **kwargs: dict):
450
- return await self.connector.get_balance(**kwargs)
450
+ try:
451
+ return await self.connector.get_balance(**kwargs)
452
+ except ccxt.AuthenticationError as err:
453
+ raise errors.AuthenticationError(err) from err
451
454
 
452
455
  async def get_symbol_prices(self, symbol: str, time_frame: commons_enums.TimeFrames, limit: int = None,
453
456
  **kwargs: dict) -> typing.Optional[list]:
@@ -207,6 +207,7 @@ def get_enabled_exchanges(config):
207
207
  async def get_local_exchange_manager(
208
208
  exchange_name: str, exchange_config: dict, tentacles_setup_config,
209
209
  is_sandboxed: bool, ignore_config=False, builder=None, use_cached_markets=True,
210
+ is_broker_enabled: bool = False,
210
211
  market_filter: typing.Union[None, typing.Callable[[dict], bool]] = None
211
212
  ):
212
213
  exchange_type = exchange_config.get(common_constants.CONFIG_EXCHANGE_TYPE, get_default_exchange_type(exchange_name))
@@ -220,6 +221,7 @@ async def get_local_exchange_manager(
220
221
  .is_using_exchange_type(exchange_type) \
221
222
  .is_exchange_only() \
222
223
  .is_rest_only() \
224
+ .is_broker_enabled(is_broker_enabled) \
223
225
  .use_cached_markets(use_cached_markets) \
224
226
  .use_market_filter(market_filter) \
225
227
  .is_ignoring_config(ignore_config) \
@@ -58,6 +58,7 @@ class Order(util.Initializable):
58
58
  self.side = side
59
59
  self.tag = None
60
60
  self.associated_entry_ids = None
61
+ self.broker_applied = False
61
62
 
62
63
  # original order attributes
63
64
  self.creation_time = self.exchange_manager.exchange.get_exchange_current_time()
@@ -282,6 +283,10 @@ class Order(util.Initializable):
282
283
  if self.is_created() and not self.is_closed():
283
284
  await self.update_order_status()
284
285
 
286
+ def register_broker_applied_if_enabled(self):
287
+ if not self.simulated and self.trader and self.trader.exchange_manager:
288
+ self.broker_applied = self.trader.exchange_manager.is_broker_enabled
289
+
285
290
  def _on_origin_price_change(self, previous_price, price_time):
286
291
  """
287
292
  Called when origin price just changed.
@@ -674,6 +679,10 @@ class Order(util.Initializable):
674
679
  # rebind order attributes that are not stored on exchange
675
680
  order_dict = order_details.get(constants.STORAGE_ORIGIN_VALUE, {})
676
681
  self.tag = order_dict.get(enums.ExchangeConstantsOrderColumns.TAG.value, self.tag)
682
+ self.broker_applied = order_dict.get(
683
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value,
684
+ self.broker_applied
685
+ )
677
686
  self.order_id = order_dict.get(enums.ExchangeConstantsOrderColumns.ID.value, self.order_id)
678
687
  self.exchange_order_id = order_dict.get(enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value,
679
688
  self.exchange_order_id)
@@ -768,6 +777,7 @@ class Order(util.Initializable):
768
777
  enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
769
778
  enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
770
779
  enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value: self.is_self_managed(),
780
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
771
781
  }
772
782
 
773
783
  def clear(self):
@@ -23,9 +23,13 @@ def create_order_from_raw(trader, raw_order):
23
23
  return create_order_from_type(trader, order_type)
24
24
 
25
25
 
26
- def create_order_instance_from_raw(trader, raw_order, force_open_or_pending_creation=False):
26
+ def create_order_instance_from_raw(
27
+ trader, raw_order, force_open_or_pending_creation=False, has_just_been_created=False
28
+ ):
27
29
  order = create_order_from_raw(trader, raw_order)
28
30
  order.update_from_raw(raw_order)
31
+ if has_just_been_created:
32
+ order.register_broker_applied_if_enabled()
29
33
  if force_open_or_pending_creation \
30
34
  and order.status not in (enums.OrderStatus.OPEN, enums.OrderStatus.PENDING_CREATION):
31
35
  order.status = enums.OrderStatus.OPEN
@@ -57,8 +57,13 @@ class BalanceUpdater(portfolios_channel.BalanceProducer):
57
57
  f"{self.channel.exchange_manager.exchange_name} is not supporting updates"
58
58
  )
59
59
  await self.pause()
60
+ except errors.AuthenticationError as err:
61
+ self.logger.exception(
62
+ err, True, f"Authentication error when fetching balance: {err}. Retrying in the next update cycle"
63
+ )
64
+ await asyncio.sleep(self.BALANCE_REFRESH_TIME)
60
65
  except Exception as e:
61
- self.logger.error(f"Failed to update balance : {e}")
66
+ self.logger.exception(e, True, f"Failed to update balance : {e}")
62
67
 
63
68
  async def fetch_and_push(self):
64
69
  await self.push((await self.fetch_portfolio()))
@@ -61,6 +61,7 @@ class Trade:
61
61
  self.tag = None
62
62
  self.quantity_currency = None
63
63
  self.associated_entry_ids = None
64
+ self.broker_applied = False
64
65
 
65
66
  # raw exchange trade type, used to create trade dict
66
67
  self.exchange_trade_type = None
@@ -94,6 +95,7 @@ class Trade:
94
95
  self.reduce_only = order.reduce_only
95
96
  self.tag = order.tag
96
97
  self.associated_entry_ids = order.associated_entry_ids
98
+ self.broker_applied = order.broker_applied
97
99
 
98
100
  def get_time(self):
99
101
  return self.executed_time if self.has_been_executed() else self.canceled_time
@@ -125,6 +127,7 @@ class Trade:
125
127
  enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
126
128
  enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
127
129
  enums.ExchangeConstantsOrderColumns.ENTRIES.value: self.associated_entry_ids,
130
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
128
131
  enums.TradeExtraConstants.CREATION_TIME.value: self.creation_time,
129
132
  }
130
133
 
@@ -165,6 +168,9 @@ class Trade:
165
168
  trade.reduce_only = trade_dict.get(enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value)
166
169
  trade.tag = trade_dict.get(enums.ExchangeConstantsOrderColumns.TAG.value)
167
170
  trade.associated_entry_ids = trade_dict.get(enums.ExchangeConstantsOrderColumns.ENTRIES.value)
171
+ trade.broker_applied = trade_dict.get(
172
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value, trade.broker_applied
173
+ )
168
174
  trade.creation_time = trade_dict.get(enums.TradeExtraConstants.CREATION_TIME.value)
169
175
  return trade
170
176
 
@@ -27,6 +27,7 @@ class ExchangeAuthDetails(octobot_commons.dataclasses.FlexibleDataclass, octobot
27
27
  api_password: str = ""
28
28
  exchange_type: str = ""
29
29
  sandboxed: bool = False
30
+ broker_enabled: bool = False
30
31
  encrypted: str = ""
31
32
 
32
33
 
@@ -393,6 +393,7 @@ async def test_update_from_order_storage(trader_simulator):
393
393
  assert order.exchange_order_id is origin_exchange_order_id
394
394
  assert order.has_been_bundled is origin_has_been_bundled
395
395
  assert order.associated_entry_ids is origin_associated_entry_ids
396
+ assert order.broker_applied is False
396
397
  assert order.update_with_triggering_order_fees is origin_update_with_triggering_order_fees
397
398
 
398
399
  # partial update
@@ -414,6 +415,7 @@ async def test_update_from_order_storage(trader_simulator):
414
415
  enums.ExchangeConstantsOrderColumns.TAG.value: "t1",
415
416
  enums.ExchangeConstantsOrderColumns.ID.value: "11a",
416
417
  enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value: "eee1",
418
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: True,
417
419
  },
418
420
  enums.StoredOrdersAttr.TRADER_CREATION_KWARGS.value: {"plop2": 1},
419
421
  enums.StoredOrdersAttr.EXCHANGE_CREATION_PARAMS.value: {"ex": 2, "gg": "yesyes"},
@@ -425,6 +427,7 @@ async def test_update_from_order_storage(trader_simulator):
425
427
  assert order.trader_creation_kwargs == {"plop2": 1} != origin_trader_creation_kwargs
426
428
  assert order.exchange_creation_params == {"ex": 2, "gg": "yesyes"} != origin_exchange_creation_params
427
429
  assert order.order_id == "11a" != origin_order_id
430
+ assert order.broker_applied is True
428
431
  assert order.exchange_order_id == "eee1" != origin_exchange_order_id
429
432
  assert order.has_been_bundled is True is not origin_has_been_bundled
430
433
  assert order.associated_entry_ids == ["ABC", "2"] != origin_associated_entry_ids
@@ -22,6 +22,7 @@ import octobot_commons.constants as constants
22
22
  import octobot_commons.enums as commons_enums
23
23
  import octobot_trading.enums as trading_enums
24
24
  import octobot_trading.exchanges.connectors.ccxt.ccxt_client_util as ccxt_client_util
25
+ import octobot_trading.exchanges.util as exchanges_util
25
26
  from octobot_trading.enums import ExchangeConstantsTickersColumns as Ectc, \
26
27
  ExchangeConstantsMarketStatusColumns as Ecmsc
27
28
  from tests_additional.real_exchanges import get_exchange_manager
@@ -41,6 +42,7 @@ class RealExchangeTester:
41
42
  CANDLE_SINCE_SEC = CANDLE_SINCE / 1000
42
43
  REQUIRES_AUTH = False # set True when even normally public apis require authentication
43
44
  MARKET_STATUS_TYPE = trading_enums.ExchangeTypes.SPOT.value
45
+ HISTORICAL_CANDLES_TO_FETCH_COUNT = 650
44
46
 
45
47
  # Public methods: to be implemented as tests
46
48
  # Use await self._[method_name] to get the test request result
@@ -100,6 +102,25 @@ class RealExchangeTester:
100
102
  # async def test_create_order(self):
101
103
  # pass
102
104
 
105
+ async def test_get_historical_ohlcv(self):
106
+ # common implementation, should always work if candles history is supported
107
+ historical_ohlcv = await self.get_historical_ohlcv()
108
+ assert len(historical_ohlcv) > 500 # should be around 650
109
+ self.ensure_elements_order(historical_ohlcv, commons_enums.PriceIndexes.IND_PRICE_TIME.value)
110
+ self.ensure_unique_elements(historical_ohlcv, commons_enums.PriceIndexes.IND_PRICE_TIME.value)
111
+ start, end = self.get_historical_ohlcv_start_and_end_times()
112
+ max_candle_time = self.get_time_after_time_frames(start, len(historical_ohlcv))
113
+ assert max_candle_time <= end
114
+ assert max_candle_time <= self.get_time()
115
+ # on some exchanges, a lot of candles are missing, ensure more than 1 fetch succeeded
116
+ assert (
117
+ self.HISTORICAL_CANDLES_TO_FETCH_COUNT * 0.85
118
+ < len(historical_ohlcv)
119
+ <= self.HISTORICAL_CANDLES_TO_FETCH_COUNT
120
+ )
121
+ for candle in historical_ohlcv:
122
+ assert start <= candle[commons_enums.PriceIndexes.IND_PRICE_TIME.value] <= end
123
+
103
124
  def get_config(self):
104
125
  return {
105
126
  constants.CONFIG_EXCHANGES: {
@@ -108,7 +129,7 @@ class RealExchangeTester:
108
129
  }
109
130
  }
110
131
  }
111
-
132
+
112
133
  @contextlib.asynccontextmanager
113
134
  async def get_exchange_manager(self, market_filter=None):
114
135
  async with get_exchange_manager(
@@ -140,6 +161,22 @@ class RealExchangeTester:
140
161
  return await exchange_manager.exchange.get_symbol_prices(self.SYMBOL, self.TIME_FRAME,
141
162
  limit=limit, **kwargs)
142
163
 
164
+ async def get_historical_ohlcv(self, **kwargs) -> list:
165
+ async with self.get_exchange_manager() as exchange_manager:
166
+ start, end = self.get_historical_ohlcv_start_and_end_times()
167
+ start_ms, end_ms = start * 1000, end * 1000
168
+ ohlcvs = []
169
+ async for ohlcv in exchanges_util.get_historical_ohlcv(
170
+ exchange_manager, self.SYMBOL, self.TIME_FRAME, start_ms, end_ms, request_retry_timeout=2, **kwargs
171
+ ):
172
+ ohlcvs.extend(ohlcv)
173
+ return ohlcvs
174
+
175
+ def get_historical_ohlcv_start_and_end_times(self):
176
+ start = self.get_time() - (self.get_timeframe_seconds() * self.HISTORICAL_CANDLES_TO_FETCH_COUNT * 2)
177
+ end = self.get_time_after_time_frames(start, self.HISTORICAL_CANDLES_TO_FETCH_COUNT)
178
+ return start, end
179
+
143
180
  async def get_kline_price(self, **kwargs):
144
181
  async with self.get_exchange_manager() as exchange_manager:
145
182
  return await exchange_manager.exchange.get_kline_price(self.SYMBOL, self.TIME_FRAME, **kwargs)
@@ -195,6 +232,10 @@ class RealExchangeTester:
195
232
  def ensure_elements_order(elements, sort_key, reverse=False):
196
233
  assert sorted(elements, key=lambda x: x[sort_key], reverse=reverse) == elements
197
234
 
235
+ @staticmethod
236
+ def ensure_unique_elements(elements, key):
237
+ assert len(elements) == len(set(element[key] for element in elements))
238
+
198
239
  def check_market_status_limits(self, market_status,
199
240
  normal_price_max=10000, normal_price_min=1e-06,
200
241
  normal_cost_max=10000, normal_cost_min=1e-06,
@@ -100,6 +100,9 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
100
100
  for candle in symbol_prices:
101
101
  assert self.CANDLE_SINCE_SEC <= candle[PriceIndexes.IND_PRICE_TIME.value] <= max_candle_time
102
102
 
103
+ async def test_get_historical_ohlcv(self):
104
+ await super().test_get_historical_ohlcv()
105
+
103
106
  async def test_get_kline_price(self):
104
107
  kline_price = await self.get_kline_price()
105
108
  assert len(kline_price) == 1