OctoBot-Trading 2.4.203__tar.gz → 2.4.205__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 (512) hide show
  1. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/CHANGELOG.md +8 -0
  2. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/OctoBot_Trading.egg-info/SOURCES.txt +1 -0
  4. {OctoBot-Trading-2.4.203/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.205}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/README.md +1 -1
  6. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/portfolio.py +5 -8
  8. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -1
  9. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/types/rest_exchange.py +2 -0
  10. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/__init__.py +2 -0
  11. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/order.py +1 -1
  12. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/__init__.py +6 -2
  13. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/portfolio_util.py +276 -51
  14. OctoBot-Trading-2.4.205/octobot_trading/personal_data/portfolios/resolved_orders_portfolio_delta.py +218 -0
  15. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +65 -19
  16. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_portfolio_util.py +610 -79
  17. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_sub_portfolio_data.py +26 -4
  18. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/LICENSE +0 -0
  19. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/MANIFEST.in +0 -0
  20. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  21. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  22. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/OctoBot_Trading.egg-info/requires.txt +0 -0
  23. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  24. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/__init__.py +0 -0
  25. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/channels.py +0 -0
  26. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/contracts.py +0 -0
  27. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/exchange.py +0 -0
  28. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/modes.py +0 -0
  29. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/orders.py +0 -0
  30. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/positions.py +0 -0
  31. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/profitability.py +0 -0
  32. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/storage.py +0 -0
  33. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/symbol_data.py +0 -0
  34. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/trader.py +0 -0
  35. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/api/trades.py +0 -0
  36. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/constants.py +0 -0
  37. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/enums.py +0 -0
  38. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/errors.py +0 -0
  39. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_channel.py +0 -0
  40. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/__init__.py +0 -0
  41. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  42. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  43. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  44. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  45. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  46. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  47. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  48. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  49. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  50. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  51. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  52. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  53. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  56. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  57. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  58. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  59. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  61. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  62. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  63. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  64. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  65. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  66. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  67. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  69. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  70. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  71. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  72. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  73. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  76. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  77. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  78. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  79. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  80. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  83. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  84. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  86. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  89. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  90. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  92. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  94. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  95. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  97. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/config/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  99. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  100. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
  101. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  102. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  105. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  106. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  107. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  108. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  109. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  110. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  112. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  113. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  114. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/connectors/util.py +0 -0
  115. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchange_builder.py +0 -0
  116. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchange_channels.py +0 -0
  117. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchange_details.py +0 -0
  118. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchange_factory.py +0 -0
  119. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchange_manager.py +0 -0
  120. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  121. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/exchanges.py +0 -0
  122. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  123. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  124. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  126. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/traders/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/traders/trader.py +0 -0
  128. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  129. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/types/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  131. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/util/__init__.py +0 -0
  132. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  133. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  134. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  135. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  136. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  138. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/channel/__init__.py +0 -0
  139. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  140. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  141. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/channel/mode.py +0 -0
  142. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/mode_activity.py +0 -0
  143. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/mode_config.py +0 -0
  144. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/modes_factory.py +0 -0
  145. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/modes_util.py +0 -0
  146. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  149. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  150. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  151. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  152. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  153. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  154. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  155. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  156. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  157. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  158. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  159. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  160. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  162. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/octobot_channel_consumer.py +0 -0
  163. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  164. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  166. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py +0 -0
  167. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py +0 -0
  168. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py +0 -0
  169. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  171. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  172. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  173. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  175. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  176. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  177. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  178. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
  179. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  180. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  181. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/order_group.py +0 -0
  182. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/order_state.py +0 -0
  183. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/order_util.py +0 -0
  184. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  185. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  186. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  190. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  191. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  192. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  193. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  194. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  196. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  197. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  198. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  199. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  200. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/triggers/__init__.py +0 -0
  201. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/triggers/base_trigger.py +0 -0
  202. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/triggers/price_trigger.py +0 -0
  203. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  205. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  206. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  207. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  208. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  209. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  210. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  211. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  212. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  213. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  214. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  215. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  216. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  217. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  218. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  219. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  220. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  221. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  222. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  223. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  224. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  225. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  226. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  228. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  229. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  230. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  231. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  232. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  233. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  234. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  236. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  237. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  238. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  239. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  240. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  242. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  243. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  244. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  245. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  247. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  248. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  249. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  250. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/position.py +0 -0
  251. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  252. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/position_state.py +0 -0
  253. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/position_util.py +0 -0
  254. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  255. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  256. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  257. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  258. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  259. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  260. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  262. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  263. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/state.py +0 -0
  264. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/__init__.py +0 -0
  265. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  267. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  268. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/trade.py +0 -0
  269. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  270. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  271. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  272. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  273. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  275. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  276. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  277. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  278. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  279. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  280. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  281. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  282. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/channel/__init__.py +0 -0
  284. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  285. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  286. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/channel/signal_producer.py +0 -0
  287. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/signal_creation.py +0 -0
  288. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  289. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/signals/util.py +0 -0
  290. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/abstract_storage.py +0 -0
  292. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/candles_storage.py +0 -0
  293. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/orders_storage.py +0 -0
  294. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/portfolio_storage.py +0 -0
  295. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/storage_manager.py +0 -0
  296. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/trades_storage.py +0 -0
  297. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/transactions_storage.py +0 -0
  298. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/storage/util.py +0 -0
  299. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/supervisors/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  301. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  302. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/__init__.py +0 -0
  303. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/config_util.py +0 -0
  304. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/initializable.py +0 -0
  305. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/initialization_util.py +0 -0
  306. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/simulator_updater_utils.py +0 -0
  307. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/test_tools/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  309. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  310. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  311. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  312. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/requirements.txt +0 -0
  313. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/setup.cfg +0 -0
  314. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/setup.py +0 -0
  315. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_channels.py +0 -0
  317. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_exchange.py +0 -0
  318. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_modes.py +0 -0
  319. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_orders.py +0 -0
  320. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_portfolio.py +0 -0
  321. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_profitability.py +0 -0
  322. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_symbol_data.py +0 -0
  323. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_trader.py +0 -0
  324. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/api/test_trades.py +0 -0
  325. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/cli/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/contracts/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  329. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  330. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/funding/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  332. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/kline/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  334. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/ohlcv/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  336. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  337. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/order_book/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  339. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/prices/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  341. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  342. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/recent_trades/__init__.py +0 -0
  343. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  344. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  345. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/ticker/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  347. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/connectors/__init__.py +0 -0
  349. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  351. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  352. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/connectors/test_util.py +0 -0
  353. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/implementations/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  355. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  356. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_abstract_exchange.py +0 -0
  357. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  358. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_exchange_builder.py +0 -0
  359. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_exchange_config_data.py +0 -0
  360. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_exchange_factory.py +0 -0
  361. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_exchange_manager.py +0 -0
  362. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_exchange_simulator.py +0 -0
  363. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/test_exchanges.py +0 -0
  364. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/traders/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/traders/test_trader.py +0 -0
  366. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/types/__init__.py +0 -0
  367. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  368. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/util/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  370. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/exchanges/util/test_exchange_util.py +0 -0
  371. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/__init__.py +0 -0
  372. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/__init__.py +0 -0
  373. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  374. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  375. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  376. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  377. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  378. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  379. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  380. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/test_abstract_mode_consumer.py +0 -0
  381. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/test_abstract_trading_mode.py +0 -0
  382. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/modes/test_modes_util.py +0 -0
  383. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/__init__.py +0 -0
  384. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/__init__.py +0 -0
  385. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py +0 -0
  387. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py +0 -0
  388. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py +0 -0
  389. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/groups/__init__.py +0 -0
  390. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  391. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  392. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  393. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
  394. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  396. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  397. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  398. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  399. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_order_state.py +0 -0
  400. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  401. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  402. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  403. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  404. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  405. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_order.py +0 -0
  406. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_order_adapter.py +0 -0
  407. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_order_factory.py +0 -0
  408. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_order_util.py +0 -0
  409. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_orders_manager.py +0 -0
  410. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  411. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  412. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  413. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  414. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/triggers/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/triggers/test_base_trigger.py +0 -0
  416. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/triggers/test_price_trigger.py +0 -0
  417. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  420. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  421. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  422. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  423. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  424. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  425. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  426. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/market/__init__.py +0 -0
  427. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  428. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  429. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  430. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  432. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  433. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  435. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  436. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  437. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  438. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/history/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  440. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  441. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_asset.py +0 -0
  442. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  443. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  444. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  445. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  446. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  447. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/types/__init__.py +0 -0
  448. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  449. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  450. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  451. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/channel/__init__.py +0 -0
  453. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/states/__init__.py +0 -0
  454. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/test_position.py +0 -0
  455. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/test_position_factory.py +0 -0
  456. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/test_positions_manager.py +0 -0
  457. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/types/__init__.py +0 -0
  458. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  459. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  460. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/trades/__init__.py +0 -0
  461. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/trades/test_trade_factory.py +0 -0
  462. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/trades/test_trade_manager.py +0 -0
  463. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  464. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/trades/test_trade_util.py +0 -0
  465. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/transactions/__init__.py +0 -0
  466. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  467. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  468. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/signals/__init__.py +0 -0
  469. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  470. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/signals/test_util.py +0 -0
  471. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/test_utils/__init__.py +0 -0
  472. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/test_utils/order_util.py +0 -0
  473. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/test_utils/random_numbers.py +0 -0
  474. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/util/__init__.py +0 -0
  475. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests/util/test_config_util.py +0 -0
  476. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/__init__.py +0 -0
  477. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/__init__.py +0 -0
  478. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  479. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  480. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  481. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_binance.py +0 -0
  482. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  483. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bingx.py +0 -0
  484. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  485. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bitget.py +0 -0
  486. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  487. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  488. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  489. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bitso.py +0 -0
  490. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  491. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bybit.py +0 -0
  492. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  493. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  494. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_coinex.py +0 -0
  495. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  496. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_gateio.py +0 -0
  497. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  498. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  499. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_htx.py +0 -0
  500. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
  501. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_kraken.py +0 -0
  502. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  503. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  504. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_mexc.py +0 -0
  505. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_ndax.py +0 -0
  506. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  507. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_okx.py +0 -0
  508. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  509. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_phemex.py +0 -0
  510. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  511. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_upbit.py +0 -0
  512. {OctoBot-Trading-2.4.203 → OctoBot-Trading-2.4.205}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,14 @@ 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.205] - 2025-08-07
