From 3bce9278bd823c0c55a31280918474a853fdf8d2 Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Tue, 9 Sep 2025 14:37:08 +0200 Subject: [PATCH] Add cache for gen_pairlist() in StaticPairList in backtest mode --- freqtrade/plugins/pairlist/StaticPairList.py | 30 ++++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/freqtrade/plugins/pairlist/StaticPairList.py b/freqtrade/plugins/pairlist/StaticPairList.py index bff2105b3..9df437260 100644 --- a/freqtrade/plugins/pairlist/StaticPairList.py +++ b/freqtrade/plugins/pairlist/StaticPairList.py @@ -7,6 +7,9 @@ Provides pair white list as it configured in config import logging from copy import deepcopy +from cachetools import LRUCache + +from freqtrade.enums.runmode import RunMode from freqtrade.exchange.exchange_types import Tickers from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting @@ -22,6 +25,7 @@ class StaticPairList(IPairList): super().__init__(*args, **kwargs) self._allow_inactive = self._pairlistconfig.get("allow_inactive", False) + self._pair_cache: LRUCache = LRUCache(maxsize=1) @property def needstickers(self) -> bool: @@ -60,15 +64,23 @@ class StaticPairList(IPairList): :param tickers: Tickers (from exchange.get_tickers). May be cached. :return: List of pairs """ - wl = self.verify_whitelist( - self._config["exchange"]["pair_whitelist"], logger.info, keep_invalid=True - ) - if self._allow_inactive: - return wl - else: - # Avoid implicit filtering of "verify_whitelist" to keep - # proper warnings in the log - return self._whitelist_for_active_markets(wl) + pairlist = self._pair_cache.get("pairlist") + + if not pairlist: + wl = self.verify_whitelist( + self._config["exchange"]["pair_whitelist"], logger.info, keep_invalid=True + ) + if self._allow_inactive: + pairlist = wl + else: + # Avoid implicit filtering of "verify_whitelist" to keep + # proper warnings in the log + pairlist = self._whitelist_for_active_markets(wl) + + if self._config["runmode"] in (RunMode.BACKTEST, RunMode.HYPEROPT): + self._pair_cache["pairlist"] = pairlist.copy() + + return pairlist def filter_pairlist(self, pairlist: list[str], tickers: Tickers) -> list[str]: """