OctoBot-Trading 2.4.51__tar.gz → 2.4.53__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.51 → OctoBot-Trading-2.4.53}/CHANGELOG.md +14 -3
  2. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.51/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.53}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/README.md +1 -1
  5. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/__init__.py +8 -2
  7. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/exchange.py +2 -2
  8. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/portfolio.py +4 -0
  9. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/trades.py +18 -1
  10. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/constants.py +1 -0
  11. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/enums.py +1 -0
  12. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/candles_manager.py +2 -1
  13. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +8 -4
  14. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +1 -0
  15. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchange_builder.py +4 -0
  16. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchange_factory.py +6 -41
  17. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchange_manager.py +1 -2
  18. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/traders/trader.py +1 -1
  19. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/types/rest_exchange.py +4 -1
  20. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/util/exchange_util.py +2 -0
  21. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/order.py +18 -6
  22. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/order_factory.py +5 -1
  23. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +6 -1
  24. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/portfolio.py +1 -1
  25. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/portfolio_manager.py +1 -0
  26. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +21 -9
  27. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/trade.py +6 -0
  28. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/test_tools/exchange_data.py +1 -0
  29. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/__init__.py +1 -0
  30. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_order.py +3 -0
  31. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/test_portfolio.py +213 -174
  32. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/test_portfolio_manager.py +1 -0
  33. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/real_exchange_tester.py +42 -1
  34. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_ascendex.py +3 -0
  35. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_binance.py +3 -0
  36. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_binance_futures.py +3 -0
  37. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bingx.py +38 -18
  38. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bitfinex.py +3 -0
  39. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bitget.py +5 -0
  40. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bithumb.py +3 -0
  41. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bitso.py +3 -0
  42. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bitstamp.py +3 -0
  43. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bybit.py +3 -0
  44. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_bybit_futures.py +3 -0
  45. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_coinbase.py +3 -0
  46. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_coinex.py +4 -0
  47. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_cryptocom.py +4 -0
  48. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_gateio.py +3 -0
  49. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_hitbtc.py +4 -0
  50. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_hollaex.py +3 -0
  51. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_htx.py +3 -0
  52. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_kraken.py +5 -0
  53. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_kucoin.py +3 -0
  54. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_kucoin_futures.py +3 -0
  55. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_mexc.py +3 -0
  56. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_ndax.py +3 -0
  57. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_okx.py +3 -0
  58. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_okx_futures.py +3 -0
  59. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_phemex.py +5 -0
  60. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_poloniex.py +4 -0
  61. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_upbit.py +3 -0
  62. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_wavesexchange.py +3 -0
  63. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/LICENSE +0 -0
  64. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/MANIFEST.in +0 -0
  65. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  66. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  67. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  68. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/OctoBot_Trading.egg-info/requires.txt +0 -0
  69. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  70. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/channels.py +0 -0
  71. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/contracts.py +0 -0
  72. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/modes.py +0 -0
  73. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/orders.py +0 -0
  74. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/positions.py +0 -0
  75. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/profitability.py +0 -0
  76. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/storage.py +0 -0
  77. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/symbol_data.py +0 -0
  78. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/api/trader.py +0 -0
  79. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/errors.py +0 -0
  80. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_channel.py +0 -0
  81. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  83. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  84. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  85. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  86. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  87. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  88. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  89. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  91. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  92. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  93. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  94. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  97. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  98. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  99. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  100. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  102. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  104. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  105. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  106. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  107. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  108. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  110. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  111. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  112. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  113. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  114. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  115. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  116. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  117. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  118. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  119. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  120. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  122. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  123. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  124. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  125. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  126. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  129. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  130. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  131. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  132. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/__init__.py +0 -0
  133. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  134. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  135. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  137. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/config/__init__.py +0 -0
  138. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  139. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  140. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  141. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  142. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  143. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  144. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  145. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  146. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  147. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  149. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  150. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  151. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchange_channels.py +0 -0
  152. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchange_details.py +0 -0
  153. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  154. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/exchanges.py +0 -0
  155. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  157. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  158. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  159. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/traders/__init__.py +0 -0
  160. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  161. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/types/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  163. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/util/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  165. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  166. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  167. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/__init__.py +0 -0
  168. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  169. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/channel/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  171. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  172. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/channel/mode.py +0 -0
  173. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/mode_config.py +0 -0
  174. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/modes_factory.py +0 -0
  175. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/modes_util.py +0 -0
  176. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  177. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  178. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  179. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  180. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  181. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  182. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  183. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  184. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  185. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  187. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  188. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  190. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/octobot_channel_consumer.py +0 -0
  191. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/__init__.py +0 -0
  192. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  193. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/__init__.py +0 -0
  194. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  196. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  197. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  198. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  199. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  200. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  201. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  202. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  203. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  204. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/order_group.py +0 -0
  205. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/order_state.py +0 -0
  206. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/order_util.py +0 -0
  207. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  208. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  209. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  211. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  212. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  213. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  214. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  215. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  216. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  217. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  218. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  219. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  220. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  221. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  222. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  223. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  224. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  225. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  226. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  228. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  229. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  230. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  231. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  232. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  233. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  234. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  235. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  236. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  237. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  238. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  239. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  240. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  241. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  242. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  243. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  244. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  245. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  246. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  247. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  248. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  249. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  250. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  251. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  252. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  253. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  254. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  255. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  256. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  257. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  259. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  260. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  261. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  262. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/position.py +0 -0
  263. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  264. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/position_state.py +0 -0
  265. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/position_util.py +0 -0
  266. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  267. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  268. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  269. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  270. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  271. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  272. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  273. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  274. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  275. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/state.py +0 -0
  276. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/__init__.py +0 -0
  277. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  278. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  279. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  280. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  281. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  282. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  283. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  284. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  285. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  286. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  287. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  288. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  289. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  290. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  291. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  292. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  293. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/__init__.py +0 -0
  294. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/channel/__init__.py +0 -0
  295. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  296. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  297. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/channel/signal_producer.py +0 -0
  298. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/signal_creation.py +0 -0
  299. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  300. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/signals/util.py +0 -0
  301. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/__init__.py +0 -0
  302. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/abstract_storage.py +0 -0
  303. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/candles_storage.py +0 -0
  304. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/orders_storage.py +0 -0
  305. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/portfolio_storage.py +0 -0
  306. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/storage_manager.py +0 -0
  307. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/trades_storage.py +0 -0
  308. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/transactions_storage.py +0 -0
  309. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/storage/util.py +0 -0
  310. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/supervisors/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  312. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  313. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/config_util.py +0 -0
  315. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/initializable.py +0 -0
  316. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/initialization_util.py +0 -0
  317. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/simulator_updater_utils.py +0 -0
  318. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/test_tools/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  320. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  321. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  322. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/requirements.txt +0 -0
  323. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/setup.cfg +0 -0
  324. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/setup.py +0 -0
  325. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_channels.py +0 -0
  327. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_exchange.py +0 -0
  328. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_modes.py +0 -0
  329. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_orders.py +0 -0
  330. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_portfolio.py +0 -0
  331. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_profitability.py +0 -0
  332. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_symbol_data.py +0 -0
  333. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_trader.py +0 -0
  334. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/api/test_trades.py +0 -0
  335. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/cli/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/__init__.py +0 -0
  337. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/contracts/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  339. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  340. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/funding/__init__.py +0 -0
  341. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  342. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/kline/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  344. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/ohlcv/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  346. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  347. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/order_book/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  349. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/prices/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  351. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  352. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/recent_trades/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  354. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  355. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/ticker/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  357. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/connectors/__init__.py +0 -0
  359. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  361. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  362. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/implementations/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  364. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  365. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_abstract_exchange.py +0 -0
  366. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  367. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_exchange_builder.py +0 -0
  368. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_exchange_config_data.py +0 -0
  369. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_exchange_factory.py +0 -0
  370. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_exchange_manager.py +0 -0
  371. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_exchange_simulator.py +0 -0
  372. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/test_exchanges.py +0 -0
  373. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/traders/__init__.py +0 -0
  374. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/traders/test_trader.py +0 -0
  375. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/types/__init__.py +0 -0
  376. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  377. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/util/__init__.py +0 -0
  378. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  379. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/exchanges/util/test_exchange_util.py +0 -0
  380. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/__init__.py +0 -0
  381. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/script_keywords/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  383. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  384. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  385. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  387. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/test_abstract_mode_consumer.py +0 -0
  388. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/test_abstract_trading_mode.py +0 -0
  389. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/modes/test_modes_util.py +0 -0
  390. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/__init__.py +0 -0
  391. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/groups/__init__.py +0 -0
  392. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  393. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  394. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  395. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/__init__.py +0 -0
  396. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  397. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  398. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  399. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  400. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_order_state.py +0 -0
  401. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  402. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  403. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  404. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  405. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  406. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_order_adapter.py +0 -0
  407. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_order_factory.py +0 -0
  408. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_order_util.py +0 -0
  409. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_orders_manager.py +0 -0
  410. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  411. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/__init__.py +0 -0
  412. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  413. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  414. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  415. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  416. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  417. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  418. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  419. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/market/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  421. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  422. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  423. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  424. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  425. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  426. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  429. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  430. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  431. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/history/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  433. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  434. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/test_asset.py +0 -0
  435. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  436. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  437. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  438. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/types/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  440. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  441. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  442. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/__init__.py +0 -0
  443. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/channel/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/states/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/test_position.py +0 -0
  446. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/test_position_factory.py +0 -0
  447. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/test_positions_manager.py +0 -0
  448. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/types/__init__.py +0 -0
  449. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  450. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  451. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/trades/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/trades/test_trade_factory.py +0 -0
  453. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/trades/test_trade_manager.py +0 -0
  454. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  455. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/trades/test_trade_util.py +0 -0
  456. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/transactions/__init__.py +0 -0
  457. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  458. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  459. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/signals/__init__.py +0 -0
  460. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  461. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/signals/test_util.py +0 -0
  462. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/test_utils/__init__.py +0 -0
  463. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/test_utils/order_util.py +0 -0
  464. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/test_utils/random_numbers.py +0 -0
  465. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/util/__init__.py +0 -0
  466. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests/util/test_config_util.py +0 -0
  467. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/__init__.py +0 -0
  468. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/__init__.py +0 -0
  469. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  470. {OctoBot-Trading-2.4.51 → OctoBot-Trading-2.4.53}/tests_additional/real_exchanges/test_okcoin.py +0 -0
