OctoBot-Trading 2.4.174__tar.gz → 2.4.176__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 (495) hide show
  1. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/CHANGELOG.md +16 -1
  2. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.174/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.176}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/README.md +1 -1
  5. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/constants.py +1 -0
  7. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +7 -2
  8. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchange_factory.py +1 -1
  9. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/types/rest_exchange.py +12 -6
  10. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/order_util.py +45 -18
  11. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/portfolio_util.py +3 -3
  12. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +6 -0
  13. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/position.py +27 -8
  14. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_order_util.py +159 -4
  15. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_portfolio_util.py +15 -0
  16. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/test_position.py +56 -0
  17. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/LICENSE +0 -0
  18. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/MANIFEST.in +0 -0
  19. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  20. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  21. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  22. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/OctoBot_Trading.egg-info/requires.txt +0 -0
  23. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  24. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/__init__.py +0 -0
  25. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/channels.py +0 -0
  26. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/contracts.py +0 -0
  27. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/exchange.py +0 -0
  28. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/modes.py +0 -0
  29. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/orders.py +0 -0
  30. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/portfolio.py +0 -0
  31. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/positions.py +0 -0
  32. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/profitability.py +0 -0
  33. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/storage.py +0 -0
  34. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/symbol_data.py +0 -0
  35. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/trader.py +0 -0
  36. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/api/trades.py +0 -0
  37. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/enums.py +0 -0
  38. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/errors.py +0 -0
  39. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_channel.py +0 -0
  40. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/__init__.py +0 -0
  41. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  42. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  43. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  44. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  45. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  46. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  47. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  48. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  49. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  50. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  51. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  52. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  53. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  55. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  56. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  57. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  58. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  59. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  60. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  61. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  62. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  63. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  64. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  65. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  66. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  67. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  69. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  70. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  71. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  72. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  73. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  75. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  76. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  77. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  78. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  79. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  80. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  82. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  83. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  84. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  85. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  86. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  88. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  89. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  90. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  91. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  92. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/__init__.py +0 -0
  93. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  94. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  95. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  97. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/config/__init__.py +0 -0
  98. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  99. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  100. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
  101. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/config/proxy_config.py +0 -0
  102. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  103. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  105. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  106. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  107. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  108. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  109. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  110. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  111. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  112. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  113. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  114. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchange_builder.py +0 -0
  115. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchange_channels.py +0 -0
  116. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchange_details.py +0 -0
  117. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchange_manager.py +0 -0
  118. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  119. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/exchanges.py +0 -0
  120. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  121. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  122. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  123. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  124. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/traders/__init__.py +0 -0
  125. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/traders/trader.py +0 -0
  126. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  127. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/types/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  129. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/util/__init__.py +0 -0
  130. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  131. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  132. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  133. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  134. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/__init__.py +0 -0
  135. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  136. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/channel/__init__.py +0 -0
  137. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  138. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  139. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/channel/mode.py +0 -0
  140. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/mode_activity.py +0 -0
  141. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/mode_config.py +0 -0
  142. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/modes_factory.py +0 -0
  143. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/modes_util.py +0 -0
  144. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  146. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  147. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  148. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  149. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  150. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  151. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  163. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  166. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  167. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  168. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  169. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  171. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  172. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  173. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
  174. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/order.py +0 -0
  175. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  176. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  177. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/order_group.py +0 -0
  178. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/order_state.py +0 -0
  179. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  180. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  181. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  182. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  186. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  187. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  188. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  189. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
  190. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
  191. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
  192. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
  193. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
  194. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
  195. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  196. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  197. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  198. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  199. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  201. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  202. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  203. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  204. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  205. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  206. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  207. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  208. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  209. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  210. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  211. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  212. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  213. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  215. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  216. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  217. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  218. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  219. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  220. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  221. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  222. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  223. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  224. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  225. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  226. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  227. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  228. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  229. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  230. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  231. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  232. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  233. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  234. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  235. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  236. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  237. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  238. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  240. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  241. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  242. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  243. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  244. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/position_state.py +0 -0
  245. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/position_util.py +0 -0
  246. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  247. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  249. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  250. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  251. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  252. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  253. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  254. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  255. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/state.py +0 -0
  256. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  259. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  260. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/trade.py +0 -0
  261. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  262. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  263. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  264. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  265. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  267. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  268. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  269. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  270. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  271. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  272. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  273. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  274. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/__init__.py +0 -0
  275. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/channel/__init__.py +0 -0
  276. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  277. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  278. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/channel/signal_producer.py +0 -0
  279. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/signal_creation.py +0 -0
  280. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  281. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/signals/util.py +0 -0
  282. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/abstract_storage.py +0 -0
  284. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/candles_storage.py +0 -0
  285. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/orders_storage.py +0 -0
  286. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/portfolio_storage.py +0 -0
  287. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/storage_manager.py +0 -0
  288. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/trades_storage.py +0 -0
  289. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/transactions_storage.py +0 -0
  290. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/storage/util.py +0 -0
  291. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/supervisors/__init__.py +0 -0
  292. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  293. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  294. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/__init__.py +0 -0
  295. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/config_util.py +0 -0
  296. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/initializable.py +0 -0
  297. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/initialization_util.py +0 -0
  298. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/simulator_updater_utils.py +0 -0
  299. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/test_tools/__init__.py +0 -0
  300. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  301. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  302. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  303. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  304. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/requirements.txt +0 -0
  305. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/setup.cfg +0 -0
  306. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/setup.py +0 -0
  307. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_channels.py +0 -0
  309. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_exchange.py +0 -0
  310. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_modes.py +0 -0
  311. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_orders.py +0 -0
  312. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_portfolio.py +0 -0
  313. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_profitability.py +0 -0
  314. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_symbol_data.py +0 -0
  315. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_trader.py +0 -0
  316. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/api/test_trades.py +0 -0
  317. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/cli/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/__init__.py +0 -0
  319. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/contracts/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  321. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  322. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/funding/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  324. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/kline/__init__.py +0 -0
  325. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  326. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/ohlcv/__init__.py +0 -0
  327. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  328. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  329. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/order_book/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  331. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/prices/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  333. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  334. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/recent_trades/__init__.py +0 -0
  335. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  336. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  337. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/ticker/__init__.py +0 -0
  338. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  339. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/__init__.py +0 -0
  340. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/connectors/__init__.py +0 -0
  341. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  342. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  343. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  344. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/implementations/__init__.py +0 -0
  345. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  346. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  347. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_abstract_exchange.py +0 -0
  348. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  349. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_exchange_builder.py +0 -0
  350. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_exchange_config_data.py +0 -0
  351. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_exchange_factory.py +0 -0
  352. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_exchange_manager.py +0 -0
  353. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_exchange_simulator.py +0 -0
  354. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/test_exchanges.py +0 -0
  355. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/traders/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/traders/test_trader.py +0 -0
  357. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/types/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  359. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/util/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  361. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/exchanges/util/test_exchange_util.py +0 -0
  362. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  366. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  367. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  368. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  369. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  370. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  371. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/test_abstract_mode_consumer.py +0 -0
  372. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/test_abstract_trading_mode.py +0 -0
  373. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/modes/test_modes_util.py +0 -0
  374. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/__init__.py +0 -0
  375. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/__init__.py +0 -0
  376. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/groups/__init__.py +0 -0
  377. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  378. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  379. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  380. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
  381. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  383. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  384. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  385. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  386. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_order_state.py +0 -0
  387. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  388. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  389. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  390. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  391. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  392. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_order.py +0 -0
  393. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_order_adapter.py +0 -0
  394. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_order_factory.py +0 -0
  395. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_orders_manager.py +0 -0
  396. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  397. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
  398. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
  399. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
  400. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  403. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  404. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  405. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  406. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  407. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  408. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  409. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/market/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  411. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  412. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  413. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  414. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  415. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  416. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/__init__.py +0 -0
  417. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  418. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  419. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  420. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  421. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/history/__init__.py +0 -0
  422. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  423. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  424. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_asset.py +0 -0
  425. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  426. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  427. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  428. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  429. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
  430. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  431. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/types/__init__.py +0 -0
  432. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  433. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  434. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  435. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/channel/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/states/__init__.py +0 -0
  438. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/test_position_factory.py +0 -0
  439. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/test_positions_manager.py +0 -0
  440. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/types/__init__.py +0 -0
  441. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  442. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  443. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/trades/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/trades/test_trade_factory.py +0 -0
  445. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/trades/test_trade_manager.py +0 -0
  446. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  447. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/trades/test_trade_util.py +0 -0
  448. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/transactions/__init__.py +0 -0
  449. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  450. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  451. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/signals/__init__.py +0 -0
  452. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  453. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/signals/test_util.py +0 -0
  454. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/test_utils/__init__.py +0 -0
  455. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/test_utils/order_util.py +0 -0
  456. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/test_utils/random_numbers.py +0 -0
  457. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/util/__init__.py +0 -0
  458. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests/util/test_config_util.py +0 -0
  459. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/__init__.py +0 -0
  460. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/__init__.py +0 -0
  461. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  462. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  463. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  464. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_binance.py +0 -0
  465. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  466. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bingx.py +0 -0
  467. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  468. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bitget.py +0 -0
  469. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  470. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bitmart.py +0 -0
  471. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bitmex.py +0 -0
  472. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bitso.py +0 -0
  473. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  474. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bybit.py +0 -0
  475. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  476. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  477. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_coinex.py +0 -0
  478. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  479. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_gateio.py +0 -0
  480. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  481. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  482. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_htx.py +0 -0
  483. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
  484. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_kraken.py +0 -0
  485. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  486. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  487. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_mexc.py +0 -0
  488. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_ndax.py +0 -0
  489. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  490. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_okx.py +0 -0
  491. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  492. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_phemex.py +0 -0
  493. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  494. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_upbit.py +0 -0
  495. {OctoBot-Trading-2.4.174 → OctoBot-Trading-2.4.176}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,9 +4,24 @@ 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.176] - 2025-05-20
