OctoBot-Trading 2.4.57__tar.gz → 2.4.59__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 (471) hide show
  1. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/CHANGELOG.md +9 -0
  2. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/SOURCES.txt +1 -0
  4. {OctoBot-Trading-2.4.57/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.59}/PKG-INFO +2 -2
  5. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/README.md +1 -1
  6. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/__init__.py +1 -1
  7. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/symbol_data.py +3 -1
  8. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/constants.py +2 -0
  9. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/price_events_manager.py +6 -0
  10. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/modes_util.py +18 -8
  11. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order.py +15 -3
  12. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_util.py +40 -0
  13. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/limit_order.py +34 -3
  14. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +3 -0
  15. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +3 -0
  16. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +3 -0
  17. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +3 -0
  18. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/market_order.py +1 -3
  19. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/test_modes_util.py +48 -0
  20. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/__init__.py +10 -0
  21. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order.py +18 -4
  22. OctoBot-Trading-2.4.59/tests/personal_data/orders/types/limit/test_limit_order.py +118 -0
  23. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/LICENSE +0 -0
  24. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/MANIFEST.in +0 -0
  25. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  26. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  27. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/requires.txt +0 -0
  28. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  29. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/__init__.py +0 -0
  30. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/channels.py +0 -0
  31. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/contracts.py +0 -0
  32. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/exchange.py +0 -0
  33. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/modes.py +0 -0
  34. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/orders.py +0 -0
  35. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/portfolio.py +0 -0
  36. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/positions.py +0 -0
  37. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/profitability.py +0 -0
  38. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/storage.py +0 -0
  39. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/trader.py +0 -0
  40. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/trades.py +0 -0
  41. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/enums.py +0 -0
  42. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/errors.py +0 -0
  43. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_channel.py +0 -0
  44. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/__init__.py +0 -0
  45. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  46. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  47. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  48. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  49. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  50. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  51. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  52. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  53. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  54. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  55. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  56. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  57. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  58. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  60. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  61. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  62. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  63. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  64. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  65. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  66. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  68. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  69. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  70. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  71. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  72. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  74. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  75. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  76. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  77. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  78. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  79. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  80. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  81. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  82. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  83. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  84. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  85. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  86. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  87. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  88. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  89. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  90. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  91. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  92. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  93. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  94. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  95. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/__init__.py +0 -0
  96. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  97. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  98. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  99. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  100. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/config/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  102. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  103. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  104. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  105. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  106. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  107. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  108. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  109. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  110. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  111. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  112. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  113. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  114. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  115. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  116. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_builder.py +0 -0
  117. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_channels.py +0 -0
  118. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_details.py +0 -0
  119. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_factory.py +0 -0
  120. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_manager.py +0 -0
  121. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  122. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchanges.py +0 -0
  123. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  125. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  126. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  127. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/traders/__init__.py +0 -0
  128. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/traders/trader.py +0 -0
  129. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  130. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/types/__init__.py +0 -0
  131. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
  132. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  133. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  135. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  136. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  137. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  138. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/__init__.py +0 -0
  139. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  140. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/__init__.py +0 -0
  141. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  142. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  143. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/mode.py +0 -0
  144. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/mode_config.py +0 -0
  145. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/modes_factory.py +0 -0
  146. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  147. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  148. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
  149. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
  150. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  151. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  152. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  153. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  154. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  155. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  157. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  158. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  160. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/octobot_channel_consumer.py +0 -0
  161. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  163. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/__init__.py +0 -0
  164. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  165. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  166. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  167. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  168. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  169. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  170. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  171. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  172. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  173. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  174. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  175. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_group.py +0 -0
  176. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_state.py +0 -0
  177. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  178. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  179. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  180. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  183. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  185. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  186. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  187. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  188. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  189. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  192. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  193. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  194. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  196. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  197. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  198. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  199. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  200. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  201. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  202. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  203. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  204. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  205. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  207. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  208. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  209. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  211. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  212. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  213. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  214. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  215. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  216. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  217. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  218. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  219. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  220. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  221. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  222. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  223. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
  224. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  225. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/__init__.py +0 -0
  226. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  227. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  228. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  229. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  230. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position.py +0 -0
  231. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  232. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position_state.py +0 -0
  233. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position_util.py +0 -0
  234. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  235. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  236. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  237. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  238. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  239. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  240. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  241. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  242. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  243. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/state.py +0 -0
  244. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/__init__.py +0 -0
  245. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  246. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  247. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  248. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trade.py +0 -0
  249. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  250. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  251. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  252. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  253. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  254. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  255. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  256. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  257. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  258. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  259. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  260. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  261. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/__init__.py +0 -0
  263. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/__init__.py +0 -0
  264. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  265. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  266. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/signal_producer.py +0 -0
  267. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/signal_creation.py +0 -0
  268. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  269. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/util.py +0 -0
  270. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/__init__.py +0 -0
  271. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/abstract_storage.py +0 -0
  272. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/candles_storage.py +0 -0
  273. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/orders_storage.py +0 -0
  274. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/portfolio_storage.py +0 -0
  275. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/storage_manager.py +0 -0
  276. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/trades_storage.py +0 -0
  277. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/transactions_storage.py +0 -0
  278. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/util.py +0 -0
  279. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/supervisors/__init__.py +0 -0
  280. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  281. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  282. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/config_util.py +0 -0
  284. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/initializable.py +0 -0
  285. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/initialization_util.py +0 -0
  286. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/simulator_updater_utils.py +0 -0
  287. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/__init__.py +0 -0
  288. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  289. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  290. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  291. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  292. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/requirements.txt +0 -0
  293. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/setup.cfg +0 -0
  294. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/setup.py +0 -0
  295. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/__init__.py +0 -0
  296. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_channels.py +0 -0
  297. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_exchange.py +0 -0
  298. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_modes.py +0 -0
  299. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_orders.py +0 -0
  300. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_portfolio.py +0 -0
  301. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_profitability.py +0 -0
  302. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_symbol_data.py +0 -0
  303. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_trader.py +0 -0
  304. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_trades.py +0 -0
  305. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/cli/__init__.py +0 -0
  306. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/__init__.py +0 -0
  307. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/contracts/__init__.py +0 -0
  308. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  309. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  310. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/funding/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  312. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/kline/__init__.py +0 -0
  313. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  314. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ohlcv/__init__.py +0 -0
  315. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  316. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  317. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/order_book/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  319. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/prices/__init__.py +0 -0
  320. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  321. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  322. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/recent_trades/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  324. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  325. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ticker/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  327. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/__init__.py +0 -0
  328. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  330. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  331. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  332. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/implementations/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  334. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  335. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_abstract_exchange.py +0 -0
  336. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_builder.py +0 -0
  338. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_config_data.py +0 -0
  339. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_factory.py +0 -0
  340. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_manager.py +0 -0
  341. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_simulator.py +0 -0
  342. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchanges.py +0 -0
  343. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/traders/__init__.py +0 -0
  344. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/traders/test_trader.py +0 -0
  345. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/types/__init__.py +0 -0
  346. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  347. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/util/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  349. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/util/test_exchange_util.py +0 -0
  350. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/__init__.py +0 -0
  351. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/__init__.py +0 -0
  352. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
  354. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
  355. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  356. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  357. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/test_abstract_mode_consumer.py +0 -0
  358. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/test_abstract_trading_mode.py +0 -0
  359. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/__init__.py +0 -0
  360. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/__init__.py +0 -0
  361. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  362. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  363. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  364. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  366. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  367. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  368. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  369. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  371. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  374. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  375. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order_adapter.py +0 -0
  376. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order_factory.py +0 -0
  377. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order_util.py +0 -0
  378. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_orders_manager.py +0 -0
  379. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  380. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/__init__.py +0 -0
  381. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  382. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  383. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  384. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  385. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  386. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  387. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  388. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/market/__init__.py +0 -0
  389. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  390. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  391. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  392. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  393. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  394. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  395. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/__init__.py +0 -0
  396. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  397. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  398. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  399. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  400. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/history/__init__.py +0 -0
  401. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  402. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  403. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_asset.py +0 -0
  404. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio.py +0 -0
  405. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  406. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  407. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  408. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  409. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/__init__.py +0 -0
  410. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  411. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  412. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  413. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/__init__.py +0 -0
  414. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/channel/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/states/__init__.py +0 -0
  416. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/test_position.py +0 -0
  417. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/test_position_factory.py +0 -0
  418. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/test_positions_manager.py +0 -0
  419. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/types/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  421. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  422. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/__init__.py +0 -0
  423. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_factory.py +0 -0
  424. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_manager.py +0 -0
  425. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  426. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_util.py +0 -0
  427. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/transactions/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  429. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  430. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/signals/__init__.py +0 -0
  431. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  432. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/signals/test_util.py +0 -0
  433. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/test_utils/__init__.py +0 -0
  434. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/test_utils/order_util.py +0 -0
  435. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/test_utils/random_numbers.py +0 -0
  436. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/util/__init__.py +0 -0
  437. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/util/test_config_util.py +0 -0
  438. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/__init__.py +0 -0
  440. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  441. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  442. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  443. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_binance.py +0 -0
  444. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  445. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bingx.py +0 -0
  446. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  447. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitget.py +0 -0
  448. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  449. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitso.py +0 -0
  450. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  451. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bybit.py +0 -0
  452. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  453. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  454. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_coinex.py +0 -0
  455. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  456. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_gateio.py +0 -0
  457. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  458. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  459. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_htx.py +0 -0
  460. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_kraken.py +0 -0
  461. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  462. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  463. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_mexc.py +0 -0
  464. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_ndax.py +0 -0
  465. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  466. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_okx.py +0 -0
  467. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  468. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_phemex.py +0 -0
  469. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  470. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_upbit.py +0 -0
  471. {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,15 @@ 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.59] - 2024-03-11
