From 8274a6c3a9a8ce38cf56a7e42c86af10d78cc564 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 24 Nov 2025 07:07:13 +0100 Subject: [PATCH] chore: update usage of TTLCache to FtTTLCache --- freqtrade/exchange/binance.py | 4 ++-- freqtrade/exchange/exchange.py | 14 +++++++------- freqtrade/mixins/logging_mixin.py | 6 ++++-- freqtrade/plugins/pairlist/MarketCapPairList.py | 5 ++--- .../plugins/pairlist/PercentChangePairList.py | 5 ++--- freqtrade/plugins/pairlist/RemotePairList.py | 6 +++--- freqtrade/plugins/pairlist/VolatilityFilter.py | 5 ++--- freqtrade/plugins/pairlist/VolumePairList.py | 6 ++---- freqtrade/plugins/pairlist/rangestabilityfilter.py | 5 ++--- freqtrade/plugins/pairlistmanager.py | 5 +++-- freqtrade/rpc/api_server/webserver_bgwork.py | 2 +- freqtrade/rpc/fiat_convert.py | 4 ++-- freqtrade/util/measure_time.py | 4 ++-- 13 files changed, 34 insertions(+), 37 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 807aa27cf..b5c6c5d52 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -5,7 +5,6 @@ from datetime import UTC, datetime from pathlib import Path import ccxt -from cachetools import TTLCache from pandas import DataFrame from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS @@ -21,6 +20,7 @@ from freqtrade.exchange.common import retrier from freqtrade.exchange.exchange_types import FtHas, Tickers from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_msecs from freqtrade.misc import deep_merge_dicts, json_load +from freqtrade.util import FtTTLCache from freqtrade.util.datetime_helpers import dt_from_ts, dt_ts @@ -76,7 +76,7 @@ class Binance(Exchange): def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) - self._spot_delist_schedule_cache: TTLCache = TTLCache(maxsize=100, ttl=300) + self._spot_delist_schedule_cache: FtTTLCache = FtTTLCache(maxsize=100, ttl=300) def get_proxy_coin(self) -> str: """ diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index e86a37b73..b3ff6890a 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -16,7 +16,6 @@ from typing import Any, Literal, TypeGuard, TypeVar import ccxt import ccxt.pro as ccxt_pro -from cachetools import TTLCache from ccxt import TICK_SIZE from dateutil import parser from pandas import DataFrame, concat @@ -107,9 +106,8 @@ from freqtrade.misc import ( file_load_json, safe_value_fallback2, ) -from freqtrade.util import dt_from_ts, dt_now +from freqtrade.util import FtTTLCache, PeriodicCache, dt_from_ts, dt_now from freqtrade.util.datetime_helpers import dt_humanize_delta, dt_ts, format_ms_time -from freqtrade.util.periodic_cache import PeriodicCache logger = logging.getLogger(__name__) @@ -230,13 +228,13 @@ class Exchange: self._cache_lock = Lock() # Cache for 10 minutes ... - self._fetch_tickers_cache: TTLCache = TTLCache(maxsize=4, ttl=60 * 10) + self._fetch_tickers_cache: FtTTLCache = FtTTLCache(maxsize=4, ttl=60 * 10) # Cache values for 300 to avoid frequent polling of the exchange for prices # Caching only applies to RPC methods, so prices for open trades are still # refreshed once every iteration. # Shouldn't be too high either, as it'll freeze UI updates in case of open orders. - self._exit_rate_cache: TTLCache = TTLCache(maxsize=100, ttl=300) - self._entry_rate_cache: TTLCache = TTLCache(maxsize=100, ttl=300) + self._exit_rate_cache: FtTTLCache = FtTTLCache(maxsize=100, ttl=300) + self._entry_rate_cache: FtTTLCache = FtTTLCache(maxsize=100, ttl=300) # Holds candles self._klines: dict[PairWithTimeframe, DataFrame] = {} @@ -2164,7 +2162,9 @@ class Exchange: name = side.capitalize() strat_name = "entry_pricing" if side == "entry" else "exit_pricing" - cache_rate: TTLCache = self._entry_rate_cache if side == "entry" else self._exit_rate_cache + cache_rate: FtTTLCache = ( + self._entry_rate_cache if side == "entry" else self._exit_rate_cache + ) if not refresh: with self._cache_lock: rate = cache_rate.get(pair) diff --git a/freqtrade/mixins/logging_mixin.py b/freqtrade/mixins/logging_mixin.py index 91ad2c25e..2849a186d 100644 --- a/freqtrade/mixins/logging_mixin.py +++ b/freqtrade/mixins/logging_mixin.py @@ -1,6 +1,8 @@ from collections.abc import Callable -from cachetools import TTLCache, cached +from cachetools import cached + +from freqtrade.util import FtTTLCache class LoggingMixin: @@ -18,7 +20,7 @@ class LoggingMixin: """ self.logger = logger self.refresh_period = refresh_period - self._log_cache: TTLCache = TTLCache(maxsize=1024, ttl=self.refresh_period) + self._log_cache: FtTTLCache = FtTTLCache(maxsize=1024, ttl=self.refresh_period) def log_once(self, message: str, logmethod: Callable, force_show: bool = False) -> None: """ diff --git a/freqtrade/plugins/pairlist/MarketCapPairList.py b/freqtrade/plugins/pairlist/MarketCapPairList.py index f39bc3255..ecb287090 100644 --- a/freqtrade/plugins/pairlist/MarketCapPairList.py +++ b/freqtrade/plugins/pairlist/MarketCapPairList.py @@ -7,11 +7,10 @@ Provides dynamic pair list based on Market Cap import logging import math -from cachetools import TTLCache - from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Tickers from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting +from freqtrade.util import FtTTLCache from freqtrade.util.coin_gecko import FtCoinGeckoApi @@ -38,7 +37,7 @@ class MarketCapPairList(IPairList): self._max_rank = self._pairlistconfig.get("max_rank", 30) self._refresh_period = self._pairlistconfig.get("refresh_period", 86400) self._categories = self._pairlistconfig.get("categories", []) - self._marketcap_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period) + self._marketcap_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) _coingecko_config = self._config.get("coingecko", {}) diff --git a/freqtrade/plugins/pairlist/PercentChangePairList.py b/freqtrade/plugins/pairlist/PercentChangePairList.py index 7f09cf77d..3138856c8 100644 --- a/freqtrade/plugins/pairlist/PercentChangePairList.py +++ b/freqtrade/plugins/pairlist/PercentChangePairList.py @@ -10,7 +10,6 @@ import logging from datetime import timedelta from typing import TypedDict -from cachetools import TTLCache from pandas import DataFrame from freqtrade.constants import ListPairsWithTimeframes, PairWithTimeframe @@ -18,7 +17,7 @@ from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date from freqtrade.exchange.exchange_types import Ticker, Tickers from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting -from freqtrade.util import dt_now, format_ms_time +from freqtrade.util import FtTTLCache, dt_now, format_ms_time logger = logging.getLogger(__name__) @@ -47,7 +46,7 @@ class PercentChangePairList(IPairList): self._min_value = self._pairlistconfig.get("min_value", None) self._max_value = self._pairlistconfig.get("max_value", None) self._refresh_period = self._pairlistconfig.get("refresh_period", 1800) - self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period) + self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._lookback_days = self._pairlistconfig.get("lookback_days", 0) self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d") self._lookback_period = self._pairlistconfig.get("lookback_period", 0) diff --git a/freqtrade/plugins/pairlist/RemotePairList.py b/freqtrade/plugins/pairlist/RemotePairList.py index db32d5a77..7967c2d1c 100644 --- a/freqtrade/plugins/pairlist/RemotePairList.py +++ b/freqtrade/plugins/pairlist/RemotePairList.py @@ -10,7 +10,6 @@ from typing import Any import rapidjson import requests -from cachetools import TTLCache from freqtrade import __version__ from freqtrade.configuration.load_config import CONFIG_PARSE_MODE @@ -18,6 +17,7 @@ from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Tickers from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist +from freqtrade.util import FtTTLCache logger = logging.getLogger(__name__) @@ -48,7 +48,7 @@ class RemotePairList(IPairList): self._number_pairs = self._pairlistconfig["number_assets"] self._refresh_period: int = self._pairlistconfig.get("refresh_period", 1800) self._keep_pairlist_on_failure = self._pairlistconfig.get("keep_pairlist_on_failure", True) - self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period) + self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._pairlist_url = self._pairlistconfig.get("pairlist_url", "") self._read_timeout = self._pairlistconfig.get("read_timeout", 60) self._bearer_token = self._pairlistconfig.get("bearer_token", "") @@ -159,7 +159,7 @@ class RemotePairList(IPairList): ) self._refresh_period = remote_refresh_period - self._pair_cache = TTLCache(maxsize=1, ttl=remote_refresh_period) + self._pair_cache = FtTTLCache(maxsize=1, ttl=remote_refresh_period) self._init_done = True diff --git a/freqtrade/plugins/pairlist/VolatilityFilter.py b/freqtrade/plugins/pairlist/VolatilityFilter.py index 84056564a..8cd33f2c4 100644 --- a/freqtrade/plugins/pairlist/VolatilityFilter.py +++ b/freqtrade/plugins/pairlist/VolatilityFilter.py @@ -7,7 +7,6 @@ import sys from datetime import timedelta import numpy as np -from cachetools import TTLCache from pandas import DataFrame from freqtrade.constants import ListPairsWithTimeframes @@ -15,7 +14,7 @@ from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Tickers from freqtrade.misc import plural from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting -from freqtrade.util import dt_floor_day, dt_now, dt_ts +from freqtrade.util import FtTTLCache, dt_floor_day, dt_now, dt_ts logger = logging.getLogger(__name__) @@ -38,7 +37,7 @@ class VolatilityFilter(IPairList): self._def_candletype = self._config["candle_type_def"] self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None) - self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period) + self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1000, ttl=self._refresh_period) candle_limit = self._exchange.ohlcv_candle_limit("1d", self._def_candletype) if self._days < 1: diff --git a/freqtrade/plugins/pairlist/VolumePairList.py b/freqtrade/plugins/pairlist/VolumePairList.py index 7e7fa7601..7d5ce3468 100644 --- a/freqtrade/plugins/pairlist/VolumePairList.py +++ b/freqtrade/plugins/pairlist/VolumePairList.py @@ -8,14 +8,12 @@ import logging from datetime import timedelta from typing import Any, Literal -from cachetools import TTLCache - from freqtrade.constants import ListPairsWithTimeframes from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date from freqtrade.exchange.exchange_types import Tickers from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting -from freqtrade.util import dt_now, format_ms_time +from freqtrade.util import FtTTLCache, dt_now, format_ms_time logger = logging.getLogger(__name__) @@ -43,7 +41,7 @@ class VolumePairList(IPairList): self._min_value = self._pairlistconfig.get("min_value", 0) self._max_value = self._pairlistconfig.get("max_value", None) self._refresh_period = self._pairlistconfig.get("refresh_period", 1800) - self._pair_cache: TTLCache = TTLCache(maxsize=1, ttl=self._refresh_period) + self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=self._refresh_period) self._lookback_days = self._pairlistconfig.get("lookback_days", 0) self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d") self._lookback_period = self._pairlistconfig.get("lookback_period", 0) diff --git a/freqtrade/plugins/pairlist/rangestabilityfilter.py b/freqtrade/plugins/pairlist/rangestabilityfilter.py index 8ea082658..6a0e730e3 100644 --- a/freqtrade/plugins/pairlist/rangestabilityfilter.py +++ b/freqtrade/plugins/pairlist/rangestabilityfilter.py @@ -5,7 +5,6 @@ Rate of change pairlist filter import logging from datetime import timedelta -from cachetools import TTLCache from pandas import DataFrame from freqtrade.constants import ListPairsWithTimeframes @@ -13,7 +12,7 @@ from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Tickers from freqtrade.misc import plural from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting -from freqtrade.util import dt_floor_day, dt_now, dt_ts +from freqtrade.util import FtTTLCache, dt_floor_day, dt_now, dt_ts logger = logging.getLogger(__name__) @@ -32,7 +31,7 @@ class RangeStabilityFilter(IPairList): self._def_candletype = self._config["candle_type_def"] self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None) - self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period) + self._pair_cache: FtTTLCache = FtTTLCache(maxsize=1000, ttl=self._refresh_period) candle_limit = self._exchange.ohlcv_candle_limit("1d", self._def_candletype) if self._days < 1: diff --git a/freqtrade/plugins/pairlistmanager.py b/freqtrade/plugins/pairlistmanager.py index 9056d842e..aad5dc865 100644 --- a/freqtrade/plugins/pairlistmanager.py +++ b/freqtrade/plugins/pairlistmanager.py @@ -5,7 +5,7 @@ PairList manager class import logging from functools import partial -from cachetools import LRUCache, TTLCache, cached +from cachetools import LRUCache, cached from freqtrade.constants import Config, ListPairsWithTimeframes from freqtrade.data.dataprovider import DataProvider @@ -17,6 +17,7 @@ from freqtrade.mixins import LoggingMixin from freqtrade.plugins.pairlist.IPairList import IPairList, SupportsBacktesting from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist from freqtrade.resolvers import PairListResolver +from freqtrade.util import FtTTLCache logger = logging.getLogger(__name__) @@ -129,7 +130,7 @@ class PairListManager(LoggingMixin): """List of short_desc for each Pairlist Handler""" return [{p.name: p.short_desc()} for p in self._pairlist_handlers] - @cached(TTLCache(maxsize=1, ttl=1800)) + @cached(FtTTLCache(maxsize=1, ttl=1800)) def _get_cached_tickers(self) -> Tickers: return self._exchange.get_tickers() diff --git a/freqtrade/rpc/api_server/webserver_bgwork.py b/freqtrade/rpc/api_server/webserver_bgwork.py index 75aadb78e..be17f7a94 100644 --- a/freqtrade/rpc/api_server/webserver_bgwork.py +++ b/freqtrade/rpc/api_server/webserver_bgwork.py @@ -37,7 +37,7 @@ class ApiBG: # Generic background jobs - # TODO: Change this to TTLCache + # TODO: Change this to FtTTLCache jobs: dict[str, JobsContainer] = {} # Pairlist evaluate things pairlist_running: bool = False diff --git a/freqtrade/rpc/fiat_convert.py b/freqtrade/rpc/fiat_convert.py index f4589a7da..16d64dd50 100644 --- a/freqtrade/rpc/fiat_convert.py +++ b/freqtrade/rpc/fiat_convert.py @@ -7,11 +7,11 @@ import logging from datetime import datetime from typing import Any -from cachetools import TTLCache from requests.exceptions import RequestException from freqtrade.constants import SUPPORTED_FIAT, Config from freqtrade.mixins.logging_mixin import LoggingMixin +from freqtrade.util import FtTTLCache from freqtrade.util.coin_gecko import FtCoinGeckoApi @@ -54,7 +54,7 @@ class CryptoToFiatConverter(LoggingMixin): def __init__(self, config: Config) -> None: # Timeout: 6h - self._pair_price: TTLCache = TTLCache(maxsize=500, ttl=6 * 60 * 60) + self._pair_price: FtTTLCache = FtTTLCache(maxsize=500, ttl=6 * 60 * 60) _coingecko_config = config.get("coingecko", {}) self._coingecko = FtCoinGeckoApi( diff --git a/freqtrade/util/measure_time.py b/freqtrade/util/measure_time.py index baa94f062..85fadf1e8 100644 --- a/freqtrade/util/measure_time.py +++ b/freqtrade/util/measure_time.py @@ -2,7 +2,7 @@ import logging import time from collections.abc import Callable -from cachetools import TTLCache +from freqtrade.util import FtTTLCache logger = logging.getLogger(__name__) @@ -27,7 +27,7 @@ class MeasureTime: """ self._callback = callback self._time_limit = time_limit - self.__cache: TTLCache = TTLCache(maxsize=1, ttl=ttl) + self.__cache: FtTTLCache = FtTTLCache(maxsize=1, ttl=ttl) def __enter__(self): self._start = time.time()