@@ -4,15 +4,26 @@ 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.51] - 2023-01-18
7
+ ## [2.4.53] - 2024-02-02
8
+ ### Fixed
9
+ - [Orders] Handle quote-based fees in exchange simulator
10
+
11
+ ## [2.4.52] - 2024-01-30
12
+ ### Added
13
+ - [API] Trades utility
14
+ ### Fixed
15
+ - [Exchanges] Unidentified auth error in market status loading
16
+ - [Exchanges] Fetch balance error spam on auth error
17
+
18
+ ## [2.4.51] - 2024-01-18
8
19
  ### Added
9
20
  - [CoinEx] Support CoinEx exchange
10
21
 
11
- ## [2.4.50] - 2023-01-18
22
+ ## [2.4.50] - 2024-01-18
12
23
  ### Updated
13
24
  - [Websocket] Fix websocket reconnection after binance auto disconnect
14
25
 
15
- ## [2.4.49] - 2023-01-08
26
+ ## [2.4.49] - 2024-01-08
16
27
  ### Updated
17
28
  - [Exchanges] replace Huobi by HTX
18
29
  - [CCXT] 4.2.10
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.51
3
+ Version: 2.4.53
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.51](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.53](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.51
3
+ Version: 2.4.53
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.51](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.53](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.51](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.53](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.51" # major.minor.revision
18
+ VERSION = "2.4.53" # 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"
@@ -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."
@@ -635,10 +637,12 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
635
637
  price=float(price),
636
638
  takerOrMaker=taker_or_maker)
