From ddce28c12db4a6b8ca0b50c564f3578feddcc074 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 18 Dec 2021 15:32:02 +0100 Subject: [PATCH] Update data downloading to include funding_fee downloads --- freqtrade/data/history/history_utils.py | 25 ++++++++++++++----------- freqtrade/exchange/exchange.py | 10 ++++------ tests/data/test_history.py | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 64297c7e5..57fdc4a14 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -283,17 +283,20 @@ def refresh_backtest_ohlcv_data(exchange: Exchange, pairs: List[str], timeframes # Predefined candletype (and timeframe) depending on exchange # Downloads what is necessary to backtest based on futures data. timeframe = exchange._ft_has['mark_ohlcv_timeframe'] - candle_type = CandleType.from_string(exchange._ft_has['mark_ohlcv_price']) - - # TODO: this could be in most parts to the above. - if erase: - if data_handler.ohlcv_purge(pair, timeframe, candle_type=candle_type): - logger.info(f'Deleting existing data for pair {pair}, interval {timeframe}.') - _download_pair_history(pair=pair, process=process, - datadir=datadir, exchange=exchange, - timerange=timerange, data_handler=data_handler, - timeframe=str(timeframe), new_pairs_days=new_pairs_days, - candle_type=candle_type) + fr_candle_type = CandleType.from_string(exchange._ft_has['mark_ohlcv_price']) + # All exchanges need FundingRate for futures trading. + # The timeframe is aligned to the mark-price timeframe. + for candle_type in (CandleType.FUNDING_RATE, fr_candle_type): + # TODO: this could be in most parts to the above. + if erase: + if data_handler.ohlcv_purge(pair, timeframe, candle_type=candle_type): + logger.info( + f'Deleting existing data for pair {pair}, interval {timeframe}.') + _download_pair_history(pair=pair, process=process, + datadir=datadir, exchange=exchange, + timerange=timerange, data_handler=data_handler, + timeframe=str(timeframe), new_pairs_days=new_pairs_days, + candle_type=candle_type) return pairs_not_available diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index f05a0bd52..b6709d0db 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1840,8 +1840,8 @@ class Exchange: if self.funding_fee_cutoff(open_date): open_date += timedelta(hours=1) - - open_date = timeframe_to_prev_date('1h', open_date) + timeframe = self._ft_has['mark_ohlcv_timeframe'] + open_date = timeframe_to_prev_date(timeframe, open_date) fees: float = 0 if not close_date: @@ -1850,11 +1850,9 @@ class Exchange: # close_timestamp = int(close_date.timestamp()) * 1000 mark_comb: PairWithTimeframe = ( - pair, '1h', CandleType.from_string(self._ft_has["mark_ohlcv_price"])) + pair, timeframe, CandleType.from_string(self._ft_has["mark_ohlcv_price"])) - # TODO-lev: 1h seems arbitrary and generates a lot of "empty" lines - # TODO-lev: probably a exchange-adjusted parameter would make more sense - funding_comb: PairWithTimeframe = (pair, '1h', CandleType.FUNDING_RATE) + funding_comb: PairWithTimeframe = (pair, timeframe, CandleType.FUNDING_RATE) candle_histories = self.refresh_latest_ohlcv( [mark_comb, funding_comb], since_ms=open_timestamp, diff --git a/tests/data/test_history.py b/tests/data/test_history.py index 678a0b31b..d70d69080 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -490,7 +490,7 @@ def test_validate_backtest_data(default_conf, mocker, caplog, testdatadir) -> No @pytest.mark.parametrize('trademode,callcount', [ ('spot', 4), ('margin', 4), - ('futures', 6), + ('futures', 8), # Called 8 times - 4 normal, 2 funding and 2 mark/index calls ]) def test_refresh_backtest_ohlcv_data( mocker, default_conf, markets, caplog, testdatadir, trademode, callcount):