OctoBot-Trading 2.4.139__tar.gz → 2.4.140__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.139 → OctoBot-Trading-2.4.140}/CHANGELOG.md +8 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.139/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.140}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/README.md +1 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/errors.py +14 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/abstract_exchange.py +4 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_manager.py +3 -3
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/trader.py +24 -14
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/rest_exchange.py +25 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order.py +90 -13
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_util.py +5 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +16 -11
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +13 -9
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +16 -11
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +13 -9
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/market_order.py +2 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +16 -10
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +12 -8
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position.py +4 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/positions_manager.py +3 -3
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order.py +209 -6
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/test_future_portfolio.py +5 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/test_position.py +13 -13
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/types/test_inverse_position.py +10 -10
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/types/test_linear_position.py +10 -10
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/LICENSE +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/constants.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/config/proxy_config.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/setup.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitmart.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitmex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [2.4.140] - 2025-01-03
|
8
|
+
### Updated
|
9
|
+
[Positions] properly clear closed positions
|
10
|
+
[Exchanges] handle newline error in keys
|
11
|
+
### Fixed
|
12
|
+
[Exchanges] don't raise on missing order description
|
13
|
+
[Orders] fix closed pos & instant fill chained orders
|
14
|
+
|
7
15
|
## [2.4.139] - 2023-12-29
|
8
16
|
### Updated
|
9
17
|
[Simulator] handle futures backtesting with market status and different ccxt classes
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.140
|
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.140](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.140
|
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.140](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.140](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)
|
@@ -143,6 +143,20 @@ class ExchangeAccountSymbolPermissionError(OctoBotExchangeError):
|
|
143
143
|
"""
|
144
144
|
|
145
145
|
|
146
|
+
class ExchangeClosedPositionError(OctoBotExchangeError):
|
147
|
+
"""
|
148
|
+
Raised when an exchange failed to execute the given request because the associated position is closed.
|
149
|
+
Can happen with reduce-only orders
|
150
|
+
"""
|
151
|
+
|
152
|
+
|
153
|
+
class ExchangeOrderInstantTriggerError(OctoBotExchangeError):
|
154
|
+
"""
|
155
|
+
Raised when an exchange failed to execute the given request because the associated order would immediately trigger.
|
156
|
+
Can happen with stop orders
|
157
|
+
"""
|
158
|
+
|
159
|
+
|
146
160
|
class PortfolioNegativeValueError(Exception):
|
147
161
|
"""
|
148
162
|
Raised when the portfolio is being updated with a negative value
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/abstract_exchange.py
RENAMED
@@ -742,7 +742,10 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
742
742
|
self._creating_exchange_order_descriptions.add(desc)
|
743
743
|
yield
|
744
744
|
finally:
|
745
|
-
|
745
|
+
try:
|
746
|
+
self._creating_exchange_order_descriptions.remove(desc)
|
747
|
+
except KeyError:
|
748
|
+
self.logger.error(f"Failed to remove {desc} from exchange order descriptions")
|
746
749
|
|
747
750
|
def is_creating_order(
|
748
751
|
self, order: dict, symbol: str
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/exchange_manager.py
RENAMED
@@ -322,9 +322,9 @@ class ExchangeManager(util.Initializable):
|
|
322
322
|
common_constants.CONFIG_EXCHANGE_SECRET, config_exchange, None
|
323
323
|
)
|
324
324
|
return (
|
325
|
-
# remove leading and trailing ", ' and whitespaces if any
|
326
|
-
key.strip(' "').strip("'") if key else key,
|
327
|
-
secret.strip(' "').strip("'") if secret else secret,
|
325
|
+
# remove leading and trailing ", ', newlines and whitespaces if any
|
326
|
+
key.strip(' "').strip("'").strip("\n") if key else key,
|
327
|
+
secret.strip(' "').strip("'").strip("\n") if secret else secret,
|
328
328
|
configuration.decrypt_element_if_possible(
|
329
329
|
common_constants.CONFIG_EXCHANGE_PASSWORD, config_exchange, None
|
330
330
|
),
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -87,9 +87,10 @@ class Trader(util.Initializable):
|
|
87
87
|
Orders
|
88
88
|
"""
|
89
89
|
|
90
|
-
async def create_order(
|
91
|
-
|
92
|
-
|
90
|
+
async def create_order(
|
91
|
+
self, order, loaded: bool = False, params: dict = None, wait_for_creation=True, raise_all_creation_error=False,
|
92
|
+
creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
|
93
|
+
):
|
93
94
|
"""
|
94
95
|
Create a new order from an OrderFactory created order, update portfolio, registers order in order manager and
|
95
96
|
notifies order channel.
|
@@ -99,6 +100,8 @@ class Trader(util.Initializable):
|
|
99
100
|
:param wait_for_creation: when True, always make sure the order is completely created before returning.
|
100
101
|
On exchanges async api, a create request will return before the order is actually live on exchange, in this case
|
101
102
|
the associated order state will make sure that the order is creating by polling the order from the exchange.
|
103
|
+
:param raise_all_creation_error: when True, will raise each ceation error when possible
|
104
|
+
(instead of retuning None)
|
102
105
|
:param creation_timeout: time before raising a timeout error when waiting for an order creation
|
103
106
|
:return: The crated order instance
|
104
107
|
"""
|
@@ -123,27 +126,34 @@ class Trader(util.Initializable):
|
|
123
126
|
# forward errors that require actions to fix the situation
|
124
127
|
raise
|
125
128
|
except Exception as e:
|
129
|
+
if raise_all_creation_error:
|
130
|
+
raise
|
126
131
|
self.logger.exception(e, True, f"Unexpected error when creating order: {e}. Order: {order}")
|
127
132
|
return None
|
128
133
|
|
129
134
|
return created_order
|
130
135
|
|
131
|
-
async def create_artificial_order(
|
132
|
-
|
133
|
-
|
134
|
-
|
136
|
+
async def create_artificial_order(
|
137
|
+
self, order_type, symbol, current_price, quantity, price, reduce_only, close_position,
|
138
|
+
emit_trading_signals=False, wait_for_creation=True,
|
139
|
+
creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
|
140
|
+
):
|
135
141
|
"""
|
136
142
|
Creates an OctoBot managed order (managed orders example: stop loss that is not published on the exchange and
|
137
143
|
that is maintained internally).
|
138
144
|
"""
|
139
|
-
order = order_factory.create_order_instance(
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
+
order = order_factory.create_order_instance(
|
146
|
+
trader=self,
|
147
|
+
order_type=order_type,
|
148
|
+
symbol=symbol,
|
149
|
+
current_price=current_price,
|
150
|
+
quantity=quantity,
|
151
|
+
price=price,
|
152
|
+
reduce_only=reduce_only,
|
153
|
+
close_position=close_position,
|
154
|
+
)
|
145
155
|
async with signals.remote_signal_publisher(self.exchange_manager, order.symbol, emit_trading_signals):
|
146
|
-
await signals.create_order(
|
156
|
+
return await signals.create_order(
|
147
157
|
self.exchange_manager,
|
148
158
|
emit_trading_signals and signals.should_emit_trading_signal(self.exchange_manager),
|
149
159
|
order,
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -119,6 +119,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
119
119
|
EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
|
120
120
|
# text content of errors due to unhandled authentication issues
|
121
121
|
EXCHANGE_AUTHENTICATION_ERRORS: typing.List[typing.Iterable[str]] = []
|
122
|
+
# text content of errors due to a closed position on the exchange. Relevant for reduce-only orders
|
123
|
+
EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
|
124
|
+
# text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
|
125
|
+
EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
|
122
126
|
|
123
127
|
DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
|
124
128
|
|
@@ -253,7 +257,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
253
257
|
if self.should_log_on_ddos_exception(e):
|
254
258
|
self.connector.log_ddos_error(e)
|
255
259
|
raise errors.FailedRequest(
|
256
|
-
f"Failed
|
260
|
+
f"Failed order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
|
257
261
|
) from e
|
258
262
|
except errors.OctoBotExchangeError:
|
259
263
|
# custom error: forward it
|
@@ -276,6 +280,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
276
280
|
f"Exchange is refusing this order request on this account because "
|
277
281
|
f"of its compliancy requirements."
|
278
282
|
) from e
|
283
|
+
if self.is_exchange_closed_position_error(e):
|
284
|
+
raise errors.ExchangeClosedPositionError(
|
285
|
+
f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
|
286
|
+
f"Exchange is refusing this order request because associated position is closed."
|
287
|
+
) from e
|
288
|
+
if self.is_exchange_order_would_immediately_trigger_error(e):
|
289
|
+
raise errors.ExchangeOrderInstantTriggerError(
|
290
|
+
f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
|
291
|
+
f"Exchange is refusing this order request because associated order would instantly trigger."
|
292
|
+
) from e
|
279
293
|
self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
|
280
294
|
# print(traceback.format_exc(), file=sys.stderr) # uncomment for debugging in tests
|
281
295
|
self.logger.exception(
|
@@ -989,6 +1003,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
989
1003
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_COMPLIANCY_ERRORS)
|
990
1004
|
return False
|
991
1005
|
|
1006
|
+
def is_exchange_closed_position_error(self, error: BaseException) -> bool:
|
1007
|
+
if self.EXCHANGE_CLOSED_POSITION_ERRORS:
|
1008
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_CLOSED_POSITION_ERRORS)
|
1009
|
+
return False
|
1010
|
+
|
1011
|
+
def is_exchange_order_would_immediately_trigger_error(self, error: BaseException) -> bool:
|
1012
|
+
if self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS:
|
1013
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS)
|
1014
|
+
return False
|
1015
|
+
|
992
1016
|
def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
|
993
1017
|
if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
|
994
1018
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.140}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -24,6 +24,7 @@ import octobot_trading.constants as constants
|
|
24
24
|
import octobot_trading.enums as enums
|
25
25
|
import octobot_trading.errors as errors
|
26
26
|
import octobot_trading.personal_data.orders.states as orders_states
|
27
|
+
import octobot_trading.exchanges.traders.trader
|
27
28
|
import octobot_trading.personal_data.orders.order_util as order_util
|
28
29
|
import octobot_trading.personal_data.orders.decimal_order_adapter as decimal_order_adapter
|
29
30
|
import octobot_trading.util as util
|
@@ -36,10 +37,11 @@ class Order(util.Initializable):
|
|
36
37
|
It is also use to store creation & fill values of the order
|
37
38
|
"""
|
38
39
|
CHECK_ORDER_STATUS_AFTER_INIT_DELAY = 2
|
40
|
+
SUPPORTS_GROUPING = True # False when orders of this type can't be grouped
|
39
41
|
|
40
42
|
def __init__(self, trader, side=None):
|
41
43
|
super().__init__()
|
42
|
-
self.trader = trader
|
44
|
+
self.trader: octobot_trading.exchanges.traders.trader.Trader = trader
|
43
45
|
self.exchange_manager = trader.exchange_manager
|
44
46
|
self.lock = asyncio.Lock()
|
45
47
|
self.is_synchronized_with_exchange = False
|
@@ -69,9 +71,9 @@ class Order(util.Initializable):
|
|
69
71
|
self.origin_stop_price = constants.ZERO
|
70
72
|
|
71
73
|
# order type attributes
|
72
|
-
self.order_type = None
|
74
|
+
self.order_type: enums.TraderOrderType = None
|
73
75
|
# raw exchange order type, used to create order dict
|
74
|
-
self.exchange_order_type = None
|
76
|
+
self.exchange_order_type: enums.TradeOrderType = None
|
75
77
|
|
76
78
|
# filled order attributes
|
77
79
|
self.filled_quantity = constants.ZERO
|
@@ -112,6 +114,8 @@ class Order(util.Initializable):
|
|
112
114
|
self.has_been_bundled = False
|
113
115
|
# True when this order is to be opened as a chained order and has not been open yet
|
114
116
|
self.is_waiting_for_chained_trigger = False
|
117
|
+
# instance of the order that has been created after self has been filled. Used in stop / TP orders
|
118
|
+
self.on_filled_artificial_order = None
|
115
119
|
|
116
120
|
# Params given to the exchange request when this order is created. Include any exchange specific param here.
|
117
121
|
# All params and values in those will be ignored in simulated orders
|
@@ -276,6 +280,17 @@ class Order(util.Initializable):
|
|
276
280
|
|
277
281
|
return changed
|
278
282
|
|
283
|
+
async def create_on_filled_artificial_order(self, enable_associated_orders_creation):
|
284
|
+
"""
|
285
|
+
:return: the equivalent artificial order after trigger price (ex: stop loss => market order)
|
286
|
+
"""
|
287
|
+
await self.on_filled(enable_associated_orders_creation, force_artificial_orders=True)
|
288
|
+
if self.on_filled_artificial_order is not None:
|
289
|
+
logging.get_logger(self.logger_name).info(f"Created artificial order: {self.on_filled_artificial_order}")
|
290
|
+
if self.order_group:
|
291
|
+
self.on_filled_artificial_order.add_to_order_group(self.order_group)
|
292
|
+
return self.on_filled_artificial_order
|
293
|
+
|
279
294
|
async def initialize_impl(self, **kwargs):
|
280
295
|
"""
|
281
296
|
Initialize order status update tasks
|
@@ -432,8 +447,8 @@ class Order(util.Initializable):
|
|
432
447
|
await self.state.initialize(forced=force_close)
|
433
448
|
|
434
449
|
async def on_cancel(
|
435
|
-
|
436
|
-
|
450
|
+
self, is_from_exchange_data=False, force_cancel=False, enable_associated_orders_creation=None,
|
451
|
+
ignored_order=None
|
437
452
|
):
|
438
453
|
enable_associated_orders_creation = self.state.enable_associated_orders_creation \
|
439
454
|
if (self.state and enable_associated_orders_creation is None) \
|
@@ -451,12 +466,12 @@ class Order(util.Initializable):
|
|
451
466
|
"""
|
452
467
|
self.status = enums.OrderStatus.FILLED
|
453
468
|
|
454
|
-
async def on_filled(self, enable_associated_orders_creation):
|
469
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
455
470
|
"""
|
456
471
|
Filling complete callback
|
457
472
|
"""
|
458
473
|
if enable_associated_orders_creation:
|
459
|
-
await self._trigger_chained_orders()
|
474
|
+
await self._trigger_chained_orders(enable_associated_orders_creation)
|
460
475
|
elif self.chained_orders:
|
461
476
|
logging.get_logger(self.get_logger_name()).info(
|
462
477
|
f"Skipped chained orders creation for {len(self.chained_orders)} chained orders: "
|
@@ -494,16 +509,68 @@ class Order(util.Initializable):
|
|
494
509
|
Implement if necessary
|
495
510
|
"""
|
496
511
|
|
497
|
-
async def _trigger_chained_orders(self):
|
512
|
+
async def _trigger_chained_orders(self, enable_associated_orders_creation):
|
498
513
|
logger = logging.get_logger(self.get_logger_name())
|
499
514
|
for index, order in enumerate(self.chained_orders):
|
515
|
+
if order.is_cleared():
|
516
|
+
logger.error(
|
517
|
+
f"Chained order {index + 1}/{len(self.chained_orders)} has been cleared: skipping "
|
518
|
+
f"creation (order: {order})"
|
519
|
+
)
|
520
|
+
continue
|
500
521
|
can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
|
501
522
|
if can_be_created and order.should_be_created():
|
502
523
|
logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
|
503
|
-
await
|
524
|
+
await self._create_triggered_chained_order(order, enable_associated_orders_creation)
|
504
525
|
else:
|
505
526
|
logger.debug(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
|
506
527
|
|
528
|
+
async def _create_triggered_chained_order(self, order, enable_associated_orders_creation):
|
529
|
+
logger = logging.get_logger(self.get_logger_name())
|
530
|
+
try:
|
531
|
+
await order_util.create_as_chained_order(order)
|
532
|
+
except errors.ExchangeClosedPositionError as err:
|
533
|
+
message = (
|
534
|
+
f"chained order is cancelled as it can't be created: position is closed "
|
535
|
+
f"on exchange ({err}) order: {order.id}"
|
536
|
+
)
|
537
|
+
if order.reduce_only:
|
538
|
+
# can happen on reduce only orders
|
539
|
+
logger.warning(f"Reduce only {message}")
|
540
|
+
else:
|
541
|
+
# should not happen on non-reduce only orders
|
542
|
+
logger.error(f"Unexpected: Non reduce only {message}")
|
543
|
+
# order can't be created: consider it cancelled
|
544
|
+
# note: grouped orders will also be skipped as this one is cancelled (should_be_created will be false)
|
545
|
+
order.status = octobot_trading.enums.OrderStatus.CLOSED
|
546
|
+
# clear state to avoid using outdated pending creation state
|
547
|
+
order.state = None
|
548
|
+
order.clear()
|
549
|
+
except errors.ExchangeOrderInstantTriggerError as err:
|
550
|
+
logger.info(f"Order would instantly trigger ({err}). Creating artificial order instead.")
|
551
|
+
equivalent_order = await order.create_on_filled_artificial_order(enable_associated_orders_creation)
|
552
|
+
if equivalent_order is None:
|
553
|
+
# should not happen on limit or market only orders
|
554
|
+
logger.error(f"Unexpected instant trigger error: {err} when creating chained order {order}")
|
555
|
+
else:
|
556
|
+
# acceptable: convert this order into its "triggered artificial order" equivalent
|
557
|
+
logger.warning(
|
558
|
+
f"Outdated chained order: order trigger price has already been reached. "
|
559
|
+
f"Creating equivalent {equivalent_order.get_name()} artificial order instead. "
|
560
|
+
f"Initial order: {order}, artificial order: {equivalent_order}."
|
561
|
+
)
|
562
|
+
# note: grouped orders will also be skipped as this one is filled (should_be_created will be false)
|
563
|
+
order.status = octobot_trading.enums.OrderStatus.CLOSED
|
564
|
+
# clear state to avoid using outdated pending creation state
|
565
|
+
order.state = None
|
566
|
+
order.clear()
|
567
|
+
except Exception as err:
|
568
|
+
logger.exception(
|
569
|
+
err,
|
570
|
+
True,
|
571
|
+
f"Unexpected error ({err.__class__.__name__}: {err}) when creating chained order: {order}"
|
572
|
+
)
|
573
|
+
|
507
574
|
async def set_as_chained_order(self, triggered_by, has_been_bundled, exchange_creation_params,
|
508
575
|
update_with_triggering_order_fees, **trader_creation_kwargs):
|
509
576
|
if triggered_by is self:
|
@@ -526,9 +593,19 @@ class Order(util.Initializable):
|
|
526
593
|
return False
|
527
594
|
for other_order in self.triggered_by.chained_orders:
|
528
595
|
if other_order is self:
|
529
|
-
|
530
|
-
|
531
|
-
|
596
|
+
continue
|
597
|
+
order_to_check = (
|
598
|
+
other_order
|
599
|
+
if other_order.on_filled_artificial_order is None
|
600
|
+
else other_order.on_filled_artificial_order
|
601
|
+
)
|
602
|
+
if (
|
603
|
+
self.order_group is not None and self.order_group is order_to_check.order_group
|
604
|
+
and (
|
605
|
+
order_to_check.is_closed() # grouped order has been closed
|
606
|
+
or not order_to_check.SUPPORTS_GROUPING # grouped order can't be used in groups (anymore)
|
607
|
+
)
|
608
|
+
):
|
532
609
|
return True
|
533
610
|
return False
|
534
611
|
|
@@ -758,7 +835,7 @@ class Order(util.Initializable):
|
|
758
835
|
|
759
836
|
self.fee = order_util.parse_raw_fees(raw_order[enums.ExchangeConstantsOrderColumns.FEE.value])
|
760
837
|
|
761
|
-
self.executed_time = self.trader.exchange.get_uniformized_timestamp(
|
838
|
+
self.executed_time = self.trader.exchange_manager.exchange.get_uniformized_timestamp(
|
762
839
|
raw_order[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value])
|
763
840
|
|
764
841
|
def _update_type_from_raw(self, raw_order):
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# pylint: disable=W0706
|
1
2
|
# Drakkar-Software OctoBot-Trading
|
2
3
|
# Copyright (c) Drakkar-Software, All rights reserved.
|
3
4
|
#
|
@@ -479,8 +480,12 @@ async def create_as_chained_order(order):
|
|
479
480
|
order,
|
480
481
|
loaded=False,
|
481
482
|
params=order.exchange_creation_params,
|
483
|
+
raise_all_creation_error=True,
|
482
484
|
**order.trader_creation_kwargs
|
483
485
|
)
|
486
|
+
except (errors.ExchangeClosedPositionError, errors.ExchangeOrderInstantTriggerError):
|
487
|
+
# Order can be created and might be outdated forward error for the caller to fix it if possible
|
488
|
+
raise
|
484
489
|
except Exception as err:
|
485
490
|
# log warning to be sure to keep track of the failed order details
|
486
491
|
logging.get_logger(LOGGER_NAME).warning(
|
@@ -34,14 +34,19 @@ class StopLossLimitOrder(limit_order.LimitOrder):
|
|
34
34
|
async def update_price_if_outdated(self):
|
35
35
|
pass
|
36
36
|
|
37
|
-
async def on_filled(self, enable_associated_orders_creation):
|
38
|
-
await limit_order.LimitOrder.on_filled(
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
37
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
38
|
+
await limit_order.LimitOrder.on_filled(
|
39
|
+
self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
|
40
|
+
)
|
41
|
+
order_type = (
|
42
|
+
enums.TraderOrderType.SELL_LIMIT
|
43
|
+
if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_LIMIT
|
44
|
+
)
|
45
|
+
limit_price = (
|
46
|
+
self.limit_price
|
47
|
+
if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else self.origin_stop_price
|
48
|
+
)
|
49
|
+
self.on_filled_artificial_order = await self.trader.create_artificial_order(
|
50
|
+
order_type, self.symbol, self.origin_stop_price, self.origin_quantity, limit_price,
|
51
|
+
self.reduce_only, self.close_position
|
52
|
+
)
|
@@ -32,12 +32,16 @@ class StopLossOrder(limit_order.LimitOrder):
|
|
32
32
|
# Creates a market order when filled, which is taker
|
33
33
|
return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
|
34
34
|
|
35
|
-
async def on_filled(self, enable_associated_orders_creation):
|
36
|
-
await limit_order.LimitOrder.on_filled(
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
36
|
+
await limit_order.LimitOrder.on_filled(
|
37
|
+
self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
|
38
|
+
)
|
39
|
+
if not self.trader.simulate and (self.is_self_managed() or force_artificial_orders):
|
40
|
+
order_type = (
|
41
|
+
enums.TraderOrderType.SELL_MARKET
|
42
|
+
if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_MARKET
|
43
|
+
)
|
44
|
+
self.on_filled_artificial_order = await self.trader.create_artificial_order(
|
45
|
+
order_type, self.symbol, self.origin_stop_price, self.origin_quantity, self.origin_stop_price,
|
46
|
+
self.reduce_only, self.close_position
|
47
|
+
)
|
@@ -29,14 +29,19 @@ class TakeProfitLimitOrder(limit_order.LimitOrder):
|
|
29
29
|
async def update_price_if_outdated(self):
|
30
30
|
pass
|
31
31
|
|
32
|
-
async def on_filled(self, enable_associated_orders_creation):
|
33
|
-
await limit_order.LimitOrder.on_filled(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
32
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
33
|
+
await limit_order.LimitOrder.on_filled(
|
34
|
+
self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
|
35
|
+
)
|
36
|
+
order_type = (
|
37
|
+
enums.TraderOrderType.SELL_LIMIT
|
38
|
+
if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_LIMIT
|
39
|
+
)
|
40
|
+
limit_price = (
|
41
|
+
self.limit_price
|
42
|
+
if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else self.origin_stop_price
|
43
|
+
)
|
44
|
+
self.on_filled_artificial_order = await self.trader.create_artificial_order(
|
45
|
+
order_type, self.symbol, self.origin_stop_price, self.origin_quantity, limit_price,
|
46
|
+
self.reduce_only, self.close_position
|
47
|
+
)
|
@@ -32,12 +32,16 @@ class TakeProfitOrder(limit_order.LimitOrder):
|
|
32
32
|
# Creates a market order when filled, which is taker
|
33
33
|
return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
|
34
34
|
|
35
|
-
async def on_filled(self, enable_associated_orders_creation):
|
36
|
-
await limit_order.LimitOrder.on_filled(
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
36
|
+
await limit_order.LimitOrder.on_filled(
|
37
|
+
self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
|
38
|
+
)
|
39
|
+
if not self.trader.simulate and (self.is_self_managed() or force_artificial_orders):
|
40
|
+
order_type = (
|
41
|
+
enums.TraderOrderType.SELL_MARKET
|
42
|
+
if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_MARKET
|
43
|
+
)
|
44
|
+
self.on_filled_artificial_order = await self.trader.create_artificial_order(
|
45
|
+
order_type, self.symbol, self.origin_stop_price, self.origin_quantity, self.origin_stop_price,
|
46
|
+
self.reduce_only, self.close_position
|
47
|
+
)
|
@@ -18,6 +18,8 @@ import octobot_trading.personal_data.orders.order as order_class
|
|
18
18
|
|
19
19
|
|
20
20
|
class MarketOrder(order_class.Order):
|
21
|
+
SUPPORTS_GROUPING = False # False when orders of this type can't be grouped
|
22
|
+
|
21
23
|
async def update_order_status(self, force_refresh=False):
|
22
24
|
if self.trader.simulate:
|
23
25
|
# TODO: ensure no issue un not running it in task anymore
|
@@ -25,13 +25,19 @@ class TrailingStopLimitOrder(trailing_stop_order.TrailingStopOrder):
|
|
25
25
|
self.order_type = enums.TraderOrderType.TRAILING_STOP_LIMIT
|
26
26
|
self.limit_price = limit_price
|
27
27
|
|
28
|
-
async def on_filled(self, enable_associated_orders_creation):
|
29
|
-
await trailing_stop_order.TrailingStopOrder.on_filled(
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
29
|
+
await trailing_stop_order.TrailingStopOrder.on_filled(
|
30
|
+
self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
|
31
|
+
)
|
32
|
+
order_type = (
|
33
|
+
enums.TraderOrderType.SELL_LIMIT
|
34
|
+
if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_LIMIT
|
35
|
+
)
|
36
|
+
limit_price = (
|
37
|
+
self.limit_price
|
38
|
+
if self.limit_price != self.UNINITIALIZED_LIMIT_PRICE else self.origin_stop_price
|
39
|
+
)
|
40
|
+
self.on_filled_artificial_order = await self.trader.create_artificial_order(
|
41
|
+
order_type, self.symbol, self.origin_stop_price, self.origin_quantity, limit_price,
|
42
|
+
self.reduce_only, self.close_position
|
43
|
+
)
|
@@ -143,17 +143,21 @@ class TrailingStopOrder(order_class.Order):
|
|
143
143
|
f"replacing stop...")
|
144
144
|
await self._reset_events(decimal.Decimal(str(prices_manager.mark_price)), prices_manager.mark_price_set_time)
|
145
145
|
|
146
|
-
async def on_filled(self, enable_associated_orders_creation):
|
146
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
147
147
|
"""
|
148
148
|
Create an artificial when trailing stop is filled
|
149
149
|
"""
|
150
|
-
await order_class.Order.on_filled(
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
150
|
+
await order_class.Order.on_filled(
|
151
|
+
self, enable_associated_orders_creation, force_artificial_orders=force_artificial_orders
|
152
|
+
)
|
153
|
+
order_type = (
|
154
|
+
enums.TraderOrderType.SELL_MARKET
|
155
|
+
if self.side is enums.TradeOrderSide.SELL else enums.TraderOrderType.BUY_MARKET
|
156
|
+
)
|
157
|
+
self.on_filled_artificial_order = await self.trader.create_artificial_order(
|
158
|
+
order_type, self.symbol, self.origin_stop_price, self.origin_quantity, self.origin_stop_price,
|
159
|
+
self.reduce_only, self.close_position
|
160
|
+
)
|
157
161
|
|
158
162
|
def _clear_event_and_tasks(self):
|
159
163
|
"""
|