8
+ ### Updated
9
+ [SubPortfolio] add filled/cancelled orders inferring enging
10
+
11
+ ## [2.4.204] - 2025-08-04
12
+ ### Updated
13
+ [SubPortfolio] handle local exchange symbols fees
14
+
7
15
  ## [2.4.203] - 2025-08-03
8
16
  ### Updated
9
17
  [Trades] log parsing error
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.203
3
+ Version: 2.4.205
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.203](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.205](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)
@@ -222,6 +222,7 @@ octobot_trading/personal_data/portfolios/portfolio_manager.py
222
222
  octobot_trading/personal_data/portfolios/portfolio_profitability.py
223
223
  octobot_trading/personal_data/portfolios/portfolio_util.py
224
224
  octobot_trading/personal_data/portfolios/portfolio_value_holder.py
225
+ octobot_trading/personal_data/portfolios/resolved_orders_portfolio_delta.py
225
226
  octobot_trading/personal_data/portfolios/sub_portfolio.py
226
227
  octobot_trading/personal_data/portfolios/sub_portfolio_data.py
227
228
  octobot_trading/personal_data/portfolios/value_converter.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.203
3
+ Version: 2.4.205
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.203](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.205](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.203](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.205](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.203" # major.minor.revision
18
+ VERSION = "2.4.205" # major.minor.revision
@@ -125,22 +125,19 @@ def is_usd_like_coin(coin) -> bool:
125
125
  def resolve_sub_portfolios(
126
126
  master_portfolio: personal_data.SubPortfolioData,
127
127
  sub_portfolios: list[personal_data.SubPortfolioData],
128
- allowed_filling_assets: list[str],
129
- forbidden_filling_assets: list[str],
130
128
  market_prices: dict[str, float],
131
129
  ) -> (personal_data.SubPortfolioData, list[personal_data.SubPortfolioData]):
132
- return personal_data.resolve_sub_portfolios(
133
- master_portfolio, sub_portfolios, allowed_filling_assets, forbidden_filling_assets, market_prices
134
- )
130
+ return personal_data.resolve_sub_portfolios(master_portfolio, sub_portfolios, market_prices)
135
131
 
136
132
 
137
133
  def get_portfolio_filled_orders_deltas(
138
134
  previous_portfolio_content: dict[str, dict[str, decimal.Decimal]],
139
135
  updated_portfolio_content: dict[str, dict[str, decimal.Decimal]],
140
- filled_orders: list[personal_data.Order]
141
- ) -> (dict[str, dict[str, decimal.Decimal]], dict[str, dict[str, decimal.Decimal]]):
136
+ filled_orders: list[personal_data.Order],
137
+ unknown_filled_or_cancelled_orders: list[personal_data.Order]
138
+ ) -> personal_data.ResolvedOrdersPortoflioDelta:
142
139
  return personal_data.get_portfolio_filled_orders_deltas(
143
- previous_portfolio_content, updated_portfolio_content, filled_orders
140
+ previous_portfolio_content, updated_portfolio_content, filled_orders, unknown_filled_or_cancelled_orders
144
141
  )
