From a13b633c5623fc16b1ed997a8195ca82dc27c001 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 17 Mar 2022 20:11:56 +0100 Subject: [PATCH] update VOlumepairlist to also work without tickers --- freqtrade/plugins/pairlist/VolumePairList.py | 36 ++++++++++++-------- tests/plugins/test_pairlist.py | 4 +-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/freqtrade/plugins/pairlist/VolumePairList.py b/freqtrade/plugins/pairlist/VolumePairList.py index 961c461f2..6adca7369 100644 --- a/freqtrade/plugins/pairlist/VolumePairList.py +++ b/freqtrade/plugins/pairlist/VolumePairList.py @@ -71,10 +71,11 @@ class VolumePairList(IPairList): f'to at least {self._tf_in_sec} and restart the bot.' ) - if not self._exchange.exchange_has('fetchTickers'): + if not self._use_range and not self._exchange.exchange_has('fetchTickers'): raise OperationalException( - 'Exchange does not support dynamic whitelist. ' - 'Please edit your config and restart the bot.' + "Exchange does not support dynamic whitelist in this configuration. " + "Please edit your config and either remove Volumepairlist, " + "or switch to using candles. and restart the bot." ) if not self._validate_keys(self._sort_key): @@ -95,7 +96,7 @@ class VolumePairList(IPairList): If no Pairlist requires tickers, an empty Dict is passed as tickers argument to filter_pairlist """ - return True + return not self._use_range def _validate_keys(self, key): return key in SORT_VALUES @@ -126,13 +127,15 @@ class VolumePairList(IPairList): tradable_only=True, active_only=True).keys()] # No point in testing for blacklisted pairs... _pairlist = self.verify_blacklist(_pairlist, logger.info) - - filtered_tickers = [ - v for k, v in tickers.items() - if (self._exchange.get_pair_quote_currency(k) == self._stake_currency - and (self._use_range or v[self._sort_key] is not None) - and v['symbol'] in _pairlist)] - pairlist = [s['symbol'] for s in filtered_tickers] + if not self._use_range: + filtered_tickers = [ + v for k, v in tickers.items() + if (self._exchange.get_pair_quote_currency(k) == self._stake_currency + and (self._use_range or v[self._sort_key] is not None) + and v['symbol'] in _pairlist)] + pairlist = [s['symbol'] for s in filtered_tickers] + else: + pairlist = _pairlist pairlist = self.filter_pairlist(pairlist, tickers) self._pair_cache['pairlist'] = pairlist.copy() @@ -147,11 +150,11 @@ class VolumePairList(IPairList): :param tickers: Tickers (from exchange.get_tickers()). May be cached. :return: new whitelist """ - # Use the incoming pairlist. - filtered_tickers = [v for k, v in tickers.items() if k in pairlist] - - # get lookback period in ms, for exchange ohlcv fetch if self._use_range: + # Create bare minimum from tickers structure. + filtered_tickers = [{'symbol': k} for k in pairlist] + + # get lookback period in ms, for exchange ohlcv fetch since_ms = int(arrow.utcnow() .floor('minute') .shift(minutes=-(self._lookback_period * self._tf_in_min) @@ -208,6 +211,9 @@ class VolumePairList(IPairList): filtered_tickers[i]['quoteVolume'] = quoteVolume else: filtered_tickers[i]['quoteVolume'] = 0 + else: + # Tickers mode - filter based on incomming pairlist. + filtered_tickers = [v for k, v in tickers.items() if k in pairlist] if self._min_value > 0: filtered_tickers = [ diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index 8d7e2b5c1..9b7865e82 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -587,10 +587,10 @@ def test_VolumePairList_whitelist_gen(mocker, whitelist_conf, shitcoinmarkets, t ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume", "lookback_timeframe": "1d", "lookback_period": 1, "refresh_period": 86400}], "BTC", "binance", ['LTC/BTC', 'ETH/BTC', 'TKN/BTC', 'XRP/BTC', 'HOT/BTC']), - # expecting pairs from default tickers, because 1h candles are not available + # expecting pairs as input, because 1h candles are not available ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume", "lookback_timeframe": "1h", "lookback_period": 2, "refresh_period": 3600}], - "BTC", "binance", ['ETH/BTC', 'TKN/BTC', 'LTC/BTC', 'HOT/BTC', 'FUEL/BTC']), + "BTC", "binance", ['ETH/BTC', 'LTC/BTC', 'NEO/BTC', 'TKN/BTC', 'XRP/BTC']), # ftx data is already in Quote currency, therefore won't require conversion ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume", "lookback_timeframe": "1d", "lookback_period": 1, "refresh_period": 86400}],