OctoBot-Trading 2.4.183__tar.gz → 2.4.184__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.
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/CHANGELOG.md +4 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.183/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.184}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/README.md +1 -1
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +2 -1
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/trader.py +28 -15
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/orders.py +1 -1
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/orders_updater.py +1 -1
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order.py +9 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_abstract_mode_consumer.py +149 -2
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/LICENSE +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/constants.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/errors.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/exchange_credentials_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/proxy_config.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/active_order_swap_strategy.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/stop_first_active_order_swap_strategy.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/active_order_swap_strategies/take_profit_first_active_order_swap_strategy.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/groups/trailing_on_filled_tp_balanced_order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/filled_take_profit_trailing_profile.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_price_step.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/trailing_profiles/trailing_profile_types.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/triggers/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/triggers/base_trigger.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/triggers/price_trigger.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/sub_portfolio_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/setup.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/test_active_order_swap_strategy.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/test_stop_first_active_order_swap_strategy.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/active_order_swap_strategies/test_take_profit_first_active_order_swap_strategy.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/groups/test_trailing_on_filled_tp_balanced_order_group.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/trailing_profiles/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/trailing_profiles/test_filled_take_profit_trailing_profile.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/trailing_profiles/test_trailing_profile_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/triggers/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/triggers/test_base_trigger.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/triggers/test_price_trigger.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_sub_portfolio_data.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitmart.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitmex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_hyperliquid.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,10 @@ 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.184] - 2025-06-04
|
8
|
+
### Fixed
|
9
|
+
[Order Cancel] fix deadlock
|
10
|
+
|
7
11
|
## [2.4.183] - 2025-06-01
|
8
12
|
### Fixed
|
9
13
|
[Exchanges] fix edit_order
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.184
|
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.
|
19
|
+
# OctoBot-Trading [2.4.184](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
|
20
20
|
[](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
|
[](https://pypi.python.org/pypi/OctoBot-Trading/)
|
22
22
|
[](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.
|
3
|
+
Version: 2.4.184
|
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.
|
19
|
+
# OctoBot-Trading [2.4.184](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
|
20
20
|
[](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
|
[](https://pypi.python.org/pypi/OctoBot-Trading/)
|
22
22
|
[](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# OctoBot-Trading [2.4.
|
1
|
+
# OctoBot-Trading [2.4.184](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
|
2
2
|
[](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
|
[](https://pypi.python.org/pypi/OctoBot-Trading/)
|
4
4
|
[](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
|
@@ -34,6 +34,7 @@ class RecentTradeUpdater(recent_trade_channel.RecentTradeProducer):
|
|
34
34
|
self.refresh_time = RecentTradeUpdater.RECENT_TRADE_REFRESH_TIME
|
35
35
|
|
36
36
|
async def init_recent_trades(self):
|
37
|
+
pair = None
|
37
38
|
try:
|
38
39
|
for pair in self.channel.exchange_manager.exchange_config.traded_symbol_pairs:
|
39
40
|
recent_trades = await self.channel.exchange_manager.exchange.\
|
@@ -45,7 +46,7 @@ class RecentTradeUpdater(recent_trade_channel.RecentTradeProducer):
|
|
45
46
|
self.logger.exception(
|
46
47
|
e,
|
47
48
|
True,
|
48
|
-
f"Fail to initialize recent trades : {html_util.get_html_summary_if_relevant(e)}"
|
49
|
+
f"Fail to initialize {pair} recent trades : {html_util.get_html_summary_if_relevant(e)}"
|
49
50
|
)
|
50
51
|
|
51
52
|
async def start(self):
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -465,6 +465,7 @@ class Trader(util.Initializable):
|
|
465
465
|
order.is_waiting_for_chained_trigger = False
|
466
466
|
return success
|
467
467
|
order_status = None
|
468
|
+
is_order_refreshing = False
|
468
469
|
# if real order: cancel on exchange
|
469
470
|
if not self.simulate and order.is_active and not order.is_self_managed():
|
470
471
|
try:
|
@@ -496,6 +497,7 @@ class Trader(util.Initializable):
|
|
496
497
|
except Exception as err:
|
497
498
|
self.logger.exception(err, True, f"Failed to cancel order {order}")
|
498
499
|
return False
|
500
|
+
is_order_refreshing = order.is_refreshing()
|
499
501
|
if order_status is enums.OrderStatus.CANCELED:
|
500
502
|
order.status = octobot_trading.enums.OrderStatus.CANCELED
|
501
503
|
self.logger.debug(f"Successfully cancelled order {order}")
|
@@ -505,11 +507,14 @@ class Trader(util.Initializable):
|
|
505
507
|
else:
|
506
508
|
order.status = octobot_trading.enums.OrderStatus.CANCELED
|
507
509
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
510
|
+
if not is_order_refreshing:
|
511
|
+
# don't override state if order is already refreshing (most likely from open orders updater)
|
512
|
+
await order.on_cancel(force_cancel=order.status is octobot_trading.enums.OrderStatus.CANCELED,
|
513
|
+
is_from_exchange_data=False,
|
514
|
+
ignored_order=ignored_order)
|
515
|
+
if wait_for_cancelling and (order.is_refreshing() or order.is_pending()):
|
516
|
+
# Don't wait for new state to avoid potential deadlock. Will raise if cancel is not in process
|
517
|
+
self._ensure_probably_canceled_order(order, None)
|
513
518
|
return True
|
514
519
|
|
515
520
|
async def _handle_order_cancel_error(self, order, err, wait_for_cancelling, cancelling_timeout):
|
@@ -531,10 +536,7 @@ class Trader(util.Initializable):
|
|
531
536
|
# can't wait for the order state to fully refresh as it will require a portfolio lock which might
|
532
537
|
# be locked by this ask already (and create a deadlock)
|
533
538
|
# => be optimistic and consider refreshing state as end state
|
534
|
-
if
|
535
|
-
raise errors.FilledOrderError(f"Order is filled, it can't be cancelled. Order: {order}") from err
|
536
|
-
if order.is_refreshing_canceling_state():
|
537
|
-
self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
|
539
|
+
if self._ensure_probably_canceled_order(order, err):
|
538
540
|
return True
|
539
541
|
else:
|
540
542
|
# trigger forced refresh to get an update of the order
|
@@ -542,17 +544,14 @@ class Trader(util.Initializable):
|
|
542
544
|
await order.state.synchronize(force_synchronization=True)
|
543
545
|
if previous_status != order.status:
|
544
546
|
# don't wait for new state to avoid potential deadlock
|
545
|
-
if
|
546
|
-
raise errors.FilledOrderError(f"Order is filled, it can't be cancelled. Order: {order}") from err
|
547
|
-
if order.is_refreshing_canceling_state():
|
548
|
-
self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
|
547
|
+
if self._ensure_probably_canceled_order(order, err):
|
549
548
|
return True
|
550
549
|
if order.is_cancelled():
|
551
550
|
self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
|
552
551
|
return True
|
553
552
|
if order.is_cancelling():
|
554
|
-
|
555
|
-
|
553
|
+
# don't wait for new state to avoid potential deadlock, just check that order is not filling
|
554
|
+
self._ensure_probably_canceled_order(order, err)
|
556
555
|
return True
|
557
556
|
elif order.is_open():
|
558
557
|
if isinstance(err, errors.OrderNotFoundOnCancelError):
|
@@ -574,6 +573,20 @@ class Trader(util.Initializable):
|
|
574
573
|
f"Can't cancel order and unknown post sync order state for order: {order}."
|
575
574
|
) from err
|
576
575
|
|
576
|
+
def _ensure_probably_canceled_order(self, order, err: typing.Optional[Exception]) -> bool:
|
577
|
+
if order.is_refreshing_filling_state():
|
578
|
+
filled_err = errors.FilledOrderError(f"Order is filled, it can't be cancelled. Order: {order}")
|
579
|
+
if err is None:
|
580
|
+
raise filled_err
|
581
|
+
raise filled_err from err
|
582
|
+
if order.is_refreshing_canceling_state():
|
583
|
+
self.logger.debug(f"Tried to cancel an already cancelled order. Order: {order}")
|
584
|
+
return True
|
585
|
+
if order.is_pending_cancel_state():
|
586
|
+
self.logger.debug(f"Tried to cancel a pending cancel order. Order: {order}")
|
587
|
+
return True
|
588
|
+
return False
|
589
|
+
|
577
590
|
async def cancel_all_orders(
|
578
591
|
self,
|
579
592
|
symbol: str,
|
@@ -29,7 +29,7 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
|
|
29
29
|
|
30
30
|
async def perform(self, orders, is_from_bot=False, are_closed=False):
|
31
31
|
try:
|
32
|
-
self.logger.debug(f"Received order update for {len(orders)}
|
32
|
+
self.logger.debug(f"Received order update for {len(orders)}{' closed' if are_closed else ''} orders.")
|
33
33
|
has_new_order = False
|
34
34
|
waiting_complete_init_orders = []
|
35
35
|
symbols = set()
|
@@ -200,10 +200,10 @@ class OrdersUpdater(orders_channel.OrdersProducer):
|
|
200
200
|
|
201
201
|
if raw_order is not None:
|
202
202
|
self.logger.info(f"Received update for {order} on {exchange_name}: {raw_order}")
|
203
|
-
|
204
203
|
await self.channel.exchange_manager.exchange_personal_data.handle_order_update_from_raw(
|
205
204
|
order.exchange_order_id, raw_order, should_notify=should_notify
|
206
205
|
)
|
206
|
+
self.logger.info(f"Completed update for {order} on {exchange_name}")
|
207
207
|
else:
|
208
208
|
self.logger.info(f"Can't received update for {order} on {exchange_name}: received order is None")
|
209
209
|
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -405,15 +405,24 @@ class Order(util.Initializable):
|
|
405
405
|
def is_refreshing(self) -> bool:
|
406
406
|
return self.state is not None and self.state.is_refreshing()
|
407
407
|
|
408
|
+
def is_pending(self) -> bool:
|
409
|
+
return self.state is not None and self.state.is_pending()
|
410
|
+
|
408
411
|
def is_refreshing_filling_state(self) -> bool:
|
409
412
|
return self._is_refreshing_state(orders_states.FillOrderState)
|
410
413
|
|
411
414
|
def is_refreshing_canceling_state(self) -> bool:
|
412
415
|
return self._is_refreshing_state(orders_states.CancelOrderState)
|
413
416
|
|
417
|
+
def is_pending_cancel_state(self) -> bool:
|
418
|
+
return self._is_pending_state(orders_states.CancelOrderState)
|
419
|
+
|
414
420
|
def _is_refreshing_state(self, state_type) -> bool:
|
415
421
|
return self.is_refreshing() and isinstance(self.state, state_type)
|
416
422
|
|
423
|
+
def _is_pending_state(self, state_type) -> bool:
|
424
|
+
return self.is_pending() and isinstance(self.state, state_type)
|
425
|
+
|
417
426
|
def can_be_edited(self) -> bool:
|
418
427
|
# orders that are not yet open or already open can be edited
|
419
428
|
return self.state is None or (self.state.is_open() and not self.is_refreshing())
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/tests/modes/test_abstract_mode_consumer.py
RENAMED
@@ -316,7 +316,6 @@ async def test_create_order_if_possible_ensure_no_deadlock_when_canceling_orders
|
|
316
316
|
|
317
317
|
_origin_handle_portfolio_and_position_update_from_order_calls = []
|
318
318
|
_synchronize_with_exchange_calls = []
|
319
|
-
origin_handle_portfolio_and_position_update_from_order = exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order
|
320
319
|
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
321
320
|
with mock.patch.object(
|
322
321
|
consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
|
@@ -393,7 +392,6 @@ async def test_create_order_if_possible_ensure_no_deadlock_when_canceling_orders
|
|
393
392
|
|
394
393
|
_origin_handle_portfolio_and_position_update_from_order_calls = []
|
395
394
|
_synchronize_with_exchange_calls = []
|
396
|
-
origin_handle_portfolio_and_position_update_from_order = exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order
|
397
395
|
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
398
396
|
with mock.patch.object(
|
399
397
|
consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
|
@@ -421,6 +419,155 @@ async def test_create_order_if_possible_ensure_no_deadlock_when_canceling_orders
|
|
421
419
|
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [] # order no more open
|
422
420
|
|
423
421
|
|
422
|
+
# 5. no concurrent task: open_order ends up in PENDING_CANCEL state after exchange.cancel() call
|
423
|
+
# order.on_cancel() and don't dead lock in cancelled order state
|
424
|
+
# => create_order_if_possible (which has portfolio lock) will not wait for cancel order state terminate
|
425
|
+
open_order = await _create_initialized_open_order(exchange_manager, symbol)
|
426
|
+
open_order.simulated = False # force real order simulation
|
427
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
428
|
+
completed_tasks.clear()
|
429
|
+
|
430
|
+
async def _synchronize_with_exchange(*_, **__):
|
431
|
+
# will not set order in final state => don't do anything, order stays pending
|
432
|
+
_synchronize_with_exchange_calls.append(1)
|
433
|
+
_synchronize_with_exchange_calls.append(1)
|
434
|
+
|
435
|
+
async def _create_new_orders(*_, **__):
|
436
|
+
# for now order is open
|
437
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
438
|
+
assert open_order.status == octobot_trading.enums.OrderStatus.OPEN
|
439
|
+
assert isinstance(open_order.state, personal_data.OpenOrderState)
|
440
|
+
# order cancel will end up in PENDING_CANCEL
|
441
|
+
await consumer.trading_mode.cancel_order(open_order, wait_for_cancelling=True) is True
|
442
|
+
# order now in pending cancel state
|
443
|
+
assert isinstance(open_order.state, personal_data.CancelOrderState)
|
444
|
+
assert open_order.is_pending_cancel_state() is True
|
445
|
+
for _ in range(10):
|
446
|
+
# wait a few cycles to make sure handle_portfolio_and_position_update_from_order_calls
|
447
|
+
# really don't get called (locked by consumer lock
|
448
|
+
await asyncio_tools.wait_asyncio_next_cycle()
|
449
|
+
# _synchronize_with_exchange_calls started and completed
|
450
|
+
assert _synchronize_with_exchange_calls == [1, 1]
|
451
|
+
|
452
|
+
async def _on_cancel(*args, **kwargs):
|
453
|
+
await origin_on_cancel(*args, **kwargs)
|
454
|
+
|
455
|
+
|
456
|
+
_synchronize_with_exchange_calls = []
|
457
|
+
_origin_handle_portfolio_and_position_update_from_order_calls = []
|
458
|
+
origin_on_cancel = open_order.on_cancel
|
459
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
460
|
+
with mock.patch.object(
|
461
|
+
consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
|
462
|
+
) as _create_new_orders_mock, mock.patch.object(
|
463
|
+
open_order, "on_cancel", mock.AsyncMock(side_effect=_on_cancel)
|
464
|
+
) as _on_cancel_mock, \
|
465
|
+
mock.patch.object(
|
466
|
+
exchange_manager.exchange_personal_data, "handle_portfolio_and_position_update_from_order", mock.AsyncMock()
|
467
|
+
) as handle_portfolio_and_position_update_from_order_mock, \
|
468
|
+
mock.patch.object(
|
469
|
+
personal_data.CancelOrderState, "_synchronize_with_exchange", mock.AsyncMock(side_effect=_synchronize_with_exchange)
|
470
|
+
) as _synchronize_with_exchange_mock, \
|
471
|
+
mock.patch.object(
|
472
|
+
exchange_manager.exchange, "cancel_order", mock.AsyncMock(return_value=octobot_trading.enums.OrderStatus.PENDING_CANCEL)
|
473
|
+
) as cancel_order_mock:
|
474
|
+
# doesn't create a concurrent cancel order task let, it will be created from then on_cancel() call
|
475
|
+
await asyncio.gather(_create_order_if_possible_task(), _timeout_task(timeout))
|
476
|
+
_create_new_orders_mock.assert_called_once_with(symbol, -1, octobot_trading.enums.EvaluatorStates.VERY_LONG.value)
|
477
|
+
cancel_order_mock.assert_called_once()
|
478
|
+
_on_cancel_mock.assert_called_once()
|
479
|
+
handle_portfolio_and_position_update_from_order_mock.assert_not_called() # call has been skipped for the test
|
480
|
+
_synchronize_with_exchange_mock.assert_called_once()
|
481
|
+
# ensure no error was raised
|
482
|
+
assert symbol not in consumer.previous_call_error_per_symbol
|
483
|
+
consumer.previous_call_error_per_symbol.clear()
|
484
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [] # order no more open
|
485
|
+
|
486
|
+
|
487
|
+
# 6. concurrent task: open_order ends up in PENDING_CANCEL state after exchange.cancel() call
|
488
|
+
# because order is already refreshing (ex: from open orders updater)
|
489
|
+
# => create_order_if_possible (which has portfolio lock) will not wait for cancel order state terminate
|
490
|
+
open_order = await _create_initialized_open_order(exchange_manager, symbol)
|
491
|
+
open_order.simulated = False # force real order simulation
|
492
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
493
|
+
completed_tasks.clear()
|
494
|
+
|
495
|
+
async def _synchronize_with_exchange(*_, **__):
|
496
|
+
# will not set order in final state => don't do anything, order stays pending
|
497
|
+
_synchronize_with_exchange_calls.append(1)
|
498
|
+
for _ in range(10):
|
499
|
+
# wait a few cycles to let _cancel_order trading_mode.cancel_order
|
500
|
+
await asyncio_tools.wait_asyncio_next_cycle()
|
501
|
+
_synchronize_with_exchange_calls.append(1)
|
502
|
+
|
503
|
+
async def _create_new_orders(*_, **__):
|
504
|
+
assert _origin_handle_portfolio_and_position_update_from_order_calls == []
|
505
|
+
# for now order is open
|
506
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
507
|
+
assert open_order.status == octobot_trading.enums.OrderStatus.OPEN
|
508
|
+
assert isinstance(open_order.state, personal_data.OpenOrderState)
|
509
|
+
# order cancel will end up in PENDING_CANCEL
|
510
|
+
await consumer.trading_mode.cancel_order(open_order, wait_for_cancelling=True) is True
|
511
|
+
# _synchronize_with_exchange_calls is still waiting
|
512
|
+
assert _synchronize_with_exchange_calls == [1]
|
513
|
+
assert open_order.is_refreshing() is True
|
514
|
+
# order now in pending cancel state
|
515
|
+
assert isinstance(open_order.state, personal_data.CancelOrderState)
|
516
|
+
assert open_order.is_refreshing_canceling_state() is True
|
517
|
+
for _ in range(10):
|
518
|
+
# wait a few cycles to make sure _origin_handle_portfolio_and_position_update_from_order_calls
|
519
|
+
# really don't get called (locked by consumer lock
|
520
|
+
await asyncio_tools.wait_asyncio_next_cycle()
|
521
|
+
# _delayed_handle_portfolio_and_position_update_from_order is waiting for consumer to release lock
|
522
|
+
assert _origin_handle_portfolio_and_position_update_from_order_calls == []
|
523
|
+
# _synchronize_with_exchange_calls is now completed
|
524
|
+
assert _synchronize_with_exchange_calls == [1, 1]
|
525
|
+
|
526
|
+
async def _on_cancel(*args, **kwargs):
|
527
|
+
await origin_on_cancel(*args, **kwargs)
|
528
|
+
|
529
|
+
async def _cancel_order(*args, **kwargs):
|
530
|
+
# simulate an on_cancel call from somewhere else => triggers a canceling state
|
531
|
+
open_order.status = octobot_trading.enums.OrderStatus.PENDING_CANCEL
|
532
|
+
asyncio.create_task(open_order.on_cancel()) # will leave order in refreshing
|
533
|
+
await asyncio_tools.wait_asyncio_next_cycle() # let task run once (trigger refreshing state)
|
534
|
+
return octobot_trading.enums.OrderStatus.PENDING_CANCEL
|
535
|
+
|
536
|
+
_origin_handle_portfolio_and_position_update_from_order_calls = []
|
537
|
+
_synchronize_with_exchange_calls = []
|
538
|
+
origin_on_cancel = open_order.on_cancel
|
539
|
+
origin_ensure_probably_canceled_order = exchange_manager.trader._ensure_probably_canceled_order
|
540
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [open_order]
|
541
|
+
with mock.patch.object(
|
542
|
+
consumer, "create_new_orders", mock.AsyncMock(side_effect=_create_new_orders)
|
543
|
+
) as _create_new_orders_mock, mock.patch.object(
|
544
|
+
open_order, "on_cancel", mock.AsyncMock(side_effect=_on_cancel)
|
545
|
+
) as _on_cancel_mock, \
|
546
|
+
mock.patch.object(
|
547
|
+
exchange_manager.exchange_personal_data, "handle_portfolio_and_position_update_from_order", mock.AsyncMock()
|
548
|
+
) as handle_portfolio_and_position_update_from_order_mock, \
|
549
|
+
mock.patch.object(
|
550
|
+
personal_data.CancelOrderState, "_synchronize_with_exchange", mock.AsyncMock(side_effect=_synchronize_with_exchange)
|
551
|
+
) as _synchronize_with_exchange_mock, \
|
552
|
+
mock.patch.object(
|
553
|
+
exchange_manager.exchange, "cancel_order", mock.AsyncMock(side_effect=_cancel_order)
|
554
|
+
) as cancel_order_mock, \
|
555
|
+
mock.patch.object(
|
556
|
+
exchange_manager.trader, "_ensure_probably_canceled_order", mock.AsyncMock(side_effect=origin_ensure_probably_canceled_order)
|
557
|
+
) as _ensure_probably_canceled_order_mock:
|
558
|
+
# doesn't create a concurrent cancel order task let, it will be created from then on_cancel() call
|
559
|
+
await asyncio.gather(_create_order_if_possible_task(), _timeout_task(timeout))
|
560
|
+
_create_new_orders_mock.assert_called_once_with(symbol, -1, octobot_trading.enums.EvaluatorStates.VERY_LONG.value)
|
561
|
+
cancel_order_mock.assert_called_once()
|
562
|
+
_on_cancel_mock.assert_called_once()
|
563
|
+
handle_portfolio_and_position_update_from_order_mock.assert_not_called() # call has been skipped for the test
|
564
|
+
_synchronize_with_exchange_mock.assert_called_once()
|
565
|
+
_ensure_probably_canceled_order_mock.assert_called_once()
|
566
|
+
# ensure no error was raised
|
567
|
+
assert symbol not in consumer.previous_call_error_per_symbol
|
568
|
+
consumer.previous_call_error_per_symbol.clear()
|
569
|
+
assert exchange_manager.exchange_personal_data.orders_manager.get_open_orders() == [] # order no more open
|
570
|
+
|
424
571
|
|
425
572
|
async def _create_initialized_open_order(exchange_manager, symbol):
|
426
573
|
open_order = personal_data.BuyLimitOrder(exchange_manager.trader)
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/OctoBot_Trading.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/kline/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ohlcv/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/prices/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchange_data/ticker/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/abstract_exchange.py
RENAMED
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/adapters/__init__.py
RENAMED
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.183 → OctoBot-Trading-2.4.184}/octobot_trading/exchanges/config/proxy_config.py
RENAMED
File without changes
|