OctoBot-Trading 2.4.57__tar.gz → 2.4.59__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.57 → OctoBot-Trading-2.4.59}/CHANGELOG.md +9 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/SOURCES.txt +1 -0
- {OctoBot-Trading-2.4.57/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.59}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/README.md +1 -1
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/symbol_data.py +3 -1
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/constants.py +2 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/price_events_manager.py +6 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/modes_util.py +18 -8
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order.py +15 -3
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_util.py +40 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/limit_order.py +34 -3
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +3 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +3 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +3 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +3 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/market_order.py +1 -3
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/test_modes_util.py +48 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/__init__.py +10 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order.py +18 -4
- OctoBot-Trading-2.4.59/tests/personal_data/orders/types/limit/test_limit_order.py +118 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/LICENSE +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/errors.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/traders/trader.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/types/rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/setup.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bingx.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitget.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_okx.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,15 @@ 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.59] - 2024-03-11
|
8
|
+
### Fixed
|
9
|
+
- [TradingModes] Fix convert_asset_to_target_asset to properly handle fees
|
10
|
+
|
11
|
+
## [2.4.58] - 2024-03-07
|
12
|
+
### Fixed
|
13
|
+
- [ChainedOrders] Outdated limit price
|
14
|
+
- [Backtesting] Invalid order fill price
|
15
|
+
|
7
16
|
## [2.4.57] - 2024-03-06
|
8
17
|
### Updated
|
9
18
|
- [Exchange] log last request url on failed retry
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.59
|
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.59](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)
|
@@ -378,6 +378,7 @@ tests/personal_data/orders/types/__init__.py
|
|
378
378
|
tests/personal_data/orders/types/test_unknown_order.py
|
379
379
|
tests/personal_data/orders/types/limit/__init__.py
|
380
380
|
tests/personal_data/orders/types/limit/test_buy_limit_order.py
|
381
|
+
tests/personal_data/orders/types/limit/test_limit_order.py
|
381
382
|
tests/personal_data/orders/types/limit/test_sell_limit_order.py
|
382
383
|
tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py
|
383
384
|
tests/personal_data/orders/types/limit/test_stop_loss_order.py
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.59
|
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.59](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.59](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)
|
@@ -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.enums
|
17
19
|
|
18
20
|
import octobot_trading.enums
|
@@ -105,7 +107,7 @@ def create_new_candles_manager(candles=None, max_candles_count=None) -> exchange
|
|
105
107
|
|
106
108
|
def force_set_mark_price(exchange_manager, symbol, price):
|
107
109
|
exchange_manager.exchange_symbols_data.get_exchange_symbol_data(symbol).prices_manager.\
|
108
|
-
set_mark_price(price, octobot_trading.enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
|
110
|
+
set_mark_price(decimal.Decimal(str(price)), octobot_trading.enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
|
109
111
|
|
110
112
|
|
111
113
|
def is_mark_price_initialized(exchange_manager, symbol: str) -> bool:
|
@@ -39,6 +39,8 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
|
|
39
39
|
|
40
40
|
# Order creation
|
41
41
|
ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
|
42
|
+
CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
|
43
|
+
CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
|
42
44
|
|
43
45
|
# Tentacles
|
44
46
|
TRADING_MODE_REQUIRED_STRATEGIES = "required_strategies"
|
@@ -49,6 +49,12 @@ class PriceEventsManager:
|
|
49
49
|
self.clear_recent_prices()
|
50
50
|
self.events.clear()
|
51
51
|
|
52
|
+
def get_min_and_max_prices(self) -> (float, float):
|
53
|
+
if len(self._last_recent_prices) < 2:
|
54
|
+
raise IndexError("Not enough data")
|
55
|
+
prices = sorted([element[self.PRICE_KEY] for element in self._last_recent_prices])
|
56
|
+
return prices[0], prices[-1]
|
57
|
+
|
52
58
|
def handle_recent_trades(self, recent_trades):
|
53
59
|
"""
|
54
60
|
Handle new recent trades prices
|
@@ -151,19 +151,29 @@ def _get_associated_symbol_and_order_type(trading_mode, asset: str, target_asset
|
|
151
151
|
|
152
152
|
|
153
153
|
def _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount) -> decimal.Decimal:
|
154
|
+
side = (
|
155
|
+
trading_enums.TradeOrderSide.SELL
|
156
|
+
if order_type in (trading_enums.TraderOrderType.SELL_MARKET, trading_enums.TraderOrderType.SELL_LIMIT)
|
157
|
+
else trading_enums.TradeOrderSide.BUY
|
158
|
+
)
|
159
|
+
|
160
|
+
currency_available, market_available, market_quantity = trading_personal_data.get_portfolio_amounts(
|
161
|
+
trading_mode.exchange_manager, symbol, price, portfolio_type=common_constants.PORTFOLIO_AVAILABLE
|
162
|
+
)
|
154
163
|
if asset_amount is None:
|
155
|
-
currency_available
|
156
|
-
trading_mode.exchange_manager, symbol, price, portfolio_type=common_constants.PORTFOLIO_AVAILABLE
|
157
|
-
)
|
158
|
-
quantity = currency_available if order_type is trading_enums.TraderOrderType.SELL_MARKET \
|
159
|
-
else market_quantity
|
164
|
+
quantity = currency_available if side is trading_enums.TradeOrderSide.SELL else market_quantity
|
160
165
|
else:
|
161
166
|
try:
|
162
|
-
quantity = asset_amount if
|
163
|
-
else (asset_amount / price)
|
167
|
+
quantity = asset_amount if side is trading_enums.TradeOrderSide.SELL else (asset_amount / price)
|
164
168
|
except (decimal.DivisionByZero, decimal.InvalidOperation):
|
165
169
|
quantity = constants.ZERO
|
166
|
-
|
170
|
+
|
171
|
+
adapted_quantity = trading_personal_data.decimal_adapt_order_quantity_because_fees(
|
172
|
+
trading_mode.exchange_manager, symbol, order_type, quantity, price,
|
173
|
+
trading_enums.ExchangeConstantsMarketPropertyColumns.TAKER, side,
|
174
|
+
currency_available if side is trading_enums.TradeOrderSide.SELL else market_available
|
175
|
+
)
|
176
|
+
return adapted_quantity
|
167
177
|
|
168
178
|
|
169
179
|
async def notify_portfolio_optimization_complete():
|
{OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -484,12 +484,15 @@ class Order(util.Initializable):
|
|
484
484
|
logger.debug(f"Updating chained order quantity with triggering order fees. {fees_str}")
|
485
485
|
return True
|
486
486
|
|
487
|
+
async def update_price_if_outdated(self):
|
488
|
+
"""
|
489
|
+
Implement if necessary
|
490
|
+
"""
|
491
|
+
|
487
492
|
async def _trigger_chained_orders(self):
|
488
493
|
logger = logging.get_logger(self.get_logger_name())
|
489
494
|
for index, order in enumerate(self.chained_orders):
|
490
|
-
can_be_created =
|
491
|
-
if order.update_with_triggering_order_fees:
|
492
|
-
can_be_created = order.update_quantity_with_order_fees(self)
|
495
|
+
can_be_created = await order_util.adapt_chained_order_before_creation(self, order)
|
493
496
|
if can_be_created and order.should_be_created():
|
494
497
|
logger.debug(f"Creating chained order {index + 1}/{len(self.chained_orders)}")
|
495
498
|
await order_util.create_as_chained_order(order)
|
@@ -721,6 +724,15 @@ class Order(util.Initializable):
|
|
721
724
|
# quantity in USDT for BTC/USDT => cost = price(BTC in USDT)
|
722
725
|
self.total_cost = quantity
|
723
726
|
|
727
|
+
def update_order_filled_values(self, ideal_price: decimal.Decimal):
|
728
|
+
if not self.filled_price:
|
729
|
+
# keep order.filled_price if already set (!= 0)
|
730
|
+
self.filled_price = order_util.get_valid_filled_price(self, ideal_price)
|
731
|
+
if not self.filled_quantity or self.exchange_manager.trader.simulate:
|
732
|
+
# keep self.filled_quantity if already set (!= 0) in real trading
|
733
|
+
self.filled_quantity = self.origin_quantity
|
734
|
+
self._update_total_cost()
|
735
|
+
|
724
736
|
def consider_as_canceled(self):
|
725
737
|
self.status = enums.OrderStatus.CANCELED
|
726
738
|
if self.canceled_time == 0:
|
{OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/octobot_trading/personal_data/orders/order_util.py
RENAMED
@@ -551,6 +551,46 @@ def generate_order_id():
|
|
551
551
|
return str(uuid.uuid4())
|
552
552
|
|
553
553
|
|
554
|
+
def _get_possible_filled_price(
|
555
|
+
exchange_manager, symbol: str, side: enums.TradeOrderSide, ideal_price: decimal.Decimal
|
556
|
+
) -> decimal.Decimal:
|
557
|
+
try:
|
558
|
+
min_price, max_price = exchange_manager.exchange_symbols_data.get_exchange_symbol_data(symbol).\
|
559
|
+
price_events_manager.get_min_and_max_prices()
|
560
|
+
if side is enums.TradeOrderSide.SELL:
|
561
|
+
if ideal_price < min_price:
|
562
|
+
return min_price
|
563
|
+
if side is enums.TradeOrderSide.BUY:
|
564
|
+
if ideal_price > max_price:
|
565
|
+
return max_price
|
566
|
+
except IndexError:
|
567
|
+
# no available price data
|
568
|
+
pass
|
569
|
+
return ideal_price
|
570
|
+
|
571
|
+
|
572
|
+
def get_valid_filled_price(order, ideal_price: decimal.Decimal):
|
573
|
+
# ensure filled price based on ideal_price makes sense according to the current candle
|
574
|
+
# instead of blindly using ideal_price as this could
|
575
|
+
# potentially buy higher than the candle high or sell lower than the candle low,
|
576
|
+
# which can't happen on real conditions
|
577
|
+
|
578
|
+
if order.exchange_manager.is_backtesting:
|
579
|
+
# in backtesting: ensure ideal_price is with in current candle price.
|
580
|
+
return _get_possible_filled_price(order.exchange_manager, order.symbol, order.side, ideal_price)
|
581
|
+
# not in backtesting: price desync can't happen
|
582
|
+
return ideal_price
|
583
|
+
|
584
|
+
|
585
|
+
async def adapt_chained_order_before_creation(base_order, chained_order):
|
586
|
+
can_be_created = True
|
587
|
+
if chained_order.update_with_triggering_order_fees:
|
588
|
+
can_be_created = chained_order.update_quantity_with_order_fees(base_order)
|
589
|
+
# ensure price is not outdated
|
590
|
+
await chained_order.update_price_if_outdated()
|
591
|
+
return can_be_created
|
592
|
+
|
593
|
+
|
554
594
|
async def wait_for_order_fill(order, timeout, wait_for_portfolio_update):
|
555
595
|
if order.is_open():
|
556
596
|
if order.state is None:
|
@@ -18,6 +18,7 @@ import asyncio
|
|
18
18
|
import octobot_trading.enums as enums
|
19
19
|
import octobot_trading.constants as constants
|
20
20
|
import octobot_trading.personal_data.orders.order as order_class
|
21
|
+
import octobot_trading.personal_data.orders.decimal_order_adapter as decimal_order_adapter
|
21
22
|
|
22
23
|
|
23
24
|
class LimitOrder(order_class.Order):
|
@@ -36,6 +37,38 @@ class LimitOrder(order_class.Order):
|
|
36
37
|
self.trigger_above = raw_order[enums.ExchangeConstantsOrderColumns.TRIGGER_ABOVE.value]
|
37
38
|
return updated
|
38
39
|
|
40
|
+
async def update_price_if_outdated(self):
|
41
|
+
# price is outdated if it would trigger and instantly filled order with more than the allowed tolerance
|
42
|
+
try:
|
43
|
+
current_price = await self.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(self.symbol) \
|
44
|
+
.prices_manager.get_mark_price(timeout=constants.CHAINED_ORDER_PRICE_FETCHING_TIMEOUT)
|
45
|
+
self._update_limit_price_if_necessary(current_price)
|
46
|
+
except asyncio.TimeoutError:
|
47
|
+
# price can't be checked
|
48
|
+
return
|
49
|
+
|
50
|
+
def _update_limit_price_if_necessary(self, current_price):
|
51
|
+
updated_price = self.origin_price
|
52
|
+
if self.side is enums.TradeOrderSide.BUY:
|
53
|
+
highest_accepted_buy_price = (
|
54
|
+
current_price * (constants.ONE + constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE)
|
55
|
+
)
|
56
|
+
if self.origin_price > highest_accepted_buy_price:
|
57
|
+
# buy price is more than CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE % higher than the current price
|
58
|
+
# => Reduce it to the highest allowed price
|
59
|
+
updated_price = highest_accepted_buy_price
|
60
|
+
if self.side is enums.TradeOrderSide.SELL:
|
61
|
+
lowest_accepted_sell_price = (
|
62
|
+
current_price * (constants.ONE - constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE)
|
63
|
+
)
|
64
|
+
if self.origin_price < lowest_accepted_sell_price:
|
65
|
+
# sell price is more than CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE % lower than the current price
|
66
|
+
# => Increase it to the current price
|
67
|
+
updated_price = lowest_accepted_sell_price
|
68
|
+
if self.origin_price != updated_price:
|
69
|
+
symbol_market = self.exchange_manager.exchange.get_market_status(self.symbol, with_fixer=False)
|
70
|
+
self.origin_price = decimal_order_adapter.decimal_adapt_price(symbol_market, updated_price)
|
71
|
+
|
39
72
|
async def update_order_status(self, force_refresh=False):
|
40
73
|
if self.limit_price_hit_event is None:
|
41
74
|
self._create_hit_event(self.creation_time)
|
@@ -87,9 +120,7 @@ class LimitOrder(order_class.Order):
|
|
87
120
|
|
88
121
|
def on_fill_actions(self):
|
89
122
|
self.taker_or_maker = self._filled_maker_or_taker()
|
90
|
-
self.
|
91
|
-
self.filled_quantity = self.origin_quantity
|
92
|
-
self._update_total_cost()
|
123
|
+
self.update_order_filled_values(self.origin_price)
|
93
124
|
order_class.Order.on_fill_actions(self)
|
94
125
|
|
95
126
|
def clear(self):
|
@@ -31,6 +31,9 @@ class StopLossLimitOrder(limit_order.LimitOrder):
|
|
31
31
|
def is_counted_in_available_funds(self):
|
32
32
|
return False
|
33
33
|
|
34
|
+
async def update_price_if_outdated(self):
|
35
|
+
pass
|
36
|
+
|
34
37
|
async def on_filled(self, enable_associated_orders_creation):
|
35
38
|
await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
|
36
39
|
# TODO replace with chained order ?
|
@@ -25,6 +25,9 @@ class StopLossOrder(limit_order.LimitOrder):
|
|
25
25
|
def is_counted_in_available_funds(self):
|
26
26
|
return False
|
27
27
|
|
28
|
+
async def update_price_if_outdated(self):
|
29
|
+
pass
|
30
|
+
|
28
31
|
def _filled_maker_or_taker(self):
|
29
32
|
# Creates a market order when filled, which is taker
|
30
33
|
return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
|
@@ -26,6 +26,9 @@ class TakeProfitLimitOrder(limit_order.LimitOrder):
|
|
26
26
|
super().__init__(trader, side)
|
27
27
|
self.limit_price = limit_price
|
28
28
|
|
29
|
+
async def update_price_if_outdated(self):
|
30
|
+
pass
|
31
|
+
|
29
32
|
async def on_filled(self, enable_associated_orders_creation):
|
30
33
|
await limit_order.LimitOrder.on_filled(self, enable_associated_orders_creation)
|
31
34
|
# TODO replace with chained order ?
|
@@ -25,6 +25,9 @@ class TakeProfitOrder(limit_order.LimitOrder):
|
|
25
25
|
def is_counted_in_available_funds(self):
|
26
26
|
return False
|
27
27
|
|
28
|
+
async def update_price_if_outdated(self):
|
29
|
+
pass
|
30
|
+
|
28
31
|
def _filled_maker_or_taker(self):
|
29
32
|
# Creates a market order when filled, which is taker
|
30
33
|
return enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
|
@@ -30,9 +30,7 @@ class MarketOrder(order_class.Order):
|
|
30
30
|
def on_fill_actions(self):
|
31
31
|
self.taker_or_maker = enums.ExchangeConstantsMarketPropertyColumns.TAKER.value
|
32
32
|
self.origin_price = self.created_last_price
|
33
|
-
self.
|
34
|
-
self.filled_quantity = self.origin_quantity
|
35
|
-
self._update_total_cost()
|
33
|
+
self.update_order_filled_values(self.created_last_price)
|
36
34
|
order_class.Order.on_fill_actions(self)
|
37
35
|
|
38
36
|
def can_be_edited(self):
|
@@ -195,6 +195,54 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
|
|
195
195
|
trading_mode.create_order.assert_called_once()
|
196
196
|
trading_mode.create_order.reset_mock()
|
197
197
|
|
198
|
+
orders = await modes_util.convert_asset_to_target_asset(
|
199
|
+
trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(1000)
|
200
|
+
)
|
201
|
+
assert len(orders) == 1
|
202
|
+
order = orders[0]
|
203
|
+
assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
|
204
|
+
assert order.symbol == "ETH/USDT"
|
205
|
+
assert order.origin_quantity == decimal.Decimal("0.66666666")
|
206
|
+
assert order.created_last_price == decimal.Decimal(1500)
|
207
|
+
trading_mode.create_order.assert_called_once()
|
208
|
+
trading_mode.create_order.reset_mock()
|
209
|
+
|
210
|
+
# with fees paid in quote
|
211
|
+
fees = {
|
212
|
+
trading_enums.FeePropertyColumns.COST.value: "2",
|
213
|
+
trading_enums.FeePropertyColumns.CURRENCY.value: "USDT",
|
214
|
+
}
|
215
|
+
with mock.patch.object(exchange_manager.exchange, "get_trade_fee", mock.Mock(return_value=fees)) \
|
216
|
+
as get_trade_fee_mock:
|
217
|
+
# cast 1: enough funds in pf to cover fees
|
218
|
+
orders = await modes_util.convert_asset_to_target_asset(
|
219
|
+
trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(450)
|
220
|
+
)
|
221
|
+
assert len(orders) == 1
|
222
|
+
order = orders[0]
|
223
|
+
assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
|
224
|
+
assert order.symbol == "ETH/USDT"
|
225
|
+
assert order.origin_quantity == decimal.Decimal("0.3")
|
226
|
+
assert order.created_last_price == decimal.Decimal(1500)
|
227
|
+
get_trade_fee_mock.assert_called_once()
|
228
|
+
get_trade_fee_mock.reset_mock()
|
229
|
+
trading_mode.create_order.assert_called_once()
|
230
|
+
trading_mode.create_order.reset_mock()
|
231
|
+
|
232
|
+
# cast 2: reduce amount to cover fees
|
233
|
+
orders = await modes_util.convert_asset_to_target_asset(
|
234
|
+
trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(1000)
|
235
|
+
)
|
236
|
+
assert len(orders) == 1
|
237
|
+
order = orders[0]
|
238
|
+
assert order.order_type == trading_enums.TraderOrderType.BUY_MARKET
|
239
|
+
assert order.symbol == "ETH/USDT"
|
240
|
+
assert order.origin_quantity == decimal.Decimal("0.66400000") # lower than 0.66666666 when fees is 0 USDT
|
241
|
+
assert order.created_last_price == decimal.Decimal(1500)
|
242
|
+
get_trade_fee_mock.assert_called_once()
|
243
|
+
trading_mode.create_order.assert_called_once()
|
244
|
+
trading_mode.create_order.reset_mock()
|
245
|
+
|
198
246
|
|
199
247
|
def _get_trading_mode(exchange_manager):
|
200
248
|
return mock.Mock(
|
@@ -45,6 +45,16 @@ def created_order(order_type, order_type_enum, *args, **kwargs):
|
|
45
45
|
return order
|
46
46
|
|
47
47
|
|
48
|
+
|
49
|
+
@pytest.fixture()
|
50
|
+
def backtesting_buy_and_sell_limit_orders(event_loop, backtesting_trader):
|
51
|
+
_, _, trader_instance = backtesting_trader
|
52
|
+
return (
|
53
|
+
created_order(BuyLimitOrder, TraderOrderType.BUY_LIMIT, trader_instance),
|
54
|
+
created_order(SellLimitOrder, TraderOrderType.SELL_LIMIT, trader_instance)
|
55
|
+
)
|
56
|
+
|
57
|
+
|
48
58
|
@pytest.fixture()
|
49
59
|
def buy_limit_order(event_loop, simulated_trader):
|
50
60
|
_, _, trader_instance = simulated_trader
|
@@ -303,10 +303,16 @@ async def test_trigger_chained_orders(trader_simulator):
|
|
303
303
|
await base_order.on_filled(True)
|
304
304
|
|
305
305
|
# with chained orders
|
306
|
-
order_mock_1 = mock.Mock(
|
307
|
-
|
308
|
-
|
309
|
-
|
306
|
+
order_mock_1 = mock.Mock(
|
307
|
+
update_price_if_outdated=mock.AsyncMock(),
|
308
|
+
update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
|
309
|
+
should_be_created=mock.Mock(return_value=True)
|
310
|
+
)
|
311
|
+
order_mock_2 = mock.Mock(
|
312
|
+
update_price_if_outdated=mock.AsyncMock(),
|
313
|
+
update_quantity_with_order_fees=mock.AsyncMock(return_value=True),
|
314
|
+
should_be_created=mock.Mock(return_value=False)
|
315
|
+
)
|
310
316
|
with mock.patch.object(order_util, "create_as_chained_order", mock.AsyncMock()) as create_as_chained_order_mock:
|
311
317
|
|
312
318
|
base_order.add_chained_order(order_mock_1)
|
@@ -316,12 +322,20 @@ async def test_trigger_chained_orders(trader_simulator):
|
|
316
322
|
await base_order.on_filled(False)
|
317
323
|
order_mock_1.should_be_created.assert_not_called()
|
318
324
|
order_mock_2.should_be_created.assert_not_called()
|
325
|
+
order_mock_1.update_price_if_outdated.assert_not_called()
|
326
|
+
order_mock_2.update_price_if_outdated.assert_not_called()
|
327
|
+
order_mock_1.update_quantity_with_order_fees.assert_not_called()
|
328
|
+
order_mock_2.update_quantity_with_order_fees.assert_not_called()
|
319
329
|
create_as_chained_order_mock.assert_not_called()
|
320
330
|
|
321
331
|
# triggers chained orders
|
322
332
|
await base_order.on_filled(True)
|
323
333
|
order_mock_1.should_be_created.assert_called_once()
|
324
334
|
order_mock_2.should_be_created.assert_called_once()
|
335
|
+
order_mock_1.update_price_if_outdated.assert_called_once()
|
336
|
+
order_mock_2.update_price_if_outdated.assert_called_once()
|
337
|
+
order_mock_1.update_quantity_with_order_fees.assert_called_once()
|
338
|
+
order_mock_2.update_quantity_with_order_fees.assert_called_once()
|
325
339
|
create_as_chained_order_mock.assert_called_once_with(order_mock_1)
|
326
340
|
|
327
341
|
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# Drakkar-Software OctoBot-Trading
|
2
|
+
# Copyright (c) Drakkar-Software, All rights reserved.
|
3
|
+
#
|
4
|
+
# This library is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
6
|
+
# License as published by the Free Software Foundation; either
|
7
|
+
# version 3.0 of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this library.
|
16
|
+
import decimal
|
17
|
+
import mock
|
18
|
+
import pytest
|
19
|
+
|
20
|
+
import octobot_trading.enums as enums
|
21
|
+
|
22
|
+
import octobot_trading.constants as trading_constants
|
23
|
+
import octobot_trading.personal_data as trading_personal_data
|
24
|
+
from tests.personal_data import DEFAULT_MARKET_QUANTITY, DEFAULT_ORDER_SYMBOL
|
25
|
+
from tests.test_utils.random_numbers import decimal_random_quantity
|
26
|
+
|
27
|
+
from tests import event_loop
|
28
|
+
from tests.exchanges import backtesting_trader, backtesting_config, backtesting_exchange_manager, fake_backtesting
|
29
|
+
from tests.personal_data.orders import backtesting_buy_and_sell_limit_orders
|
30
|
+
|
31
|
+
pytestmark = pytest.mark.asyncio
|
32
|
+
|
33
|
+
|
34
|
+
async def test_update_price_if_outdated(backtesting_buy_and_sell_limit_orders):
|
35
|
+
buy_limit_order, sell_limit_order = backtesting_buy_and_sell_limit_orders
|
36
|
+
buy_order_price = decimal.Decimal("100")
|
37
|
+
buy_limit_order.update(
|
38
|
+
price=buy_order_price,
|
39
|
+
quantity=decimal_random_quantity(max_value=DEFAULT_MARKET_QUANTITY / buy_order_price),
|
40
|
+
symbol=DEFAULT_ORDER_SYMBOL,
|
41
|
+
order_type=enums.TraderOrderType.BUY_LIMIT,
|
42
|
+
)
|
43
|
+
sell_order_price = decimal.Decimal("150")
|
44
|
+
sell_limit_order.update(
|
45
|
+
price=sell_order_price,
|
46
|
+
quantity=decimal_random_quantity(max_value=DEFAULT_MARKET_QUANTITY / sell_order_price),
|
47
|
+
symbol=DEFAULT_ORDER_SYMBOL,
|
48
|
+
order_type=enums.TraderOrderType.BUY_LIMIT,
|
49
|
+
)
|
50
|
+
origin_update_limit_price_if_necessary = buy_limit_order._update_limit_price_if_necessary
|
51
|
+
# buy side
|
52
|
+
with mock.patch.object(
|
53
|
+
buy_limit_order, "_update_limit_price_if_necessary",
|
54
|
+
mock.Mock(side_effect=origin_update_limit_price_if_necessary)
|
55
|
+
) as _update_limit_price_if_necessary_mock:
|
56
|
+
# without price
|
57
|
+
await buy_limit_order.update_price_if_outdated()
|
58
|
+
_update_limit_price_if_necessary_mock.assert_not_called()
|
59
|
+
|
60
|
+
# with up-to-date price
|
61
|
+
buy_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(buy_limit_order.symbol).\
|
62
|
+
prices_manager.set_mark_price(decimal.Decimal("110"), enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
|
63
|
+
await buy_limit_order.update_price_if_outdated()
|
64
|
+
_update_limit_price_if_necessary_mock.assert_called_once()
|
65
|
+
assert buy_limit_order.origin_price is buy_order_price
|
66
|
+
_update_limit_price_if_necessary_mock.reset_mock()
|
67
|
+
|
68
|
+
# with outdated price
|
69
|
+
buy_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(buy_limit_order.symbol).\
|
70
|
+
prices_manager.set_mark_price(decimal.Decimal("90"), enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
|
71
|
+
await buy_limit_order.update_price_if_outdated()
|
72
|
+
|
73
|
+
_update_limit_price_if_necessary_mock.assert_called_once()
|
74
|
+
# price got adapted
|
75
|
+
assert buy_limit_order.origin_price < buy_order_price
|
76
|
+
assert buy_limit_order.origin_price == decimal.Decimal("90") * (
|
77
|
+
trading_constants.ONE + trading_constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE
|
78
|
+
)
|
79
|
+
|
80
|
+
sell_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(sell_limit_order.symbol). \
|
81
|
+
prices_manager._reset_prices()
|
82
|
+
origin_update_limit_price_if_necessary = sell_limit_order._update_limit_price_if_necessary
|
83
|
+
# sell side
|
84
|
+
with mock.patch.object(
|
85
|
+
sell_limit_order, "_update_limit_price_if_necessary",
|
86
|
+
mock.Mock(side_effect=origin_update_limit_price_if_necessary)
|
87
|
+
) as _update_limit_price_if_necessary_mock:
|
88
|
+
# without price
|
89
|
+
await sell_limit_order.update_price_if_outdated()
|
90
|
+
_update_limit_price_if_necessary_mock.assert_not_called()
|
91
|
+
|
92
|
+
# with up-to-date price
|
93
|
+
sell_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(sell_limit_order.symbol).\
|
94
|
+
prices_manager.set_mark_price(decimal.Decimal("110"), enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
|
95
|
+
await sell_limit_order.update_price_if_outdated()
|
96
|
+
_update_limit_price_if_necessary_mock.assert_called_once()
|
97
|
+
assert sell_limit_order.origin_price is sell_order_price
|
98
|
+
_update_limit_price_if_necessary_mock.reset_mock()
|
99
|
+
|
100
|
+
# with outdated price
|
101
|
+
not_round_price = decimal.Decimal("155") + decimal.Decimal(1/3) # force not round number
|
102
|
+
sell_limit_order.exchange_manager.exchange_symbols_data.get_exchange_symbol_data(sell_limit_order.symbol).\
|
103
|
+
prices_manager.set_mark_price(not_round_price, enums.MarkPriceSources.EXCHANGE_MARK_PRICE.value)
|
104
|
+
await sell_limit_order.update_price_if_outdated()
|
105
|
+
|
106
|
+
_update_limit_price_if_necessary_mock.assert_called_once()
|
107
|
+
# price got adapted
|
108
|
+
assert sell_limit_order.origin_price > sell_order_price
|
109
|
+
assert sell_limit_order.origin_price != not_round_price * (
|
110
|
+
trading_constants.ONE - trading_constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE
|
111
|
+
)
|
112
|
+
# ensure price decimals got adapted
|
113
|
+
assert sell_limit_order.origin_price == trading_personal_data.decimal_adapt_price(
|
114
|
+
sell_limit_order.exchange_manager.exchange.get_market_status(sell_limit_order.symbol, with_fixer=False),
|
115
|
+
not_round_price * (
|
116
|
+
trading_constants.ONE - trading_constants.CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE
|
117
|
+
)
|
118
|
+
)
|
File without changes
|
File without changes
|
{OctoBot-Trading-2.4.57 → OctoBot-Trading-2.4.59}/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
|