637
639
  fees[enums.FeePropertyColumns.IS_FROM_EXCHANGE.value] = False
638
- fees[enums.FeePropertyColumns.COST.value] = decimal.Decimal(str(fees[enums.FeePropertyColumns.COST.value]))
640
+ fees[enums.FeePropertyColumns.COST.value] = decimal.Decimal(
641
+ str(fees.get(enums.FeePropertyColumns.COST.value) or 0)
642
+ )
639
643
  if self.exchange_manager.is_future:
640
644
  # fees on futures are wrong
641
- rate = fees[enums.FeePropertyColumns.RATE.value]
645
+ rate = fees.get(enums.FeePropertyColumns.RATE.value, 0) or 0
642
646
  # avoid using ccxt computed fees as they are often wrong
643
647
  # see https://docs.ccxt.com/en/latest/manual.html#trading-fees
644
648
  parsed_symbol = commons_symbols.parse_symbol(symbol)
@@ -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.
@@ -529,12 +534,14 @@ class Order(util.Initializable):
529
534
  except KeyError:
530
535
  return False
531
536
 
532
- def get_computed_fee(self, forced_value=None):
537
+ def get_computed_fee(self, forced_value=None, use_origin_quantity_and_price=False):
533
538
  is_from_exchange = False
539
+ price = self.origin_price if use_origin_quantity_and_price else self.filled_price
540
+ quantity = self.origin_quantity if use_origin_quantity_and_price else self.filled_quantity
534
541
  if self.fees_currency_side is enums.FeesCurrencySide.UNDEFINED:
