OctoBot-Trading 2.4.142__tar.gz → 2.4.143__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.142 → OctoBot-Trading-2.4.143}/CHANGELOG.md +4 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.142/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.143}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/README.md +1 -1
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/enums.py +1 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/errors.py +7 -1
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +12 -1
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/trader.py +13 -5
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/rest_exchange.py +7 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order.py +9 -2
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_factory.py +4 -1
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -8
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/util.py +1 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/exchanges_test_tools.py +70 -30
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/traders/test_trader.py +68 -1
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_factory.py +50 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/signals/test_trading_signal_bundle_builder.py +5 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/signals/test_util.py +46 -2
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/LICENSE +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/constants.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/config/proxy_config.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/setup.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitmart.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitmex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/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.143] - 2025-01-08
|
8
|
+
### Fixed
|
9
|
+
[Orders] properly handle trigger above
|
10
|
+
|
7
11
|
## [2.4.142] - 2025-01-07
|
8
12
|
### Fixed
|
9
13
|
[Order] fix _create_triggered_chained_order
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.143
|
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.143](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.143
|
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.143](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.143](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)
|
@@ -536,6 +536,7 @@ class TradingSignalOrdersAttrs(enum.Enum):
|
|
536
536
|
EXCHANGE = "exchange"
|
537
537
|
EXCHANGE_TYPE = "exchange_type"
|
538
538
|
TYPE = "type"
|
539
|
+
TRIGGER_ABOVE = "trigger_above"
|
539
540
|
QUANTITY = "quantity"
|
540
541
|
TARGET_AMOUNT = "target_amount"
|
541
542
|
TARGET_POSITION = "target_position"
|
@@ -57,7 +57,13 @@ class OrderCancelError(OctoBotExchangeError):
|
|
57
57
|
"""
|
58
58
|
|
59
59
|
|
60
|
-
class
|
60
|
+
class ExchangeOrderCancelError(OrderCancelError):
|
61
|
+
"""
|
62
|
+
Raised when an exchange failed to execute the given request because the associated order can't be cancelled
|
63
|
+
"""
|
64
|
+
|
65
|
+
|
66
|
+
class OrderNotFoundOnCancelError(ExchangeOrderCancelError):
|
61
67
|
"""
|
62
68
|
Raised upon a failed order cancel because order is not found
|
63
69
|
"""
|
@@ -672,7 +672,18 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
672
672
|
) -> enums.OrderStatus:
|
673
673
|
try:
|
674
674
|
with self.error_describer():
|
675
|
-
|
675
|
+
try:
|
676
|
+
await self.client.cancel_order(exchange_order_id, symbol=symbol, params=kwargs)
|
677
|
+
except Exception as err:
|
678
|
+
if self.exchange_manager.exchange.is_exchange_order_uncancellable(err):
|
679
|
+
# handle ExchangeOrderCancelError locally not to raise it from other contexts
|
680
|
+
# (such as if used in error_describer)
|
681
|
+
raise octobot_trading.errors.ExchangeOrderCancelError(
|
682
|
+
f"Error when handling order {html_util.get_html_summary_if_relevant(err)}. "
|
683
|
+
f"Exchange is refusing to cancel this order. The order is probably filled "
|
684
|
+
f"or cancelled already."
|
685
|
+
) from err
|
686
|
+
raise
|
676
687
|
# no exception, cancel worked
|
677
688
|
try:
|
678
689
|
# make sure order is canceled
|
{OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -389,6 +389,7 @@ class Trader(util.Initializable):
|
|
389
389
|
# order will just never get created
|
390
390
|
order.is_waiting_for_chained_trigger = False
|
391
391
|
return success
|
392
|
+
order_status = None
|
392
393
|
# if real order: cancel on exchange
|
393
394
|
if not self.simulate and not order.is_self_managed():
|
394
395
|
try:
|
@@ -408,8 +409,15 @@ class Trader(util.Initializable):
|
|
408
409
|
order.exchange_order_id, order.symbol, order.order_type
|
409
410
|
)
|
410
411
|
except errors.OrderCancelError as err:
|
411
|
-
if
|
412
|
-
|
412
|
+
if self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization:
|
413
|
+
if await self._handle_order_cancel_error(order, err, wait_for_cancelling, cancelling_timeout):
|
414
|
+
return True
|
415
|
+
else:
|
416
|
+
self.logger.warning(
|
417
|
+
f"Impossible to cancel order ({err} {err.__class__.__name__}). "
|
418
|
+
f"Considering order as cancelled {order}"
|
419
|
+
)
|
420
|
+
order_status = enums.OrderStatus.CANCELED
|
413
421
|
except Exception as err:
|
414
422
|
self.logger.exception(err, True, f"Failed to cancel order {order}")
|
415
423
|
return False
|
@@ -602,9 +610,9 @@ class Trader(util.Initializable):
|
|
602
610
|
return all_cancelled, cancelled_orders
|
603
611
|
|
604
612
|
async def cancel_all_open_orders_with_currency(
|
605
|
-
|
606
|
-
|
607
|
-
|
613
|
+
self, currency, emit_trading_signals=False,
|
614
|
+
wait_for_cancelling=True,
|
615
|
+
cancelling_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
|
608
616
|
) -> bool:
|
609
617
|
"""
|
610
618
|
Should be called only if the goal is to cancel all open orders for each traded symbol containing the
|
{OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -125,6 +125,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
125
125
|
EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
|
126
126
|
# text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
|
127
127
|
EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
|
128
|
+
# text content of errors due to an order that can't be cancelled on exchange (because filled or already cancelled)
|
129
|
+
EXCHANGE_ORDER_UNCANCELLABLE_ERRORS: typing.List[typing.Iterable[str]] = []
|
128
130
|
|
129
131
|
DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
|
130
132
|
|
@@ -1018,6 +1020,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
1018
1020
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS)
|
1019
1021
|
return False
|
1020
1022
|
|
1023
|
+
def is_exchange_order_uncancellable(self, error: BaseException) -> bool:
|
1024
|
+
if self.EXCHANGE_ORDER_UNCANCELLABLE_ERRORS:
|
1025
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_UNCANCELLABLE_ERRORS)
|
1026
|
+
return False
|
1027
|
+
|
1021
1028
|
def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
|
1022
1029
|
if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
|
1023
1030
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
|
{OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -59,6 +59,7 @@ class Order(util.Initializable):
|
|
59
59
|
self.taker_or_maker = None
|
60
60
|
self.timestamp = 0
|
61
61
|
self.side = side
|
62
|
+
self.trigger_above = None
|
62
63
|
self.tag = None
|
63
64
|
self.associated_entry_ids = None
|
64
65
|
self.broker_applied = False
|
@@ -138,7 +139,7 @@ class Order(util.Initializable):
|
|
138
139
|
fee=None, total_cost=constants.ZERO, timestamp=None,
|
139
140
|
order_type=None, reduce_only=None, close_position=None, position_side=None, fees_currency_side=None,
|
140
141
|
group=None, tag=None, quantity_currency=None, exchange_creation_params=None,
|
141
|
-
associated_entry_id=None) -> bool:
|
142
|
+
associated_entry_id=None, trigger_above=None) -> bool:
|
142
143
|
changed: bool = False
|
143
144
|
should_update_total_cost = False
|
144
145
|
|
@@ -275,6 +276,10 @@ class Order(util.Initializable):
|
|
275
276
|
if associated_entry_id is not None:
|
276
277
|
self.associate_to_entry(associated_entry_id)
|
277
278
|
|
279
|
+
if trigger_above is not None and self.trigger_above != trigger_above:
|
280
|
+
changed = True
|
281
|
+
self.trigger_above = trigger_above
|
282
|
+
|
278
283
|
if should_update_total_cost and not total_cost:
|
279
284
|
self._update_total_cost()
|
280
285
|
|
@@ -725,7 +730,8 @@ class Order(util.Initializable):
|
|
725
730
|
total_cost=decimal.Decimal(str(raw_order.get(enums.ExchangeConstantsOrderColumns.COST.value, 0.0) or 0.0)),
|
726
731
|
fee=order_util.parse_raw_fees(raw_order.get(enums.ExchangeConstantsOrderColumns.FEE.value, None)),
|
727
732
|
timestamp=raw_order.get(enums.ExchangeConstantsOrderColumns.TIMESTAMP.value, None),
|
728
|
-
reduce_only=raw_order.get(enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value, False)
|
733
|
+
reduce_only=raw_order.get(enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value, False),
|
734
|
+
trigger_above=raw_order.get(enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value, None)
|
729
735
|
)
|
730
736
|
|
731
737
|
async def update_from_order(self, other_order):
|
@@ -875,6 +881,7 @@ class Order(util.Initializable):
|
|
875
881
|
enums.ExchangeConstantsOrderColumns.FEE.value: self.fee,
|
876
882
|
enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
|
877
883
|
enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
|
884
|
+
enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value: self.trigger_above,
|
878
885
|
enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value: self.is_self_managed(),
|
879
886
|
enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
|
880
887
|
}
|
@@ -68,6 +68,7 @@ def create_order_instance(
|
|
68
68
|
total_cost=constants.ZERO,
|
69
69
|
timestamp=0,
|
70
70
|
side=None,
|
71
|
+
trigger_above=None,
|
71
72
|
fees_currency_side=None,
|
72
73
|
group=None,
|
73
74
|
tag=None,
|
@@ -103,7 +104,8 @@ def create_order_instance(
|
|
103
104
|
quantity_currency=quantity_currency,
|
104
105
|
close_position=close_position,
|
105
106
|
exchange_creation_params=exchange_creation_params,
|
106
|
-
associated_entry_id=associated_entry_id
|
107
|
+
associated_entry_id=associated_entry_id,
|
108
|
+
trigger_above=trigger_above,
|
107
109
|
)
|
108
110
|
return order
|
109
111
|
|
@@ -127,6 +129,7 @@ def create_order_from_dict(trader, order_dict):
|
|
127
129
|
quantity_filled=order_dict[enums.ExchangeConstantsOrderColumns.FILLED.value],
|
128
130
|
timestamp=order_dict[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value],
|
129
131
|
side=enums.TradeOrderSide(order_dict[enums.ExchangeConstantsOrderColumns.SIDE.value]),
|
132
|
+
trigger_above=order_dict.get(enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value),
|
130
133
|
tag=order_dict[enums.ExchangeConstantsOrderColumns.TAG.value],
|
131
134
|
reduce_only=order_dict[enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value],
|
132
135
|
)
|
@@ -29,14 +29,6 @@ class LimitOrder(order_class.Order):
|
|
29
29
|
self.trigger_above = self.side is enums.TradeOrderSide.SELL
|
30
30
|
self.allow_instant_fill = constants.ALLOW_SIMULATED_ORDERS_INSTANT_FILL
|
31
31
|
|
32
|
-
def update_from_raw(self, raw_order):
|
33
|
-
updated = super(LimitOrder, self).update_from_raw(raw_order)
|
34
|
-
if enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value in raw_order \
|
35
|
-
and self.trigger_above != raw_order[enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value]:
|
36
|
-
updated = True
|
37
|
-
self.trigger_above = raw_order[enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value]
|
38
|
-
return updated
|
39
|
-
|
40
32
|
async def update_price_if_outdated(self):
|
41
33
|
# price is outdated if it would trigger and instantly filled order with more than the allowed tolerance
|
42
34
|
try:
|
@@ -36,6 +36,7 @@ def create_order_signal_content(
|
|
36
36
|
trading_enums.TradingSignalOrdersAttrs.EXCHANGE.value: exchange_manager.exchange_name,
|
37
37
|
trading_enums.TradingSignalOrdersAttrs.EXCHANGE_TYPE.value: exchanges.get_exchange_type(exchange_manager).value,
|
38
38
|
trading_enums.TradingSignalOrdersAttrs.SIDE.value: order.side.value,
|
39
|
+
trading_enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value: order.trigger_above,
|
39
40
|
trading_enums.TradingSignalOrdersAttrs.TYPE.value: order.order_type.value,
|
40
41
|
trading_enums.TradingSignalOrdersAttrs.QUANTITY.value: float(order.origin_quantity),
|
41
42
|
trading_enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value: target_amount
|
@@ -145,26 +145,67 @@ async def get_portfolio(exchange_manager, as_float=False, clear_empty=True) -> d
|
|
145
145
|
}
|
146
146
|
|
147
147
|
|
148
|
-
|
148
|
+
def _parse_order_dict(
|
149
|
+
exchange_manager, order: dict, force_open_or_pending_creation: bool
|
150
|
+
) -> typing.Optional[personal_data.Order]:
|
151
|
+
if not order:
|
152
|
+
return None
|
153
|
+
try:
|
154
|
+
return personal_data.create_order_instance_from_raw(
|
155
|
+
exchange_manager.trader, order, force_open_or_pending_creation=force_open_or_pending_creation
|
156
|
+
)
|
157
|
+
except Exception as err:
|
158
|
+
logging.get_logger("_parse_order_dict").exception(
|
159
|
+
err,
|
160
|
+
True,
|
161
|
+
f"Unexpected error when parsing [{exchange_manager.exchange_name}] "
|
162
|
+
f"order ({err} {err.__class__.__name__}), order ignored: {order}"
|
163
|
+
)
|
164
|
+
return None
|
165
|
+
|
166
|
+
|
167
|
+
def _parse_order_into_dict(
|
168
|
+
exchange_manager, order: dict, force_open_or_pending_creation: bool, ignore_unsupported_orders: bool
|
169
|
+
) -> typing.Optional[dict]:
|
170
|
+
if (
|
171
|
+
ignore_unsupported_orders and
|
172
|
+
order[enums.ExchangeConstantsOrderColumns.TYPE.value] == enums.TradeOrderType.UNSUPPORTED.value
|
173
|
+
):
|
174
|
+
logging.get_logger("_parse_order_into_dict").warning(
|
175
|
+
f"Ignored unsupported [{exchange_manager.exchange_name}] order: {order}"
|
176
|
+
)
|
177
|
+
return None
|
178
|
+
if parsed_order := _parse_order_dict(exchange_manager, order, force_open_or_pending_creation):
|
179
|
+
try:
|
180
|
+
return parsed_order.to_dict()
|
181
|
+
except Exception as err:
|
182
|
+
logging.get_logger("_parse_order_dict").exception(
|
183
|
+
err,
|
184
|
+
True,
|
185
|
+
f"Unexpected error when converting [{exchange_manager.exchange_name}] order to dict"
|
186
|
+
f"({err}. {err.__class__.__name__}), order: {order}"
|
187
|
+
)
|
188
|
+
return None
|
189
|
+
|
190
|
+
|
191
|
+
async def _get_open_orders(exchange_manager, symbol: str, open_orders: list, ignore_unsupported_orders: bool):
|
149
192
|
orders = await exchange_manager.exchange.get_open_orders(symbol=symbol)
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
).to_dict()
|
154
|
-
for order in orders
|
155
|
-
)
|
193
|
+
for order in orders:
|
194
|
+
if order_dict := _parse_order_into_dict(exchange_manager, order, True, ignore_unsupported_orders):
|
195
|
+
open_orders.append(order_dict)
|
156
196
|
|
157
197
|
|
158
198
|
async def get_open_orders(
|
159
199
|
exchange_manager,
|
160
200
|
exchange_data: exchange_data_import.ExchangeData,
|
161
|
-
symbols: list = None
|
201
|
+
symbols: list = None,
|
202
|
+
ignore_unsupported_orders: bool = True,
|
162
203
|
) -> list:
|
163
204
|
open_orders = []
|
164
205
|
|
165
206
|
symbols = symbols or [market.symbol for market in exchange_data.markets]
|
166
207
|
await asyncio.gather(*(
|
167
|
-
_get_open_orders(exchange_manager, symbol, open_orders) for symbol in symbols
|
208
|
+
_get_open_orders(exchange_manager, symbol, open_orders, ignore_unsupported_orders) for symbol in symbols
|
168
209
|
))
|
169
210
|
return open_orders
|
170
211
|
|
@@ -177,25 +218,26 @@ async def get_order(
|
|
177
218
|
return await exchange_manager.exchange.get_order(exchange_order_id, symbol=symbol)
|
178
219
|
|
179
220
|
|
180
|
-
async def _get_cancelled_orders(exchange_manager, symbol: str, cancelled_orders: list):
|
221
|
+
async def _get_cancelled_orders(exchange_manager, symbol: str, cancelled_orders: list, ignore_unsupported_orders: bool):
|
181
222
|
orders = await exchange_manager.exchange.get_cancelled_orders(symbol=symbol)
|
182
|
-
|
183
|
-
|
184
|
-
exchange_manager
|
185
|
-
)
|
186
|
-
|
187
|
-
)
|
223
|
+
for order in orders:
|
224
|
+
if order_dict := _parse_order_into_dict(
|
225
|
+
exchange_manager, order, False, ignore_unsupported_orders
|
226
|
+
):
|
227
|
+
cancelled_orders.append(order_dict)
|
188
228
|
|
189
229
|
|
190
230
|
async def get_cancelled_orders(
|
191
231
|
exchange_manager,
|
192
232
|
exchange_data: exchange_data_import.ExchangeData,
|
193
|
-
symbols: list = None
|
233
|
+
symbols: list = None,
|
234
|
+
ignore_unsupported_orders: bool = True,
|
194
235
|
) -> list:
|
195
236
|
cancelled_orders = []
|
196
237
|
symbols = symbols or [market.symbol for market in exchange_data.markets]
|
197
238
|
await asyncio.gather(*(
|
198
|
-
_get_cancelled_orders(exchange_manager, symbol, cancelled_orders)
|
239
|
+
_get_cancelled_orders(exchange_manager, symbol, cancelled_orders, ignore_unsupported_orders)
|
240
|
+
for symbol in symbols
|
199
241
|
))
|
200
242
|
return cancelled_orders
|
201
243
|
|
@@ -230,11 +272,11 @@ async def _create_order(
|
|
230
272
|
) -> typing.Optional[personal_data.Order]:
|
231
273
|
symbol = order_dict[enums.ExchangeConstantsOrderColumns.SYMBOL.value]
|
232
274
|
side, order_type = personal_data.parse_order_type(order_dict)
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
)
|
275
|
+
temp_order = _parse_order_dict(exchange_manager, order_dict, True)
|
276
|
+
if temp_order is None:
|
277
|
+
logging.get_logger("_create_order").error(f"Unexpected: order can't be created.")
|
278
|
+
return None
|
279
|
+
order_params = exchange_manager.exchange.get_order_additional_params(temp_order)
|
238
280
|
created_order = await exchange_manager.exchange.create_order(
|
239
281
|
order_type,
|
240
282
|
symbol,
|
@@ -246,10 +288,9 @@ async def _create_order(
|
|
246
288
|
params=order_params
|
247
289
|
)
|
248
290
|
# is private, to use in tests context only
|
249
|
-
order =
|
250
|
-
|
251
|
-
|
252
|
-
if not order:
|
291
|
+
order = _parse_order_dict(exchange_manager, created_order, True)
|
292
|
+
if order is None:
|
293
|
+
logging.get_logger("_create_order").error(f"Unexpected: order hasn't been created.")
|
253
294
|
return order
|
254
295
|
if order.status is enums.OrderStatus.PENDING_CREATION and order_creation_timeout > 0:
|
255
296
|
try:
|
@@ -284,9 +325,8 @@ async def wait_for_other_status(order: personal_data.Order, timeout) -> personal
|
|
284
325
|
f"Order fetched with status different from {origin_status} after {iterations} "
|
285
326
|
f"iterations and {round(time.time() - t0)}s"
|
286
327
|
)
|
287
|
-
|
288
|
-
|
289
|
-
)
|
328
|
+
if parsed_order := _parse_order_dict(order.exchange_manager, raw_order, False):
|
329
|
+
return parsed_order
|
290
330
|
if time.time() - t0 + constants.CREATED_ORDER_FORCED_UPDATE_PERIOD >= timeout:
|
291
331
|
break
|
292
332
|
await asyncio.sleep(constants.CREATED_ORDER_FORCED_UPDATE_PERIOD)
|
@@ -23,7 +23,10 @@ import pytest
|
|
23
23
|
import time
|
24
24
|
from mock import AsyncMock, patch, Mock
|
25
25
|
|
26
|
-
from octobot_trading.errors import
|
26
|
+
from octobot_trading.errors import (
|
27
|
+
TooManyOpenPositionError, InvalidLeverageValue, OrderEditError,
|
28
|
+
ExchangeOrderCancelError, OrderNotFoundOnCancelError
|
29
|
+
)
|
27
30
|
from octobot_trading.personal_data import LinearPosition
|
28
31
|
import octobot_commons.constants as commons_constants
|
29
32
|
from octobot_commons.asyncio_tools import wait_asyncio_next_cycle
|
@@ -178,6 +181,70 @@ class TestTrader:
|
|
178
181
|
|
179
182
|
await self.stop(exchange_manager)
|
180
183
|
|
184
|
+
|
185
|
+
async def test_cancel_order_error(self):
|
186
|
+
_, exchange_manager, trader_inst = await self.init_default()
|
187
|
+
|
188
|
+
limit_buy = BuyLimitOrder(trader_inst)
|
189
|
+
limit_buy.update(order_type=TraderOrderType.SELL_LIMIT,
|
190
|
+
symbol=self.DEFAULT_SYMBOL,
|
191
|
+
current_price=decimal.Decimal("70"),
|
192
|
+
quantity=decimal.Decimal("10"),
|
193
|
+
price=decimal.Decimal("70"))
|
194
|
+
try:
|
195
|
+
trader_inst.simulate = False
|
196
|
+
with mock.patch.object(trader_inst, "_handle_order_cancel_error", mock.AsyncMock(
|
197
|
+
return_value=True
|
198
|
+
)) as _handle_order_cancel_error_mock:
|
199
|
+
with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
|
200
|
+
return_value=OrderStatus.CANCELED
|
201
|
+
)) as cancel_order_mock:
|
202
|
+
assert await trader_inst.cancel_order(limit_buy) is True
|
203
|
+
cancel_order_mock.assert_called_once()
|
204
|
+
_handle_order_cancel_error_mock.assert_not_called()
|
205
|
+
limit_buy.state = None
|
206
|
+
with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
|
207
|
+
side_effect=ExchangeOrderCancelError
|
208
|
+
)) as cancel_order_mock:
|
209
|
+
assert await trader_inst.cancel_order(limit_buy) is True
|
210
|
+
assert cancel_order_mock.call_count == 2
|
211
|
+
_handle_order_cancel_error_mock.assert_called_once()
|
212
|
+
_handle_order_cancel_error_mock.reset_mock()
|
213
|
+
limit_buy.state = None
|
214
|
+
with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
|
215
|
+
side_effect=OrderNotFoundOnCancelError
|
216
|
+
)) as cancel_order_mock:
|
217
|
+
assert await trader_inst.cancel_order(limit_buy) is True
|
218
|
+
assert cancel_order_mock.call_count == 2
|
219
|
+
_handle_order_cancel_error_mock.assert_called_once()
|
220
|
+
_handle_order_cancel_error_mock.reset_mock()
|
221
|
+
limit_buy.state = None
|
222
|
+
|
223
|
+
with trader_inst.exchange_manager.exchange_personal_data.orders_manager.disabled_order_auto_synchronization():
|
224
|
+
with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
|
225
|
+
side_effect=OrderNotFoundOnCancelError
|
226
|
+
)) as cancel_order_mock:
|
227
|
+
assert await trader_inst.cancel_order(limit_buy) is True
|
228
|
+
assert cancel_order_mock.call_count == 2
|
229
|
+
_handle_order_cancel_error_mock.assert_not_called()
|
230
|
+
limit_buy.state = None
|
231
|
+
|
232
|
+
with mock.patch.object(trader_inst, "_handle_order_cancel_error", mock.AsyncMock(
|
233
|
+
return_value=False
|
234
|
+
)) as _handle_order_cancel_error_mock:
|
235
|
+
with mock.patch.object(exchange_manager.exchange, "cancel_order", mock.AsyncMock(
|
236
|
+
side_effect=ExchangeOrderCancelError
|
237
|
+
)) as cancel_order_mock:
|
238
|
+
assert await trader_inst.cancel_order(limit_buy) is True
|
239
|
+
assert cancel_order_mock.call_count == 2
|
240
|
+
_handle_order_cancel_error_mock.assert_called_once()
|
241
|
+
_handle_order_cancel_error_mock.reset_mock()
|
242
|
+
limit_buy.state = None
|
243
|
+
|
244
|
+
finally:
|
245
|
+
trader_inst.simulate = True
|
246
|
+
|
247
|
+
|
181
248
|
async def test_cancel_open_orders_default_symbol(self):
|
182
249
|
config, exchange_manager, trader_inst = await self.init_default()
|
183
250
|
orders_manager = exchange_manager.exchange_personal_data.orders_manager
|
{OctoBot-Trading-2.4.142 → OctoBot-Trading-2.4.143}/tests/personal_data/orders/test_order_factory.py
RENAMED
@@ -81,6 +81,24 @@ class TestOrderFactory:
|
|
81
81
|
}
|
82
82
|
assert personal_data.parse_order_type(ccxt_order_sell_limit) == (TradeOrderSide.SELL, TraderOrderType.SELL_LIMIT)
|
83
83
|
|
84
|
+
ccxt_order_stop_loss_sell = {
|
85
|
+
"side": TradeOrderSide.SELL,
|
86
|
+
"type": TradeOrderType.STOP_LOSS
|
87
|
+
}
|
88
|
+
assert personal_data.parse_order_type(ccxt_order_stop_loss_sell) == (TradeOrderSide.SELL, TraderOrderType.STOP_LOSS)
|
89
|
+
|
90
|
+
ccxt_order_stop_loss_buy = {
|
91
|
+
"side": TradeOrderSide.BUY,
|
92
|
+
"type": TradeOrderType.STOP_LOSS
|
93
|
+
}
|
94
|
+
assert personal_data.parse_order_type(ccxt_order_stop_loss_buy) == (TradeOrderSide.BUY, TraderOrderType.STOP_LOSS)
|
95
|
+
|
96
|
+
unsupported = {
|
97
|
+
"side": TradeOrderSide.BUY,
|
98
|
+
"type": TradeOrderType.UNSUPPORTED
|
99
|
+
}
|
100
|
+
assert personal_data.parse_order_type(unsupported) == (TradeOrderSide.BUY, TraderOrderType.UNSUPPORTED)
|
101
|
+
|
84
102
|
await self.stop(exchange_manager)
|
85
103
|
|
86
104
|
async def test_create_order_from_dict(self):
|
@@ -114,7 +132,35 @@ class TestOrderFactory:
|
|
114
132
|
assert limit_order.exchange_creation_params == {"plop": 1, "fake_param": True}
|
115
133
|
# associated_entry_ids are not copied
|
116
134
|
assert created_from_dict.associated_entry_ids is None
|
135
|
+
assert created_from_dict.trigger_above is limit_order.trigger_above is True
|
117
136
|
assert limit_order.associated_entry_ids == ["1"]
|
137
|
+
|
138
|
+
|
139
|
+
_, exchange_manager, trader_inst = await self.init_default()
|
140
|
+
limit_order = personal_data.create_order_instance(
|
141
|
+
trader_inst,
|
142
|
+
TraderOrderType.SELL_LIMIT,
|
143
|
+
self.DEFAULT_SYMBOL,
|
144
|
+
price,
|
145
|
+
quantity,
|
146
|
+
price=price,
|
147
|
+
trigger_above=False,
|
148
|
+
)
|
149
|
+
order_dict = limit_order.to_dict()
|
150
|
+
created_from_dict = personal_data.create_order_from_dict(trader_inst, order_dict)
|
151
|
+
assert created_from_dict.origin_price == limit_order.origin_price == price
|
152
|
+
assert created_from_dict.origin_quantity == limit_order.origin_quantity == quantity
|
153
|
+
assert created_from_dict.__class__ is limit_order.__class__ == personal_data.SellLimitOrder
|
154
|
+
assert created_from_dict.symbol == limit_order.symbol == self.DEFAULT_SYMBOL
|
155
|
+
assert created_from_dict.reduce_only is limit_order.reduce_only is False
|
156
|
+
# exchange_creation_params are not copied
|
157
|
+
assert created_from_dict.exchange_creation_params == {}
|
158
|
+
assert limit_order.exchange_creation_params == {}
|
159
|
+
# associated_entry_ids are not copied
|
160
|
+
assert created_from_dict.associated_entry_ids is None
|
161
|
+
assert created_from_dict.trigger_above is limit_order.trigger_above is False
|
162
|
+
assert limit_order.associated_entry_ids is None
|
163
|
+
|
118
164
|
await self.stop(exchange_manager)
|
119
165
|
|
120
166
|
async def test_create_order_from_order_storage_details_with_simple_order(self):
|
@@ -127,6 +173,7 @@ class TestOrderFactory:
|
|
127
173
|
current_price=decimal.Decimal("70"),
|
128
174
|
quantity=decimal.Decimal("10"),
|
129
175
|
price=decimal.Decimal("70"))
|
176
|
+
order.trigger_above = True
|
130
177
|
order_storage_details = orders_storage._format_order(order, exchange_manager)
|
131
178
|
order_storage_details[StoredOrdersAttr.ENTRIES.value] = ["11111"]
|
132
179
|
|
@@ -141,6 +188,7 @@ class TestOrderFactory:
|
|
141
188
|
assert created_order.timestamp == order.timestamp
|
142
189
|
assert created_order.creation_time == order.creation_time
|
143
190
|
assert created_order.origin_price == order.origin_price
|
191
|
+
assert created_order.trigger_above is order.trigger_above is True
|
144
192
|
assert created_order.__class__ is order.__class__
|
145
193
|
# associated_entry_ids are added from order_storage_details but not in original order
|
146
194
|
assert created_order.associated_entry_ids == ["11111"]
|
@@ -149,6 +197,7 @@ class TestOrderFactory:
|
|
149
197
|
# updated creation_time (as with chained orders): creation_time is used to restore order
|
150
198
|
assert created_order.creation_time != 123
|
151
199
|
order.creation_time = 123
|
200
|
+
order.trigger_above = False
|
152
201
|
|
153
202
|
order_storage_details = orders_storage._format_order(order, exchange_manager)
|
154
203
|
created_order = await personal_data.create_order_from_order_storage_details(
|
@@ -160,6 +209,7 @@ class TestOrderFactory:
|
|
160
209
|
assert created_order.timestamp == 123 # aligned with creation time
|
161
210
|
assert created_order.creation_time == 123 # aligned with creation time
|
162
211
|
assert created_order.origin_price == order.origin_price
|
212
|
+
assert created_order.trigger_above is order.trigger_above is False
|
163
213
|
assert created_order.__class__ is order.__class__
|
164
214
|
# associated_entry_ids are added from order_storage_details but not in original order
|
165
215
|
assert created_order.associated_entry_ids is None
|
@@ -119,16 +119,19 @@ def test_add_created_order(trading_signal_bundle_builder, buy_limit_order):
|
|
119
119
|
|
120
120
|
# update the same order
|
121
121
|
buy_limit_order.order_type = enums.TraderOrderType.SELL_LIMIT
|
122
|
+
buy_limit_order.trigger_above = False
|
122
123
|
trading_signal_bundle_builder.add_created_order(buy_limit_order, buy_limit_order.exchange_manager, target_position="2%")
|
123
124
|
assert len(trading_signal_bundle_builder.signals) == 1
|
124
125
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TYPE.value] == enums.TraderOrderType.SELL_LIMIT.value
|
125
126
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
|
126
127
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "2%"
|
128
|
+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is False
|
127
129
|
|
128
130
|
# add new order (orders are based on order_id)
|
129
131
|
previous_order_id = buy_limit_order.order_id
|
130
132
|
buy_limit_order.order_id = "other_id"
|
131
133
|
buy_limit_order.order_type = enums.TraderOrderType.STOP_LOSS_LIMIT
|
134
|
+
buy_limit_order.trigger_above = True
|
132
135
|
trading_signal_bundle_builder.add_created_order(buy_limit_order, buy_limit_order.exchange_manager, target_position="50")
|
133
136
|
assert len(trading_signal_bundle_builder.signals) == 2
|
134
137
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ORDER_ID.value] == \
|
@@ -136,11 +139,13 @@ def test_add_created_order(trading_signal_bundle_builder, buy_limit_order):
|
|
136
139
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TYPE.value] == enums.TraderOrderType.SELL_LIMIT.value
|
137
140
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
|
138
141
|
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "2%"
|
142
|
+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is False
|
139
143
|
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.ORDER_ID.value] == "other_id"
|
140
144
|
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TYPE.value] == \
|
141
145
|
enums.TraderOrderType.STOP_LOSS_LIMIT.value
|
142
146
|
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
|
143
147
|
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "50"
|
148
|
+
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is True
|
144
149
|
|
145
150
|
|
146
151
|
def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):
|