OctoBot-Trading 2.4.92__tar.gz → 2.4.94__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.92 → OctoBot-Trading-2.4.94}/CHANGELOG.md +14 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.92/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.94}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/README.md +1 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/__init__.py +8 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/exchange.py +11 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/orders.py +8 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/trades.py +9 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/constants.py +1 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/abstract_websocket_exchange.py +6 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +16 -5
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_builder.py +4 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_manager.py +3 -2
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_websocket_factory.py +6 -2
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/traders/trader.py +2 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/types/websocket_exchange.py +23 -2
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/abstract_trading_mode.py +1 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/modes_util.py +1 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/channel/orders.py +1 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order.py +3 -3
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order_state.py +6 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/orders_manager.py +14 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +3 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/state.py +7 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/trades_manager.py +19 -4
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/test_tools/exchanges_test_tools.py +10 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_exchange_builder.py +10 -1
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_order_state_factory.py +36 -2
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/trades/test_trade_manager.py +18 -3
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/LICENSE +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/errors.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/setup.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/modes/test_modes_util.py +2 -2
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,20 @@ 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.94] - 2024-07-28
|
8
|
+
### Fixed
|
9
|
+
- [OrderStates] enable_associated_orders_creation param
|
10
|
+
|
11
|
+
## [2.4.93] - 2024-07-23
|
12
|
+
### Added
|
13
|
+
- [Trades] get_trade_pnl API
|
14
|
+
- [Orders] allow disabled_order_auto_synchronization
|
15
|
+
### Fixed
|
16
|
+
- [Exchanges] Websocket limit issues
|
17
|
+
### Updated
|
18
|
+
- [Trades] Increase default max trades history to 6000
|
19
|
+
- [Orders] Add logs on auto-refresh
|
20
|
+
|
7
21
|
## [2.4.92] - 2024-07-15
|
8
22
|
### Fixed
|
9
23
|
- [Trades] optimize trade storage RAM
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.94
|
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.94](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.94
|
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.94](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.94](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)
|
@@ -51,6 +51,7 @@ from octobot_trading.api.symbol_data import (
|
|
51
51
|
from octobot_trading.api.trades import (
|
52
52
|
get_trade_history,
|
53
53
|
get_completed_pnl_history,
|
54
|
+
get_trade_pnl,
|
54
55
|
is_executed_trade,
|
55
56
|
is_trade_after_or_at,
|
56
57
|
get_total_paid_trading_fees,
|
@@ -94,6 +95,7 @@ from octobot_trading.api.exchange import (
|
|
94
95
|
get_backtesting_data_files,
|
95
96
|
get_backtesting_data_file,
|
96
97
|
get_has_websocket,
|
98
|
+
get_has_reached_websocket_limit,
|
97
99
|
supports_websockets,
|
98
100
|
is_compatible_account,
|
99
101
|
get_new_ccxt_client,
|
@@ -177,10 +179,12 @@ from octobot_trading.api.profitability import (
|
|
177
179
|
)
|
178
180
|
from octobot_trading.api.orders import (
|
179
181
|
get_open_orders,
|
182
|
+
get_pending_creation_orders,
|
180
183
|
get_order_exchange_name,
|
181
184
|
order_to_dict,
|
182
185
|
parse_order_type,
|
183
186
|
parse_order_status,
|
187
|
+
is_order_pending,
|
184
188
|
get_order_profitability,
|
185
189
|
get_minimal_order_cost,
|
186
190
|
create_order,
|
@@ -234,6 +238,7 @@ __all__ = [
|
|
234
238
|
"get_config_symbols",
|
235
239
|
"get_trade_history",
|
236
240
|
"get_completed_pnl_history",
|
241
|
+
"get_trade_pnl",
|
237
242
|
"is_executed_trade",
|
238
243
|
"is_trade_after_or_at",
|
239
244
|
"get_total_paid_trading_fees",
|
@@ -273,6 +278,7 @@ __all__ = [
|
|
273
278
|
"get_backtesting_data_files",
|
274
279
|
"get_backtesting_data_file",
|
275
280
|
"get_has_websocket",
|
281
|
+
"get_has_reached_websocket_limit",
|
276
282
|
"supports_websockets",
|
277
283
|
"is_compatible_account",
|
278
284
|
"get_new_ccxt_client",
|
@@ -346,10 +352,12 @@ __all__ = [
|
|
346
352
|
"get_reference_market",
|
347
353
|
"get_initializing_currencies_prices",
|
348
354
|
"get_open_orders",
|
355
|
+
"get_pending_creation_orders",
|
349
356
|
"get_order_exchange_name",
|
350
357
|
"order_to_dict",
|
351
358
|
"parse_order_type",
|
352
359
|
"parse_order_status",
|
360
|
+
"is_order_pending",
|
353
361
|
"get_order_profitability",
|
354
362
|
"get_minimal_order_cost",
|
355
363
|
"create_order",
|
@@ -202,6 +202,13 @@ def get_has_websocket(exchange_manager) -> bool:
|
|
202
202
|
return exchange_manager.has_websocket
|
203
203
|
|
204
204
|
|
205
|
+
def get_has_reached_websocket_limit(exchange_manager) -> bool:
|
206
|
+
return (
|
207
|
+
exchange_manager.exchange_web_socket
|
208
|
+
and exchange_manager.exchange_web_socket.is_beyond_feed_exchange_limit
|
209
|
+
)
|
210
|
+
|
211
|
+
|
205
212
|
def supports_websockets(exchange_name: str, tentacles_setup_config) -> bool:
|
206
213
|
return exchanges.supports_websocket(exchange_name, tentacles_setup_config)
|
207
214
|
|
@@ -243,10 +250,14 @@ def get_fees(exchange_manager, symbol) -> dict:
|
|
243
250
|
|
244
251
|
|
245
252
|
def get_max_handled_pair_with_time_frame(exchange_manager) -> int:
|
253
|
+
if get_has_reached_websocket_limit(exchange_manager):
|
254
|
+
return exchange_manager.exchange_web_socket.get_connector_max_handled_feeds()
|
246
255
|
return exchange_manager.exchange.get_max_handled_pair_with_time_frame()
|
247
256
|
|
248
257
|
|
249
258
|
def get_currently_handled_pair_with_time_frame(exchange_manager) -> int:
|
259
|
+
if get_has_reached_websocket_limit(exchange_manager):
|
260
|
+
return exchange_manager.exchange_web_socket.get_connector_feeds_count()
|
250
261
|
return exchange_manager.get_currently_handled_pair_with_time_frame()
|
251
262
|
|
252
263
|
|
@@ -45,6 +45,10 @@ def get_open_orders(exchange_manager, symbol=None) -> list:
|
|
45
45
|
return exchange_manager.exchange_personal_data.orders_manager.get_open_orders(symbol=symbol)
|
46
46
|
|
47
47
|
|
48
|
+
def get_pending_creation_orders(exchange_manager) -> list:
|
49
|
+
return exchange_manager.exchange_personal_data.orders_manager.pending_creation_orders
|
50
|
+
|
51
|
+
|
48
52
|
async def cancel_all_open_orders(exchange_manager, emit_trading_signals=True) -> bool:
|
49
53
|
return await exchange_manager.trader.cancel_all_open_orders(emit_trading_signals=emit_trading_signals)
|
50
54
|
|
@@ -74,6 +78,10 @@ def parse_order_status(dict_order) -> octobot_trading.enums.OrderStatus:
|
|
74
78
|
return personal_data.parse_order_status(dict_order)
|
75
79
|
|
76
80
|
|
81
|
+
def is_order_pending(order: personal_data.Order) -> bool:
|
82
|
+
return order.status == octobot_trading.enums.OrderStatus.PENDING_CREATION
|
83
|
+
|
84
|
+
|
77
85
|
def get_order_profitability(exchange_manager, order_id) -> float:
|
78
86
|
try:
|
79
87
|
return exchange_manager.exchange_personal_data.orders_manager.get_order(order_id).get_profitability()
|
@@ -14,6 +14,7 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public
|
15
15
|
# License along with this library.
|
16
16
|
import decimal
|
17
|
+
import typing
|
17
18
|
|
18
19
|
import octobot_trading.enums
|
19
20
|
import octobot_trading.personal_data as personal_data
|
@@ -38,6 +39,14 @@ def get_completed_pnl_history(exchange_manager, quote=None, symbol=None, since=N
|
|
38
39
|
)
|
39
40
|
|
40
41
|
|
42
|
+
def get_trade_pnl(
|
43
|
+
exchange_manager, trade_id: typing.Optional[str] = None, order_id: typing.Optional[str] = None
|
44
|
+
) -> typing.Optional[personal_data.TradePnl]:
|
45
|
+
return exchange_manager.exchange_personal_data.trades_manager.get_completed_trade_pnl(
|
46
|
+
trade_id, order_id
|
47
|
+
)
|
48
|
+
|
49
|
+
|
41
50
|
def _trade_filter(trade, quote=None, symbol=None, timestamp=None, include_cancelled=False) -> bool:
|
42
51
|
if trade.status is octobot_trading.enums.OrderStatus.CANCELED and not include_cancelled:
|
43
52
|
return False
|
@@ -177,7 +177,7 @@ BALANCE_CHANNEL = "Balance"
|
|
177
177
|
BALANCE_PROFITABILITY_CHANNEL = "BalanceProfitability"
|
178
178
|
POSITIONS_CHANNEL = "Positions"
|
179
179
|
INDIVIDUAL_ORDER_SYNC_TIMEOUT = 1 * commons_constants.MINUTE_TO_SECONDS
|
180
|
-
MAX_TRADES_COUNT = int(os.getenv("MAX_TRADES_COUNT", "
|
180
|
+
MAX_TRADES_COUNT = int(os.getenv("MAX_TRADES_COUNT", "6000")) # larger values can use a large part of ram
|
181
181
|
|
182
182
|
# History
|
183
183
|
DEFAULT_SAVED_HISTORICAL_TIMEFRAMES = [commons_enums.TimeFrames.ONE_DAY]
|
@@ -42,6 +42,8 @@ class AbstractWebsocketExchange:
|
|
42
42
|
octobot_trading.enums.WebsocketFeeds.CANDLE,
|
43
43
|
octobot_trading.enums.WebsocketFeeds.KLINE,
|
44
44
|
]
|
45
|
+
# Feeds to create above which not to use websockets
|
46
|
+
MAX_HANDLED_FEEDS = octobot_trading.constants.NO_DATA_LIMIT
|
45
47
|
|
46
48
|
def __init__(self, config, exchange_manager):
|
47
49
|
self.config = config
|
@@ -212,6 +214,10 @@ class AbstractWebsocketExchange:
|
|
212
214
|
"""
|
213
215
|
return octobot_trading.constants.INFINITE_MAX_HANDLED_PAIRS_WITH_TIMEFRAME
|
214
216
|
|
217
|
+
@classmethod
|
218
|
+
def get_feeds_count(cls, pairs, time_frames) -> int:
|
219
|
+
raise NotImplementedError(f"get_feeds_count is not implemented")
|
220
|
+
|
215
221
|
def _should_authenticate(self):
|
216
222
|
api_key, api_secret, _ = self.get_exchange_credentials()
|
217
223
|
return not self.exchange_manager.without_auth \
|
@@ -620,14 +620,14 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
|
|
620
620
|
if not already_got_closed_by_user_error:
|
621
621
|
count_error = False
|
622
622
|
self.logger.debug(
|
623
|
-
f"{ws_des} connection automatically closed, reconnecting in {self.LONG_RECONNECT_DELAY}
|
624
|
-
f"seconds ({err})"
|
623
|
+
f"{ws_des} connection automatically closed, reconnecting in {self.LONG_RECONNECT_DELAY}"
|
624
|
+
f" seconds ({err})"
|
625
625
|
)
|
626
626
|
already_got_closed_by_user_error = True
|
627
627
|
if count_error:
|
628
628
|
error_count = self._increment_error_counter(g_kwargs.get("time_frame"), err)
|
629
|
-
error_message = f"Unexpected error when handling {ws_des} feed: {err}
|
630
|
-
f"({error_count} times)"
|
629
|
+
error_message = f"Unexpected error when handling {ws_des} feed: {err} " \
|
630
|
+
f"({err.__class__.__name__}) ({error_count} times)"
|
631
631
|
if error_count == 1:
|
632
632
|
self.logger.exception(err, True, error_message)
|
633
633
|
elif error_count % spamming_logs_warning_interval == 0:
|
@@ -642,7 +642,7 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
|
|
642
642
|
def _create_task_if_necessary(self, feed, feed_callback, feed_generator, **kwargs):
|
643
643
|
identifier = self._get_feed_identifier(feed_generator, kwargs)
|
644
644
|
if identifier not in self.feed_tasks:
|
645
|
-
self.logger.debug(f"Subscribing to {feed.value} with {kwargs}")
|
645
|
+
self.logger.debug(f"Subscribing to {feed.value} with {kwargs} ({len(self.feed_tasks)} total feeds)")
|
646
646
|
self.feed_tasks[identifier] = asyncio.create_task(
|
647
647
|
self._feed_task(feed, feed_callback, feed_generator, **kwargs)
|
648
648
|
)
|
@@ -771,6 +771,17 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
|
|
771
771
|
def _is_pair_independent_feed(self, feed):
|
772
772
|
return feed in self.PAIR_INDEPENDENT_CHANNELS
|
773
773
|
|
774
|
+
@classmethod
|
775
|
+
def get_feeds_count(cls, pairs, time_frames) -> int:
|
776
|
+
total_count = 0
|
777
|
+
if pairs:
|
778
|
+
# rounding: account for 1 feed per symbol
|
779
|
+
total_count = len(pairs)
|
780
|
+
if cls.get_exchange_feed(trading_enums.WebsocketFeeds.CANDLE):
|
781
|
+
# rounding: account for 1 per timeframe per symbol
|
782
|
+
total_count += len(pairs) * len(time_frames)
|
783
|
+
return total_count
|
784
|
+
|
774
785
|
def _convert_book_prices_to_orders(self, book_prices_and_volumes, book_side):
|
775
786
|
"""
|
776
787
|
Convert a book_prices format : {PRICE_1: SIZE_1, PRICE_2: SIZE_2...}
|
{OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_builder.py
RENAMED
@@ -17,6 +17,7 @@
|
|
17
17
|
import typing
|
18
18
|
import octobot_commons.logging as logging
|
19
19
|
import octobot_commons.constants as commons_constants
|
20
|
+
import octobot_commons.authentication as commons_authentication
|
20
21
|
|
21
22
|
import octobot_trading.errors as errors
|
22
23
|
import octobot_trading.modes as modes
|
@@ -120,6 +121,9 @@ class ExchangeBuilder:
|
|
120
121
|
|
121
122
|
async def build_trading_modes(self, trading_mode_class):
|
122
123
|
try:
|
124
|
+
# ensure authenticated data are fetched before starting trading modes
|
125
|
+
if not self.exchange_manager.is_backtesting:
|
126
|
+
await commons_authentication.Authenticator.wait_and_check_has_open_source_package()
|
123
127
|
self._ensure_trading_mode_compatibility(trading_mode_class)
|
124
128
|
return await modes.create_trading_modes(
|
125
129
|
self.config,
|
{OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/exchange_manager.py
RENAMED
@@ -107,10 +107,11 @@ class ExchangeManager(util.Initializable):
|
|
107
107
|
await self.exchange_web_socket.close_sockets()
|
108
108
|
except Exception as err:
|
109
109
|
self.logger.exception(err, True, f"Error when stopping exchange websocket: {err}")
|
110
|
-
self.exchange_web_socket.clear()
|
111
|
-
self.exchange_web_socket = None
|
112
110
|
if enable_logs:
|
113
111
|
self.logger.debug("Stopped websocket")
|
112
|
+
if self.exchange_web_socket:
|
113
|
+
self.exchange_web_socket.clear()
|
114
|
+
self.exchange_web_socket = None
|
114
115
|
|
115
116
|
# stop trading modes
|
116
117
|
if enable_logs:
|
@@ -59,8 +59,12 @@ async def _create_websocket(exchange_manager, websocket_class_name, ws_exchange_
|
|
59
59
|
try:
|
60
60
|
exchange_manager.exchange_web_socket = ws_exchange_class(exchange_manager.config, exchange_manager)
|
61
61
|
await _init_websocket(exchange_manager)
|
62
|
-
exchange_manager.
|
63
|
-
|
62
|
+
if exchange_manager.exchange_web_socket.is_websocket_running:
|
63
|
+
exchange_manager.logger.info(
|
64
|
+
f"{ws_exchange_class.get_name()} connecting to {exchange_manager.exchange.name.capitalize()}"
|
65
|
+
)
|
66
|
+
else:
|
67
|
+
exchange_manager.has_websocket = False
|
64
68
|
except Exception as e:
|
65
69
|
exchange_manager.logger.error(f"Fail to init websocket for {websocket_class_name} "
|
66
70
|
f"({exchange_manager.exchange.name}): {e}")
|
{OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -285,7 +285,8 @@ class Trader(util.Initializable):
|
|
285
285
|
|
286
286
|
await updated_order.initialize()
|
287
287
|
if is_pending_creation and wait_for_creation \
|
288
|
-
and updated_order.state is not None and updated_order.state.is_pending()
|
288
|
+
and updated_order.state is not None and updated_order.state.is_pending()\
|
289
|
+
and self.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization:
|
289
290
|
await updated_order.state.wait_for_terminate(creation_timeout)
|
290
291
|
return updated_order
|
291
292
|
|
@@ -18,6 +18,7 @@ import sys
|
|
18
18
|
import concurrent.futures as futures
|
19
19
|
|
20
20
|
import octobot_commons.thread_util as thread_util
|
21
|
+
import octobot_trading.constants
|
21
22
|
import octobot_trading.enums
|
22
23
|
import octobot_trading.exchanges.abstract_websocket_exchange as abstract_websocket
|
23
24
|
|
@@ -42,6 +43,7 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
|
|
42
43
|
|
43
44
|
self.is_websocket_running = False
|
44
45
|
self.is_websocket_authenticated = False
|
46
|
+
self.is_beyond_feed_exchange_limit = False
|
45
47
|
|
46
48
|
self.restart_task = None
|
47
49
|
|
@@ -59,6 +61,13 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
|
|
59
61
|
self.time_frames = time_frames
|
60
62
|
|
61
63
|
if self.pairs:
|
64
|
+
if self._has_too_many_feeds_to_handle():
|
65
|
+
self.logger.info(
|
66
|
+
f"Disabling websocket: {self.get_connector_feeds_count()} "
|
67
|
+
f"feeds are required and {self.get_connector_max_handled_feeds()} are supported at most."
|
68
|
+
)
|
69
|
+
self.is_beyond_feed_exchange_limit = True
|
70
|
+
return
|
62
71
|
# unauthenticated
|
63
72
|
await self.add_feed(octobot_trading.enums.WebsocketFeeds.TRADES)
|
64
73
|
await self.add_feed(octobot_trading.enums.WebsocketFeeds.L1_BOOK)
|
@@ -91,8 +100,9 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
|
|
91
100
|
# ensure feeds are added
|
92
101
|
self.create_feeds()
|
93
102
|
else:
|
94
|
-
self.logger.warning(
|
95
|
-
|
103
|
+
self.logger.warning(
|
104
|
+
f"{self.exchange_manager.exchange_name.title()}'s websocket has no symbol to feed"
|
105
|
+
)
|
96
106
|
|
97
107
|
async def add_feed(self, feed_name):
|
98
108
|
if self.is_feed_available(feed_name):
|
@@ -213,6 +223,17 @@ class WebSocketExchange(abstract_websocket.AbstractWebsocketExchange):
|
|
213
223
|
for websocket in self.websocket_connectors:
|
214
224
|
websocket.add_pairs(pairs, watching_only=watching_only)
|
215
225
|
|
226
|
+
def _has_too_many_feeds_to_handle(self) -> bool:
|
227
|
+
if self.get_connector_max_handled_feeds() == octobot_trading.constants.NO_DATA_LIMIT:
|
228
|
+
return False
|
229
|
+
return self.get_connector_feeds_count() >= self.get_connector_max_handled_feeds()
|
230
|
+
|
231
|
+
def get_connector_feeds_count(self):
|
232
|
+
return self.websocket_connector.get_feeds_count(self.pairs, self.time_frames)
|
233
|
+
|
234
|
+
def get_connector_max_handled_feeds(self):
|
235
|
+
return self.websocket_connector.MAX_HANDLED_FEEDS
|
236
|
+
|
216
237
|
def clear(self):
|
217
238
|
super(WebSocketExchange, self).clear()
|
218
239
|
for connector in self.websocket_connectors:
|
{OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/modes/abstract_trading_mode.py
RENAMED
@@ -349,7 +349,7 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
|
|
349
349
|
return created_orders
|
350
350
|
|
351
351
|
async def single_exchange_process_optimize_initial_portfolio(
|
352
|
-
self, sellable_assets, target_asset: str, tickers: dict
|
352
|
+
self, sellable_assets: list, target_asset: str, tickers: dict
|
353
353
|
) -> list:
|
354
354
|
raise NotImplementedError("single_exchange_process_optimize_initial_portfolio is not implemented")
|
355
355
|
|
@@ -75,7 +75,7 @@ def get_assets_requiring_extra_price_data_to_convert(exchange_manager, sellable_
|
|
75
75
|
|
76
76
|
async def convert_assets_to_target_asset(trading_mode, sellable_assets: list, target_asset: str, tickers: dict) -> list:
|
77
77
|
created_orders = []
|
78
|
-
for asset in sellable_assets:
|
78
|
+
for asset in sorted(sellable_assets):
|
79
79
|
new_orders = await convert_asset_to_target_asset(
|
80
80
|
trading_mode, asset, target_asset, tickers, asset_amount=None
|
81
81
|
)
|
@@ -214,7 +214,7 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
|
|
214
214
|
wait_for_refresh=wait_for_refresh))
|
215
215
|
except IndexError:
|
216
216
|
if not self.channel.exchange_manager.is_simulated and create_order_producer_if_missing:
|
217
|
-
self.logger.
|
217
|
+
self.logger.info("Missing orders producer, starting one...")
|
218
218
|
await exchanges.create_authenticated_producer_from_parent(self.channel.exchange_manager,
|
219
219
|
self.__class__,
|
220
220
|
force_register_producer=True)
|
{OctoBot-Trading-2.4.92 → OctoBot-Trading-2.4.94}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -406,7 +406,7 @@ class Order(util.Initializable):
|
|
406
406
|
async def on_fill(self, force_fill=False, is_from_exchange_data=False, enable_associated_orders_creation=None):
|
407
407
|
enable_associated_orders_creation = self.state.enable_associated_orders_creation \
|
408
408
|
if (self.state and enable_associated_orders_creation is None) \
|
409
|
-
else (enable_associated_orders_creation
|
409
|
+
else (True if enable_associated_orders_creation is None else enable_associated_orders_creation)
|
410
410
|
logging.get_logger(self.get_logger_name()).debug(f"on_fill triggered for {self}")
|
411
411
|
if (self.is_open() and not self.is_refreshing()) or self.is_pending_creation():
|
412
412
|
with self.order_state_creation():
|
@@ -423,7 +423,7 @@ class Order(util.Initializable):
|
|
423
423
|
async def on_close(self, force_close=False, is_from_exchange_data=False, enable_associated_orders_creation=None):
|
424
424
|
enable_associated_orders_creation = self.state.enable_associated_orders_creation \
|
425
425
|
if (self.state and enable_associated_orders_creation is None) \
|
426
|
-
else (enable_associated_orders_creation
|
426
|
+
else (True if enable_associated_orders_creation is None else enable_associated_orders_creation)
|
427
427
|
with self.order_state_creation():
|
428
428
|
self.state = orders_states.CloseOrderState(
|
429
429
|
self, is_from_exchange_data=is_from_exchange_data,
|
@@ -437,7 +437,7 @@ class Order(util.Initializable):
|
|
437
437
|
):
|
438
438
|
enable_associated_orders_creation = self.state.enable_associated_orders_creation \
|
439
439
|
if (self.state and enable_associated_orders_creation is None) \
|
440
|
-
else (enable_associated_orders_creation
|
440
|
+
else (True if enable_associated_orders_creation is None else enable_associated_orders_creation)
|
441
441
|
with self.order_state_creation():
|
442
442
|
self.state = orders_states.CancelOrderState(
|
443
443
|
self, is_from_exchange_data=is_from_exchange_data,
|
@@ -106,6 +106,9 @@ class OrderState(state_class.State):
|
|
106
106
|
"""
|
107
107
|
try:
|
108
108
|
self.ensure_not_cleared(self.order)
|
109
|
+
self.get_logger().info(
|
110
|
+
f"Synchronizing order {self.order} with {self.order.exchange_manager.exchange_name} exchange"
|
111
|
+
)
|
109
112
|
await exchange_channel.get_chan(
|
110
113
|
octobot_trading.constants.ORDERS_CHANNEL,
|
111
114
|
self.order.exchange_manager.id
|
@@ -126,6 +129,9 @@ class OrderState(state_class.State):
|
|
126
129
|
if order.is_cleared():
|
127
130
|
raise octobot_trading.errors.InvalidOrderState(f"Order has already been cleared. Order: {order}")
|
128
131
|
|
132
|
+
def _is_synchronization_enabled(self):
|
133
|
+
return self.order.exchange_manager.exchange_personal_data.orders_manager.enable_order_auto_synchronization
|
134
|
+
|
129
135
|
def clear(self):
|
130
136
|
"""
|
131
137
|
Clear references
|
@@ -16,6 +16,7 @@
|
|
16
16
|
import collections
|
17
17
|
import uuid
|
18
18
|
import typing
|
19
|
+
import contextlib
|
19
20
|
|
20
21
|
import octobot_commons.logging as logging
|
21
22
|
|
@@ -35,7 +36,8 @@ class OrdersManager(util.Initializable):
|
|
35
36
|
super().__init__()
|
36
37
|
self.logger = logging.get_logger(self.__class__.__name__)
|
37
38
|
self.trader = trader
|
38
|
-
self.orders_initialized = False
|
39
|
+
self.orders_initialized = False
|
40
|
+
self.enable_order_auto_synchronization = True
|
39
41
|
self.orders = collections.OrderedDict()
|
40
42
|
self.order_groups = {}
|
41
43
|
# orders that are expected from exchange but have not yet been fetched: will be removed when fetched
|
@@ -222,6 +224,17 @@ class OrdersManager(util.Initializable):
|
|
222
224
|
self._add_order(order.order_id, order)
|
223
225
|
self._check_orders_size()
|
224
226
|
|
227
|
+
@contextlib.contextmanager
|
228
|
+
def disabled_order_auto_synchronization(self):
|
229
|
+
"""
|
230
|
+
Can be used to locally disable orders auto refresh when an order is pending
|
231
|
+
"""
|
232
|
+
self.enable_order_auto_synchronization = False
|
233
|
+
try:
|
234
|
+
yield
|
235
|
+
finally:
|
236
|
+
self.enable_order_auto_synchronization = True
|
237
|
+
|
225
238
|
# private methods
|
226
239
|
def _reset_orders(self):
|
227
240
|
self.orders_initialized = False
|
@@ -46,6 +46,9 @@ class PendingCreationOrderState(order_state.OrderState):
|
|
46
46
|
# If it turns out to be instantly closed, OctoBot will miss it as is will never be fetched with
|
47
47
|
# open orders refresh.
|
48
48
|
self.ensure_not_cleared(self.order)
|
49
|
+
self.get_logger().info(
|
50
|
+
f"Synchronizing order {self.order} with {self.order.exchange_manager.exchange_name} exchange"
|
51
|
+
)
|
49
52
|
while self.order.is_pending_creation() \
|
50
53
|
and time.time() - t0 < octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT:
|
51
54
|
iteration += 1
|
@@ -157,7 +157,7 @@ class State(util.Initializable):
|
|
157
157
|
else:
|
158
158
|
raise
|
159
159
|
finally:
|
160
|
-
self.has_already_been_synchronized_once =
|
160
|
+
self.has_already_been_synchronized_once = self._is_synchronization_enabled()
|
161
161
|
|
162
162
|
async def synchronize_with_exchange(self, force_synchronization: bool = False) -> None:
|
163
163
|
"""
|
@@ -166,6 +166,9 @@ class State(util.Initializable):
|
|
166
166
|
Restore the previous state if the refresh process fails
|
167
167
|
:param force_synchronization: When True, for the update of the order from the exchange
|
168
168
|
"""
|
169
|
+
if not self._is_synchronization_enabled():
|
170
|
+
self.get_logger().info(f"Skipped {self.__class__.__name__} exchange synchronization")
|
171
|
+
return
|
169
172
|
if self.is_refreshing():
|
170
173
|
self.log_event_message(enums.StatesMessages.ALREADY_SYNCHRONIZING)
|
171
174
|
else:
|
@@ -236,6 +239,9 @@ class State(util.Initializable):
|
|
236
239
|
"""
|
237
240
|
raise NotImplementedError("on_refresh_successful not implemented")
|
238
241
|
|
242
|
+
def _is_synchronization_enabled(self):
|
243
|
+
return True
|
244
|
+
|
239
245
|
def clear(self):
|
240
246
|
"""
|
241
247
|
Clear references
|
@@ -14,6 +14,7 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public
|
15
15
|
# License along with this library.
|
16
16
|
import collections
|
17
|
+
import typing
|
17
18
|
|
18
19
|
import octobot_commons.logging as logging
|
19
20
|
import octobot_commons.tree as commons_tree
|
@@ -86,14 +87,23 @@ class TradesManager(util.Initializable):
|
|
86
87
|
self.logger.warning(f"Trade without any registered fee: {trade.to_dict()}")
|
87
88
|
return total_fees
|
88
89
|
|
89
|
-
def
|
90
|
-
|
90
|
+
def get_completed_trade_pnl(
|
91
|
+
self, trade_id: typing.Optional[str], order_id: typing.Optional[str]
|
92
|
+
) -> typing.Optional[trade_pnl.TradePnl]:
|
93
|
+
pnls = []
|
94
|
+
trade = self.get_trade(trade_id) if trade_id else self.get_trade_from_order_id(order_id)
|
95
|
+
if trade:
|
96
|
+
pnls = self.get_completed_trades_pnl(selected_trades=[trade])
|
97
|
+
return pnls[0] if pnls else None
|
98
|
+
|
99
|
+
def get_completed_trades_pnl(self, trades_history=None, selected_trades=None) -> list[trade_pnl.TradePnl]:
|
100
|
+
trades = trades_history or self.get_trades()
|
91
101
|
trades_by_order_id = {
|
92
102
|
trade.origin_order_id: trade
|
93
103
|
for trade in trades
|
94
104
|
}
|
95
105
|
exits_by_entry_id = {}
|
96
|
-
for trade in trades:
|
106
|
+
for trade in (selected_trades or trades):
|
97
107
|
if trade.status is not enums.OrderStatus.CANCELED and trade.associated_entry_ids:
|
98
108
|
for entry_id in trade.associated_entry_ids:
|
99
109
|
if entry_id not in trades_by_order_id:
|
@@ -109,9 +119,14 @@ class TradesManager(util.Initializable):
|
|
109
119
|
for entry_id, exit_trade in exits_by_entry_id.items()
|
110
120
|
]
|
111
121
|
|
112
|
-
def get_trade(self, trade_id):
|
122
|
+
def get_trade(self, trade_id: str):
|
113
123
|
return self.trades[trade_id]
|
114
124
|
|
125
|
+
def get_trade_from_order_id(self, order_id: str):
|
126
|
+
if trades := self.get_trades(origin_order_id=order_id):
|
127
|
+
return trades[0]
|
128
|
+
return None
|
129
|
+
|
115
130
|
def get_trades(self, origin_order_id=None, exchange_order_id=None):
|
116
131
|
return [
|
117
132
|
trade
|
@@ -155,6 +155,14 @@ async def get_open_orders(
|
|
155
155
|
return open_orders
|
156
156
|
|
157
157
|
|
158
|
+
async def get_order(
|
159
|
+
exchange_manager,
|
160
|
+
exchange_order_id: str,
|
161
|
+
symbol: str,
|
162
|
+
) -> dict:
|
163
|
+
return await exchange_manager.exchange.get_order(exchange_order_id, symbol=symbol)
|
164
|
+
|
165
|
+
|
158
166
|
async def get_cancelled_orders(
|
159
167
|
exchange_manager,
|
160
168
|
exchange_data: exchange_data_import.ExchangeData,
|
@@ -245,5 +253,7 @@ async def wait_for_other_status(order: personal_data.Order, timeout) -> personal
|
|
245
253
|
return personal_data.create_order_instance_from_raw(
|
246
254
|
order.trader, raw_order, force_open_or_pending_creation=False
|
247
255
|
)
|
256
|
+
if time.time() - t0 + constants.CREATED_ORDER_FORCED_UPDATE_PERIOD >= timeout:
|
257
|
+
break
|
248
258
|
await asyncio.sleep(constants.CREATED_ORDER_FORCED_UPDATE_PERIOD)
|
249
259
|
raise TimeoutError(f"Order was not found with another status than {origin_status} within {timeout} seconds")
|