From 7c702dd1069bbbe9f7208c8085faa113acc667f3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 Oct 2022 14:43:45 +0000 Subject: [PATCH] Add cache eviction --- freqtrade/exchange/exchange.py | 5 +++++ tests/exchange/test_exchange.py | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 914f67e60..64ea3a5ca 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1860,6 +1860,11 @@ class Exchange: 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 + else: + # Time jump detected, evict cache + logger.info( + f"Time jump detected. Evicting cache for {pair}, {timeframe}, {candle_type}") + del self._klines[(pair, timeframe, candle_type)] 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 d8f5b832c..673dc7594 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2255,6 +2255,18 @@ def test_refresh_latest_ohlcv_cache(mocker, default_conf, candle_type, time_mach assert len(res[pair1]) == 100 assert len(res[pair2]) == 100 + # Move to distant future (so a 1 call would cause a hole in the data) + time_machine.move_to(start + timedelta(hours=2000)) + ohlcv = generate_test_data_raw('1h', 100, start + timedelta(hours=1900)) + exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) + res = exchange.refresh_latest_ohlcv(pairs) + + assert exchange._api_async.fetch_ohlcv.call_count == 2 + assert len(res) == 2 + # Cache eviction - new data. + assert len(res[pair1]) == 99 + assert len(res[pair2]) == 99 + @pytest.mark.asyncio @pytest.mark.parametrize("exchange_name", EXCHANGES)