145
142
 
146
143
 
@@ -25,7 +25,6 @@ import binascii
25
25
  import copy
26
26
 
27
27
  import octobot_commons.enums
28
- import octobot_commons.logging
29
28
  import octobot_commons.symbols as commons_symbols
30
29
  import octobot_commons.html_util as html_util
31
30
 
@@ -139,6 +139,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
139
139
  EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
140
140
  # text content of errors due to an order that can't be cancelled on exchange (because filled or already cancelled)
141
141
  EXCHANGE_ORDER_UNCANCELLABLE_ERRORS: typing.List[typing.Iterable[str]] = []
142
+ # set when the exchange can allow users to pay fees in a custom currency (ex: BNB on binance)
143
+ LOCAL_FEES_CURRENCIES: typing.List[str] = []
142
144
 
143
145
  DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
144
146
 
@@ -177,6 +177,7 @@ from octobot_trading.personal_data.portfolios import (
177
177
  HistoricalAssetValue,
178
178
  HistoricalPortfolioValueManager,
179
179
  SubPortfolioData,
180
+ ResolvedOrdersPortoflioDelta,
180
181
  )
181
182
  from octobot_trading.personal_data import positions
182
183
  from octobot_trading.personal_data.positions import (
@@ -474,4 +475,5 @@ __all__ = [
474
475
  "create_fee_transaction",
475
476
  "create_transfer_transaction",
476
477
  "SubPortfolioData",
478
+ "ResolvedOrdersPortoflioDelta",
477
479
  ]
@@ -1142,7 +1142,7 @@ class Order(util.Initializable):
1142
1142
  return self.trader is not None
1143
1143
 
1144
1144
 
1145
- def parse_order_type(raw_order):
1145
+ def parse_order_type(raw_order) -> (enums.TradeOrderSide, enums.TraderOrderType):
1146
1146
  try:
1147
1147
  side: enums.TradeOrderSide = enums.TradeOrderSide(raw_order[enums.ExchangeConstantsOrderColumns.SIDE.value])
1148
1148
  order_type: enums.TradeOrderType = enums.TradeOrderType.UNKNOWN
@@ -44,7 +44,7 @@ from octobot_trading.personal_data.portfolios import types
44
44
  from octobot_trading.personal_data.portfolios import portfolio_util
45
45
  from octobot_trading.personal_data.portfolios import history
46
46
  from octobot_trading.personal_data.portfolios import sub_portfolio_data
47
-
47
+ from octobot_trading.personal_data.portfolios import resolved_orders_portfolio_delta
48
48
 
49
49
  from octobot_trading.personal_data.portfolios.portfolio_factory import (
50
50
  create_portfolio_from_exchange_manager,
@@ -97,7 +97,10 @@ from octobot_trading.personal_data.portfolios.history import (
97
97
  from octobot_trading.personal_data.portfolios.sub_portfolio_data import (
98
98
  SubPortfolioData,
99
99
  )
100
-
100
+ from octobot_trading.personal_data.portfolios.resolved_orders_portfolio_delta import (
101
+ ResolvedOrdersPortoflioDelta,
102
+ )
103
+
101
104
  __all__ = [
102
105
  "BalanceUpdaterSimulator",
103
106
  "BalanceProfitabilityUpdaterSimulator",
@@ -139,4 +142,5 @@ __all__ = [
139
142
  "HistoricalAssetValue",
140
143
  "HistoricalPortfolioValueManager",
141
144
  "SubPortfolioData",
145
+ "ResolvedOrdersPortoflioDelta",
142
146
  ]
@@ -16,12 +16,14 @@
16
16
  import copy
17
17
  import decimal
18
18
  import typing
19
+ import itertools
19
20
 
20
21
  import octobot_trading.personal_data.portfolios.asset as asset
21
22
  import octobot_trading.personal_data.portfolios.assets
22
23
  import octobot_trading.personal_data.orders.order as order_import
23
24
  import octobot_trading.personal_data.orders.order_util as order_util
24
25
  import octobot_trading.personal_data.portfolios.sub_portfolio_data as sub_portfolio_data
26
+ import octobot_trading.personal_data.portfolios.resolved_orders_portfolio_delta as resolved_orders_portfolio_delta
25
27
  import octobot_trading.constants as constants
26
28
  import octobot_trading.enums as enums
27
29
  import octobot_trading.errors as errors
@@ -258,16 +260,12 @@ def get_asset_price_from_converter_or_tickers(
258
260
  def resolve_sub_portfolios(
259
261
  master_portfolio: sub_portfolio_data.SubPortfolioData,
260
262
  sub_portfolios: list[sub_portfolio_data.SubPortfolioData],
261
- allowed_filling_assets: list[str],
262
- forbidden_filling_assets: list[str],
263
263
  market_prices: dict[str, float],
264
264
  ) -> (sub_portfolio_data.SubPortfolioData, list[sub_portfolio_data.SubPortfolioData]):
265
265
  resolved_portfolios = []
266
266
  remaining_master_portfolio = copy.deepcopy(master_portfolio)
267
267
  for sub_portfolio in sorted(sub_portfolios, key=lambda x: x.priority_key):
268
- resolved_portfolio = _resolve_sub_portfolio(
269
- remaining_master_portfolio, sub_portfolio, allowed_filling_assets, forbidden_filling_assets, market_prices
270
- )
268
+ resolved_portfolio = _resolve_sub_portfolio(remaining_master_portfolio, sub_portfolio, market_prices)
271
269
  resolved_portfolios.append(resolved_portfolio)
272
270
  return remaining_master_portfolio, resolved_portfolios
273
271
 
@@ -275,8 +273,6 @@ def resolve_sub_portfolios(
275
273
  def _resolve_sub_portfolio(
276
274
  remaining_master_portfolio: sub_portfolio_data.SubPortfolioData,
277
275
  sub_portfolio: sub_portfolio_data.SubPortfolioData,
278
- allowed_filling_assets: list[str],
279
- forbidden_filling_assets: list[str],
280
276
  market_prices: dict[str, float],
281
277
  ) -> sub_portfolio_data.SubPortfolioData:
282
278
  resolved_content = {}
@@ -287,14 +283,14 @@ def _resolve_sub_portfolio(
287
283
  for asset_name, holdings in forecasted_sub_portfolio_content.items():
288
284
  missing_amount_in_asset = _resolve_sub_portfolio_asset(
289
285
  asset_name, holdings, remaining_master_portfolio, resolved_content,
290
- sub_portfolio.locked_funds_by_asset.get(asset_name, constants.ZERO), forbidden_filling_assets
286
+ sub_portfolio.locked_funds_by_asset.get(asset_name, constants.ZERO), sub_portfolio.forbidden_filling_assets
291
287
  )
292
288
  if missing_amount_in_asset > constants.ZERO:
293
289
  missing_amount_by_asset[asset_name] = missing_amount_in_asset
294
290
  # now that assets have been allocated, try to compensate missing assets
295
291
  for asset_name, missing_amount_in_asset in missing_amount_by_asset.items():
296
292
  _fill_missing_assets_from_allowed_filling_assets(
297
- asset_name, allowed_filling_assets, market_prices,
293
+ asset_name, sub_portfolio.allowed_filling_assets, market_prices,
298
294
  remaining_master_portfolio, missing_amount_in_asset,
299
295
  resolved_content, funds_deltas, missing_funds
300
296
  )
@@ -305,8 +301,8 @@ def _resolve_sub_portfolio(
305
301
  sub_portfolio.priority_key,
306
302
  resolved_content,
307
303
  sub_portfolio.unit,
308
- funds_deltas,
309
- missing_funds,
304
+ funds_deltas=funds_deltas,
305
+ missing_funds=missing_funds,
310
306
  )
311
307
 
312
308
 
@@ -424,6 +420,7 @@ def _fill_missing_assets_from_allowed_filling_assets(
424
420
  commons_constants.PORTFOLIO_TOTAL: funds_to_add_in_filling_asset,
425
421
  commons_constants.PORTFOLIO_AVAILABLE: funds_to_add_in_filling_asset,
426
422
  }
423
+ # register filling assets in funds_deltas
427
424
  if filling_asset in funds_deltas:
428
425
  funds_deltas[filling_asset][commons_constants.PORTFOLIO_TOTAL] += funds_to_add_in_filling_asset
429
426
  funds_deltas[filling_asset][commons_constants.PORTFOLIO_AVAILABLE] += funds_to_add_in_filling_asset
@@ -544,16 +541,147 @@ def get_missing_master_portfolio_values_update(
544
541
  def get_portfolio_filled_orders_deltas(
545
542
  previous_portfolio_content: dict[str, dict[str, decimal.Decimal]],
546
543
  updated_portfolio_content: dict[str, dict[str, decimal.Decimal]],
547
- filled_orders: list[order_import.Order]
548
- ) -> (dict[str, dict[str, decimal.Decimal]], dict[str, dict[str, decimal.Decimal]]):
549
- orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas = get_assets_delta_from_orders(filled_orders)
544
+ filled_orders: list[order_import.Order],
545
+ unknown_filled_or_cancelled_orders: list[order_import.Order]
546
+ ) -> resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta:
550
547
  portfolios_asset_deltas = _get_assets_delta_from_portfolio(previous_portfolio_content, updated_portfolio_content)
551
- # return portfolio asset deltas that can approximately be explained by given orders
548
+ if unknown_filled_or_cancelled_orders:
549
+ return _compute_most_probable_assets_deltas_from_orders_considering_unknown_orders(
550
+ filled_orders, portfolios_asset_deltas, unknown_filled_or_cancelled_orders
551
+ )
552
+ else:
553
+ orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas = get_assets_delta_from_orders(filled_orders)
554
+ return compute_assets_deltas_from_orders(
555
+ orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas,
556
+ portfolios_asset_deltas, allow_portfolio_delta_shrinking=True
557
+ )
558
+
559
+
560
+ def _reverse_portfolio_deltas(
561
+ portfolios_asset_deltas: dict[str, dict[str, decimal.Decimal]],
562
+ ) -> dict[str, dict[str, decimal.Decimal]]:
563
+ return {
564
+ asset_name: {
565
+ key: -delta_values[key] for key in delta_values
566
+ }
567
+ for asset_name, delta_values in portfolios_asset_deltas.items()
568
+ }
569
+
570
+
571
+ def _compute_most_probable_assets_deltas_from_orders_considering_unknown_orders(
572
+ filled_orders: list[order_import.Order],
573
+ portfolios_asset_deltas: dict[str, dict[str, decimal.Decimal]],
574
+ unknown_filled_or_cancelled_orders: list[order_import.Order]
575
+ ) -> resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta:
576
+ """
577
+ Returns the most probable deltas which are the ones that can be best explained by given orders
578
+ """
579
+
580
+ if filled_orders:
581
+ orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas = get_assets_delta_from_orders(
582
+ filled_orders
583
+ )
584
+ known_filled_orders_resolved_delta = compute_assets_deltas_from_orders(
585
+ orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas,
586
+ portfolios_asset_deltas,
587
+ allow_portfolio_delta_shrinking=False,
588
+ allow_mixed_sign_delta=True,
589
+ register_missed_partial_delta_as_ignored=True,
590
+ ignore_order_unrelated_deltas=False,
591
+ ignore_order_extra_deltas=False,
592
+ )
593
+ else:
594
+ known_filled_orders_resolved_delta = resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta()
595
+ # init with all cancelled orders and explained+unexplained portfolio deltas from known filled orders
596
+ best_inferred_resolved_delta = resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta(
597
+ inferred_cancelled_orders=unknown_filled_or_cancelled_orders,
598
+ ).merge_order_deltas(known_filled_orders_resolved_delta, portfolios_asset_deltas)
599
+ post_filled_orders_portfolio_asset_deltas = resolved_orders_portfolio_delta.filter_empty_deltas(
600
+ sub_portfolio_data.get_content_after_deltas(
601
+ portfolios_asset_deltas, _reverse_portfolio_deltas(
602
+ best_inferred_resolved_delta.explained_orders_deltas
603
+ ), apply_available_deltas=True
604
+ )
605
+ )
606
+ # start at 1 to avoid considering no filled orders (already considered in best_inferred_resolved_delta)
607
+ for orders_to_fill_count in range(1, len(unknown_filled_or_cancelled_orders) + 1):
608
+ for filled_orders_combination in itertools.combinations(unknown_filled_or_cancelled_orders, orders_to_fill_count):
609
+ potential_filled_orders_combination = list(filled_orders_combination)
610
+ orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas = get_assets_delta_from_orders(
611
+ potential_filled_orders_combination
612
+ )
613
+ if any(
614
+ asset_name not in post_filled_orders_portfolio_asset_deltas # use post_filled_orders_portfolio_asset_deltas?
615
+ for asset_name in orders_asset_deltas
616
+ ):
617
+ # at least one of the candidate filled orders is not related to portfolio delta: skip this combination
618
+ continue
619
+ inferred_resolved_delta_candidate = compute_assets_deltas_from_orders(
620
+ orders_asset_deltas, expected_fee_related_deltas, possible_fees_asset_deltas,
621
+ post_filled_orders_portfolio_asset_deltas,
622
+ allow_portfolio_delta_shrinking=False,
623
+ register_missed_partial_delta_as_ignored=True,
624
+ ignore_order_unrelated_deltas=False,
625
+ ignore_order_extra_deltas=True,
626
+ )
627
+ if not inferred_resolved_delta_candidate.adds_explanations():
628
+ # no added explanations: skip this combination
629
+ continue
630
+ merged_inferred_resolved_delta_candidate = inferred_resolved_delta_candidate.merge_order_deltas(
631
+ known_filled_orders_resolved_delta, portfolios_asset_deltas
632
+ )
633
+ merged_inferred_resolved_delta_candidate.inferred_filled_orders = potential_filled_orders_combination
634
+ merged_inferred_resolved_delta_candidate.inferred_cancelled_orders = [
635
+ order for order in unknown_filled_or_cancelled_orders if order not in potential_filled_orders_combination
636
+ ]
637
+ try:
638
+ if merged_inferred_resolved_delta_candidate.is_fully_explained():
639
+ return _get_cleared_inferred_resolved_delta(
640
+ merged_inferred_resolved_delta_candidate, portfolios_asset_deltas
641
+ )
642
+ elif merged_inferred_resolved_delta_candidate.is_more_probable_than(best_inferred_resolved_delta):
643
+ best_inferred_resolved_delta = merged_inferred_resolved_delta_candidate
644
+ except KeyError as err:
645
+ # should not happen, catch it to avoid raising it if it does
646
+ commons_logging.get_logger(__name__).error(
647
+ f"Unexpected error when computing most probable assets deltas from orders: {err}"
648
+ )
649
+ return _get_cleared_inferred_resolved_delta(best_inferred_resolved_delta, portfolios_asset_deltas)
650
+
651
+
652
+ def _get_cleared_inferred_resolved_delta(
653
+ resolved_delta: resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta,
654
+ portfolios_asset_deltas: dict[str, dict[str, decimal.Decimal]],
655
+ ) -> resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta:
656
+ # clear partial deltas as they should not be considered real deltas (they are due to other "unknown" orders)
657
+ resolved_delta.ensure_max_delta_and_clear_irrelevant_deltas(portfolios_asset_deltas)
658
+ return resolved_delta
659
+
660
+
661
+ def compute_assets_deltas_from_orders(
662
+ orders_asset_deltas: dict[str, decimal.Decimal],
663
+ expected_fee_related_deltas: dict[str, decimal.Decimal],
664
+ possible_fees_asset_deltas: dict[str, decimal.Decimal],
665
+ portfolios_asset_deltas: dict[str, dict[str, decimal.Decimal]],
666
+ allow_portfolio_delta_shrinking: bool = True,
667
+ allow_mixed_sign_delta: bool = False,
668
+ register_missed_partial_delta_as_ignored: bool = False,
669
+ ignore_order_unrelated_deltas: bool = True,
670
+ ignore_order_extra_deltas: bool = False,
671
+ ) -> resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta:
672
+ """
673
+ returns portfolio asset deltas that can approximately be explained by given orders
674
+ """
552
675
  orders_linked_deltas = {}
553
676
  ignored_deltas = {}
554
677
  for asset_name, holdings_delta in portfolios_asset_deltas.items():
555
678
  if asset_name not in orders_asset_deltas:
556
- # this delta is not due to these orders: skip it
679
+ if ignore_order_unrelated_deltas:
680
+ # this delta is not due to these orders: skip it
681
+ continue
682
+ else:
683
+ # this delta is not due to these orders: add it to ignored deltas
684
+ ignored_deltas[asset_name] = holdings_delta
557
685
  continue
558
686
  order_asset_delta = orders_asset_deltas[asset_name]
559
687
  holding_total = holdings_delta[commons_constants.PORTFOLIO_TOTAL]
@@ -569,7 +697,13 @@ def get_portfolio_filled_orders_deltas(
569
697
  * min_allowed_equivalent_total_holding < 0
570
698
  ):
571
699
  # different sign: incompatible, this is unexpected
572
- ignored_deltas[asset_name] = holdings_delta
700
+ if allow_mixed_sign_delta:
701
+ orders_linked_deltas[asset_name] = {
702
+ key: order_asset_delta
703
+ for key in holdings_delta
704
+ }
705
+ else:
706
+ ignored_deltas[asset_name] = holdings_delta
573
707
  elif (
574
708
  # approx same value
575
709
  abs(min_allowed_equivalent_total_holding)
@@ -609,10 +743,18 @@ def get_portfolio_filled_orders_deltas(
609
743
  if (
610
744
  # try while taking possible fees into account
611
745
  asset_name in possible_fees_asset_deltas and (
612
- abs(min_allowed_equivalent_total_holding)
613
- # fees bring back the order delta into the expected portfolio delta window
614
- < abs(order_asset_delta + possible_fees_asset_deltas[asset_name])
615
- < abs(max_allowed_equivalent_total_holding)
746
+ any(
747
+ abs(min_allowed_equivalent_total_holding)
748
+ # fees bring back the order delta into the expected portfolio delta window
749
+ < abs(order_asset_delta + possible_fee)
750
+ < abs(max_allowed_equivalent_total_holding)
751
+ for possible_fee in (
752
+ # try with smaller fees in case user is paying less fees (when having large volume)
753
+ # test from 10% up to 100% fees
754
+ possible_fees_asset_deltas[asset_name] * decimal.Decimal(multiplier / 10)
755
+ for multiplier in range(1, 11)
756
+ )
757
+ )
616
758
  )
617
759
  ):
618
760
  orders_linked_deltas[asset_name] = holdings_delta
@@ -622,35 +764,58 @@ def get_portfolio_filled_orders_deltas(
622
764
  # Add it to ignored_deltas
623
765
  ignored_deltas[asset_name] = holdings_delta
624
766
  elif abs(min_allowed_equivalent_total_holding) > abs(order_asset_delta):
625
- # too much in portfolio delta: only take what is linked to the orders deltas
626
- # => updates both total and available
627
- # Should very rarely happen as it might reduce the total portfolio if done when unecessary
628
- commons_logging.get_logger(__name__).warning(
629
- f"Too large portfolio {asset_name} delta: {holdings_delta}, reducing to order delta: {order_asset_delta}"
767
+ # too much in portfolio delta
768
+ if register_missed_partial_delta_as_ignored:
769
+ # Partial deltas: only take what is linked to the orders deltas
770
+ # => updates both total and available
771
+ orders_linked_deltas[asset_name] = {
772
+ key: order_asset_delta
773
+ for key in holdings_delta
774
+ }
775
+ # register extra delta as ignored
776
+ ignored_deltas[asset_name] = {
777
+ key: pf_delta - order_asset_delta if abs(pf_delta - order_asset_delta) > constants.ZERO else constants.ZERO
778
+ for key, pf_delta in holdings_delta.items()
779
+ }
780
+ elif allow_portfolio_delta_shrinking:
781
+ # Only take what is linked to the orders deltas and ignore extra delta values (shrink portfolio deltas)
782
+ # => updates both total and available
783
+ # Should very rarely happen as it might reduce the total portfolio if done when unecessary
784
+ commons_logging.get_logger(__name__).warning(
785
+ f"Too large portfolio {asset_name} delta: {holdings_delta}, reducing to order delta: {order_asset_delta}"
786
+ )
787
+ orders_linked_deltas[asset_name] = {
788
+ key: order_asset_delta
789
+ for key in holdings_delta
790
+ }
791
+ else:
792
+ # can't be from those orders: ignore this delta
793
+ ignored_deltas[asset_name] = holdings_delta
794
+
795
+ if not ignore_order_extra_deltas:
796
+ # consider order deltas that are seen in portfolio deltas
797
+ for asset_name, order_delta in orders_asset_deltas.items():
798
+ can_have_no_delta = (
799
+ (order_delta == constants.ZERO)
800
+ or (order_delta + possible_fees_asset_deltas.get(asset_name, constants.ZERO)) == constants.ZERO
801
+ or (order_delta - possible_fees_asset_deltas.get(asset_name, constants.ZERO)) == constants.ZERO
630
802
  )
631
- orders_linked_deltas[asset_name] = {
632
- key: order_asset_delta
633
- for key in holdings_delta
634
- }
635
- for asset_name, order_delta in orders_asset_deltas.items():
636
- can_have_no_delta = (
637
- (order_delta == constants.ZERO)
638
- or (order_delta + possible_fees_asset_deltas.get(asset_name, constants.ZERO)) == constants.ZERO
639
- or (order_delta - possible_fees_asset_deltas.get(asset_name, constants.ZERO)) == constants.ZERO
640
- )
641
- if asset_name not in portfolios_asset_deltas and not can_have_no_delta:
642
- # asset not in portfolio delta, this is unexpected, register it in ignored deltas
643
- ignored_deltas[asset_name] = {
644
- commons_constants.PORTFOLIO_TOTAL: order_delta,
645
- commons_constants.PORTFOLIO_AVAILABLE: order_delta
646
- }
647
- return orders_linked_deltas, ignored_deltas
803
+ if asset_name not in portfolios_asset_deltas and not can_have_no_delta:
804
+ # asset not in portfolio delta, this is unexpected, register it in ignored deltas
805
+ ignored_deltas[asset_name] = {
806
+ commons_constants.PORTFOLIO_TOTAL: order_delta,
807
+ commons_constants.PORTFOLIO_AVAILABLE: order_delta
808
+ }
809
+ return resolved_orders_portfolio_delta.ResolvedOrdersPortoflioDelta(
810
+ explained_orders_deltas=orders_linked_deltas,
811
+ unexplained_orders_deltas=ignored_deltas
812
+ )
648
813
 
649
814
 
650
815
  def _get_assets_delta_from_portfolio(
651
816
  previous_portfolio_content: dict,
652
817
  updated_portfolio_content: dict,
653
- ) -> dict[str, dict[str, decimal.Decimal]]:
818
+ ) -> dict[str, dict[str, decimal.Decimal]]:
654
819
  asset_deltas = {}
655
820
  for asset_name in set(previous_portfolio_content).union(updated_portfolio_content):
656
821
  if previous_portfolio_content.get(asset_name) != updated_portfolio_content.get(asset_name):
@@ -674,6 +839,7 @@ def get_assets_delta_from_orders(orders: list[order_import.Order]) -> (
674
839
  asset_deltas = {}
675
840
  expected_fee_related_deltas = {}
676
841
  possible_fee_related_deltas = {}
842
+ exchange_local_fees_currency_price = _get_exchange_local_fees_currency_price(orders)
677
843
  for order in orders:
678
844
  base, quote = symbol_util.parse_symbol(order.symbol).base_and_quote()
679
845
  # order "expected" related deltas
@@ -695,9 +861,11 @@ def get_assets_delta_from_orders(orders: list[order_import.Order]) -> (
695
861
  asset_deltas[unit_and_amount[0]] += unit_and_amount[1] * multiplier
696
862
  # order "probable" related deltas (account for worse case fees)
697
863
  expected_forecasted_fees = order.get_computed_fee(use_origin_quantity_and_price=True)
698
- possible_forecasted_fees = _get_other_asset_forecasted_fees(order, expected_forecasted_fees)
699
- for fee_asset in (base, quote):
700
- for fee in (expected_forecasted_fees, possible_forecasted_fees):
864
+ possible_forecasted_fees = _get_other_asset_forecasted_fees(
865
+ order, expected_forecasted_fees, exchange_local_fees_currency_price
866
+ )
867
+ for fee_asset in (base, quote) + tuple(exchange_local_fees_currency_price):
868
+ for fee in (expected_forecasted_fees, ) + possible_forecasted_fees:
701
869
  is_expected_fee = fee is expected_forecasted_fees
702
870
  if asset_amount := order_util.get_fees_for_currency(fee, fee_asset):
703
871
  for delta_counter in (expected_fee_related_deltas, possible_fee_related_deltas):
@@ -710,13 +878,70 @@ def get_assets_delta_from_orders(orders: list[order_import.Order]) -> (
710
878
  delta_counter[fee_asset] += -asset_amount
711
879
  return asset_deltas, expected_fee_related_deltas, possible_fee_related_deltas
712
880
 
713
- def _get_other_asset_forecasted_fees(order: order_import.Order, forecasted_fees: dict) -> dict:
881
+ def _get_other_asset_forecasted_fees(
882
+ order: order_import.Order, forecasted_fees: dict,
883
+ exchange_local_fees_currency_price: dict[str, dict[str, decimal.Decimal]]
884
+ ) -> tuple[dict]:
714
885
  base, quote = symbol_util.parse_symbol(order.symbol).base_and_quote()
715
886
  other_fee = copy.deepcopy(forecasted_fees)
887
+ base_local_fee = None
888
+ quote_local_fee = None
716
889
  if base_fee := order_util.get_fees_for_currency(forecasted_fees, base):
890
+ fee_cost = base_fee * order.origin_price
717
891
  other_fee[enums.FeePropertyColumns.CURRENCY.value] = quote
718
- other_fee[enums.FeePropertyColumns.COST.value] = base_fee * order.origin_price
892
+ other_fee[enums.FeePropertyColumns.COST.value] = fee_cost
893
+ if base not in exchange_local_fees_currency_price and quote not in exchange_local_fees_currency_price:
894
+ for fee_currency, fee_price_by_symbol in exchange_local_fees_currency_price.items():
895
+ for fee_symbol, fee_price in fee_price_by_symbol.items():
896
+ parsed_fee_symbol = symbol_util.parse_symbol(fee_symbol)
897
+ # shared base or quote ? divive, multiply otherwise
898
+ if parsed_fee_symbol.base == base or parsed_fee_symbol.quote == quote:
899
+ base_local_fee = {
900
+ enums.FeePropertyColumns.CURRENCY.value: fee_currency,
901
+ enums.FeePropertyColumns.COST.value: fee_cost / fee_price
902
+ }
903
+ elif parsed_fee_symbol.base == quote or parsed_fee_symbol.quote == base:
904
+ base_local_fee = {
905
+ enums.FeePropertyColumns.CURRENCY.value: fee_currency,
906
+ enums.FeePropertyColumns.COST.value: fee_cost * fee_price
907
+ }
719
908
  elif quote_fee := order_util.get_fees_for_currency(forecasted_fees, quote):
909
+ fee_cost = quote_fee / order.origin_price
720
910
  other_fee[enums.FeePropertyColumns.CURRENCY.value] = base
721
- other_fee[enums.FeePropertyColumns.COST.value] = quote_fee / order.origin_price
722
- return other_fee
911
+ other_fee[enums.FeePropertyColumns.COST.value] = fee_cost
912
+ if base not in exchange_local_fees_currency_price and quote not in exchange_local_fees_currency_price:
913
+ for fee_currency, fee_price_by_symbol in exchange_local_fees_currency_price.items():
914
+ for fee_symbol, fee_price in fee_price_by_symbol.items():
915
+ parsed_fee_symbol = symbol_util.parse_symbol(fee_symbol)
916
+ # shared base or quote ? divive, multiply otherwise
917
+ if parsed_fee_symbol.base == base or parsed_fee_symbol.quote == quote:
918
+ quote_local_fee = {
919
+ enums.FeePropertyColumns.CURRENCY.value: fee_currency,
920
+ enums.FeePropertyColumns.COST.value: fee_cost / fee_price
921
+ }
922
+ elif parsed_fee_symbol.base == quote or parsed_fee_symbol.quote == base:
923
+ quote_local_fee = {
924
+ enums.FeePropertyColumns.CURRENCY.value: fee_currency,
925
+ enums.FeePropertyColumns.COST.value: fee_cost * fee_price
926
+ }
927
+ return tuple(
928
+ fee
929
+ for fee in (other_fee, base_local_fee, quote_local_fee)
930
+ if fee is not None
931
+ )
932
+
933
+
934
+ def _get_exchange_local_fees_currency_price(orders: list[order_import.Order]) -> dict[str, dict[str, decimal.Decimal]]:
935
+ exchange_local_fees_currency_price = {}
936
+ # use given orders to get the price of the potential local fees currencies
937
+ # if an order trades this currency, then we can use its price to get the price of the currency
938
+ for order in orders:
939
+ for local_fees_currency in order.trader.exchange_manager.exchange.LOCAL_FEES_CURRENCIES:
940
+ if local_fees_currency not in exchange_local_fees_currency_price:
941
+ exchange_local_fees_currency_price[local_fees_currency] = {}
942
+ if (
943
+ local_fees_currency in symbol_util.parse_symbol(order.symbol).base_and_quote()
944
+ and order.symbol not in exchange_local_fees_currency_price[local_fees_currency]
945
+ ):
946
+ exchange_local_fees_currency_price[local_fees_currency][order.symbol] = order.origin_price
947
+ return exchange_local_fees_currency_price