8
+ ### Fixed
9
+ - [TradingModes] Fix convert_asset_to_target_asset to properly handle fees
10
+
11
+ ## [2.4.58] - 2024-03-07
12
+ ### Fixed
13
+ - [ChainedOrders] Outdated limit price
14
+ - [Backtesting] Invalid order fill price
15
+
7
16
  ## [2.4.57] - 2024-03-06
8
17
  ### Updated
9
18
  - [Exchange] log last request url on failed retry
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.57
3
+ Version: 2.4.59
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.57](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.59](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)
@@ -378,6 +378,7 @@ tests/personal_data/orders/types/__init__.py
378
378
  tests/personal_data/orders/types/test_unknown_order.py
379
379
  tests/personal_data/orders/types/limit/__init__.py
380
380
  tests/personal_data/orders/types/limit/test_buy_limit_order.py
381
+ tests/personal_data/orders/types/limit/test_limit_order.py
381
382
  tests/personal_data/orders/types/limit/test_sell_limit_order.py
382
383
  tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py
383
384
  tests/personal_data/orders/types/limit/test_stop_loss_order.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.57
3
+ Version: 2.4.59
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.57](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.59](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.57](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.59](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.57" # major.minor.revision
18
+ VERSION = "2.4.59" # major.minor.revision
@@ -13,6 +13,8 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
+ import decimal
17
+
16
18
  import octobot_commons.enums
17
19
 
18
20
  import octobot_trading.enums
@@ -105,7 +107,7 @@ def create_new_candles_manager(candles=None, max_candles_count=None) -> exchange
105
107
 
106
108
  def force_set_mark_price(exchange_manager, symbol, price):
107
109
  exchange_manager.exchange_symbols_data.get_exchange_symbol_data(symbol).prices_manager.\
108
- set_mark_price(price, octobot_trading.enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
110
+ set_mark_price(decimal.Decimal(str(price)), octobot_trading.enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
109
111
 
110
112
 
111
113
  def is_mark_price_initialized(exchange_manager, symbol: str) -> bool:
@@ -39,6 +39,8 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
39
39
 
40
40
  # Order creation
41
41
  ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
42
+ CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
43
+ CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
42
44
 
43
45
  # Tentacles
44
46
  TRADING_MODE_REQUIRED_STRATEGIES = "required_strategies"
@@ -49,6 +49,12 @@ class PriceEventsManager:
49
49
  self.clear_recent_prices()
50
50
  self.events.clear()
51
51
 
52
+ def get_min_and_max_prices(self) -> (float, float):
53
+ if len(self._last_recent_prices) < 2:
54
+ raise IndexError("Not enough data")
55
+ prices = sorted([element[self.PRICE_KEY] for element in self._last_recent_prices])
56
+ return prices[0], prices[-1]
57
+
52
58
  def handle_recent_trades(self, recent_trades):
53
59
  """
54
60
  Handle new recent trades prices
@@ -151,19 +151,29 @@ def _get_associated_symbol_and_order_type(trading_mode, asset: str, target_asset
151
151
 
152
152
 
153
153
  def _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount) -> decimal.Decimal:
154
+ side = (
155
+ trading_enums.TradeOrderSide.SELL
156
+ if order_type in (trading_enums.TraderOrderType.SELL_MARKET, trading_enums.TraderOrderType.SELL_LIMIT)
157
+ else trading_enums.TradeOrderSide.BUY
158
+ )
159
+
160
+ currency_available, market_available, market_quantity = trading_personal_data.get_portfolio_amounts(
161
+ trading_mode.exchange_manager, symbol, price, portfolio_type=common_constants.PORTFOLIO_AVAILABLE
162
+ )
154
163
  if asset_amount is None:
155
- currency_available, _, market_quantity = trading_personal_data.get_portfolio_amounts(
156
- trading_mode.exchange_manager, symbol, price, portfolio_type=common_constants.PORTFOLIO_AVAILABLE
157
- )
158
- quantity = currency_available if order_type is trading_enums.TraderOrderType.SELL_MARKET \
159
- else market_quantity
164
+ quantity = currency_available if side is trading_enums.TradeOrderSide.SELL else market_quantity
160
165
  else:
161
166
  try:
162
- quantity = asset_amount if order_type is trading_enums.TraderOrderType.SELL_MARKET \
163
- else (asset_amount / price)
167
+ quantity = asset_amount if side is trading_enums.TradeOrderSide.SELL else (asset_amount / price)
164
168
  except (decimal.DivisionByZero, decimal.InvalidOperation):
165
169
  quantity = constants.ZERO
166
- return quantity
170
+
171
+ adapted_quantity = trading_personal_data.decimal_adapt_order_quantity_because_fees(
172
+ trading_mode.exchange_manager, symbol, order_type, quantity, price,
173
+ trading_enums.ExchangeConstantsMarketPropertyColumns.TAKER, side,
174
+ currency_available if side is trading_enums.TradeOrderSide.SELL else market_available
175
+ )
176
+ return adapted_quantity
167
177
 
168
178
 
169
179
  async def notify_portfolio_optimization_complete():
@@ -484,12 +484,15 @@ class Order(util.Initializable):
484
484
  logger.debug(f"Updating chained order quantity with triggering order fees. {fees_str}")
485
485
  return True
486
486
 
487
+ async def update_price_if_outdated(self):
488
+ """
489
+ Implement if necessary
490
+ """
491
+
487
492
  async def _trigger_chained_orders(self):
488
493
  logger = logging.get_logger(self.get_logger_name())
489
494
  for index, order in enumerate(self.chained_orders):
490
- can_be_created = True
491
- if order.update_with_triggering_order_fees:
492
- can_be_created = order.update_quantity_with_order_fees(self)
495
+ can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
493
496
  if can_be_created and order.should_be_created():
494
497
  logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
495
498
  await order_util.create_as_chained_order(order)
@@ -721,6 +724,15 @@ class Order(util.Initializable):
721
724
  # quantity in USDT for BTC/USDT => cost = price(BTC in USDT)
722
725
  self.total_cost = quantity
723
726
 
727
+ def update_order_filled_values(self, ideal_price: decimal.Decimal):
728
+ if not self.filled_price:
729
+ # keep order.filled_price if already set (!= 0)
730
+ self.filled_price = order_util.get_valid_filled_price(self, ideal_price)
731
+ if not self.filled_quantity or self.exchange_manager.trader.simulate:
732
+ # keep self.filled_quantity if already set (!= 0) in real trading
733
+ self.filled_quantity = self.origin_quantity
734
+ self._update_total_cost()
735
+
724
736
  def consider_as_canceled(self):
725
737
  self.status = enums.OrderStatus.CANCELED
726
738
  if self.canceled_time == 0:
@@ -551,6 +551,46 @@ def generate_order_id():
551
551
  return str(uuid.uuid4())
552
552
 
553
553
 
554
+ def _get_possible_filled_price(
555
+ exchange_manager, symbol: str, side: enums.TradeOrderSide, ideal_price: decimal.Decimal
556
+ ) -> decimal.Decimal:
557
+ try:
558
+ min_price, max_price = exchange_manager.exchange_symbols_data.get_exchange_symbol_data(symbol).\
559
+ price_events_manager.get_min_and_max_prices()
560
+ if side is enums.TradeOrderSide.SELL:
561
+ if ideal_price < min_price:
562
+ return min_price
563
+ if side is enums.TradeOrderSide.BUY:
564
+ if ideal_price > max_price:
565
+ return max_price
566
+ except IndexError:
567
+ # no available price data
568
+ pass
569
+ return ideal_price
570
+
571
+
572
+ def get_valid_filled_price(order, ideal_price: decimal.Decimal):
573
+ # ensure filled price based on ideal_price makes sense according to the current candle
574
+ # instead of blindly using ideal_price as this could
575
+ # potentially buy higher than the candle high or sell lower than the candle low,
576
+ # which can't happen on real conditions
577
+
578
+ if order.exchange_manager.is_backtesting:
579
+ # in backtesting: ensure ideal_price is with in current candle price.
580
+ return _get_possible_filled_price(order.exchange_manager, order.symbol, order.side, ideal_price)
581
+ # not in backtesting: price desync can't happen
582
+ return ideal_price
583
+
584
+
585
+ async def adapt_chained_order_before_creation(base_order, chained_order):
586
+ can_be_created = True
587
+ if chained_order.update_with_triggering_order_fees:
588
+ can_be_created = chained_order.update_quantity_with_order_fees(base_order)
589
+ # ensure price is not outdated
590
+ await chained_order.update_price_if_outdated()
591
+ return can_be_created
592
+
593
+
554
594
  async def wait_for_order_fill(order, timeout, wait_for_portfolio_update):
555
595
  if order.is_open():
556
596
  if order.state is None:
@@ -18,6 +18,7 @@ import asyncio
18
18
  import octobot_trading.enums as enums
19
19
  import octobot_trading.constants as constants
20
20
  import octobot_trading.personal_data.orders.order as order_class
21
+ import octobot_trading.personal_data.orders.decimal_order_adapter as decimal_order_adapter
21
22
 
22
23
 
23
24
  class LimitOrder(order_class.Order):
@@ -36,6 +37,38 @@ class LimitOrder(order_class.Order):
36
37
  self.trigger_above = raw_order[enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value]
37
38
  return updated
38
39
 
40
+ async def update_price_if_outdated(self):
41
+ # price is outdated if it would trigger and instantly filled order with more than the allowed tolerance
42
+ try:
43
+ current_price = await self.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(self.symbol) \
44
+ .prices_manager.get_mark_price(timeout=constants.CHAINED_ORDER_PRICE_FETCHING_TIMEOUT)
45
+ self._update_limit_price_if_necessary(current_price)
46
+ except asyncio.TimeoutError:
47
+ # price can't be checked
48
+ return
49
+
50
+ def _update_limit_price_if_necessary(self, current_price):
51
+ updated_price = self.origin_price
52
+ if self.side is enums.TradeOrderSide.BUY:
53
+ highest_accepted_buy_price = (
54
+ current_price * (constants.ONE + constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE)
55
+ )
56
+ if self.origin_price > highest_accepted_buy_price:
57
+ # buy price is more than CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE % higher than the current price
58
+ # => Reduce it to the highest allowed price
59
+ updated_price = highest_accepted_buy_price
60
+ if self.side is enums.TradeOrderSide.SELL:
61
+ lowest_accepted_sell_price = (
62
+ current_price * (constants.ONE - constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE)
63
+ )
64
+ if self.origin_price < lowest_accepted_sell_price:
65
+ # sell price is more than CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE % lower than the current price
66
+ # => Increase it to the current price
67
+ updated_price = lowest_accepted_sell_price
68
+ if self.origin_price != updated_price:
69
+ symbol_market = self.exchange_manager.exchange.get_market_status(self.symbol, with_fixer=False)
70
+ self.origin_price = decimal_order_adapter.decimal_adapt_price(symbol_market, updated_price)
71
+
39
72
  async def update_order_status(self, force_refresh=False):
40
73
  if self.limit_price_hit_event is None:
41
74
  self._create_hit_event(self.creation_time)
@@ -87,9 +120,7 @@ class LimitOrder(order_class.Order):
87
120
 
88
121
  def on_fill_actions(self):
89
122
  self.taker_or_maker = self._filled_maker_or_taker()
90
- self.filled_price = self.origin_price
91
- self.filled_quantity = self.origin_quantity
92
- self._update_total_cost()
123
+ self.update_order_filled_values(self.origin_price)
93
124
  order_class.Order.on_fill_actions(self)
94
125
 
95
126
  def clear(self):
@@ -31,6 +31,9 @@ class StopLossLimitOrder(limit_order.LimitOrder):
31
31
  def is_counted_in_available_funds(self):
32
32
  return False
33
33
 
34
+ async def update_price_if_outdated(self):
35
+ pass
36
+
34
37
  async def on_filled(self, enable_associated_orders_creation):
35
38
  await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
36
39
  # TODO replace with chained order ?
@@ -25,6 +25,9 @@ class StopLossOrder(limit_order.LimitOrder):
25
25
  def is_counted_in_available_funds(self):
26
26
  return False
27
27
 
28
+ async def update_price_if_outdated(self):
29
+ pass
30
+
28
31
  def _filled_maker_or_taker(self):
29
32
  # Creates a market order when filled, which is taker
30
33
  return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
@@ -26,6 +26,9 @@ class TakeProfitLimitOrder(limit_order.LimitOrder):
26
26
  super().__init__(trader, side)
27
27
  self.limit_price = limit_price
28
28
 
29
+ async def update_price_if_outdated(self):
30
+ pass
31
+
29
32
  async def on_filled(self, enable_associated_orders_creation):
30
33
  await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
31
34
  # TODO replace with chained order ?
@@ -25,6 +25,9 @@ class TakeProfitOrder(limit_order.LimitOrder):
25
25
  def is_counted_in_available_funds(self):
26
26
  return False
27
27
 
28
+ async def update_price_if_outdated(self):
29
+ pass
30
+
28
31
  def _filled_maker_or_taker(self):
29
32
  # Creates a market order when filled, which is taker
30
33
  return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
@@ -30,9 +30,7 @@ class MarketOrder(order_class.Order):
30
30
  def on_fill_actions(self):
31
31
  self.taker_or_maker = enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
32
32
  self.origin_price = self.created_last_price
33
- self.filled_price = self.created_last_price
34
- self.filled_quantity = self.origin_quantity
35
- self._update_total_cost()
33
+ self.update_order_filled_values(self.created_last_price)
36
34
  order_class.Order.on_fill_actions(self)
37
35
 
38
36
  def can_be_edited(self):
@@ -195,6 +195,54 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
195
195
  trading_mode.create_order.assert_called_once()
196
196
  trading_mode.create_order.reset_mock()
197
197
 
198
+ orders = await modes_util.convert_asset_to_target_asset(
199
+ trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(1000)
200
+ )
201
+ assert len(orders) == 1
202
+ order = orders[0]
203
+ assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
204
+ assert order.symbol == "ETH/USDT"
205
+ assert order.origin_quantity == decimal.Decimal("0.66666666")
206
+ assert order.created_last_price == decimal.Decimal(1500)
207
+ trading_mode.create_order.assert_called_once()
208
+ trading_mode.create_order.reset_mock()
209
+
210
+ # with fees paid in quote
211
+ fees = {
212
+ trading_enums.FeePropertyColumns.COST.value: "2",
213
+ trading_enums.FeePropertyColumns.CURRENCY.value: "USDT",
214
+ }
215
+ with mock.patch.object(exchange_manager.exchange, "get_trade_fee", mock.Mock(return_value=fees)) \
216
+ as get_trade_fee_mock:
217
+ # cast 1: enough funds in pf to cover fees
218
+ orders = await modes_util.convert_asset_to_target_asset(
219
+ trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(450)
220
+ )
221
+ assert len(orders) == 1
222
+ order = orders[0]
223
+ assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
224
+ assert order.symbol == "ETH/USDT"
225
+ assert order.origin_quantity == decimal.Decimal("0.3")
226
+ assert order.created_last_price == decimal.Decimal(1500)
227
+ get_trade_fee_mock.assert_called_once()
228
+ get_trade_fee_mock.reset_mock()
229
+ trading_mode.create_order.assert_called_once()
230
+ trading_mode.create_order.reset_mock()
231
+
232
+ # cast 2: reduce amount to cover fees
233
+ orders = await modes_util.convert_asset_to_target_asset(
234
+ trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(1000)
235
+ )
236
+ assert len(orders) == 1
237
+ order = orders[0]
238
+ assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
239
+ assert order.symbol == "ETH/USDT"
240
+ assert order.origin_quantity == decimal.Decimal("0.66400000") # lower than 0.66666666 when fees is 0 USDT
241
+ assert order.created_last_price == decimal.Decimal(1500)
242
+ get_trade_fee_mock.assert_called_once()
243
+ trading_mode.create_order.assert_called_once()
244
+ trading_mode.create_order.reset_mock()
245
+
198
246
 
199
247
  def _get_trading_mode(exchange_manager):
200
248
  return mock.Mock(
@@ -45,6 +45,16 @@ def created_order(order_type, order_type_enum, *args, **kwargs):
45
45
  return order
46
46
 
47
47
 
48
+
49
+ @pytest.fixture()
50
+ def backtesting_buy_and_sell_limit_orders(event_loop, backtesting_trader):
51
+ _, _, trader_instance = backtesting_trader
52
+ return (
53
+ created_order(BuyLimitOrder, TraderOrderType.BUY_LIMIT, trader_instance),
54
+ created_order(SellLimitOrder, TraderOrderType.SELL_LIMIT, trader_instance)
55
+ )
56
+
57
+
48
58
  @pytest.fixture()
49
59
  def buy_limit_order(event_loop, simulated_trader):
50
60
  _, _, trader_instance = simulated_trader
@@ -303,10 +303,16 @@ async def test_trigger_chained_orders(trader_simulator):
303
303
  await base_order.on_filled(True)
304
304
 
305
305
  # with chained orders
306
- order_mock_1 = mock.Mock()
307
- order_mock_1.should_be_created = mock.Mock(return_value=True)
308
- order_mock_2 = mock.Mock()
309
- order_mock_2.should_be_created = mock.Mock(return_value=False)
306
+ order_mock_1 = mock.Mock(
307
+ update_price_if_outdated=mock.AsyncMock(),
308
+ update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
309
+ should_be_created=mock.Mock(return_value=True)
310
+ )
311
+ order_mock_2 = mock.Mock(
312
+ update_price_if_outdated=mock.AsyncMock(),
313
+ update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
314
+ should_be_created=mock.Mock(return_value=False)
315
+ )
310
316
  with mock.patch.object(order_util, "create_as_chained_order", mock.AsyncMock()) as create_as_chained_order_mock:
311
317
 
312
318
  base_order.add_chained_order(order_mock_1)
@@ -316,12 +322,20 @@ async def test_trigger_chained_orders(trader_simulator):
316
322
  await base_order.on_filled(False)
317
323
  order_mock_1.should_be_created.assert_not_called()
318
324
  order_mock_2.should_be_created.assert_not_called()
325
+ order_mock_1.update_price_if_outdated.assert_not_called()
326
+ order_mock_2.update_price_if_outdated.assert_not_called()
327
+ order_mock_1.update_quantity_with_order_fees.assert_not_called()
328
+ order_mock_2.update_quantity_with_order_fees.assert_not_called()
319
329
  create_as_chained_order_mock.assert_not_called()
320
330
 
321
331
  # triggers chained orders
322
332
  await base_order.on_filled(True)
323
333
  order_mock_1.should_be_created.assert_called_once()
324
334
  order_mock_2.should_be_created.assert_called_once()
335
+ order_mock_1.update_price_if_outdated.assert_called_once()
336
+ order_mock_2.update_price_if_outdated.assert_called_once()
337
+ order_mock_1.update_quantity_with_order_fees.assert_called_once()
338
+ order_mock_2.update_quantity_with_order_fees.assert_called_once()
325
339
  create_as_chained_order_mock.assert_called_once_with(order_mock_1)
326
340
 
327
341
 
@@ -0,0 +1,118 @@
1
+ # Drakkar-Software OctoBot-Trading
2
+ # Copyright (c) Drakkar-Software, All rights reserved.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 3.0 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library.
16
+ import decimal
17
+ import mock
18
+ import pytest
19
+
20
+ import octobot_trading.enums as enums
21
+
22
+ import octobot_trading.constants as trading_constants
23
+ import octobot_trading.personal_data as trading_personal_data
24
+ from tests.personal_data import DEFAULT_MARKET_QUANTITY, DEFAULT_ORDER_SYMBOL
25
+ from tests.test_utils.random_numbers import decimal_random_quantity
26
+
27
+ from tests import event_loop
28
+ from tests.exchanges import backtesting_trader, backtesting_config, backtesting_exchange_manager, fake_backtesting
29
+ from tests.personal_data.orders import backtesting_buy_and_sell_limit_orders
30
+
31
+ pytestmark = pytest.mark.asyncio
32
+
33
+
34
+ async def test_update_price_if_outdated(backtesting_buy_and_sell_limit_orders):
35
+ buy_limit_order, sell_limit_order = backtesting_buy_and_sell_limit_orders
36
+ buy_order_price = decimal.Decimal("100")
37
+ buy_limit_order.update(
38
+ price=buy_order_price,
39
+ quantity=decimal_random_quantity(max_value=DEFAULT_MARKET_QUANTITY / buy_order_price),
40
+ symbol=DEFAULT_ORDER_SYMBOL,
41
+ order_type=enums.TraderOrderType.BUY_LIMIT,
42
+ )
43
+ sell_order_price = decimal.Decimal("150")
44
+ sell_limit_order.update(
45
+ price=sell_order_price,
46
+ quantity=decimal_random_quantity(max_value=DEFAULT_MARKET_QUANTITY / sell_order_price),
47
+ symbol=DEFAULT_ORDER_SYMBOL,
48
+ order_type=enums.TraderOrderType.BUY_LIMIT,
49
+ )
50
+ origin_update_limit_price_if_necessary = buy_limit_order._update_limit_price_if_necessary
51
+ # buy side
52
+ with mock.patch.object(
53
+ buy_limit_order, "_update_limit_price_if_necessary",
54
+ mock.Mock(side_effect=origin_update_limit_price_if_necessary)
55
+ ) as _update_limit_price_if_necessary_mock:
56
+ # without price
57
+ await buy_limit_order.update_price_if_outdated()
58
+ _update_limit_price_if_necessary_mock.assert_not_called()
59
+
60
+ # with up-to-date price
61
+ buy_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(buy_limit_order.symbol).\
62
+ prices_manager.set_mark_price(decimal.Decimal("110"), enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
63
+ await buy_limit_order.update_price_if_outdated()
64
+ _update_limit_price_if_necessary_mock.assert_called_once()
65
+ assert buy_limit_order.origin_price is buy_order_price
66
+ _update_limit_price_if_necessary_mock.reset_mock()
67
+
68
+ # with outdated price
69
+ buy_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(buy_limit_order.symbol).\
70
+ prices_manager.set_mark_price(decimal.Decimal("90"), enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
71
+ await buy_limit_order.update_price_if_outdated()
72
+
73
+ _update_limit_price_if_necessary_mock.assert_called_once()
74
+ # price got adapted
75
+ assert buy_limit_order.origin_price < buy_order_price
76
+ assert buy_limit_order.origin_price == decimal.Decimal("90") * (
77
+ trading_constants.ONE + trading_constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE
78
+ )
79
+
80
+ sell_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(sell_limit_order.symbol). \
81
+ prices_manager._reset_prices()
82
+ origin_update_limit_price_if_necessary = sell_limit_order._update_limit_price_if_necessary
83
+ # sell side
84
+ with mock.patch.object(
85
+ sell_limit_order, "_update_limit_price_if_necessary",
86
+ mock.Mock(side_effect=origin_update_limit_price_if_necessary)
87
+ ) as _update_limit_price_if_necessary_mock:
88
+ # without price
89
+ await sell_limit_order.update_price_if_outdated()
90
+ _update_limit_price_if_necessary_mock.assert_not_called()
91
+
92
+ # with up-to-date price
93
+ sell_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(sell_limit_order.symbol).\
94
+ prices_manager.set_mark_price(decimal.Decimal("110"), enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
95
+ await sell_limit_order.update_price_if_outdated()
96
+ _update_limit_price_if_necessary_mock.assert_called_once()
97
+ assert sell_limit_order.origin_price is sell_order_price
98
+ _update_limit_price_if_necessary_mock.reset_mock()
99
+
100
+ # with outdated price
101
+ not_round_price = decimal.Decimal("155") + decimal.Decimal(1/3) # force not round number
102
+ sell_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(sell_limit_order.symbol).\
103
+ prices_manager.set_mark_price(not_round_price, enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
104
+ await sell_limit_order.update_price_if_outdated()
105
+
106
+ _update_limit_price_if_necessary_mock.assert_called_once()
107
+ # price got adapted
108
+ assert sell_limit_order.origin_price > sell_order_price
109
+ assert sell_limit_order.origin_price != not_round_price * (
110
+ trading_constants.ONE - trading_constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE
111
+ )
112
+ # ensure price decimals got adapted
113
+ assert sell_limit_order.origin_price == trading_personal_data.decimal_adapt_price(
114
+ sell_limit_order.exchange_manager.exchange.get_market_status(sell_limit_order.symbol, with_fixer=False),
115
+ not_round_price * (
116
+ trading_constants.ONE - trading_constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE
117
+ )
118
+ )