diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index b98ea1999..ae4001f5f 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -752,17 +752,7 @@ class Backtesting: min_backtest_date = datetime.now(tz=timezone.utc) - timedelta(weeks=4) return min_backtest_date - def start(self) -> None: - """ - Run backtesting end-to-end - :return: None - """ - data: Dict[str, Any] = {} - - data, timerange = self.load_bt_data() - self.load_bt_data_detail() - logger.info("Dataload complete. Calculating indicators") - + def load_prior_backtest(self): self.run_ids = { strategy.get_strategy_name(): get_strategy_run_id(strategy) for strategy in self.strategylist @@ -775,6 +765,19 @@ class Backtesting: self.results = find_existing_backtest_stats( self.config['user_data_dir'] / 'backtest_results', self.run_ids, min_backtest_date) + def start(self) -> None: + """ + Run backtesting end-to-end + :return: None + """ + data: Dict[str, Any] = {} + + data, timerange = self.load_bt_data() + self.load_bt_data_detail() + logger.info("Dataload complete. Calculating indicators") + + self.load_prior_backtest() + for strat in self.strategylist: if self.results and strat.get_strategy_name() in self.results['strategy']: # When previous result hash matches - reuse that result and skip backtesting. diff --git a/freqtrade/rpc/api_server/api_backtest.py b/freqtrade/rpc/api_server/api_backtest.py index 8101f54f5..97b7b7989 100644 --- a/freqtrade/rpc/api_server/api_backtest.py +++ b/freqtrade/rpc/api_server/api_backtest.py @@ -77,13 +77,21 @@ async def api_start_backtest(bt_settings: BacktestRequest, background_tasks: Bac lastconfig['enable_protections'] = btconfig.get('enable_protections') lastconfig['dry_run_wallet'] = btconfig.get('dry_run_wallet') - ApiServer._bt.abort = False - min_date, max_date = ApiServer._bt.backtest_one_strategy( - strat, ApiServer._bt_data, ApiServer._bt_timerange) + ApiServer._bt.results = {} + ApiServer._bt.load_prior_backtest() - ApiServer._bt.results = generate_backtest_stats( - ApiServer._bt_data, ApiServer._bt.all_results, - min_date=min_date, max_date=max_date) + ApiServer._bt.abort = False + if (ApiServer._bt.results and + strat.get_strategy_name() in ApiServer._bt.results['strategy']): + # When previous result hash matches - reuse that result and skip backtesting. + logger.info(f'Reusing result of previous backtest for {strat.get_strategy_name()}') + else: + min_date, max_date = ApiServer._bt.backtest_one_strategy( + strat, ApiServer._bt_data, ApiServer._bt_timerange) + + ApiServer._bt.results = generate_backtest_stats( + ApiServer._bt_data, ApiServer._bt.all_results, + min_date=min_date, max_date=max_date) if btconfig.get('export', 'none') == 'trades': store_backtest_stats(btconfig['exportfilename'], ApiServer._bt.results)