OctoBot-Trading 2.4.139__tar.gz → 2.4.141__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/CHANGELOG.md +12 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.139/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.141}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/README.md +1 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/__init__.py +2 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/contracts.py +4 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/enums.py +14 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/errors.py +20 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/margin_contract.py +12 -5
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/abstract_exchange.py +4 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_manager.py +3 -3
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/trader.py +31 -19
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/rest_exchange.py +31 -2
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/abstract_trading_mode.py +8 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +1 -2
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order.py +90 -13
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_util.py +5 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +16 -11
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +13 -9
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +16 -11
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +13 -9
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/market_order.py +2 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +16 -10
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +12 -8
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position.py +4 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/positions_manager.py +3 -3
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/__init__.py +2 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/signal_creation.py +14 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/trading_signal_bundle_builder.py +103 -33
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/util.py +15 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order.py +209 -6
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/test_future_portfolio.py +5 -1
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/test_position.py +13 -13
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/types/test_inverse_position.py +10 -10
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/types/test_linear_position.py +10 -10
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/signals/test_trading_signal_bundle_builder.py +157 -20
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/LICENSE +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/constants.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/config/proxy_config.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/setup.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitmart.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitmex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,18 @@ 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.141] - 2025-01-05
|
8
|
+
### Added
|
9
|
+
[TradingSignals] add positions and leverage update
|
10
|
+
|
11
|
+
## [2.4.140] - 2025-01-03
|
12
|
+
### Updated
|
13
|
+
[Positions] properly clear closed positions
|
14
|
+
[Exchanges] handle newline error in keys
|
15
|
+
### Fixed
|
16
|
+
[Exchanges] don't raise on missing order description
|
17
|
+
[Orders] fix closed pos & instant fill chained orders
|
18
|
+
|
7
19
|
## [2.4.139] - 2023-12-29
|
8
20
|
### Updated
|
9
21
|
[Simulator] handle futures backtesting with market status and different ccxt classes
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.141
|
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.141](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.141
|
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.141](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.141](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)
|
@@ -210,6 +210,7 @@ from octobot_trading.api.contracts import (
|
|
210
210
|
get_pair_contracts,
|
211
211
|
is_handled_contract,
|
212
212
|
has_pair_future_contract,
|
213
|
+
update_pair_contract,
|
213
214
|
load_pair_contract,
|
214
215
|
create_default_future_contract,
|
215
216
|
)
|
@@ -386,6 +387,7 @@ __all__ = [
|
|
386
387
|
"get_pair_contracts",
|
387
388
|
"is_handled_contract",
|
388
389
|
"has_pair_future_contract",
|
390
|
+
"update_pair_contract",
|
389
391
|
"load_pair_contract",
|
390
392
|
"create_default_future_contract",
|
391
393
|
"set_is_exclusively_using_exchange_position_details",
|
@@ -38,6 +38,10 @@ def has_pair_future_contract(exchange_manager, pair: str) -> bool:
|
|
38
38
|
return exchange_manager.exchange.has_pair_future_contract(pair)
|
39
39
|
|
40
40
|
|
41
|
+
def update_pair_contract(exchange_manager, pair: str, leverage: decimal.Decimal):
|
42
|
+
get_pair_contracts(exchange_manager)[pair].current_leverage = leverage
|
43
|
+
|
44
|
+
|
41
45
|
def load_pair_contract(exchange_manager, contract_dict: dict):
|
42
46
|
exchange_data.update_future_contract_from_dict(exchange_manager, contract_dict)
|
43
47
|
|
@@ -521,6 +521,7 @@ class TradingSignalAttrs(enum.Enum):
|
|
521
521
|
|
522
522
|
class TradingSignalTopics(enum.Enum):
|
523
523
|
ORDERS = "orders"
|
524
|
+
POSITIONS = "positions"
|
524
525
|
PORTFOLIO = "portfolio"
|
525
526
|
|
526
527
|
|
@@ -559,6 +560,15 @@ class TradingSignalOrdersAttrs(enum.Enum):
|
|
559
560
|
UPDATE_WITH_TRIGGERING_ORDER_FEES = "update_with_triggering_order_fees"
|
560
561
|
|
561
562
|
|
563
|
+
class TradingSignalPositionsAttrs(enum.Enum):
|
564
|
+
EXCHANGE = "exchange"
|
565
|
+
EXCHANGE_TYPE = "exchange_type"
|
566
|
+
STRATEGY = "strategy"
|
567
|
+
SYMBOL = "symbol"
|
568
|
+
SIDE = "side"
|
569
|
+
LEVERAGE = "leverage"
|
570
|
+
|
571
|
+
|
562
572
|
class TradingSignalOrdersActions(enum.Enum):
|
563
573
|
CREATE = "create"
|
564
574
|
ADD_TO_GROUP = "add_to_group"
|
@@ -566,6 +576,10 @@ class TradingSignalOrdersActions(enum.Enum):
|
|
566
576
|
CANCEL = "cancel"
|
567
577
|
|
568
578
|
|
579
|
+
class TradingSignalPositionsActions(enum.Enum):
|
580
|
+
EDIT = "edit"
|
581
|
+
|
582
|
+
|
569
583
|
class StoredOrdersAttr(enum.Enum):
|
570
584
|
GROUP = "gr"
|
571
585
|
GROUP_ID = "gi"
|
@@ -143,6 +143,20 @@ class ExchangeAccountSymbolPermissionError(OctoBotExchangeError):
|
|
143
143
|
"""
|
144
144
|
|
145
145
|
|
146
|
+
class ExchangeClosedPositionError(OctoBotExchangeError):
|
147
|
+
"""
|
148
|
+
Raised when an exchange failed to execute the given request because the associated position is closed.
|
149
|
+
Can happen with reduce-only orders
|
150
|
+
"""
|
151
|
+
|
152
|
+
|
153
|
+
class ExchangeOrderInstantTriggerError(OctoBotExchangeError):
|
154
|
+
"""
|
155
|
+
Raised when an exchange failed to execute the given request because the associated order would immediately trigger.
|
156
|
+
Can happen with stop orders
|
157
|
+
"""
|
158
|
+
|
159
|
+
|
146
160
|
class PortfolioNegativeValueError(Exception):
|
147
161
|
"""
|
148
162
|
Raised when the portfolio is being updated with a negative value
|
@@ -258,6 +272,12 @@ class OrderDescriptionNotFoundError(Exception):
|
|
258
272
|
"""
|
259
273
|
|
260
274
|
|
275
|
+
class PositionDescriptionNotFoundError(Exception):
|
276
|
+
"""
|
277
|
+
Raised when a position description is not found
|
278
|
+
"""
|
279
|
+
|
280
|
+
|
261
281
|
class AdapterError(Exception):
|
262
282
|
"""
|
263
283
|
Raised when an error occurs in an adapter
|
@@ -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 decimal
|
17
|
+
|
16
18
|
import octobot_commons.logging as logging
|
17
19
|
|
18
20
|
import octobot_trading.enums as enums
|
@@ -24,12 +26,12 @@ class MarginContract:
|
|
24
26
|
contract_size=constants.ONE,
|
25
27
|
maximum_leverage=constants.ONE,
|
26
28
|
current_leverage=constants.ONE):
|
27
|
-
self.pair = pair
|
29
|
+
self.pair: str = pair
|
28
30
|
self.margin_type = margin_type
|
29
31
|
|
30
|
-
self.contract_size = contract_size
|
31
|
-
self.maximum_leverage = maximum_leverage
|
32
|
-
self.current_leverage = current_leverage
|
32
|
+
self.contract_size: decimal.Decimal = contract_size
|
33
|
+
self.maximum_leverage: decimal.Decimal = maximum_leverage
|
34
|
+
self.current_leverage: decimal.Decimal = current_leverage
|
33
35
|
|
34
36
|
self.risk_limit = {}
|
35
37
|
|
@@ -47,7 +49,12 @@ class MarginContract:
|
|
47
49
|
:param new_leverage: the leverage value to check
|
48
50
|
:return: True if valid
|
49
51
|
"""
|
50
|
-
|
52
|
+
dec_leverage = decimal.Decimal(str(new_leverage))
|
53
|
+
return (
|
54
|
+
constants.ZERO < dec_leverage
|
55
|
+
if self.maximum_leverage is None
|
56
|
+
else constants.ZERO < dec_leverage <= self.maximum_leverage
|
57
|
+
)
|
51
58
|
|
52
59
|
def set_current_leverage(self, new_leverage):
|
53
60
|
"""
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/abstract_exchange.py
RENAMED
@@ -742,7 +742,10 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
742
742
|
self._creating_exchange_order_descriptions.add(desc)
|
743
743
|
yield
|
744
744
|
finally:
|
745
|
-
|
745
|
+
try:
|
746
|
+
self._creating_exchange_order_descriptions.remove(desc)
|
747
|
+
except KeyError:
|
748
|
+
self.logger.error(f"Failed to remove {desc} from exchange order descriptions")
|
746
749
|
|
747
750
|
def is_creating_order(
|
748
751
|
self, order: dict, symbol: str
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/exchange_manager.py
RENAMED
@@ -322,9 +322,9 @@ class ExchangeManager(util.Initializable):
|
|
322
322
|
common_constants.CONFIG_EXCHANGE_SECRET, config_exchange, None
|
323
323
|
)
|
324
324
|
return (
|
325
|
-
# remove leading and trailing ", ' and whitespaces if any
|
326
|
-
key.strip(' "').strip("'") if key else key,
|
327
|
-
secret.strip(' "').strip("'") if secret else secret,
|
325
|
+
# remove leading and trailing ", ', newlines and whitespaces if any
|
326
|
+
key.strip(' "').strip("'").strip("\n") if key else key,
|
327
|
+
secret.strip(' "').strip("'").strip("\n") if secret else secret,
|
328
328
|
configuration.decrypt_element_if_possible(
|
329
329
|
common_constants.CONFIG_EXCHANGE_PASSWORD, config_exchange, None
|
330
330
|
),
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -87,9 +87,10 @@ class Trader(util.Initializable):
|
|
87
87
|
Orders
|
88
88
|
"""
|
89
89
|
|
90
|
-
async def create_order(
|
91
|
-
|
92
|
-
|
90
|
+
async def create_order(
|
91
|
+
self, order, loaded: bool = False, params: dict = None, wait_for_creation=True, raise_all_creation_error=False,
|
92
|
+
creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
|
93
|
+
):
|
93
94
|
"""
|
94
95
|
Create a new order from an OrderFactory created order, update portfolio, registers order in order manager and
|
95
96
|
notifies order channel.
|
@@ -99,6 +100,8 @@ class Trader(util.Initializable):
|
|
99
100
|
:param wait_for_creation: when True, always make sure the order is completely created before returning.
|
100
101
|
On exchanges async api, a create request will return before the order is actually live on exchange, in this case
|
101
102
|
the associated order state will make sure that the order is creating by polling the order from the exchange.
|
103
|
+
:param raise_all_creation_error: when True, will raise each ceation error when possible
|
104
|
+
(instead of retuning None)
|
102
105
|
:param creation_timeout: time before raising a timeout error when waiting for an order creation
|
103
106
|
:return: The crated order instance
|
104
107
|
"""
|
@@ -123,27 +126,34 @@ class Trader(util.Initializable):
|
|
123
126
|
# forward errors that require actions to fix the situation
|
124
127
|
raise
|
125
128
|
except Exception as e:
|
129
|
+
if raise_all_creation_error:
|
130
|
+
raise
|
126
131
|
self.logger.exception(e, True, f"Unexpected error when creating order: {e}. Order: {order}")
|
127
132
|
return None
|
128
133
|
|
129
134
|
return created_order
|
130
135
|
|
131
|
-
async def create_artificial_order(
|
132
|
-
|
133
|
-
|
134
|
-
|
136
|
+
async def create_artificial_order(
|
137
|
+
self, order_type, symbol, current_price, quantity, price, reduce_only, close_position,
|
138
|
+
emit_trading_signals=False, wait_for_creation=True,
|
139
|
+
creation_timeout=octobot_trading.constants.INDIVIDUAL_ORDER_SYNC_TIMEOUT
|
140
|
+
):
|
135
141
|
"""
|
136
142
|
Creates an OctoBot managed order (managed orders example: stop loss that is not published on the exchange and
|
137
143
|
that is maintained internally).
|
138
144
|
"""
|
139
|
-
order = order_factory.create_order_instance(
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
+
order = order_factory.create_order_instance(
|
146
|
+
trader=self,
|
147
|
+
order_type=order_type,
|
148
|
+
symbol=symbol,
|
149
|
+
current_price=current_price,
|
150
|
+
quantity=quantity,
|
151
|
+
price=price,
|
152
|
+
reduce_only=reduce_only,
|
153
|
+
close_position=close_position,
|
154
|
+
)
|
145
155
|
async with signals.remote_signal_publisher(self.exchange_manager, order.symbol, emit_trading_signals):
|
146
|
-
await signals.create_order(
|
156
|
+
return await signals.create_order(
|
147
157
|
self.exchange_manager,
|
148
158
|
emit_trading_signals and signals.should_emit_trading_signal(self.exchange_manager),
|
149
159
|
order,
|
@@ -769,13 +779,16 @@ class Trader(util.Initializable):
|
|
769
779
|
async with self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.lock:
|
770
780
|
await self.exchange_manager.exchange_personal_data.handle_portfolio_update_from_withdrawal(amount, currency)
|
771
781
|
|
772
|
-
async def set_leverage(
|
782
|
+
async def set_leverage(
|
783
|
+
self, symbol: str, side: typing.Optional[enums.PositionSide], leverage: decimal.Decimal
|
784
|
+
) -> bool:
|
773
785
|
"""
|
774
786
|
Updates the symbol contract leverage
|
775
787
|
Can raise InvalidLeverageValue if leverage value is not matching requirements
|
776
788
|
:param symbol: the symbol to update
|
777
789
|
:param side: the side to update (TODO)
|
778
790
|
:param leverage: the new leverage value
|
791
|
+
:return True if leverage changed
|
779
792
|
"""
|
780
793
|
contract = self.exchange_manager.exchange.get_pair_future_contract(symbol)
|
781
794
|
if not contract.check_leverage_update(leverage):
|
@@ -783,12 +796,11 @@ class Trader(util.Initializable):
|
|
783
796
|
f"but maximal value is {contract.maximum_leverage}")
|
784
797
|
if contract.current_leverage != leverage:
|
785
798
|
if not self.simulate:
|
786
|
-
await self.exchange_manager.exchange.set_symbol_leverage(
|
787
|
-
symbol=symbol,
|
788
|
-
leverage=leverage
|
789
|
-
)
|
799
|
+
await self.exchange_manager.exchange.set_symbol_leverage(symbol, float(leverage))
|
790
800
|
self.logger.info(f"Switching {symbol} leverage from {contract.current_leverage} to {leverage}")
|
791
801
|
contract.set_current_leverage(leverage)
|
802
|
+
return True
|
803
|
+
return False
|
792
804
|
|
793
805
|
async def set_symbol_take_profit_stop_loss_mode(self, symbol, new_mode: enums.TakeProfitStopLossMode):
|
794
806
|
"""
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -102,6 +102,8 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
102
102
|
CAN_HAVE_DELAYED_CANCELLED_ORDERS = False
|
103
103
|
# Set True when the "limit" param when fetching order books is taken into account
|
104
104
|
SUPPORTS_CUSTOM_LIMIT_ORDER_BOOK_FETCH = False
|
105
|
+
# Set False when the leverage value is set via something else that a set_leverage api (from orders for example)
|
106
|
+
UPDATE_LEVERAGE_FROM_API = True
|
105
107
|
|
106
108
|
# text content of errors due to orders not found errors
|
107
109
|
EXCHANGE_ORDER_NOT_FOUND_ERRORS: typing.List[typing.Iterable[str]] = []
|
@@ -119,6 +121,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
119
121
|
EXCHANGE_ACCOUNT_TRADED_SYMBOL_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = []
|
120
122
|
# text content of errors due to unhandled authentication issues
|
121
123
|
EXCHANGE_AUTHENTICATION_ERRORS: typing.List[typing.Iterable[str]] = []
|
124
|
+
# text content of errors due to a closed position on the exchange. Relevant for reduce-only orders
|
125
|
+
EXCHANGE_CLOSED_POSITION_ERRORS: typing.List[typing.Iterable[str]] = []
|
126
|
+
# text content of errors due to an order that would immediately trigger if created. Relevant for stop losses
|
127
|
+
EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS: typing.List[typing.Iterable[str]] = []
|
122
128
|
|
123
129
|
DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
|
124
130
|
|
@@ -253,7 +259,7 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
253
259
|
if self.should_log_on_ddos_exception(e):
|
254
260
|
self.connector.log_ddos_error(e)
|
255
261
|
raise errors.FailedRequest(
|
256
|
-
f"Failed
|
262
|
+
f"Failed order operation: {e.__class__.__name__} {html_util.get_html_summary_if_relevant(e)}"
|
257
263
|
) from e
|
258
264
|
except errors.OctoBotExchangeError:
|
259
265
|
# custom error: forward it
|
@@ -276,6 +282,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
276
282
|
f"Exchange is refusing this order request on this account because "
|
277
283
|
f"of its compliancy requirements."
|
278
284
|
) from e
|
285
|
+
if self.is_exchange_closed_position_error(e):
|
286
|
+
raise errors.ExchangeClosedPositionError(
|
287
|
+
f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
|
288
|
+
f"Exchange is refusing this order request because associated position is closed."
|
289
|
+
) from e
|
290
|
+
if self.is_exchange_order_would_immediately_trigger_error(e):
|
291
|
+
raise errors.ExchangeOrderInstantTriggerError(
|
292
|
+
f"Error when handling order {html_util.get_html_summary_if_relevant(e)}. "
|
293
|
+
f"Exchange is refusing this order request because associated order would instantly trigger."
|
294
|
+
) from e
|
279
295
|
self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
|
280
296
|
# print(traceback.format_exc(), file=sys.stderr) # uncomment for debugging in tests
|
281
297
|
self.logger.exception(
|
@@ -920,7 +936,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
920
936
|
:param leverage: the leverage
|
921
937
|
:return: the update result
|
922
938
|
"""
|
923
|
-
|
939
|
+
if self.UPDATE_LEVERAGE_FROM_API:
|
940
|
+
return await self.connector.set_symbol_leverage(leverage=leverage, symbol=symbol, **kwargs)
|
941
|
+
# nothing to do when UPDATE_LEVERAGE_FROM_API is False
|
942
|
+
return None
|
924
943
|
|
925
944
|
async def set_symbol_margin_type(self, symbol: str, isolated: bool, **kwargs: dict):
|
926
945
|
"""
|
@@ -989,6 +1008,16 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
989
1008
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_COMPLIANCY_ERRORS)
|
990
1009
|
return False
|
991
1010
|
|
1011
|
+
def is_exchange_closed_position_error(self, error: BaseException) -> bool:
|
1012
|
+
if self.EXCHANGE_CLOSED_POSITION_ERRORS:
|
1013
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_CLOSED_POSITION_ERRORS)
|
1014
|
+
return False
|
1015
|
+
|
1016
|
+
def is_exchange_order_would_immediately_trigger_error(self, error: BaseException) -> bool:
|
1017
|
+
if self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS:
|
1018
|
+
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_ORDER_IMMEDIATELY_TRIGGER_ERRORS)
|
1019
|
+
return False
|
1020
|
+
|
992
1021
|
def is_exchange_internal_sync_error(self, error: BaseException) -> bool:
|
993
1022
|
if self.EXCHANGE_INTERNAL_SYNC_ERRORS:
|
994
1023
|
return exchanges_util.is_error_on_this_type(error, self.EXCHANGE_INTERNAL_SYNC_ERRORS)
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/modes/abstract_trading_mode.py
RENAMED
@@ -17,6 +17,7 @@ import abc
|
|
17
17
|
import contextlib
|
18
18
|
import decimal
|
19
19
|
import copy
|
20
|
+
import typing
|
20
21
|
|
21
22
|
import octobot_commons.constants as common_constants
|
22
23
|
import octobot_commons.enums as common_enums
|
@@ -585,6 +586,13 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
|
|
585
586
|
params=params
|
586
587
|
)
|
587
588
|
|
589
|
+
async def set_leverage(
|
590
|
+
self, symbol: str, side: typing.Optional[enums.PositionSide], leverage: decimal.Decimal
|
591
|
+
) -> bool:
|
592
|
+
return await signals.set_leverage(
|
593
|
+
self.exchange_manager, self.should_emit_trading_signal(), symbol, side, leverage
|
594
|
+
)
|
595
|
+
|
588
596
|
async def get_additional_metadata(self, is_backtesting):
|
589
597
|
"""
|
590
598
|
Override if necessary
|
@@ -42,9 +42,8 @@ async def user_select_emit_trading_signals(ctx, identifier, def_val=False) -> bo
|
|
42
42
|
return is_emitting_signals
|
43
43
|
|
44
44
|
|
45
|
-
async def set_leverage(ctx, leverage):
|
45
|
+
async def set_leverage(ctx, leverage, side=None):
|
46
46
|
if ctx.exchange_manager.is_future:
|
47
|
-
side = None
|
48
47
|
try:
|
49
48
|
await ctx.exchange_manager.trader.set_leverage(ctx.symbol, side, decimal.Decimal(str(leverage)))
|
50
49
|
except errors.ContractExistsError as e:
|
{OctoBot-Trading-2.4.139 → OctoBot-Trading-2.4.141}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -24,6 +24,7 @@ import octobot_trading.constants as constants
|
|
24
24
|
import octobot_trading.enums as enums
|
25
25
|
import octobot_trading.errors as errors
|
26
26
|
import octobot_trading.personal_data.orders.states as orders_states
|
27
|
+
import octobot_trading.exchanges.traders.trader
|
27
28
|
import octobot_trading.personal_data.orders.order_util as order_util
|
28
29
|
import octobot_trading.personal_data.orders.decimal_order_adapter as decimal_order_adapter
|
29
30
|
import octobot_trading.util as util
|
@@ -36,10 +37,11 @@ class Order(util.Initializable):
|
|
36
37
|
It is also use to store creation & fill values of the order
|
37
38
|
"""
|
38
39
|
CHECK_ORDER_STATUS_AFTER_INIT_DELAY = 2
|
40
|
+
SUPPORTS_GROUPING = True # False when orders of this type can't be grouped
|
39
41
|
|
40
42
|
def __init__(self, trader, side=None):
|
41
43
|
super().__init__()
|
42
|
-
self.trader = trader
|
44
|
+
self.trader: octobot_trading.exchanges.traders.trader.Trader = trader
|
43
45
|
self.exchange_manager = trader.exchange_manager
|
44
46
|
self.lock = asyncio.Lock()
|
45
47
|
self.is_synchronized_with_exchange = False
|
@@ -69,9 +71,9 @@ class Order(util.Initializable):
|
|
69
71
|
self.origin_stop_price = constants.ZERO
|
70
72
|
|
71
73
|
# order type attributes
|
72
|
-
self.order_type = None
|
74
|
+
self.order_type: enums.TraderOrderType = None
|
73
75
|
# raw exchange order type, used to create order dict
|
74
|
-
self.exchange_order_type = None
|
76
|
+
self.exchange_order_type: enums.TradeOrderType = None
|
75
77
|
|
76
78
|
# filled order attributes
|
77
79
|
self.filled_quantity = constants.ZERO
|
@@ -112,6 +114,8 @@ class Order(util.Initializable):
|
|
112
114
|
self.has_been_bundled = False
|
113
115
|
# True when this order is to be opened as a chained order and has not been open yet
|
114
116
|
self.is_waiting_for_chained_trigger = False
|
117
|
+
# instance of the order that has been created after self has been filled. Used in stop / TP orders
|
118
|
+
self.on_filled_artificial_order = None
|
115
119
|
|
116
120
|
# Params given to the exchange request when this order is created. Include any exchange specific param here.
|
117
121
|
# All params and values in those will be ignored in simulated orders
|
@@ -276,6 +280,17 @@ class Order(util.Initializable):
|
|
276
280
|
|
277
281
|
return changed
|
278
282
|
|
283
|
+
async def create_on_filled_artificial_order(self, enable_associated_orders_creation):
|
284
|
+
"""
|
285
|
+
:return: the equivalent artificial order after trigger price (ex: stop loss => market order)
|
286
|
+
"""
|
287
|
+
await self.on_filled(enable_associated_orders_creation, force_artificial_orders=True)
|
288
|
+
if self.on_filled_artificial_order is not None:
|
289
|
+
logging.get_logger(self.logger_name).info(f"Created artificial order: {self.on_filled_artificial_order}")
|
290
|
+
if self.order_group:
|
291
|
+
self.on_filled_artificial_order.add_to_order_group(self.order_group)
|
292
|
+
return self.on_filled_artificial_order
|
293
|
+
|
279
294
|
async def initialize_impl(self, **kwargs):
|
280
295
|
"""
|
281
296
|
Initialize order status update tasks
|
@@ -432,8 +447,8 @@ class Order(util.Initializable):
|
|
432
447
|
await self.state.initialize(forced=force_close)
|
433
448
|
|
434
449
|
async def on_cancel(
|
435
|
-
|
436
|
-
|
450
|
+
self, is_from_exchange_data=False, force_cancel=False, enable_associated_orders_creation=None,
|
451
|
+
ignored_order=None
|
437
452
|
):
|
438
453
|
enable_associated_orders_creation = self.state.enable_associated_orders_creation \
|
439
454
|
if (self.state and enable_associated_orders_creation is None) \
|
@@ -451,12 +466,12 @@ class Order(util.Initializable):
|
|
451
466
|
"""
|
452
467
|
self.status = enums.OrderStatus.FILLED
|
453
468
|
|
454
|
-
async def on_filled(self, enable_associated_orders_creation):
|
469
|
+
async def on_filled(self, enable_associated_orders_creation, force_artificial_orders=False):
|
455
470
|
"""
|
456
471
|
Filling complete callback
|
457
472
|
"""
|
458
473
|
if enable_associated_orders_creation:
|
459
|
-
await self._trigger_chained_orders()
|
474
|
+
await self._trigger_chained_orders(enable_associated_orders_creation)
|
460
475
|
elif self.chained_orders:
|
461
476
|
logging.get_logger(self.get_logger_name()).info(
|
462
477
|
f"Skipped chained orders creation for {len(self.chained_orders)} chained orders: "
|
@@ -494,16 +509,68 @@ class Order(util.Initializable):
|
|
494
509
|
Implement if necessary
|
495
510
|
"""
|
496
511
|
|
497
|
-
async def _trigger_chained_orders(self):
|
512
|
+
async def _trigger_chained_orders(self, enable_associated_orders_creation):
|
498
513
|
logger = logging.get_logger(self.get_logger_name())
|
499
514
|
for index, order in enumerate(self.chained_orders):
|
515
|
+
if order.is_cleared():
|
516
|
+
logger.error(
|
517
|
+
f"Chained order {index + 1}/{len(self.chained_orders)} has been cleared: skipping "
|
518
|
+
f"creation (order: {order})"
|
519
|
+
)
|
520
|
+
continue
|
500
521
|
can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
|
501
522
|
if can_be_created and order.should_be_created():
|
502
523
|
logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
|
503
|
-
await
|
524
|
+
await self._create_triggered_chained_order(order, enable_associated_orders_creation)
|
504
525
|
else:
|
505
526
|
logger.debug(f"Skipping cancelled chained order {index + 1}/{len(self.chained_orders)}")
|
506
527
|
|
528
|
+
async def _create_triggered_chained_order(self, order, enable_associated_orders_creation):
|
529
|
+
logger = logging.get_logger(self.get_logger_name())
|
530
|
+
try:
|
531
|
+
await order_util.create_as_chained_order(order)
|
532
|
+
except errors.ExchangeClosedPositionError as err:
|
533
|
+
message = (
|
534
|
+
f"chained order is cancelled as it can't be created: position is closed "
|
535
|
+
f"on exchange ({err}) order: {order.id}"
|
536
|
+
)
|
537
|
+
if order.reduce_only:
|
538
|
+
# can happen on reduce only orders
|
539
|
+
logger.warning(f"Reduce only {message}")
|
540
|
+
else:
|
541
|
+
# should not happen on non-reduce only orders
|
542
|
+
logger.error(f"Unexpected: Non reduce only {message}")
|
543
|
+
# order can't be created: consider it cancelled
|
544
|
+
# note: grouped orders will also be skipped as this one is cancelled (should_be_created will be false)
|
545
|
+
order.status = octobot_trading.enums.OrderStatus.CLOSED
|
546
|
+
# clear state to avoid using outdated pending creation state
|
547
|
+
order.state = None
|
548
|
+
order.clear()
|
549
|
+
except errors.ExchangeOrderInstantTriggerError as err:
|
550
|
+
logger.info(f"Order would instantly trigger ({err}). Creating artificial order instead.")
|
551
|
+
equivalent_order = await order.create_on_filled_artificial_order(enable_associated_orders_creation)
|
552
|
+
if equivalent_order is None:
|
553
|
+
# should not happen on limit or market only orders
|
554
|
+
logger.error(f"Unexpected instant trigger error: {err} when creating chained order {order}")
|
555
|
+
else:
|
556
|
+
# acceptable: convert this order into its "triggered artificial order" equivalent
|
557
|
+
logger.warning(
|
558
|
+
f"Outdated chained order: order trigger price has already been reached. "
|
559
|
+
f"Creating equivalent {equivalent_order.get_name()} artificial order instead. "
|
560
|
+
f"Initial order: {order}, artificial order: {equivalent_order}."
|
561
|
+
)
|
562
|
+
# note: grouped orders will also be skipped as this one is filled (should_be_created will be false)
|
563
|
+
order.status = octobot_trading.enums.OrderStatus.CLOSED
|
564
|
+
# clear state to avoid using outdated pending creation state
|
565
|
+
order.state = None
|
566
|
+
order.clear()
|
567
|
+
except Exception as err:
|
568
|
+
logger.exception(
|
569
|
+
err,
|
570
|
+
True,
|
571
|
+
f"Unexpected error ({err.__class__.__name__}: {err}) when creating chained order: {order}"
|
572
|
+
)
|
573
|
+
|
507
574
|
async def set_as_chained_order(self, triggered_by, has_been_bundled, exchange_creation_params,
|
508
575
|
update_with_triggering_order_fees, **trader_creation_kwargs):
|
509
576
|
if triggered_by is self:
|
@@ -526,9 +593,19 @@ class Order(util.Initializable):
|
|
526
593
|
return False
|
527
594
|
for other_order in self.triggered_by.chained_orders:
|
528
595
|
if other_order is self:
|
529
|
-
|
530
|
-
|
531
|
-
|
596
|
+
continue
|
597
|
+
order_to_check = (
|
598
|
+
other_order
|
599
|
+
if other_order.on_filled_artificial_order is None
|
600
|
+
else other_order.on_filled_artificial_order
|
601
|
+
)
|
602
|
+
if (
|
603
|
+
self.order_group is not None and self.order_group is order_to_check.order_group
|
604
|
+
and (
|
605
|
+
order_to_check.is_closed() # grouped order has been closed
|
606
|
+
or not order_to_check.SUPPORTS_GROUPING # grouped order can't be used in groups (anymore)
|
607
|
+
)
|
608
|
+
):
|
532
609
|
return True
|
533
610
|
return False
|
534
611
|
|
@@ -758,7 +835,7 @@ class Order(util.Initializable):
|
|
758
835
|
|
759
836
|
self.fee = order_util.parse_raw_fees(raw_order[enums.ExchangeConstantsOrderColumns.FEE.value])
|
760
837
|
|
761
|
-
self.executed_time = self.trader.exchange.get_uniformized_timestamp(
|
838
|
+
self.executed_time = self.trader.exchange_manager.exchange.get_uniformized_timestamp(
|
762
839
|
raw_order[enums.ExchangeConstantsOrderColumns.TIMESTAMP.value])
|
763
840
|
|
764
841
|
def _update_type_from_raw(self, raw_order):
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# pylint: disable=W0706
|
1
2
|
# Drakkar-Software OctoBot-Trading
|
2
3
|
# Copyright (c) Drakkar-Software, All rights reserved.
|
3
4
|
#
|
@@ -479,8 +480,12 @@ async def create_as_chained_order(order):
|
|
479
480
|
order,
|
480
481
|
loaded=False,
|
481
482
|
params=order.exchange_creation_params,
|
483
|
+
raise_all_creation_error=True,
|
482
484
|
**order.trader_creation_kwargs
|
483
485
|
)
|
486
|
+
except (errors.ExchangeClosedPositionError, errors.ExchangeOrderInstantTriggerError):
|
487
|
+
# Order can be created and might be outdated forward error for the caller to fix it if possible
|
488
|
+
raise
|
484
489
|
except Exception as err:
|
485
490
|
# log warning to be sure to keep track of the failed order details
|
486
491
|
logging.get_logger(LOGGER_NAME).warning(
|