OctoBot-Trading 2.4.153__tar.gz → 2.4.155__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.153 → OctoBot-Trading-2.4.155}/CHANGELOG.md +10 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/requires.txt +2 -1
- {OctoBot-Trading-2.4.153/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.155}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/README.md +1 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/errors.py +6 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/proxy_config.py +5 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +59 -4
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +14 -4
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_builder.py +4 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_factory.py +5 -2
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_manager.py +1 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/trader.py +50 -30
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/rest_exchange.py +7 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/exchange_util.py +8 -2
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +11 -7
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order.py +1 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_util.py +1 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/requirements.txt +2 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +8 -1
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/LICENSE +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/constants.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/setup.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitmart.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitmex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/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.155] - 2025-02-03
|
8
|
+
### Added
|
9
|
+
[Exchanges] handle Socks proxies
|
10
|
+
### Updated
|
11
|
+
[Trader] enable edit_order when without enable_order_auto_synchronization
|
12
|
+
|
13
|
+
## [2.4.154] - 2025-01-31
|
14
|
+
### Added
|
15
|
+
[Exchanges] handle InvalidAPIKeyIPWhitelistError
|
16
|
+
|
7
17
|
## [2.4.153] - 2025-01-29
|
8
18
|
### Updated
|
9
19
|
[TradingMode] make register_chained_order more flexible
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.155
|
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.155](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)
|
@@ -3,8 +3,9 @@ OctoBot-Backtesting<1.10,>=1.9
|
|
3
3
|
Async-Channel<2.3,>=2.2
|
4
4
|
OctoBot-Commons<1.10,>=1.9.64
|
5
5
|
OctoBot-Tentacles-Manager<2.10,>=2.9
|
6
|
-
trading-backend>=1.2.
|
6
|
+
trading-backend>=1.2.35
|
7
7
|
ccxt==4.3.85
|
8
|
+
aiohttp_socks==0.10.1
|
8
9
|
cryptography
|
9
10
|
sortedcontainers==2.4.0
|
10
11
|
tinydb==4.5.2
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.155
|
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.155](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.155](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)
|
@@ -147,6 +147,12 @@ class AuthenticationError(OctoBotExchangeError):
|
|
147
147
|
"""
|
148
148
|
|
149
149
|
|
150
|
+
class InvalidAPIKeyIPWhitelistError(AuthenticationError):
|
151
|
+
"""
|
152
|
+
Raised when an exchange failed to authenticate due to an IP whitelist issue
|
153
|
+
"""
|
154
|
+
|
155
|
+
|
150
156
|
class ExchangeInternalSyncError(OctoBotExchangeError):
|
151
157
|
"""
|
152
158
|
Raised when an exchange is returning an error due to its internal sync process
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/config/proxy_config.py
RENAMED
@@ -33,9 +33,13 @@ class ProxyConfig:
|
|
33
33
|
# if set, will be called when exchange stops
|
34
34
|
stop_proxy_callback: typing.Optional[typing.Callable] = None
|
35
35
|
# if set, returns the last url given to a callback method that return "True", meaning the last url that used a proxy
|
36
|
-
get_last_proxied_request_url: typing.Optional[typing.Callable] = None
|
36
|
+
get_last_proxied_request_url: typing.Optional[typing.Callable[[], typing.Optional[str]]] = None
|
37
|
+
get_proxy_url: typing.Optional[typing.Callable[[], str]] = None
|
37
38
|
# the host of this proxy, used to identify proxy connexion errors
|
38
39
|
proxy_host: str = "DEFAULT PROXY HOST"
|
40
|
+
# if DNS cache should be disabled with this proxy config. Warning: in this case, DNS cache will be
|
41
|
+
# completely disabled for this exchange
|
42
|
+
disable_dns_cache: bool = False
|
39
43
|
|
40
44
|
@classmethod
|
41
45
|
def default_env_var_config(cls):
|
@@ -14,7 +14,9 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public
|
15
15
|
# License along with this library.
|
16
16
|
import asyncio
|
17
|
+
import aiohttp_socks
|
17
18
|
import os
|
19
|
+
import ssl
|
18
20
|
import aiohttp
|
19
21
|
import copy
|
20
22
|
import logging
|
@@ -143,7 +145,10 @@ def instantiate_exchange(
|
|
143
145
|
client = exchange_class(config)
|
144
146
|
_use_proxy_if_necessary(client, proxy_config)
|
145
147
|
if constants.ENABLE_CCXT_REQUESTS_COUNTER and allow_request_counter:
|
146
|
-
|
148
|
+
if proxy_config.socks_proxy or proxy_config.socks_proxy_callback:
|
149
|
+
commons_logging.get_logger(__name__).error("socks proxy and request counter can't yet be used together.")
|
150
|
+
else:
|
151
|
+
_use_request_counter(identifier, client, proxy_config)
|
147
152
|
return client
|
148
153
|
|
149
154
|
|
@@ -304,6 +309,51 @@ def _use_proxy_if_necessary(client, proxy_config: proxy_config_import.ProxyConfi
|
|
304
309
|
client.socks_proxy = proxy_config.socks_proxy
|
305
310
|
if proxy_config.socks_proxy_callback:
|
306
311
|
client.socks_proxy_callback = proxy_config.socks_proxy_callback
|
312
|
+
if proxy_config.socks_proxy or proxy_config.socks_proxy_callback:
|
313
|
+
# rewrite of async_ccxt.exchange.client.fetch() ProxyConnector creation
|
314
|
+
_init_ccxt_client_session_requirements(client)
|
315
|
+
proxy_url = proxy_config.get_proxy_url()
|
316
|
+
if (client.socks_proxy_sessions is None):
|
317
|
+
client.socks_proxy_sessions = {}
|
318
|
+
if (proxy_url not in client.socks_proxy_sessions):
|
319
|
+
connector = aiohttp_socks.ProxyConnector.from_url(
|
320
|
+
proxy_url,
|
321
|
+
# extra args copied from self.open()
|
322
|
+
ssl=client.ssl_context,
|
323
|
+
loop=client.asyncio_loop,
|
324
|
+
use_dns_cache=not proxy_config.disable_dns_cache,
|
325
|
+
enable_cleanup_closed=True
|
326
|
+
)
|
327
|
+
client.socks_proxy_sessions[proxy_url] = aiohttp.ClientSession(
|
328
|
+
loop=client.asyncio_loop, connector=connector, trust_env=client.aiohttp_trust_env
|
329
|
+
)
|
330
|
+
elif proxy_config.disable_dns_cache:
|
331
|
+
# rewrite of async_ccxt.exchange.client.open()
|
332
|
+
_init_ccxt_client_session_requirements(client)
|
333
|
+
if client.session:
|
334
|
+
# should not happen
|
335
|
+
asyncio.create_task(client.session.close())
|
336
|
+
connector = aiohttp.TCPConnector(
|
337
|
+
ssl=client.ssl_context, loop=client.asyncio_loop, enable_cleanup_closed=True,
|
338
|
+
# local overrides
|
339
|
+
use_dns_cache=False
|
340
|
+
# end local overrides
|
341
|
+
)
|
342
|
+
client.session = aiohttp.ClientSession(
|
343
|
+
loop=client.asyncio_loop, connector=connector, trust_env=client.aiohttp_trust_env
|
344
|
+
)
|
345
|
+
|
346
|
+
|
347
|
+
def _init_ccxt_client_session_requirements(client):
|
348
|
+
# from async_ccxt.exchange.client.open()
|
349
|
+
if client.asyncio_loop is None:
|
350
|
+
client.asyncio_loop = asyncio.get_running_loop()
|
351
|
+
client.throttle.loop = client.asyncio_loop
|
352
|
+
|
353
|
+
if client.ssl_context is None:
|
354
|
+
# Create our SSL context object with our CA cert file
|
355
|
+
client.ssl_context = ssl.create_default_context(cafile=client.cafile) if client.verify else client.verify
|
356
|
+
|
307
357
|
|
308
358
|
|
309
359
|
def _get_client_config(
|
@@ -372,7 +422,9 @@ def _get_patched_url_config(url_config: dict, old: str, new: str):
|
|
372
422
|
return updated_config
|
373
423
|
|
374
424
|
|
375
|
-
def _use_request_counter(
|
425
|
+
def _use_request_counter(
|
426
|
+
identifier: str, ccxt_client: async_ccxt.Exchange, proxy_config: proxy_config_import.ProxyConfig
|
427
|
+
):
|
376
428
|
"""
|
377
429
|
Replaces the given exchange async session by an aiohttp_util.CounterClientSession
|
378
430
|
WARNING: should only be called right after creating the exchange and on the same async loop as
|
@@ -387,7 +439,8 @@ def _use_request_counter(identifier: str, ccxt_client: async_ccxt.Exchange):
|
|
387
439
|
# same as in ccxt.async_support.exchange.py#open()
|
388
440
|
# connector = aiohttp.TCPConnector(ssl=self.ssl_context, loop=self.asyncio_loop, enable_cleanup_closed=True)
|
389
441
|
new_connector = aiohttp.TCPConnector(
|
390
|
-
ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop,
|
442
|
+
ssl=ccxt_client.ssl_context, loop=ccxt_client.asyncio_loop,
|
443
|
+
enable_cleanup_closed=True, use_dns_cache=not proxy_config.disable_dns_cache
|
391
444
|
)
|
392
445
|
counter_session = aiohttp_util.CounterClientSession(
|
393
446
|
identifier,
|
@@ -440,7 +493,9 @@ def get_proxy_error_if_any(ccxt_connector, error: Exception) -> typing.Optional[
|
|
440
493
|
depth = 1
|
441
494
|
cause_error = error
|
442
495
|
while cause_error and depth < max_depth:
|
443
|
-
if isinstance(cause_error, (
|
496
|
+
if isinstance(cause_error, (
|
497
|
+
aiohttp.ClientProxyConnectionError, aiohttp.ClientHttpProxyError, aiohttp_socks.ProxyConnectionError
|
498
|
+
)) or (
|
444
499
|
isinstance(cause_error, aiohttp.ClientConnectorError)
|
445
500
|
and ccxt_connector.exchange_manager.proxy_config.proxy_host in str(cause_error)
|
446
501
|
):
|
@@ -18,6 +18,7 @@ import contextlib
|
|
18
18
|
import decimal
|
19
19
|
import ccxt.async_support as ccxt
|
20
20
|
import ccxt.static_dependencies.ecdsa.der
|
21
|
+
import aiohttp_socks
|
21
22
|
import typing
|
22
23
|
import inspect
|
23
24
|
import binascii
|
@@ -79,7 +80,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
79
80
|
self, config, exchange_manager, adapter_class=None, additional_config=None, rest_name=None, force_auth=False
|
80
81
|
):
|
81
82
|
super().__init__(config, exchange_manager, None)
|
82
|
-
self.client = None
|
83
|
+
self.client: ccxt.Exchange = None
|
83
84
|
self.exchange_type = None
|
84
85
|
self.adapter = self.get_adapter_class(adapter_class)(self)
|
85
86
|
self.all_currencies_price_ticker = None
|
@@ -1033,11 +1034,16 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
1033
1034
|
f"Request timeout: {html_util.get_html_summary_if_relevant(err)}"
|
1034
1035
|
) from err
|
1035
1036
|
except ccxt.AuthenticationError as err:
|
1037
|
+
error_class = (
|
1038
|
+
octobot_trading.errors.InvalidAPIKeyIPWhitelistError
|
1039
|
+
if self.exchange_manager.exchange.is_ip_whitelist_error(err)
|
1040
|
+
else octobot_trading.errors.AuthenticationError
|
1041
|
+
)
|
1036
1042
|
self.raise_or_prefix_proxy_error_if_relevant(
|
1037
1043
|
err,
|
1038
|
-
|
1044
|
+
error_class(html_util.get_html_summary_if_relevant(err))
|
1039
1045
|
)
|
1040
|
-
except ccxt.ExchangeNotAvailable as err:
|
1046
|
+
except (ccxt.ExchangeNotAvailable, aiohttp_socks.ProxyConnectionError) as err:
|
1041
1047
|
self.raise_or_prefix_proxy_error_if_relevant(
|
1042
1048
|
err,
|
1043
1049
|
octobot_trading.errors.FailedRequest(
|
@@ -1045,8 +1051,12 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
1045
1051
|
)
|
1046
1052
|
)
|
1047
1053
|
except ccxt.ExchangeError as err:
|
1054
|
+
error_message = html_util.get_html_summary_if_relevant(err)
|
1055
|
+
if self.exchange_manager.exchange.is_ip_whitelist_error(err):
|
1056
|
+
# ensure this is not an IP whitelist error
|
1057
|
+
raise octobot_trading.errors.InvalidAPIKeyIPWhitelistError(error_message) from err
|
1048
1058
|
if self.exchange_manager.exchange.is_authentication_error(err):
|
1049
1059
|
# ensure this is not an unhandled authentication error
|
1050
|
-
raise octobot_trading.errors.AuthenticationError(
|
1060
|
+
raise octobot_trading.errors.AuthenticationError(error_message) from err
|
1051
1061
|
# otherwise just forward exception
|
1052
1062
|
raise
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_builder.py
RENAMED
@@ -257,6 +257,10 @@ class ExchangeBuilder:
|
|
257
257
|
self.exchange_manager.without_auth = True
|
258
258
|
return self
|
259
259
|
|
260
|
+
def disable_unauth_retry(self, disabled):
|
261
|
+
self.exchange_manager.disable_unauth_retry = disabled
|
262
|
+
return self
|
263
|
+
|
260
264
|
def is_checking_credentials(self, check_credentials):
|
261
265
|
self.exchange_manager.check_credentials = check_credentials
|
262
266
|
return self
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_factory.py
RENAMED
@@ -62,10 +62,13 @@ async def create_real_exchange(exchange_manager, exchange_config_by_exchange: ty
|
|
62
62
|
return
|
63
63
|
await _initialize_exchange_backend(exchange_manager)
|
64
64
|
except errors.AuthenticationError as err:
|
65
|
-
if
|
65
|
+
if (
|
66
|
+
exchange_manager.without_auth or exchange_manager.exchange.REQUIRES_AUTHENTICATION
|
67
|
+
or exchange_manager.disable_unauth_retry
|
68
|
+
):
|
66
69
|
# auth is required or already retried, don't loop
|
67
70
|
exchange_manager.logger.error(
|
68
|
-
f"Authentication is required and
|
71
|
+
f"Authentication is required and raised an error: impossible to connect to "
|
69
72
|
f"{exchange_manager.exchange_name} exchange: {err}"
|
70
73
|
)
|
71
74
|
raise
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/exchange_manager.py
RENAMED
@@ -57,6 +57,7 @@ class ExchangeManager(util.Initializable):
|
|
57
57
|
self.is_sandboxed: bool = False
|
58
58
|
self.is_trading: bool = True
|
59
59
|
self.without_auth: bool = False
|
60
|
+
self.disable_unauth_retry: bool = False
|
60
61
|
self.check_credentials: bool = True
|
61
62
|
self.enable_storage: bool = True
|
62
63
|
self.proxy_config: exchanges.ProxyConfig = exchanges.ProxyConfig.default_env_var_config()
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -183,38 +183,23 @@ class Trader(util.Initializable):
|
|
183
183
|
previous_exchange_order_id = order.exchange_order_id
|
184
184
|
try:
|
185
185
|
async with order.lock:
|
186
|
+
disabled_state_updater = self.exchange_manager.exchange_personal_data \
|
187
|
+
.orders_manager.enable_order_auto_synchronization is False
|
186
188
|
# now that we got the lock, ensure we can edit the order
|
187
|
-
if not self.simulate and not order.is_self_managed() and
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
self.
|
192
|
-
|
193
|
-
f"edited_price: {str(edited_price)} "
|
194
|
-
f"edited_stop_price: {str(edited_stop_price)} "
|
195
|
-
f"edited_current_price: {str(edited_current_price)}"
|
196
|
-
f"]")
|
197
|
-
order_params = self.exchange_manager.exchange.get_order_additional_params(order)
|
198
|
-
order_params.update(params or {})
|
199
|
-
# fill in every param as some exchange rely on re-creating the order altogether
|
200
|
-
edited_order = await self.exchange_manager.exchange.edit_order(
|
201
|
-
order.exchange_order_id,
|
202
|
-
order.order_type,
|
203
|
-
order.symbol,
|
204
|
-
quantity=order.origin_quantity if edited_quantity is None else edited_quantity,
|
205
|
-
price=order.origin_price if edited_price is None else edited_price,
|
206
|
-
stop_price=edited_stop_price,
|
207
|
-
side=order.side,
|
208
|
-
current_price=edited_current_price,
|
209
|
-
params=order_params
|
189
|
+
if not self.simulate and not order.is_self_managed() and (
|
190
|
+
order.state is not None or disabled_state_updater
|
191
|
+
):
|
192
|
+
if disabled_state_updater:
|
193
|
+
changed = await self._edit_order_on_exchange(
|
194
|
+
order, edited_quantity, edited_price, edited_stop_price, edited_current_price, params
|
210
195
|
)
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
196
|
+
else:
|
197
|
+
# careful here: make sure we are not editing an order on exchange that is being updated
|
198
|
+
# somewhere else
|
199
|
+
async with order.state.refresh_operation():
|
200
|
+
changed = await self._edit_order_on_exchange(
|
201
|
+
order, edited_quantity, edited_price, edited_stop_price, edited_current_price, params
|
202
|
+
)
|
218
203
|
else:
|
219
204
|
# consider order as cancelled to release portfolio amounts
|
220
205
|
self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.update_portfolio_available(
|
@@ -242,6 +227,41 @@ class Trader(util.Initializable):
|
|
242
227
|
# order id changed: update orders_manager to keep consistency
|
243
228
|
self.exchange_manager.exchange_personal_data.orders_manager.replace_order(order.order_id, order)
|
244
229
|
|
230
|
+
async def _edit_order_on_exchange(
|
231
|
+
self, order,
|
232
|
+
edited_quantity: decimal.Decimal,
|
233
|
+
edited_price: decimal.Decimal,
|
234
|
+
edited_stop_price: decimal.Decimal,
|
235
|
+
edited_current_price: decimal.Decimal,
|
236
|
+
params: dict
|
237
|
+
) -> bool:
|
238
|
+
self.logger.info(
|
239
|
+
f"Editing order: {order} [edited_quantity: {str(edited_quantity)} edited_price: {str(edited_price)} "
|
240
|
+
f"edited_stop_price: {str(edited_stop_price)} edited_current_price: {str(edited_current_price)}]"
|
241
|
+
)
|
242
|
+
order_params = self.exchange_manager.exchange.get_order_additional_params(order)
|
243
|
+
order_params.update(params or {})
|
244
|
+
# fill in every param as some exchange rely on re-creating the order altogether
|
245
|
+
edited_order = await self.exchange_manager.exchange.edit_order(
|
246
|
+
order.exchange_order_id,
|
247
|
+
order.order_type,
|
248
|
+
order.symbol,
|
249
|
+
quantity=order.origin_quantity if edited_quantity is None else edited_quantity,
|
250
|
+
price=order.origin_price if edited_price is None else edited_price,
|
251
|
+
stop_price=edited_stop_price,
|
252
|
+
side=order.side,
|
253
|
+
current_price=edited_current_price,
|
254
|
+
params=order_params
|
255
|
+
)
|
256
|
+
# apply new values from returned order (even order id might have changed)
|
257
|
+
self.logger.debug(
|
258
|
+
f"Successfully edited order on {self.exchange_manager.exchange_name}, new order values: {edited_order}"
|
259
|
+
)
|
260
|
+
changed = order.update_from_raw(edited_order)
|
261
|
+
# update portfolio from exchange
|
262
|
+
await self.exchange_manager.exchange_personal_data.handle_portfolio_and_position_update_from_order(order)
|
263
|
+
return changed
|
264
|
+
|
245
265
|
async def _create_new_order(self, new_order, params: dict,
|
246
266
|
wait_for_creation=True,
|
247
267
|
creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT) -> object:
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -124,6 +124,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
124
124
|
EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
|
125
125
|
# text content of errors due to unhandled authentication issues
|
126
126
|
EXCHANGE_AUTHENTICATION_ERRORS: typing.List[typing.Iterable[str]] = []
|
127
|
+
# text content of errors due to unhandled IP white list issues
|
128
|
+
EXCHANGE_IP_WHITELIST_ERRORS: typing.List[typing.Iterable[str]] = []
|
127
129
|
# text content of errors due to a closed position on the exchange. Relevant for reduce-only orders
|
128
130
|
EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
|
129
131
|
# text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
|
@@ -1063,6 +1065,11 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
1063
1065
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_AUTHENTICATION_ERRORS)
|
1064
1066
|
return False
|
1065
1067
|
|
1068
|
+
def is_ip_whitelist_error(self, error: BaseException) -> bool:
|
1069
|
+
if self.EXCHANGE_IP_WHITELIST_ERRORS:
|
1070
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_IP_WHITELIST_ERRORS)
|
1071
|
+
return False
|
1072
|
+
|
1066
1073
|
"""
|
1067
1074
|
Auto fetched and filled exchanges
|
1068
1075
|
"""
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchanges/util/exchange_util.py
RENAMED
@@ -221,6 +221,7 @@ async def get_local_exchange_manager(
|
|
221
221
|
exchange_name: str, exchange_config: dict, tentacles_setup_config,
|
222
222
|
is_sandboxed: bool, ignore_config=False, builder=None, use_cached_markets=True,
|
223
223
|
is_broker_enabled: bool = False, exchange_config_by_exchange: typing.Optional[dict[str, dict]] = None,
|
224
|
+
disable_unauth_retry: bool = False,
|
224
225
|
market_filter: typing.Union[None, typing.Callable[[dict], bool]] = None
|
225
226
|
):
|
226
227
|
exchange_type = exchange_config.get(common_constants.CONFIG_EXCHANGE_TYPE, get_default_exchange_type(exchange_name))
|
@@ -230,6 +231,7 @@ async def get_local_exchange_manager(
|
|
230
231
|
)
|
231
232
|
exchange_manager = await builder.use_tentacles_setup_config(tentacles_setup_config) \
|
232
233
|
.is_checking_credentials(False) \
|
234
|
+
.disable_unauth_retry(disable_unauth_retry) \
|
233
235
|
.is_sandboxed(is_sandboxed) \
|
234
236
|
.is_using_exchange_type(exchange_type) \
|
235
237
|
.use_exchange_config_by_exchange(exchange_config_by_exchange) \
|
@@ -289,6 +291,12 @@ async def is_compatible_account(exchange_name: str, exchange_config: dict, tenta
|
|
289
291
|
return True, True, None
|
290
292
|
except trading_backend.TimeSyncError:
|
291
293
|
return False, False, _get_time_sync_error_message(exchange_name, "backend.is_valid_account")
|
294
|
+
except trading_backend.APIKeyPermissionsError as err:
|
295
|
+
return False, False, f"Please update your API Key permissions: {err}"
|
296
|
+
except trading_backend.APIKeyIPWhitelistError as err:
|
297
|
+
return False, False, f"Please update your API Key IP whitelist: {err}"
|
298
|
+
except trading_backend.UnexpectedError as err:
|
299
|
+
return False, False, f"Impossible to check API key: {err}"
|
292
300
|
except trading_backend.ExchangeAuthError:
|
293
301
|
message = f"Invalid {exchange_name.capitalize()} authentication details"
|
294
302
|
if is_sandboxed:
|
@@ -297,8 +305,6 @@ async def is_compatible_account(exchange_name: str, exchange_config: dict, tenta
|
|
297
305
|
f"{exchange_name.capitalize()} to trade and validate your api key. " \
|
298
306
|
f"Disable sandbox in your accounts configuration if this is not intended."
|
299
307
|
return False, False, message
|
300
|
-
except trading_backend.APIKeyPermissionsError as err:
|
301
|
-
return False, False, f"Please update your API Key permissions: {err}"
|
302
308
|
except (AttributeError, Exception) as e:
|
303
309
|
return True, False, f"Error when loading exchange account: {e}"
|
304
310
|
|
@@ -116,7 +116,7 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
|
|
116
116
|
self.logger.error(f"Skipping order cancel: {err}")
|
117
117
|
updated_orders = True
|
118
118
|
for update_data in take_profit_actions[self.UPDATE] + stop_actions[self.UPDATE]:
|
119
|
-
self.logger.info(f"Updating order
|
119
|
+
self.logger.info(f"Updating order quantity to {update_data[self.UPDATED_QUANTITY]} to keep balance, "
|
120
120
|
f"order: {update_data[self.ORDER]}")
|
121
121
|
order = update_data[self.ORDER]
|
122
122
|
async with signals.remote_signal_publisher(order.trader.exchange_manager, order.symbol, True):
|
@@ -131,9 +131,11 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
|
|
131
131
|
self.logger.exception(e, True, f"Error when balancing orders: {e}")
|
132
132
|
finally:
|
133
133
|
# remove locally_balancing_orders from self.balancing_orders
|
134
|
-
self.balancing_orders = [
|
135
|
-
|
136
|
-
|
134
|
+
self.balancing_orders = [
|
135
|
+
order
|
136
|
+
for order in self.balancing_orders
|
137
|
+
if order not in locally_balancing_orders
|
138
|
+
]
|
137
139
|
|
138
140
|
def _get_balance(self, closed_order, ignored_orders):
|
139
141
|
balance = {
|
@@ -141,9 +143,11 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
|
|
141
143
|
self.STOP: _SideBalance()
|
142
144
|
}
|
143
145
|
for order in self.get_group_open_orders():
|
144
|
-
if
|
145
|
-
|
146
|
-
|
146
|
+
if (
|
147
|
+
order is not closed_order
|
148
|
+
and (ignored_orders is None or order not in ignored_orders)
|
149
|
+
and order not in self.balancing_orders
|
150
|
+
):
|
147
151
|
if order_util.is_stop_order(order.order_type):
|
148
152
|
balance[self.STOP].add_order(order)
|
149
153
|
else:
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -227,7 +227,7 @@ class Order(util.Initializable):
|
|
227
227
|
should_update_total_cost = True
|
228
228
|
|
229
229
|
if self.trader.simulate:
|
230
|
-
if quantity and
|
230
|
+
if quantity and self.filled_quantity != quantity:
|
231
231
|
self.filled_quantity = quantity
|
232
232
|
changed = True
|
233
233
|
should_update_total_cost = True
|
@@ -433,7 +433,7 @@ def is_stop_trade_order_type(order_type: enums.TradeOrderType):
|
|
433
433
|
]
|
434
434
|
|
435
435
|
|
436
|
-
def is_take_profit_order(order_type):
|
436
|
+
def is_take_profit_order(order_type: enums.TraderOrderType):
|
437
437
|
return order_type in [
|
438
438
|
enums.TraderOrderType.TAKE_PROFIT, enums.TraderOrderType.TAKE_PROFIT_LIMIT,
|
439
439
|
]
|
@@ -5,10 +5,11 @@ OctoBot-Backtesting>=1.9, <1.10
|
|
5
5
|
Async-Channel>=2.2, <2.3
|
6
6
|
OctoBot-Commons>=1.9.64, <1.10
|
7
7
|
OctoBot-Tentacles-Manager>=2.9, <2.10
|
8
|
-
trading-backend>=1.2.
|
8
|
+
trading-backend>=1.2.35
|
9
9
|
|
10
10
|
# Exchange connection requirements
|
11
11
|
ccxt==4.3.85 # always ensure real exchanges tests (in tests_additional and authenticated exchange tests) are passing before changing the ccxt version
|
12
|
+
aiohttp_socks==0.10.1 # used by ccxt socks proxy aiohttp connectors
|
12
13
|
|
13
14
|
cryptography # Never specify a version (managed by https://github.com/Drakkar-Software/OctoBot-PyPi-Linux-Deployer)
|
14
15
|
|
@@ -18,6 +18,7 @@ import decimal
|
|
18
18
|
import ccxt
|
19
19
|
import aiohttp
|
20
20
|
import aiohttp.client_reqrep
|
21
|
+
import aiohttp_socks
|
21
22
|
|
22
23
|
import mock
|
23
24
|
from mock import patch
|
@@ -265,7 +266,13 @@ async def test_error_describer(ccxt_connector):
|
|
265
266
|
with pytest.raises(octobot_trading.errors.ExchangeProxyError):
|
266
267
|
# proxy connection error
|
267
268
|
with ccxt_connector.error_describer():
|
268
|
-
raise ccxt.AuthenticationError from
|
269
|
+
raise ccxt.AuthenticationError from aiohttp_socks.ProxyConnectionError(
|
270
|
+
aiohttp.client_reqrep.ConnectionKey("host", 11, True, True, None, None, None), OSError("plop")
|
271
|
+
)
|
272
|
+
with pytest.raises(octobot_trading.errors.ExchangeProxyError):
|
273
|
+
# proxy connection error
|
274
|
+
with ccxt_connector.error_describer():
|
275
|
+
raise aiohttp_socks.ProxyConnectionError(
|
269
276
|
aiohttp.client_reqrep.ConnectionKey("host", 11, True, True, None, None, None), OSError("plop")
|
270
277
|
)
|
271
278
|
with mock.patch.object(
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/OctoBot_Trading.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.153 → OctoBot-Trading-2.4.155}/octobot_trading/exchange_data/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|