8
+ ### Added
9
+ [Orders] custom volume in get_valid_split_orders
10
+ [Exchanges] add hyperliquid
11
+ ### Updated
12
+ [Exchange] warn on expected error in load markets
13
+ [Orders] ensure created order amount is always set
14
+ ### Fixed
15
+ [Portfolio] fix < 0 sub portfolio issue
16
+ [Positions] fix position reversing order and pnl
17
+
18
+ ## [2.4.175] - 2025-05-13
19
+ ### Fixed
20
+ [Portfolio] fix different fees discount
21
+
7
22
  ## [2.4.174] - 2025-05-13
8
23
  ### Fixed
9
- [Portfolio] handle portfolia deltas hedge cases
24
+ [Portfolio] handle portfolio deltas hedge cases
10
25
 
11
26
  ## [2.4.173] - 2025-04-24
12
27
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.174
3
+ Version: 2.4.176
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.174](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.176](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
21
21
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.174
3
+ Version: 2.4.176
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.174](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.176](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.174](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.176](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.174" # major.minor.revision
18
+ VERSION = "2.4.176" # major.minor.revision
@@ -136,6 +136,7 @@ TESTED_EXCHANGES = [
136
136
  "coinbase",
137
137
  "cryptocom",
138
138
  "htx",
139
+ "hyperliquid",
139
140
  "bitget",
140
141
  "gateio",
141
142
  "ascendex",
@@ -177,8 +177,13 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
177
177
  raise ccxt.AuthenticationError(
178
178
  f"Invalid key format ({html_util.get_html_summary_if_relevant(err)})"
179
179
  ) from err
180
- # should never happen: if it does, propagate it
181
- self.logger.error(f"Unexpected error when loading markets: {err} ({err.__class__.__name__})")
180
+ # should not happen: if it does, propagate it
181
+ if self.exchange_manager.exchange.CAN_MAKE_AUTHENTICATED_REQUESTS_WHEN_LOADING_MARKETS:
182
+ # can happen, just warn
183
+ self.logger.warning(f"{err.__class__.__name__} when loading markets: {err}")
184
+ else:
185
+ # unexpected: notify
186
+ self.logger.error(f"Unexpected error when loading markets: {err} ({err.__class__.__name__})")
182
187
  raise
183
188
  except ccxt.ExchangeNotAvailable as err:
184
189
  raise octobot_trading.errors.FailedRequest(
@@ -67,7 +67,7 @@ async def create_real_exchange(exchange_manager, exchange_config_by_exchange: ty
67
67
  or exchange_manager.disable_unauth_retry
68
68
  ):
69
69
  # auth is required or already retried, don't loop
70
- exchange_manager.logger.error(
70
+ exchange_manager.logger.warning(
71
71
  f"Authentication is required and raised an error: impossible to connect to "
72
72
  f"{exchange_manager.exchange_name} exchange: {err}"
73
73
  )
@@ -72,6 +72,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
72
72
  EXPECT_POSSIBLE_ORDER_NOT_FOUND_DURING_ORDER_CREATION = False # set True when get_order() can return None
73
73
  # (order not found) when orders are being created on exchange and are not fully processed on the exchange side.
74
74
  REQUIRES_AUTHENTICATION = False # set True when even normally public apis require authentication
75
+ # set True when even loading markets can make auth calls when creds are set
76
+ CAN_MAKE_AUTHENTICATED_REQUESTS_WHEN_LOADING_MARKETS = False
75
77
  HAS_FETCHED_DETAILS = False # set True when this exchange details (urls etc) have to be fetched before
76
78
  # starting the exchange
77
79
  IS_SKIPPING_EMPTY_CANDLES_IN_OHLCV_FETCH = False # set True when the exchange is known for not returning any
@@ -204,7 +206,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
204
206
  stop_price=stop_price, side=side, current_price=current_price,
205
207
  reduce_only=reduce_only, params=params)
206
208
  self.logger.debug(f"Created order: {created_order}")
207
- return await self._verify_order(created_order, order_type, symbol, price, side)
209
+ return await self._verify_order(created_order, order_type, symbol, price, quantity, side)
208
210
  return None
209
211
 
210
212
  async def edit_order(self, exchange_order_id: str, order_type: enums.TraderOrderType, symbol: str,
@@ -225,7 +227,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
225
227
  edited_order = await self._edit_order(exchange_order_id, order_type, symbol, quantity=float_quantity,
226
228
  price=float_price, stop_price=float_stop_price, side=side,
227
229
  current_price=float_current_price, params=params)
228
- order = await self._verify_order(edited_order, order_type, symbol, price, side)
230
+ order = await self._verify_order(edited_order, order_type, symbol, price, quantity, side)
229
231
  return order
230
232
  return None
231
233
 
@@ -310,7 +312,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
310
312
  f"Unexpected error during order operation: {html_util.get_html_summary_if_relevant(e)}"
311
313
  )
312
314
 
313
- async def _verify_order(self, created_order, order_type, symbol, price, side, get_order_params=None):
315
+ async def _verify_order(self, created_order, order_type, symbol, price, quantity, side, get_order_params=None):
314
316
  # some exchanges are not returning the full order details on creation: fetch it if necessary
315
317
  if created_order and not self._ensure_order_details_completeness(created_order):
316
318
  if ecoc.EXCHANGE_ID.value in created_order:
@@ -332,9 +334,13 @@ class RestExchange(abstract_exchange.AbstractExchange):
332
334
  else:
333
335
  created_order = fetched_order
334
336
 
335
- # on some exchange, market order are not including price, add it manually to ensure uniformity
336
- if created_order is not None and created_order[ecoc.PRICE.value] is None and price is not None:
337
- created_order[ecoc.PRICE.value] = float(price)
337
+ if created_order is not None:
338
+ # on some exchange, market order are not including price, add it manually to ensure uniformity
339
+ if created_order[ecoc.PRICE.value] is None and price is not None:
340
+ created_order[ecoc.PRICE.value] = float(price)
341
+ # sometimes, amount is 0, this is impossible. If it is, restore amount
342
+ if not created_order[ecoc.AMOUNT.value] and quantity is not None:
343
+ created_order[ecoc.AMOUNT.value] = float(quantity)
338
344
 
339
345
  return created_order
340
346
 
@@ -18,6 +18,7 @@ import asyncio
18
18
  import decimal
19
19
  import contextlib
20
20
  import uuid
21
+ import typing
21
22
 
22
23
  import octobot_commons.symbols as symbol_util
23
24
  import octobot_commons.constants as commons_constants
@@ -109,8 +110,14 @@ def check_cost(total_order_price, min_cost):
109
110
 
110
111
 
111
112
  def get_valid_split_orders(
112
- quantity: decimal.Decimal, prices: list[decimal.Decimal], symbol_market
113
+ quantity: decimal.Decimal, prices: list[decimal.Decimal], symbol_market,
114
+ amount_ratio_per_order: typing.Optional[list[decimal.Decimal]] = None
113
115
  ) -> (list[decimal.Decimal], list[decimal.Decimal]):
116
+ if amount_ratio_per_order:
117
+ if len(amount_ratio_per_order) != len(prices):
118
+ raise ValueError(f"amount_ratio_per_order must have {len(prices)} elements")
119
+ if any(amount_ratio <= constants.ZERO for amount_ratio in amount_ratio_per_order):
120
+ raise ValueError(f"all amount_ratio_per_order must by > {constants.ZERO}")
114
121
  if len(prices) < 1:
115
122
  return [], []
116
123
  if len(prices) < 2:
@@ -125,17 +132,23 @@ def get_valid_split_orders(
125
132
  # try to split quantity evenly amount prices
126
133
  current_supported_orders_count = decimal.Decimal(str(len(prices)))
127
134
  while current_supported_orders_count > constants.ONE:
128
- order_vol = quantity / current_supported_orders_count
135
+ if amount_ratio_per_order:
136
+ used_amount_ratio_per_order = amount_ratio_per_order[:int(current_supported_orders_count)]
137
+ total_ratios = sum(used_amount_ratio_per_order)
138
+ candidate_volumes = [
139
+ quantity * ratio_per_order / total_ratios
140
+ for ratio_per_order in used_amount_ratio_per_order
141
+ ]
142
+ else:
143
+ candidate_volumes = [quantity / current_supported_orders_count] * int(current_supported_orders_count)
129
144
  candidate_prices = prices[:int(current_supported_orders_count)]
130
- first_price = min(candidate_prices)
131
- last_price = max(candidate_prices)
132
- if _are_orders_too_small(min_quantity, min_cost, min_price, first_price, order_vol):
145
+ if _are_orders_too_small(min_quantity, min_cost, min_price, min(candidate_prices), min(candidate_volumes)):
133
146
  # reduce orders count to increase quantity
134
147
  current_supported_orders_count -= 1
135
- elif _are_orders_too_large(max_quantity, max_cost, max_price, last_price, order_vol):
136
- raise errors.InvalidArgumentError(f"Order volume ({order_vol}) is too large")
148
+ elif _are_orders_too_large(max_quantity, max_cost, max_price, max(candidate_prices), max(candidate_volumes)):
149
+ raise errors.InvalidArgumentError(f"Order volume ({max(candidate_volumes)}) is too large")
137
150
  else:
138
- return [order_vol] * int(current_supported_orders_count), candidate_prices
151
+ return candidate_volumes, candidate_prices
139
152
  # default to full quantity and first price
140
153
  return [quantity], [prices[0]]
141
154
 
@@ -298,24 +311,35 @@ def get_futures_max_order_size(exchange_manager, symbol, side, current_price, re
298
311
 
299
312
  contract_current_symbol_holding = current_symbol_holding
300
313
  contract_market_quantity = market_quantity
314
+ added_quantity_from_reverse = constants.ZERO
315
+ might_reverse_position = False
301
316
  if current_position.symbol_contract.is_inverse_contract():
302
317
  # use USD (in BTC/USD) for order sizes on inverse, convert BTC values into USD ones
303
318
  contract_current_symbol_holding = current_symbol_holding * current_price
304
319
  contract_market_quantity = market_quantity * current_price
305
320
  if side is enums.TradeOrderSide.SELL and current_position.is_long():
306
321
  # can also sell the position size in long
307
- contract_current_symbol_holding = current_position.size if reduce_only \
308
- else contract_current_symbol_holding + current_position.size
322
+ contract_current_symbol_holding = current_position.size
323
+ might_reverse_position = not reduce_only
324
+ added_quantity_from_reverse = current_position.initial_margin
309
325
  elif side is enums.TradeOrderSide.BUY and current_position.is_short():
310
326
  # can also buy the position size in short
311
- contract_market_quantity = abs(current_position.size) if reduce_only \
312
- else contract_market_quantity + abs(current_position.size)
313
- if (new_position_side is enums.PositionSide.LONG and side is enums.TradeOrderSide.BUY) \
314
- or (new_position_side is enums.PositionSide.SHORT and
315
- side is enums.TradeOrderSide.SELL):
327
+ contract_market_quantity = abs(current_position.size)
328
+ might_reverse_position = not reduce_only
329
+ added_quantity_from_reverse = current_position.initial_margin
330
+ max_reducing_position_order_size = (
331
+ contract_market_quantity if side is enums.TradeOrderSide.BUY else contract_current_symbol_holding
332
+ )
333
+ if (
334
+ (new_position_side is enums.PositionSide.LONG and side is enums.TradeOrderSide.BUY)
335
+ or (new_position_side is enums.PositionSide.SHORT and side is enums.TradeOrderSide.SELL)
336
+ or might_reverse_position
337
+ ):
316
338
  quantity = market_quantity if current_position.symbol_contract.is_inverse_contract() \
317
339
  else market_quantity * current_price
318
- unleveraged_quantity = quantity / current_position.symbol_contract.current_leverage
340
+ # include added_quantity_from_reverse in case funds get freed from reversing a position
341
+ usable_quantity = quantity + added_quantity_from_reverse
342
+ unleveraged_quantity = usable_quantity / current_position.symbol_contract.current_leverage
319
343
  max_position_increased_order_quantity = get_max_order_quantity_for_price(
320
344
  current_position, unleveraged_quantity, current_price, new_position_side, symbol
321
345
  )
@@ -326,8 +350,11 @@ def get_futures_max_order_size(exchange_manager, symbol, side, current_price, re
326
350
  max_position_increased_order_quantity *= \
327
351
  exchange_manager.exchange.MAX_INCREASED_POSITION_QUANTITY_MULTIPLIER
328
352
  # increasing position: always use the same currency
329
- return max_position_increased_order_quantity, True
330
- return contract_market_quantity if side is enums.TradeOrderSide.BUY else contract_current_symbol_holding, False
353
+ return max_position_increased_order_quantity + (
354
+ # include reducing position amount to process reverse
355
+ max_reducing_position_order_size if might_reverse_position else constants.ZERO
356
+ ), True
357
+ return max_reducing_position_order_size, False
331
358
 
332
359
 
333
360
  def get_max_order_quantity_for_price(position, available_quantity, price, side, symbol):
@@ -517,9 +517,9 @@ def get_portfolio_filled_orders_deltas(
517
517
  < abs(max_allowed_equivalent_total_holding)
518
518
  for expected_fee in (
519
519
  # try with smaller fees in case user is paying less fees (when having large volume)
520
- expected_fee_related_deltas[asset_name] / decimal.Decimal(4),
521
- expected_fee_related_deltas[asset_name] / decimal.Decimal(2),
522
- expected_fee_related_deltas[asset_name],
520
+ # test from 10% up to 100% fees
521
+ expected_fee_related_deltas[asset_name] * decimal.Decimal(multiplier / 10)
522
+ for multiplier in range(1, 11)
523
523
  )
524
524
  )
525
525
  )
@@ -58,6 +58,12 @@ class SubPortfolioData:
58
58
  commons_constants.PORTFOLIO_TOTAL: delta_values[commons_constants.PORTFOLIO_TOTAL],
59
59
  commons_constants.PORTFOLIO_AVAILABLE: delta_values[commons_constants.PORTFOLIO_AVAILABLE],
60
60
  }
61
+ for key in (commons_constants.PORTFOLIO_TOTAL, commons_constants.PORTFOLIO_AVAILABLE):
62
+ if updated_content[asset][key] < constants.ZERO:
63
+ commons_logging.get_logger(__name__).warning(
64
+ f"{asset} portfolio {key} value: {updated_content[asset][key]} is < 0. Replacing with zero."
65
+ )
66
+ updated_content[asset][key] = constants.ZERO
61
67
  return updated_content
62
68
 
63
69
  def get_content_from_total_deltas_and_locked_funds(self) -> dict[str, dict[str, decimal.Decimal]]:
@@ -62,12 +62,12 @@ class Position(util.Initializable):
62
62
  self.fee_to_close = constants.ZERO
63
63
 
64
64
  # Size
65
- self.quantity = constants.ZERO
66
- self.size = constants.ZERO
65
+ self.quantity = constants.ZERO # unleverage size
66
+ self.size = constants.ZERO # size of the position (in asset)
67
67
  self.already_reduced_size = constants.ZERO
68
- self.value = constants.ZERO
69
- self.initial_margin = constants.ZERO
70
- self.margin = constants.ZERO
68
+ self.value = constants.ZERO # value of the position
69
+ self.initial_margin = constants.ZERO # locked funds from the wallet to maintain position
70
+ self.margin = constants.ZERO # initial_margin + fee to close
71
71
  self.auto_deposit_margin = False
72
72
 
73
73
  # PNL
@@ -349,6 +349,9 @@ class Position(util.Initializable):
349
349
  if self.size == constants.ZERO:
350
350
  self.creation_time = self.exchange_manager.exchange.get_exchange_current_time()
351
351
  self.update_average_entry_price(size_update, order.filled_price)
352
+ elif self._is_update_reversing_side(size_update):
353
+ # don't use size_update here as it is larger than size
354
+ self._update_exit_data(size_to_close, self.mark_price)
352
355
  elif self._is_update_decreasing_size(size_update):
353
356
  self._update_exit_data(size_update, self.mark_price)
354
357
 
@@ -413,6 +416,15 @@ class Position(util.Initializable):
413
416
  return size_update < constants.ZERO
414
417
  return size_update > constants.ZERO
415
418
 
419
+ def _is_update_reversing_side(self, size_update):
420
+ """
421
+ :param size_update: the size update
422
+ :return: True if this update will reverse position side
423
+ """
424
+ if self.is_long():
425
+ return self.size + size_update < constants.ZERO
426
+ return self.size + size_update > constants.ZERO
427
+
416
428
  def _is_update_closing(self, size_update):
417
429
  """
418
430
  :param size_update: the size update
@@ -440,10 +452,16 @@ class Position(util.Initializable):
440
452
  """
441
453
  margin_update = constants.ZERO
442
454
  is_update_increasing_position_size = self._is_update_increasing_size(size_update)
443
- if self._is_update_decreasing_size(size_update):
455
+ if self._is_update_reversing_side(size_update):
456
+ realised_pnl_update += self._update_realized_pnl_from_size_update(
457
+ self.get_quantity_to_close(), is_closing=True,
458
+ update_price=self.mark_price, trigger_source=trigger_source
459
+ )
460
+ elif self._is_update_decreasing_size(size_update):
444
461
  realised_pnl_update += self._update_realized_pnl_from_size_update(
445
462
  size_update, is_closing=self._is_update_closing(size_update),
446
- update_price=self.mark_price, trigger_source=trigger_source)
463
+ update_price=self.mark_price, trigger_source=trigger_source
464
+ )
447
465
  self._check_and_update_size(size_update)
448
466
  self._update_quantity()
449
467
  self._update_side(True)
@@ -510,7 +528,7 @@ class Position(util.Initializable):
510
528
 
511
529
  def _update_quantity(self):
512
530
  """
513
- Update position quantity from position quantity
531
+ Update position quantity from position size
514
532
  """
515
533
  self.quantity = self.size / self.symbol_contract.current_leverage
516
534
 
@@ -714,6 +732,7 @@ class Position(util.Initializable):
714
732
  if reset_entry_price:
715
733
  self._reset_entry_price()
716
734
  self.exit_price = constants.ZERO
735
+ self.already_reduced_size = constants.ZERO
717
736
  # use update_timestamp when available, use exchange time otherwise
718
737
  self.creation_time = creation_timestamp or self.exchange_manager.exchange.get_exchange_current_time()
719
738
  logging.get_logger(self.get_logger_name()).debug(f"Changed position side: now {self.side.name}")
@@ -323,10 +323,12 @@ async def test_get_futures_max_order_size(future_trader_simulator_with_default_l
323
323
  (l1_current_symbol_holding * default_contract.current_leverage).quantize(compare_accuracy)
324
324
  assert l2_market_quantity.quantize(compare_accuracy) == \
325
325
  (l1_market_quantity * default_contract.current_leverage).quantize(compare_accuracy)
326
- assert personal_data.get_futures_max_order_size(
326
+ full_buy_size, increasing = personal_data.get_futures_max_order_size(
327
327
  exchange_manager_inst, symbol, enums.TradeOrderSide.BUY,
328
328
  decimal.Decimal("37000"), False, l2_current_symbol_holding, l2_market_quantity
329
- ) == (decimal.Decimal('0.1346503937177512307045985802'), True)
329
+ )
330
+ assert (full_buy_size, increasing) == (decimal.Decimal('0.1346503937177512307045985802'), True)
331
+
330
332
  # reduce only (position is empty)
331
333
  assert personal_data.get_futures_max_order_size(
332
334
  exchange_manager_inst, symbol, enums.TradeOrderSide.BUY,
@@ -334,19 +336,22 @@ async def test_get_futures_max_order_size(future_trader_simulator_with_default_l
334
336
  ) == (constants.ZERO, False)
335
337
 
336
338
  # with short position
337
- assert personal_data.get_futures_max_order_size(
339
+ full_sell_size, increasing = personal_data.get_futures_max_order_size(
338
340
  exchange_manager_inst, symbol, enums.TradeOrderSide.SELL,
339
341
  decimal.Decimal("37000"), False, l2_current_symbol_holding, l2_market_quantity
340
- ) == (decimal.Decimal('0.1345431452958334678764786291'), True)
342
+ )
343
+ assert (full_sell_size, increasing) == (decimal.Decimal('0.1345431452958334678764786291'), True)
341
344
  # reduce only (position is empty)
342
345
  assert personal_data.get_futures_max_order_size(
343
346
  exchange_manager_inst, symbol, enums.TradeOrderSide.SELL,
344
347
  decimal.Decimal("37000"), True, l2_current_symbol_holding, l2_market_quantity
345
348
  ) == (constants.ZERO, False)
346
349
 
350
+ # LONG POSITION
347
351
  # reduce only (position is NOT empty)
348
352
  position = exchange_manager_inst.exchange_personal_data.positions_manager.get_symbol_positions(symbol)[0]
349
353
  await position.update(mark_price=decimal.Decimal(37000), update_margin=decimal.Decimal(4))
354
+ # position is now long
350
355
  position_size = position.size
351
356
  assert position_size == decimal.Decimal("0.0005405405405405405405405405405")
352
357
  assert personal_data.get_futures_max_order_size(
@@ -354,6 +359,43 @@ async def test_get_futures_max_order_size(future_trader_simulator_with_default_l
354
359
  decimal.Decimal("37000"), True, l2_current_symbol_holding, l2_market_quantity
355
360
  ) == (position_size, False)
356
361
 
362
+ # not reduce only and long position: can reverse position
363
+ position_size = position.size
364
+ assert position_size == decimal.Decimal("0.0005405405405405405405405405405") # still the same size
365
+ max_size, increasing = personal_data.get_futures_max_order_size(
366
+ exchange_manager_inst, symbol, enums.TradeOrderSide.SELL,
367
+ decimal.Decimal("37000"), False, l2_current_symbol_holding, l2_market_quantity
368
+ )
369
+ assert increasing is True
370
+ assert max_size > position_size
371
+ # higher than when just opening a position with full free funds
372
+ assert max_size > full_sell_size
373
+ assert max_size == decimal.Decimal("0.1352986545732659722297027996")
374
+
375
+ # SHORT POSITION
376
+ # reduce only (position is NOT empty)
377
+ await position.update(mark_price=decimal.Decimal(37000), update_margin=decimal.Decimal(-500))
378
+ # position is now short
379
+ position_size = position.size
380
+ assert position_size == decimal.Decimal("-0.06702702702702702702702702703")
381
+ assert personal_data.get_futures_max_order_size(
382
+ exchange_manager_inst, symbol, enums.TradeOrderSide.BUY,
383
+ decimal.Decimal("37000"), True, l2_current_symbol_holding, l2_market_quantity
384
+ ) == (-position_size, False)
385
+
386
+ # not reduce only and short position: can reverse position
387
+ position_size = position.size
388
+ assert position_size == decimal.Decimal("-0.06702702702702702702702702703") # still the same size
389
+ max_size, increasing = personal_data.get_futures_max_order_size(
390
+ exchange_manager_inst, symbol, enums.TradeOrderSide.BUY,
391
+ decimal.Decimal("37000"), False, l2_current_symbol_holding, l2_market_quantity
392
+ )
393
+ assert increasing is True
394
+ assert max_size > abs(position_size)
395
+ # higher than when just opening a position with full free funds
396
+ assert max_size > full_sell_size
397
+ assert max_size == decimal.Decimal("0.2149168523362071749168523362")
398
+
357
399
 
358
400
  @pytest.mark.asyncio
359
401
  async def test_create_as_chained_order_regular_order(trader_simulator):
@@ -622,6 +664,119 @@ def test_get_valid_split_orders():
622
664
  ) == ([decimal.Decimal('0.14985')], [decimal.Decimal('0.0006963')])
623
665
 
624
666
 
667
+ def test_get_valid_split_orders_with_amount_ratio_per_order():
668
+ # example SOL/BTC values from 12/09/2023
669
+ symbol_market = {
670
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS.value: {
671
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_AMOUNT.value: {
672
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_AMOUNT_MIN.value: 0.01,
673
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_AMOUNT_MAX.value: 90000000.0,
674
+ },
675
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_COST.value: {
676
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_COST_MIN.value: 0.0001,
677
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_COST_MAX.value: 9000000.0
678
+ },
679
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_PRICE.value: {
680
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_PRICE_MIN.value: 1e-07,
681
+ enums.ExchangeConstantsMarketStatusColumns.LIMITS_PRICE_MAX.value: 1000.0
682
+ },
683
+ },
684
+ enums.ExchangeConstantsMarketStatusColumns.PRECISION.value: {
685
+ enums.ExchangeConstantsMarketStatusColumns.PRECISION_PRICE.value: 7,
686
+ enums.ExchangeConstantsMarketStatusColumns.PRECISION_AMOUNT.value: 2
687
+ }
688
+ }
689
+
690
+ # all valid values
691
+ input_prices = [
692
+ decimal.Decimal("0.0006858"),
693
+ decimal.Decimal("0.0006908"),
694
+ decimal.Decimal("0.0006938"),
695
+ decimal.Decimal("0.0006958"),
696
+ ]
697
+ amount_ratio_per_order = [
698
+ decimal.Decimal("0.12"),
699
+ decimal.Decimal("0.24"),
700
+ decimal.Decimal("0.36"),
701
+ decimal.Decimal("0.28"),
702
+ ]
703
+ # invalid inputs
704
+ with pytest.raises(ValueError):
705
+ personal_data.get_valid_split_orders(
706
+ decimal.Decimal("2"),
707
+ input_prices,
708
+ symbol_market,
709
+ amount_ratio_per_order=[1, 2, 3] # not enough values
710
+ )
711
+ with pytest.raises(ValueError):
712
+ personal_data.get_valid_split_orders(
713
+ decimal.Decimal("2"),
714
+ [decimal.Decimal("0.5")],
715
+ symbol_market,
716
+ amount_ratio_per_order=[decimal.Decimal(0)] # 0 values
717
+ )
718
+ with pytest.raises(ValueError):
719
+ personal_data.get_valid_split_orders(
720
+ decimal.Decimal("2"),
721
+ [decimal.Decimal("0.5")],
722
+ symbol_market,
723
+ amount_ratio_per_order=[decimal.Decimal(-1.2)] # negative values
724
+ )
725
+
726
+ # valid inputs
727
+ volumes, prices = personal_data.get_valid_split_orders(
728
+ decimal.Decimal("2"),
729
+ input_prices,
730
+ symbol_market,
731
+ amount_ratio_per_order=amount_ratio_per_order
732
+ )
733
+ assert (volumes, prices) == (
734
+ [decimal.Decimal("2") * amount_ratio for amount_ratio in amount_ratio_per_order],
735
+ prices
736
+ )
737
+ assert sum(volumes) == decimal.Decimal("2")
738
+
739
+ # too small amount for cost: adapt to 2 orders
740
+ amount_ratio_per_order = [decimal.Decimal(33), decimal.Decimal(44), decimal.Decimal(55), decimal.Decimal(66)]
741
+ total_ratio = sum(amount_ratio_per_order[:2])
742
+ volumes, prices = personal_data.get_valid_split_orders(
743
+ decimal.Decimal("0.5"),
744
+ input_prices,
745
+ symbol_market,
746
+ amount_ratio_per_order=amount_ratio_per_order
747
+ )
748
+ assert (volumes, prices) == (
749
+ [decimal.Decimal("0.5") * amount_ratio/total_ratio for amount_ratio in amount_ratio_per_order[:2]],
750
+ prices
751
+ )
752
+ assert sum(volumes) == decimal.Decimal("0.5")
753
+
754
+ # too small amount for cost: adapt to 1 order
755
+ volumes, prices = personal_data.get_valid_split_orders(
756
+ decimal.Decimal("0.1"),
757
+ input_prices,
758
+ symbol_market,
759
+ amount_ratio_per_order=amount_ratio_per_order
760
+ )
761
+ assert (volumes, prices) == ([decimal.Decimal('0.1')], [decimal.Decimal('0.0006858')])
762
+
763
+ # too small amount for cost (because of the lowest price order amount that gets truncated because of
764
+ # exchange precision rules): adapt to 0 orders
765
+
766
+ input_prices = [
767
+ decimal.Decimal("0.0006963"),
768
+ decimal.Decimal("0.0006908"),
769
+ decimal.Decimal("0.0006938"),
770
+ decimal.Decimal("0.0006958"),
771
+ ]
772
+ assert personal_data.get_valid_split_orders(
773
+ decimal.Decimal("0.14985"),
774
+ input_prices,
775
+ symbol_market,
776
+ amount_ratio_per_order=amount_ratio_per_order
777
+ ) == ([decimal.Decimal('0.14985')], [decimal.Decimal('0.0006963')])
778
+
779
+
625
780
  def test_get_split_orders_count_and_increment():
626
781
  # example SOL/BTC values from 12/09/2023
627
782
  symbol_market = {
@@ -258,6 +258,21 @@ def test_resolve_sub_portfolios_with_filling_assets():
258
258
  )
259
259
 
260
260
 
261
+ def test_resolve_sub_portfolios_with_unexpected_deltas():
262
+ # more delta in post trade portfolio than actual orders => do not result in negative subportfolio
263
+ master_pf = _sub_pf(0, _content({"BTC": 0.05, "TRX": 0, "USDT": 200}))
264
+ sub_pft = _sub_pf(
265
+ 0,
266
+ _content({"BTC": 0.05, "TRX": 13.1, "USDT": 100}),
267
+ funds_deltas=_content({"BTC": -0.05, "TRX": -13.2, "USDT": 100}),
268
+ )
269
+
270
+ assert personal_data.resolve_sub_portfolios(master_pf, [sub_pft], [], [], {}) == (
271
+ _sub_pf(0, _content({"BTC": 0.05, "TRX": 0, "USDT": 0})),
272
+ [_sub_pf(0, _content({"BTC": 0, "TRX": 0, "USDT": 200}))]
273
+ )
274
+
275
+
261
276
  def test_get_portfolio_filled_orders_deltas():
262
277
  pre_trade_content = _content({"BTC": 0.1, "USDT": 1000})
263
278
  post_trade_content = _content({"BTC": 0.2, "USDT": 500})