From 92a1d58df8687bfeda5ed0f57a8736152430fce4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 Oct 2022 06:41:56 +0200 Subject: [PATCH] Evict cache if we didn't get new candles for X hours --- freqtrade/exchange/exchange.py | 8 ++++++-- tests/exchange/test_exchange.py | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 278b216ad..914f67e60 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1854,8 +1854,12 @@ class Exchange: since_ms: Optional[int], cache: bool) -> Coroutine: not_all_data = self.required_candle_call_count > 1 if cache and (pair, timeframe, candle_type) in self._klines: - # Not in cache - force multi-calls - not_all_data = False + candle_limit = self.ohlcv_candle_limit(timeframe, candle_type) + min_date = date_minus_candles(timeframe, candle_limit - 5).timestamp() + # Check if 1 call can get us updated candles without hole in the data. + if min_date < self._pairs_last_refresh_time.get((pair, timeframe, candle_type), 0): + # Cache can be used - do one-off call. + not_all_data = False if (not since_ms and (self._ft_has["ohlcv_require_since"] or not_all_data)): diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index bcd1473c6..d8f5b832c 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2145,13 +2145,13 @@ def test_refresh_latest_ohlcv(mocker, default_conf, caplog, candle_type) -> None f"{pairs[0][1]}, {candle_type} ...", caplog) caplog.clear() - # Reset refresh times - must do 1 call per pair (even though required_calls is 2) + # Reset refresh times - must do 2 call per pair as cache is expired exchange._pairs_last_refresh_time = {} res = exchange.refresh_latest_ohlcv( [('IOTA/ETH', '5m', candle_type), ('XRP/ETH', '5m', candle_type)]) assert len(res) == len(pairs) - assert exchange._api_async.fetch_ohlcv.call_count == 2 + assert exchange._api_async.fetch_ohlcv.call_count == 4 # cache - but disabled caching exchange._api_async.fetch_ohlcv.reset_mock()