From 21a5abf25d971cc2f12a74b49c552e3252a3d4bb Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 20 Nov 2023 08:42:27 +0100 Subject: [PATCH 1/2] fix: make sure that get_required_startup is timeframe independent --- freqtrade/data/dataprovider.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 11cbd7934..5e312fa74 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -332,15 +332,14 @@ class DataProvider: if not freqai_config.get('enabled', False): return self._config.get('startup_candle_count', 0) else: - startup_candles = self._config.get('startup_candle_count', 0) indicator_periods = freqai_config['feature_parameters']['indicator_periods_candles'] # make sure the startupcandles is at least the set maximum indicator periods - self._config['startup_candle_count'] = max(startup_candles, max(indicator_periods)) + needed_candles = max(indicator_periods) tf_seconds = timeframe_to_seconds(timeframe) train_candles = 0 if add_train_candles: train_candles = freqai_config['train_period_days'] * 86400 / tf_seconds - total_candles = int(self._config['startup_candle_count'] + train_candles) + total_candles = int(needed_candles + train_candles) logger.info(f'Increasing startup_candle_count for freqai to {total_candles}') return total_candles From d52936fd4239fb5e94a52c9d04846e755a1f12d9 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 20 Nov 2023 09:13:01 +0100 Subject: [PATCH 2/2] chore: try to keep startup_candle_count behaving the same as a normal FT strat --- freqtrade/data/dataprovider.py | 5 +++-- freqtrade/optimize/backtesting.py | 11 +++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 5e312fa74..11cbd7934 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -332,14 +332,15 @@ class DataProvider: if not freqai_config.get('enabled', False): return self._config.get('startup_candle_count', 0) else: + startup_candles = self._config.get('startup_candle_count', 0) indicator_periods = freqai_config['feature_parameters']['indicator_periods_candles'] # make sure the startupcandles is at least the set maximum indicator periods - needed_candles = max(indicator_periods) + self._config['startup_candle_count'] = max(startup_candles, max(indicator_periods)) tf_seconds = timeframe_to_seconds(timeframe) train_candles = 0 if add_train_candles: train_candles = freqai_config['train_period_days'] * 86400 / tf_seconds - total_candles = int(needed_candles + train_candles) + total_candles = int(self._config['startup_candle_count'] + train_candles) logger.info(f'Increasing startup_candle_count for freqai to {total_candles}') return total_candles diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 04037bc40..d5caf7070 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -147,7 +147,9 @@ class Backtesting: if self.config.get('freqai', {}).get('enabled', False): # For FreqAI, increase the required_startup to includes the training data - self.required_startup = self.dataprovider.get_required_startup(self.timeframe) + self.freqai_startup_candles = self.dataprovider.get_required_startup( + self.timeframe + ) # Add maximum startup candle count to configuration for informative pairs support self.config['startup_candle_count'] = self.required_startup @@ -234,12 +236,17 @@ class Backtesting: """ self.progress.init_step(BacktestState.DATALOAD, 1) + if self.config.get('freqai', {}).get('enabled', False): + startup_candle_count = self.freqai_startup_candles + else: + startup_candle_count = self.config['startup_candle_count'] + data = history.load_data( datadir=self.config['datadir'], pairs=self.pairlists.whitelist, timeframe=self.timeframe, timerange=self.timerange, - startup_candles=self.config['startup_candle_count'], + startup_candles=startup_candle_count, fail_without_data=True, data_format=self.config['dataformat_ohlcv'], candle_type=self.config.get('candle_type_def', CandleType.SPOT)