From 644442e2f9eadede920eea40051096950e1fa287 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Feb 2022 13:37:31 +0100 Subject: [PATCH] Track timedout orders --- docs/bot-basics.md | 1 + docs/strategy-callbacks.md | 6 ++++-- freqtrade/optimize/backtesting.py | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/bot-basics.md b/docs/bot-basics.md index a9a2628f6..8c6303063 100644 --- a/docs/bot-basics.md +++ b/docs/bot-basics.md @@ -62,6 +62,7 @@ This loop will be repeated again and again until the bot is stopped. * Check position adjustments for open trades if enabled and call `adjust_trade_position()` to determine if an additional order is requested. * Call `custom_stoploss()` and `custom_sell()` to find custom exit points. * For sells based on sell-signal and custom-sell: Call `custom_exit_price()` to determine exit price (Prices are moved to be within the closing candle). + * Check for Order timeouts, either via the `unfilledtimeout` configuration, or via `check_buy_timeout()` / `check_sell_timeout()` strategy callbacks. * Generate backtest report output !!! Note diff --git a/docs/strategy-callbacks.md b/docs/strategy-callbacks.md index bff5bd998..9cdcb65bd 100644 --- a/docs/strategy-callbacks.md +++ b/docs/strategy-callbacks.md @@ -467,7 +467,8 @@ class AwesomeStrategy(IStrategy): 'sell': 60 * 25 } - def check_buy_timeout(self, pair: str, trade: Trade, order: dict, **kwargs) -> bool: + def check_buy_timeout(self, pair: str, trade: Trade, order: dict, + current_time: datetime, **kwargs) -> bool: ob = self.dp.orderbook(pair, 1) current_price = ob['bids'][0][0] # Cancel buy order if price is more than 2% above the order. @@ -476,7 +477,8 @@ class AwesomeStrategy(IStrategy): return False - def check_sell_timeout(self, pair: str, trade: Trade, order: dict, **kwargs) -> bool: + def check_sell_timeout(self, pair: str, trade: Trade, order: dict, + current_time: datetime, **kwargs) -> bool: ob = self.dp.orderbook(pair, 1) current_price = ob['asks'][0][0] # Cancel sell order if price is more than 2% below the order. diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 737cede9d..cc4eb5351 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -233,6 +233,7 @@ class Backtesting: PairLocks.reset_locks() Trade.reset_trades() self.rejected_trades = 0 + self.timedout_orders = 0 self.dataprovider.clear_cache() if enable_protections: self._load_protections(self.strategy) @@ -646,6 +647,7 @@ class Backtesting: timedout = self.strategy.ft_check_timed_out(order.side, trade, order, current_time) if timedout: + self.timedout_orders += 1 if order.side == 'buy': if trade.nr_of_successful_buys == 0: # Remove trade due to buy timeout expiration. @@ -796,6 +798,8 @@ class Backtesting: 'config': self.strategy.config, 'locks': PairLocks.get_all_locks(), 'rejected_signals': self.rejected_trades, + # TODO: timedout_orders should be shown as part of results. + # 'timedout_orders': self.timedout_orders, 'final_balance': self.wallets.get_total(self.strategy.config['stake_currency']), }