535
- computed_fee = self.exchange_manager.exchange.get_trade_fee(self.symbol, self.order_type,
536
- self.filled_quantity, self.filled_price,
537
- self.taker_or_maker)
542
+ computed_fee = self.exchange_manager.exchange.get_trade_fee(
543
+ self.symbol, self.order_type, quantity, price, self.taker_or_maker
544
+ )
538
545
  value = computed_fee[enums.FeePropertyColumns.COST.value]
539
546
  currency = computed_fee[enums.FeePropertyColumns.CURRENCY.value]
540
547
  is_from_exchange = computed_fee[enums.FeePropertyColumns.IS_FROM_EXCHANGE.value]
@@ -542,10 +549,10 @@ class Order(util.Initializable):
542
549
  symbol_fees = self.exchange_manager.exchange.get_fees(self.symbol)
543
550
  fees = decimal.Decimal(f"{symbol_fees[self.taker_or_maker]}")
544
551
  if self.fees_currency_side is enums.FeesCurrencySide.CURRENCY:
545
- value = self.filled_quantity / self.filled_price * fees
552
+ value = quantity / price * fees
546
553
  currency = self.currency
547
554
  else:
548
- value = self.filled_quantity * self.filled_price * fees
555
+ value = quantity * price * fees
549
556
  currency = self.market
550
557
  return {
551
558
  enums.FeePropertyColumns.IS_FROM_EXCHANGE.value: is_from_exchange,
@@ -674,6 +681,10 @@ class Order(util.Initializable):
674
681
  # rebind order attributes that are not stored on exchange
675
682
  order_dict = order_details.get(constants.STORAGE_ORIGIN_VALUE, {})
676
683
  self.tag = order_dict.get(enums.ExchangeConstantsOrderColumns.TAG.value, self.tag)
684
+ self.broker_applied = order_dict.get(
685
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value,
686
+ self.broker_applied
687
+ )
677
688
  self.order_id = order_dict.get(enums.ExchangeConstantsOrderColumns.ID.value, self.order_id)
678
689
  self.exchange_order_id = order_dict.get(enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value,
679
690
  self.exchange_order_id)
@@ -768,6 +779,7 @@ class Order(util.Initializable):
768
779
  enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
769
780
  enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
770
781
  enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value: self.is_self_managed(),
782
+ enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
771
783
  }
772
784
 
773
785
  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()))
@@ -136,7 +136,7 @@ class Portfolio:
136
136
  """
137
137
  Realize portfolio availability update
138
138
  :param order: the order that triggers the portfolio update
139
- :param is_new_order: True when the order is being created
139
+ :param is_new_order: True when the order is being created, False when cancelled
140
140
  """
141
141
  raise NotImplementedError("update_portfolio_available_from_order is not implemented")
142
142
 
@@ -266,6 +266,7 @@ class PortfolioManager(util.Initializable):
266
266
  if order.is_filled():
267
267
  self.portfolio.update_portfolio_from_filled_order(order)
268
268
  else:
269
+ # order cancelled
269
270
  self.portfolio.update_portfolio_available(order, is_new_order=False)
270
271
  return True
271
272
  except errors.PortfolioNegativeValueError as portfolio_negative_value_error:
