OctoBot-Trading 2.4.73__tar.gz → 2.4.75__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.73 → OctoBot-Trading-2.4.75}/CHANGELOG.md +10 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.73/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.75}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/README.md +1 -1
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/__init__.py +2 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/exchange.py +4 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/constants.py +8 -1
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/errors.py +6 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/__init__.py +4 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/abstract_exchange.py +19 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +6 -2
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/trader.py +5 -2
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/rest_exchange.py +15 -1
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/__init__.py +4 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/exchange_util.py +9 -1
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/orders.py +19 -1
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/orders_updater.py +1 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +4 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_factory.py +3 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/orders_storage_operations.py +28 -4
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/orders_storage.py +8 -2
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/exchanges_test_tools.py +37 -2
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/traders/test_trader.py +33 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/test_exchange_util.py +27 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/LICENSE +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/setup.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,16 @@ 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.75] - 2024-04-11
|
8
|
+
### Fixed
|
9
|
+
- [Exchanges] Properly handle order not found errors
|
10
|
+
- [Order] Rare synch issues on creation
|
11
|
+
- [Order] Missing ungrouped stop orders when restarting
|
12
|
+
|
13
|
+
## [2.4.74] - 2024-04-07
|
14
|
+
### Added
|
15
|
+
- [Exchanges] ExchangeCompliancyError error
|
16
|
+
|
7
17
|
## [2.4.73] - 2024-04-04
|
8
18
|
### Added
|
9
19
|
- [Exchanges] BinanceUS to full history exchanges
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.75
|
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.75](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.75
|
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.75](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.75](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)
|
@@ -121,6 +121,7 @@ from octobot_trading.api.exchange import (
|
|
121
121
|
get_auto_filled_exchange_names,
|
122
122
|
get_exchange_details,
|
123
123
|
is_api_permission_error,
|
124
|
+
is_exchange_rules_compliancy_error,
|
124
125
|
cancel_ccxt_throttle_task,
|
125
126
|
stop_exchange,
|
126
127
|
)
|
@@ -301,6 +302,7 @@ __all__ = [
|
|
301
302
|
"get_auto_filled_exchange_names",
|
302
303
|
"get_exchange_details",
|
303
304
|
"is_api_permission_error",
|
305
|
+
"is_exchange_rules_compliancy_error",
|
304
306
|
"cancel_ccxt_throttle_task",
|
305
307
|
"stop_exchange",
|
306
308
|
"get_trading_modes",
|
@@ -326,6 +326,10 @@ def is_api_permission_error(error: BaseException) -> bool:
|
|
326
326
|
return exchanges.is_api_permission_error(error)
|
327
327
|
|
328
328
|
|
329
|
+
def is_exchange_rules_compliancy_error(error: BaseException) -> bool:
|
330
|
+
return exchanges.is_exchange_rules_compliancy_error(error)
|
331
|
+
|
332
|
+
|
329
333
|
def cancel_ccxt_throttle_task():
|
330
334
|
for task in asyncio.all_tasks():
|
331
335
|
# manually cancel ccxt async throttle task since it apparently can't be cancelled otherwise
|
@@ -42,6 +42,7 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
|
|
42
42
|
ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
|
43
43
|
CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
|
44
44
|
CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
|
45
|
+
CREATED_ORDER_FORCED_UPDATE_PERIOD = 5
|
45
46
|
|
46
47
|
# Tentacles
|
47
48
|
TRADING_MODE_REQUIRED_STRATEGIES = "required_strategies"
|
@@ -104,6 +105,7 @@ TESTED_EXCHANGES = [
|
|
104
105
|
"kucoin",
|
105
106
|
"okx",
|
106
107
|
] + sorted([
|
108
|
+
"binanceus",
|
107
109
|
"coinbase",
|
108
110
|
"cryptocom",
|
109
111
|
"htx",
|
@@ -115,7 +117,6 @@ TESTED_EXCHANGES = [
|
|
115
117
|
"hollaex",
|
116
118
|
"mexc",
|
117
119
|
"bingx",
|
118
|
-
"bitget",
|
119
120
|
"coinex",
|
120
121
|
])
|
121
122
|
DEFAULT_FUTURE_EXCHANGES = sorted(["bybit"])
|
@@ -133,6 +134,12 @@ EXCHANGE_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = [
|
|
133
134
|
("permission_denied", )
|
134
135
|
]
|
135
136
|
|
137
|
+
# text content of errors due to exchange compliancy rules
|
138
|
+
EXCHANGE_COMPLIANCY_ERRORS: typing.List[typing.Iterable[str]] = [
|
139
|
+
# OKX ex: Trading of this pair or contract is restricted due to local compliance requirements
|
140
|
+
("restricted", "compliance"),
|
141
|
+
]
|
142
|
+
|
136
143
|
CONFIG_DEFAULT_FEES = 0.001
|
137
144
|
CONFIG_DEFAULT_SIMULATOR_FEES = 0
|
138
145
|
|
@@ -99,6 +99,12 @@ class AuthenticationError(Exception):
|
|
99
99
|
"""
|
100
100
|
|
101
101
|
|
102
|
+
class ExchangeCompliancyError(Exception):
|
103
|
+
"""
|
104
|
+
Raised when an exchange failed to execute the given request because of compliance rules for the current user account
|
105
|
+
"""
|
106
|
+
|
107
|
+
|
102
108
|
class PortfolioNegativeValueError(Exception):
|
103
109
|
"""
|
104
110
|
Raised when the portfolio is being updated with a negative value
|
@@ -77,6 +77,8 @@ from octobot_trading.exchanges.util import (
|
|
77
77
|
get_auto_filled_exchange_names,
|
78
78
|
get_exchange_details,
|
79
79
|
is_api_permission_error,
|
80
|
+
is_exchange_rules_compliancy_error,
|
81
|
+
is_error_on_this_type,
|
80
82
|
force_disable_web_socket,
|
81
83
|
check_web_socket_config,
|
82
84
|
search_websocket_class,
|
@@ -162,6 +164,8 @@ __all__ = [
|
|
162
164
|
"get_auto_filled_exchange_names",
|
163
165
|
"get_exchange_details",
|
164
166
|
"is_api_permission_error",
|
167
|
+
"is_exchange_rules_compliancy_error",
|
168
|
+
"is_error_on_this_type",
|
165
169
|
"AbstractExchange",
|
166
170
|
"is_channel_managed_by_websocket",
|
167
171
|
"is_channel_fully_managed_by_websocket",
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/abstract_exchange.py
RENAMED
@@ -17,6 +17,7 @@ import asyncio
|
|
17
17
|
import typing
|
18
18
|
import decimal
|
19
19
|
import time
|
20
|
+
import contextlib
|
20
21
|
|
21
22
|
import octobot_commons.constants
|
22
23
|
import octobot_commons.enums as common_enums
|
@@ -94,6 +95,8 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
94
95
|
|
95
96
|
self.is_unreachable = False
|
96
97
|
|
98
|
+
self._creating_exchange_order_ids = set()
|
99
|
+
|
97
100
|
if self.exchange_manager.tentacles_setup_config is not None:
|
98
101
|
self.load_user_inputs_from_class(self.exchange_manager.tentacles_setup_config, self.tentacle_config)
|
99
102
|
|
@@ -698,3 +701,19 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
698
701
|
def handle_token_error(self, error):
|
699
702
|
self.logger.error(f"Exchange configuration is invalid : please check your configuration ! "
|
700
703
|
f"({error.__class__.__name__}: {error})")
|
704
|
+
|
705
|
+
@contextlib.contextmanager
|
706
|
+
def creating_order(self, creating_order: dict):
|
707
|
+
exchange_order_id = creating_order.get(
|
708
|
+
enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value
|
709
|
+
) if creating_order else None
|
710
|
+
try:
|
711
|
+
self._creating_exchange_order_ids.add(exchange_order_id)
|
712
|
+
yield
|
713
|
+
finally:
|
714
|
+
self._creating_exchange_order_ids.remove(exchange_order_id)
|
715
|
+
|
716
|
+
def is_creating_order(self, exchange_order_id):
|
717
|
+
if exchange_order_id is None:
|
718
|
+
return False
|
719
|
+
return exchange_order_id in self._creating_exchange_order_ids
|
@@ -351,8 +351,12 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
351
351
|
# some exchanges are throwing this error when an order is cancelled (ex: coinbase pro)
|
352
352
|
raise octobot_trading.errors.NotSupported(e) from e
|
353
353
|
except ccxt.ExchangeError as e:
|
354
|
-
|
355
|
-
|
354
|
+
if self.exchange_manager.exchange.is_order_not_found_error(e):
|
355
|
+
# when an OrderNotFound error should have been raised but is not for some reason
|
356
|
+
pass
|
357
|
+
else:
|
358
|
+
# something went wrong and ccxt did not expect it
|
359
|
+
raise octobot_trading.errors.FailedRequest(e) from e
|
356
360
|
else:
|
357
361
|
# When fetch_order is not supported, uses get_open_orders or get_closed_orders and extract order id
|
358
362
|
for method in (self.get_open_orders, self.get_closed_orders):
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -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
|
#
|
@@ -117,7 +118,7 @@ class Trader(util.Initializable):
|
|
117
118
|
self.logger.warning(f"Order not created on {self.exchange_manager.exchange_name} "
|
118
119
|
f"(failed attempt to create: {order}). This is likely due to "
|
119
120
|
f"the order being refused by the exchange.")
|
120
|
-
except errors.MissingFunds:
|
121
|
+
except (errors.MissingFunds, errors.AuthenticationError, errors.ExchangeCompliancyError):
|
121
122
|
# forward errors that require actions to fix the situation
|
122
123
|
raise
|
123
124
|
except Exception as e:
|
@@ -278,7 +279,9 @@ class Trader(util.Initializable):
|
|
278
279
|
|
279
280
|
if is_pending_creation:
|
280
281
|
# register order as pending order, it will then be added to live orders in order manager once open
|
281
|
-
self.exchange_manager.exchange_personal_data.orders_manager.register_pending_creation_order(
|
282
|
+
self.exchange_manager.exchange_personal_data.orders_manager.register_pending_creation_order(
|
283
|
+
updated_order
|
284
|
+
)
|
282
285
|
|
283
286
|
await updated_order.initialize()
|
284
287
|
if is_pending_creation and wait_for_creation \
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -89,6 +89,9 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
89
89
|
# Set when order cost is not (yet) accurately computed for a given exchange
|
90
90
|
MAX_INCREASED_POSITION_QUANTITY_MULTIPLIER = constants.ONE
|
91
91
|
|
92
|
+
# text content of errors due to orders not found errors
|
93
|
+
EXCHANGE_ORDER_NOT_FOUND_ERRORS: typing.List[typing.Iterable[str]] = []
|
94
|
+
|
92
95
|
DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
|
93
96
|
|
94
97
|
def __init__(self, config, exchange_manager, connector_class=None):
|
@@ -152,7 +155,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
152
155
|
stop_price=stop_price, side=side, current_price=current_price,
|
153
156
|
reduce_only=reduce_only, params=params)
|
154
157
|
self.logger.debug(f"Created order: {created_order}")
|
155
|
-
|
158
|
+
with self.creating_order(created_order):
|
159
|
+
return await self._verify_order(created_order, order_type, symbol, price, side)
|
156
160
|
return None
|
157
161
|
|
158
162
|
async def edit_order(self, exchange_order_id: str, order_type: enums.TraderOrderType, symbol: str,
|
@@ -211,6 +215,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
211
215
|
raise errors.AuthenticationError(
|
212
216
|
f"Error when handling order {e}. Please make sure that trading permissions are on for this API key."
|
213
217
|
)
|
218
|
+
if exchanges_util.is_exchange_rules_compliancy_error(e):
|
219
|
+
raise errors.ExchangeCompliancyError(
|
220
|
+
f"Error when handling order {e}. Exchange is refusing this order request on this account because "
|
221
|
+
f"of its compliancy requirements."
|
222
|
+
)
|
214
223
|
self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
|
215
224
|
print(traceback.format_exc(), file=sys.stderr)
|
216
225
|
self.logger.exception(e, False, f"Unexpected error during order operation: {e}")
|
@@ -861,6 +870,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
861
870
|
def is_skipping_empty_candles_in_ohlcv_fetch(self):
|
862
871
|
return self.IS_SKIPPING_EMPTY_CANDLES_IN_OHLCV_FETCH
|
863
872
|
|
873
|
+
def is_order_not_found_error(self, error: BaseException) -> bool:
|
874
|
+
if self.EXCHANGE_ORDER_NOT_FOUND_ERRORS:
|
875
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_NOT_FOUND_ERRORS)
|
876
|
+
return False
|
877
|
+
|
864
878
|
"""
|
865
879
|
Auto fetched and filled exchanges
|
866
880
|
"""
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/__init__.py
RENAMED
@@ -45,6 +45,8 @@ from octobot_trading.exchanges.util.exchange_util import (
|
|
45
45
|
get_auto_filled_exchange_names,
|
46
46
|
get_exchange_details,
|
47
47
|
is_api_permission_error,
|
48
|
+
is_exchange_rules_compliancy_error,
|
49
|
+
is_error_on_this_type,
|
48
50
|
)
|
49
51
|
from octobot_trading.exchanges.util import websockets_util
|
50
52
|
from octobot_trading.exchanges.util.websockets_util import (
|
@@ -78,6 +80,8 @@ __all__ = [
|
|
78
80
|
"get_auto_filled_exchange_names",
|
79
81
|
"get_exchange_details",
|
80
82
|
"is_api_permission_error",
|
83
|
+
"is_exchange_rules_compliancy_error",
|
84
|
+
"is_error_on_this_type",
|
81
85
|
"force_disable_web_socket",
|
82
86
|
"check_web_socket_config",
|
83
87
|
"search_websocket_class",
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/octobot_trading/exchanges/util/exchange_util.py
RENAMED
@@ -429,8 +429,16 @@ def get_associated_symbol(exchange_manager, asset: str, target_asset: str) -> (t
|
|
429
429
|
|
430
430
|
|
431
431
|
def is_api_permission_error(error: BaseException) -> bool:
|
432
|
+
return is_error_on_this_type(error, constants.EXCHANGE_PERMISSION_ERRORS)
|
433
|
+
|
434
|
+
|
435
|
+
def is_exchange_rules_compliancy_error(error: BaseException) -> bool:
|
436
|
+
return is_error_on_this_type(error, constants.EXCHANGE_COMPLIANCY_ERRORS)
|
437
|
+
|
438
|
+
|
439
|
+
def is_error_on_this_type(error: BaseException, descriptions: typing.List[typing.Iterable[str]]) -> bool:
|
432
440
|
lower_error = str(error).lower()
|
433
|
-
for identifiers in
|
441
|
+
for identifiers in descriptions:
|
434
442
|
if all(identifier in lower_error for identifier in identifiers):
|
435
443
|
return True
|
436
444
|
return False
|
@@ -36,11 +36,19 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
|
|
36
36
|
pending_groups = {} # Used when restoring orders from order storage:
|
37
37
|
# a dict of order groups for which to check if associated self-managed orders are to be created
|
38
38
|
for order in orders:
|
39
|
+
exchange_order_id: str = self.channel.exchange_manager.exchange.parse_exhange_order_id(order)
|
39
40
|
symbol = self.channel.exchange_manager.get_exchange_symbol(
|
40
41
|
self.channel.exchange_manager.exchange.parse_order_symbol(order)
|
41
42
|
)
|
43
|
+
if self.channel.exchange_manager.exchange.is_creating_order(exchange_order_id):
|
44
|
+
# ignore orders that are being created
|
45
|
+
self.logger.debug(
|
46
|
+
f"Ignored update from order channel for {symbol} order with exchange order id "
|
47
|
+
f"{exchange_order_id} as "
|
48
|
+
f"this order is being created and will automatically be updated once creation is complete."
|
49
|
+
)
|
50
|
+
continue
|
42
51
|
symbols.add(symbol)
|
43
|
-
exchange_order_id: str = self.channel.exchange_manager.exchange.parse_exhange_order_id(order)
|
44
52
|
|
45
53
|
# if this order was not managed by order_manager before
|
46
54
|
is_new_order = not self.channel.exchange_manager.exchange_personal_data.orders_manager. \
|
@@ -83,6 +91,16 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
|
|
83
91
|
except Exception as e:
|
84
92
|
self.logger.exception(e, True, f"Exception when triggering update: {e}")
|
85
93
|
|
94
|
+
async def _restore_required_virtual_orders(self):
|
95
|
+
"""
|
96
|
+
Restore virtual orders that would not be restored otherwise
|
97
|
+
Should only be called once or will create the same virtual orders multiple times
|
98
|
+
"""
|
99
|
+
pending_groups = {}
|
100
|
+
await orders_storage_operations.create_required_virtual_orders(
|
101
|
+
pending_groups, self.channel.exchange_manager
|
102
|
+
)
|
103
|
+
|
86
104
|
async def _handle_open_order_update(
|
87
105
|
self, symbol, order_dict, exchange_order_id, is_from_bot, is_new_order, pending_groups
|
88
106
|
):
|
@@ -76,6 +76,7 @@ class OrdersUpdater(orders_channel.OrdersProducer):
|
|
76
76
|
self.DEPENDENCIES_TIMEOUT
|
77
77
|
)
|
78
78
|
await self.fetch_and_push(is_from_bot=False, retry_till_success=True)
|
79
|
+
await self._restore_required_virtual_orders()
|
79
80
|
except errors.NotSupported:
|
80
81
|
self.logger.error(f"{self.channel.exchange_manager.exchange_name} is not supporting open orders updates")
|
81
82
|
await self.pause()
|
@@ -13,6 +13,8 @@
|
|
13
13
|
#
|
14
14
|
# You should have received a copy of the GNU Lesser General Public
|
15
15
|
# License along with this library.
|
16
|
+
import octobot_commons.logging as logging
|
17
|
+
|
16
18
|
import octobot_trading.personal_data as personal_data
|
17
19
|
import octobot_trading.enums as enums
|
18
20
|
import octobot_trading.constants as constants
|
@@ -150,3 +152,4 @@ async def restore_chained_orders_from_storage_order_details(order, order_details
|
|
150
152
|
**chained_order.get(enums.StoredOrdersAttr.TRADER_CREATION_KWARGS.value, {}),
|
151
153
|
)
|
152
154
|
order.add_chained_order(chained_order_inst)
|
155
|
+
logging.get_logger(order.get_logger_name()).debug(f"Restored chained order: {chained_order_inst}")
|
@@ -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 octobot_commons.logging as logging
|
17
|
+
import octobot_trading.enums as enums
|
17
18
|
import octobot_trading.personal_data.orders.order_factory as order_factory
|
18
19
|
import octobot_trading.personal_data.orders.groups.group_util as group_util
|
19
20
|
|
@@ -30,6 +31,7 @@ async def apply_order_storage_details_if_any(order, exchange_manager, pending_gr
|
|
30
31
|
order.exchange_order_id
|
31
32
|
)
|
32
33
|
if order_details:
|
34
|
+
logging.get_logger(LOGGER_NAME).debug(f"Updating fetched order {order} using stored order details")
|
33
35
|
order.update_from_storage_order_details(order_details)
|
34
36
|
await create_orders_storage_related_elements(order, order_details, exchange_manager, pending_groups)
|
35
37
|
|
@@ -45,21 +47,43 @@ async def create_orders_storage_related_elements(order, order_storage_details, e
|
|
45
47
|
)
|
46
48
|
|
47
49
|
|
50
|
+
async def create_order_from_storage_data(order_desc: dict, exchange_manager, pending_groups):
|
51
|
+
created_order = await order_factory.create_order_from_order_storage_details(
|
52
|
+
order_desc, exchange_manager, pending_groups
|
53
|
+
)
|
54
|
+
await created_order.initialize()
|
55
|
+
return created_order
|
56
|
+
|
57
|
+
|
48
58
|
async def _create_storage_self_managed_orders_from_group(pending_group_id, exchange_manager, pending_groups):
|
49
59
|
try:
|
50
60
|
to_create_orders = exchange_manager.storage_manager.orders_storage \
|
51
61
|
.get_startup_self_managed_orders_details_from_group(pending_group_id)
|
52
62
|
for order_desc in to_create_orders:
|
53
|
-
|
54
|
-
order_desc, exchange_manager, pending_groups
|
55
|
-
)
|
56
|
-
await created_order.initialize()
|
63
|
+
await create_order_from_storage_data(order_desc, exchange_manager, pending_groups)
|
57
64
|
except Exception as err:
|
58
65
|
logging.get_logger(LOGGER_NAME).exception(
|
59
66
|
err, True, f"Error when creating {pending_group_id} group self-managed orders with stored data: {err}"
|
60
67
|
)
|
61
68
|
|
62
69
|
|
70
|
+
async def create_required_virtual_orders(pending_groups, exchange_manager):
|
71
|
+
virtual_orders = exchange_manager.storage_manager.orders_storage.get_all_self_managed_startup_orders()
|
72
|
+
# virtual order that are not within a group will only be restored here
|
73
|
+
virtual_non_grouped_order_details = [
|
74
|
+
order
|
75
|
+
for order in virtual_orders
|
76
|
+
if order.get(enums.StoredOrdersAttr.GROUP.value, {}) == {}
|
77
|
+
]
|
78
|
+
logger = logging.get_logger(LOGGER_NAME)
|
79
|
+
for order_details in virtual_non_grouped_order_details:
|
80
|
+
try:
|
81
|
+
order = await create_order_from_storage_data(order_details, exchange_manager, pending_groups)
|
82
|
+
logger.debug(f"Restored order from storage: {order}")
|
83
|
+
except Exception as err:
|
84
|
+
logger.exception(err, True, f"Error when restoring virtual order order using stored data: {err}")
|
85
|
+
|
86
|
+
|
63
87
|
async def create_missing_self_managed_orders_from_storage_order_groups(pending_groups, exchange_manager):
|
64
88
|
# create order groups' associated self-managed orders if any
|
65
89
|
to_complete_groups = list(pending_groups.keys())
|
@@ -124,10 +124,16 @@ class OrdersStorage(abstract_storage.AbstractStorage):
|
|
124
124
|
def get_startup_self_managed_orders_details_from_group(self, group_id):
|
125
125
|
return [
|
126
126
|
order
|
127
|
-
for order in self.
|
127
|
+
for order in self.get_all_self_managed_startup_orders()
|
128
128
|
if order.get(enums.StoredOrdersAttr.GROUP.value, {}).get(enums.StoredOrdersAttr.GROUP_ID.value, None)
|
129
129
|
== group_id
|
130
|
-
|
130
|
+
]
|
131
|
+
|
132
|
+
def get_all_self_managed_startup_orders(self):
|
133
|
+
return [
|
134
|
+
order
|
135
|
+
for order in self.startup_orders.values()
|
136
|
+
if order.get(constants.STORAGE_ORIGIN_VALUE, {})
|
131
137
|
.get(enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value, False)
|
132
138
|
]
|
133
139
|
|
@@ -21,6 +21,8 @@ import typing
|
|
21
21
|
import octobot_commons.asyncio_tools as asyncio_tools
|
22
22
|
import octobot_commons.enums as common_enums
|
23
23
|
import octobot_commons.constants as commons_constants
|
24
|
+
import octobot_commons.logging as logging
|
25
|
+
import octobot_trading.constants as constants
|
24
26
|
import octobot_trading.enums as enums
|
25
27
|
import octobot_trading.api as trading_api
|
26
28
|
import octobot_trading.exchanges as exchanges
|
@@ -172,7 +174,12 @@ async def get_trades(
|
|
172
174
|
return trades
|
173
175
|
|
174
176
|
|
175
|
-
async def create_orders(
|
177
|
+
async def create_orders(
|
178
|
+
exchange_manager,
|
179
|
+
exchange_data: exchange_data_import.ExchangeData,
|
180
|
+
orders: list,
|
181
|
+
order_creation_timeout: float
|
182
|
+
) -> list:
|
176
183
|
async def _create_order(order_dict) -> personal_data.Order:
|
177
184
|
symbol = order_dict[enums.ExchangeConstantsOrderColumns.SYMBOL.value]
|
178
185
|
side, order_type = personal_data.parse_order_type(order_dict)
|
@@ -186,8 +193,36 @@ async def create_orders(exchange_manager, exchange_data: exchange_data_import.Ex
|
|
186
193
|
reduce_only=order_dict[enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value],
|
187
194
|
)
|
188
195
|
# is private, to use in tests context only
|
189
|
-
|
196
|
+
order = personal_data.create_order_instance_from_raw(
|
190
197
|
exchange_manager.trader, created_order, force_open_or_pending_creation=True
|
191
198
|
) if created_order else None
|
199
|
+
if not order:
|
200
|
+
return order
|
201
|
+
if order.status is enums.OrderStatus.PENDING_CREATION and order_creation_timeout > 0:
|
202
|
+
try:
|
203
|
+
return await wait_for_other_status(order, order_creation_timeout)
|
204
|
+
except TimeoutError as err:
|
205
|
+
logging.get_logger(order.get_logger_name()).error(f"Created order can't be fetched: {err}")
|
206
|
+
return None
|
207
|
+
return order
|
192
208
|
|
193
209
|
return await asyncio.gather(*(_create_order(order_dict) for order_dict in orders))
|
210
|
+
|
211
|
+
|
212
|
+
async def wait_for_other_status(order: personal_data.Order, timeout) -> personal_data.Order:
|
213
|
+
t0 = time.time()
|
214
|
+
iterations = 0
|
215
|
+
origin_status = order.status.value
|
216
|
+
while time.time() - t0 < timeout:
|
217
|
+
raw_order = await order.exchange_manager.exchange.get_order(order.exchange_order_id, order.symbol)
|
218
|
+
iterations += 1
|
219
|
+
if raw_order is not None and raw_order[enums.ExchangeConstantsOrderColumns.STATUS.value] != origin_status:
|
220
|
+
logging.get_logger(order.get_logger_name()).info(
|
221
|
+
f"Order fetched with status different from {origin_status} after {iterations} "
|
222
|
+
f"iterations and {round(time.time() - t0)}s"
|
223
|
+
)
|
224
|
+
return personal_data.create_order_instance_from_raw(
|
225
|
+
order.trader, raw_order, force_open_or_pending_creation=False
|
226
|
+
)
|
227
|
+
await asyncio.sleep(constants.CREATED_ORDER_FORCED_UPDATE_PERIOD)
|
228
|
+
raise TimeoutError(f"Order was not found with another status than {origin_status} within {timeout} seconds")
|
@@ -18,6 +18,7 @@ import os
|
|
18
18
|
import ccxt.async_support
|
19
19
|
import decimal
|
20
20
|
|
21
|
+
import mock
|
21
22
|
import pytest
|
22
23
|
import time
|
23
24
|
from mock import AsyncMock, patch, Mock
|
@@ -28,6 +29,7 @@ import octobot_commons.constants as commons_constants
|
|
28
29
|
from octobot_commons.asyncio_tools import wait_asyncio_next_cycle
|
29
30
|
from octobot_commons.tests.test_config import load_test_config
|
30
31
|
from octobot_trading.personal_data.orders import Order
|
32
|
+
import octobot_trading.errors as errors
|
31
33
|
from octobot_trading.enums import TraderOrderType, TradeOrderSide, TradeOrderType, OrderStatus, \
|
32
34
|
ExchangeConstantsPositionColumns, PositionMode, MarginType, TakeProfitStopLossMode, ExchangeSupportedElements
|
33
35
|
from octobot_trading.exchanges.exchange_manager import ExchangeManager
|
@@ -1080,6 +1082,37 @@ async def test__has_open_position(future_trader_simulator_with_default_linear):
|
|
1080
1082
|
assert trader_inst._has_open_position(DEFAULT_FUTURE_SYMBOL)
|
1081
1083
|
|
1082
1084
|
|
1085
|
+
async def test_create_order(future_trader_simulator_with_default_linear):
|
1086
|
+
_, exchange_manager_inst, trader_inst, default_contract = future_trader_simulator_with_default_linear
|
1087
|
+
order_mock = mock.Mock()
|
1088
|
+
with mock.patch.object(trader_inst, "_create_new_order", mock.AsyncMock()) as _create_new_order_mock:
|
1089
|
+
assert await trader_inst.create_order(order_mock)
|
1090
|
+
_create_new_order_mock.assert_called_once_with(
|
1091
|
+
order_mock, {}, wait_for_creation=True, creation_timeout=constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
|
1092
|
+
)
|
1093
|
+
for err in (errors.MissingFunds, errors.AuthenticationError, errors.ExchangeCompliancyError):
|
1094
|
+
with mock.patch.object(
|
1095
|
+
trader_inst, "_create_new_order", mock.AsyncMock(side_effect=err)
|
1096
|
+
) as _create_new_order_mock:
|
1097
|
+
with pytest.raises(err):
|
1098
|
+
assert await trader_inst.create_order(
|
1099
|
+
order_mock, params="params", wait_for_creation=False, creation_timeout=1
|
1100
|
+
)
|
1101
|
+
_create_new_order_mock.assert_called_once_with(
|
1102
|
+
order_mock, "params", wait_for_creation=False, creation_timeout=1
|
1103
|
+
)
|
1104
|
+
with mock.patch.object(
|
1105
|
+
trader_inst, "_create_new_order", mock.AsyncMock(side_effect=ZeroDivisionError)
|
1106
|
+
) as _create_new_order_mock:
|
1107
|
+
# does not raise
|
1108
|
+
assert await trader_inst.create_order(
|
1109
|
+
order_mock, params="params", wait_for_creation=False, creation_timeout=1
|
1110
|
+
) is None
|
1111
|
+
_create_new_order_mock.assert_called_once_with(
|
1112
|
+
order_mock, "params", wait_for_creation=False, creation_timeout=1
|
1113
|
+
)
|
1114
|
+
|
1115
|
+
|
1083
1116
|
def make_coroutine(response):
|
1084
1117
|
async def coroutine(*args, **kwargs):
|
1085
1118
|
return response
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/tests/exchanges/util/test_exchange_util.py
RENAMED
@@ -19,7 +19,9 @@ import mock
|
|
19
19
|
import trading_backend.exchanges
|
20
20
|
import octobot_commons.constants as commons_constants
|
21
21
|
import octobot_commons.configuration as commons_configuration
|
22
|
+
import octobot_trading.constants as constants
|
22
23
|
import octobot_trading.exchanges as exchanges
|
24
|
+
import octobot_trading.exchanges.util.exchange_util as exchange_util
|
23
25
|
|
24
26
|
from tests import event_loop
|
25
27
|
from tests.exchanges import MockedRestExchange, MockedAutoFillRestExchange
|
@@ -240,3 +242,28 @@ async def test_get_exchange_details(tentacles_setup_config, supported_exchanges)
|
|
240
242
|
)
|
241
243
|
assert details == supported_exchanges["blip"]
|
242
244
|
get_tentacle_config_mock.assert_called_once()
|
245
|
+
|
246
|
+
|
247
|
+
def test_is_api_permission_error():
|
248
|
+
with mock.patch.object(exchange_util, "is_error_on_this_type") as is_error_on_this_type_mock:
|
249
|
+
err = Exception("plop")
|
250
|
+
exchanges.is_api_permission_error(err)
|
251
|
+
is_error_on_this_type_mock.assert_called_once_with(
|
252
|
+
err, constants.EXCHANGE_PERMISSION_ERRORS
|
253
|
+
)
|
254
|
+
|
255
|
+
|
256
|
+
def test_is_exchange_rules_compliancy_error():
|
257
|
+
with mock.patch.object(exchange_util, "is_error_on_this_type") as is_error_on_this_type_mock:
|
258
|
+
err = Exception("plop")
|
259
|
+
exchanges.is_exchange_rules_compliancy_error(err)
|
260
|
+
is_error_on_this_type_mock.assert_called_once_with(
|
261
|
+
err, constants.EXCHANGE_COMPLIANCY_ERRORS
|
262
|
+
)
|
263
|
+
|
264
|
+
|
265
|
+
def test_is_error_on_this_type():
|
266
|
+
assert exchange_util.is_error_on_this_type(Exception("plop"), constants.EXCHANGE_PERMISSION_ERRORS) is False
|
267
|
+
assert exchange_util.is_error_on_this_type(Exception("api key"), constants.EXCHANGE_PERMISSION_ERRORS) is True
|
268
|
+
assert exchange_util.is_error_on_this_type(Exception("api"), constants.EXCHANGE_PERMISSION_ERRORS) is False
|
269
|
+
assert exchange_util.is_error_on_this_type(Exception("api"), constants.EXCHANGE_COMPLIANCY_ERRORS) is False
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.73 → OctoBot-Trading-2.4.75}/OctoBot_Trading.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|