@@ -17,6 +17,7 @@ import octobot_trading.constants as constants
17
17
  import octobot_trading.enums as enums
18
18
  import octobot_trading.personal_data.portfolios.assets.spot_asset as spot_asset
19
19
  import octobot_trading.personal_data.portfolios.portfolio as portfolio_class
20
+ import octobot_trading.personal_data.orders.order_util as order_util
20
21
 
21
22
 
22
23
  class SpotPortfolio(portfolio_class.Portfolio):
@@ -28,20 +29,23 @@ class SpotPortfolio(portfolio_class.Portfolio):
28
29
  Call update_portfolio_data for order currency and market
29
30
  :param order: the order that updated the portfolio
30
31
  """
31
- # update currency
32
+ base_fees = order.get_total_fees(order.currency)
33
+ quote_fees = order.get_total_fees(order.market)
34
+
35
+ # update base
32
36
  if order.side == enums.TradeOrderSide.BUY:
33
- new_quantity = order.filled_quantity - order.get_total_fees(order.currency)
37
+ new_quantity = order.filled_quantity - base_fees
34
38
  self._update_portfolio_data(order.currency, total_value=new_quantity, available_value=new_quantity)
35
39
  else:
36
- new_quantity = -order.filled_quantity
40
+ new_quantity = -order.filled_quantity - base_fees
37
41
  self._update_portfolio_data(order.currency, total_value=new_quantity)
38
42
 
39
- # update market
43
+ # update quote
40
44
  if order.side == enums.TradeOrderSide.BUY:
41
- new_quantity = -(order.filled_quantity * order.filled_price)
45
+ new_quantity = -(order.filled_quantity * order.filled_price) - quote_fees
42
46
  self._update_portfolio_data(order.market, total_value=new_quantity)
43
47
  else:
44
- new_quantity = (order.filled_quantity * order.filled_price) - order.get_total_fees(order.market)
48
+ new_quantity = (order.filled_quantity * order.filled_price) - quote_fees
45
49
  self._update_portfolio_data(order.market, total_value=new_quantity, available_value=new_quantity)
46
50
 
47
51
  def update_portfolio_data_from_withdrawal(self, amount, currency):
@@ -56,18 +60,26 @@ class SpotPortfolio(portfolio_class.Portfolio):
56
60
  """
57
61
  Realise portfolio availability update
58
62
  :param order: the order that triggers the portfolio update
59
- :param is_new_order: True when the order is being created
63
+ :param is_new_order: True when the order is being created, False when cancelled
60
64
  """
65
+ multiplier = constants.ONE if is_new_order else -constants.ONE
66
+
67
+ # take fees into account when in locked asset
68
+ # ( a BTC/USDT order with USDT fees need to lock USDT fees to be able to pay them)
69
+ forecasted_fees = order.get_computed_fee(use_origin_quantity_and_price=not order.is_filled())
70
+ base_fees = order_util.get_fees_for_currency(forecasted_fees, order.currency)
71
+ quote_fees = order_util.get_fees_for_currency(forecasted_fees, order.market)
72
+
61
73
  # when buy order
62
74
  if order.side == enums.TradeOrderSide.BUY:
63
- new_quantity = - order.origin_quantity * order.origin_price * (constants.ONE if is_new_order else -constants.ONE)
75
+ new_quantity = - (order.origin_quantity * order.origin_price + quote_fees) * multiplier
64
76
  self._update_portfolio_data(order.market,
65
77
  available_value=new_quantity,
66
78
  total_value=constants.ZERO)
67
79
 
68
80
  # when sell order
69
81
  else:
70
- new_quantity = - order.origin_quantity * (constants.ONE if is_new_order else -constants.ONE)
82
+ new_quantity = - (order.origin_quantity + base_fees) * multiplier
71
83
  self._update_portfolio_data(order.currency,
72
84
  available_value=new_quantity,
73
85
  total_value=constants.ZERO)
@@ -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
 
@@ -41,6 +41,7 @@ async def order_simulator(trader_simulator):
41
41
  def created_order(order_type, order_type_enum, *args, **kwargs):
42
42
  order = order_type(*args, **kwargs)
43
43
  order.order_type = order_type_enum
44
+ order.symbol = "BTC/USDT"
44
45
  return order
45
46
 
46
47