Merge pull request #3616 from freqtrade/fix/pairfilter
Fix pairfilter crash
This commit is contained in:
		| @@ -56,7 +56,7 @@ class PriceFilter(IPairList): | |||||||
|         :param ticker: ticker dict as returned from ccxt.load_markets() |         :param ticker: ticker dict as returned from ccxt.load_markets() | ||||||
|         :return: True if the pair can stay, false if it should be removed |         :return: True if the pair can stay, false if it should be removed | ||||||
|         """ |         """ | ||||||
|         if ticker['last'] is None: |         if ticker['last'] is None or ticker['last'] == 0: | ||||||
|             self.log_on_refresh(logger.info, |             self.log_on_refresh(logger.info, | ||||||
|                                 f"Removed {ticker['symbol']} from whitelist, because " |                                 f"Removed {ticker['symbol']} from whitelist, because " | ||||||
|                                 "ticker['last'] is empty (Usually no trade in the last 24h).") |                                 "ticker['last'] is empty (Usually no trade in the last 24h).") | ||||||
|   | |||||||
| @@ -661,7 +661,8 @@ def shitcoinmarkets(markets): | |||||||
|     Fixture with shitcoin markets - used to test filters in pairlists |     Fixture with shitcoin markets - used to test filters in pairlists | ||||||
|     """ |     """ | ||||||
|     shitmarkets = deepcopy(markets) |     shitmarkets = deepcopy(markets) | ||||||
|     shitmarkets.update({'HOT/BTC': { |     shitmarkets.update({ | ||||||
|  |         'HOT/BTC': { | ||||||
|             'id': 'HOTBTC', |             'id': 'HOTBTC', | ||||||
|             'symbol': 'HOT/BTC', |             'symbol': 'HOT/BTC', | ||||||
|             'base': 'HOT', |             'base': 'HOT', | ||||||
| @@ -767,6 +768,31 @@ def shitcoinmarkets(markets): | |||||||
|             "future": False, |             "future": False, | ||||||
|             "active": True |             "active": True | ||||||
|         }, |         }, | ||||||
|  |         'ADADOUBLE/USDT': { | ||||||
|  |             "percentage": True, | ||||||
|  |             "tierBased": False, | ||||||
|  |             "taker": 0.001, | ||||||
|  |             "maker": 0.001, | ||||||
|  |             "precision": { | ||||||
|  |                 "base": 8, | ||||||
|  |                 "quote": 8, | ||||||
|  |                 "amount": 2, | ||||||
|  |                 "price": 4 | ||||||
|  |             }, | ||||||
|  |             "limits": { | ||||||
|  |             }, | ||||||
|  |             "id": "ADADOUBLEUSDT", | ||||||
|  |             "symbol": "ADADOUBLE/USDT", | ||||||
|  |             "base": "ADADOUBLE", | ||||||
|  |             "quote": "USDT", | ||||||
|  |             "baseId": "ADADOUBLE", | ||||||
|  |             "quoteId": "USDT", | ||||||
|  |             "info": {}, | ||||||
|  |             "type": "spot", | ||||||
|  |             "spot": True, | ||||||
|  |             "future": False, | ||||||
|  |             "active": True | ||||||
|  |         }, | ||||||
|         }) |         }) | ||||||
|     return shitmarkets |     return shitmarkets | ||||||
|  |  | ||||||
| @@ -1388,6 +1414,28 @@ def tickers(): | |||||||
|             "quoteVolume": 0.0, |             "quoteVolume": 0.0, | ||||||
|             "info": {} |             "info": {} | ||||||
|         }, |         }, | ||||||
|  |         "ADADOUBLE/USDT": { | ||||||
|  |             "symbol": "ADADOUBLE/USDT", | ||||||
|  |             "timestamp": 1580469388244, | ||||||
|  |             "datetime": "2020-01-31T11:16:28.244Z", | ||||||
|  |             "high": None, | ||||||
|  |             "low": None, | ||||||
|  |             "bid": 0.7305, | ||||||
|  |             "bidVolume": None, | ||||||
|  |             "ask": 0.7342, | ||||||
|  |             "askVolume": None, | ||||||
|  |             "vwap": None, | ||||||
|  |             "open": None, | ||||||
|  |             "close": None, | ||||||
|  |             "last": 0, | ||||||
|  |             "previousClose": None, | ||||||
|  |             "change": None, | ||||||
|  |             "percentage": 2.628, | ||||||
|  |             "average": None, | ||||||
|  |             "baseVolume": 0.0, | ||||||
|  |             "quoteVolume": 0.0, | ||||||
|  |             "info": {} | ||||||
|  |         }, | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -235,7 +235,7 @@ def test_VolumePairList_refresh_empty(mocker, markets_empty, whitelist_conf): | |||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "bidVolume"}], |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "bidVolume"}], | ||||||
|      "BTC",  ['HOT/BTC', 'FUEL/BTC', 'XRP/BTC', 'LTC/BTC', 'TKN/BTC']), |      "BTC",  ['HOT/BTC', 'FUEL/BTC', 'XRP/BTC', 'LTC/BTC', 'TKN/BTC']), | ||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}], |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}], | ||||||
|      "USDT", ['ETH/USDT', 'NANO/USDT', 'ADAHALF/USDT']), |      "USDT", ['ETH/USDT', 'NANO/USDT', 'ADAHALF/USDT', 'ADADOUBLE/USDT']), | ||||||
|     # No pair for ETH, VolumePairList |     # No pair for ETH, VolumePairList | ||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}], |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}], | ||||||
|      "ETH", []), |      "ETH", []), | ||||||
| @@ -303,11 +303,11 @@ def test_VolumePairList_refresh_empty(mocker, markets_empty, whitelist_conf): | |||||||
|     # ShuffleFilter |     # ShuffleFilter | ||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}, |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}, | ||||||
|       {"method": "ShuffleFilter", "seed": 77}], |       {"method": "ShuffleFilter", "seed": 77}], | ||||||
|      "USDT", ['ETH/USDT', 'ADAHALF/USDT', 'NANO/USDT']), |      "USDT", ['ADADOUBLE/USDT', 'ETH/USDT', 'NANO/USDT', 'ADAHALF/USDT']), | ||||||
|     # ShuffleFilter, other seed |     # ShuffleFilter, other seed | ||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}, |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}, | ||||||
|       {"method": "ShuffleFilter", "seed": 42}], |       {"method": "ShuffleFilter", "seed": 42}], | ||||||
|      "USDT", ['NANO/USDT', 'ETH/USDT', 'ADAHALF/USDT']), |      "USDT", ['ADAHALF/USDT', 'NANO/USDT', 'ADADOUBLE/USDT', 'ETH/USDT']), | ||||||
|     # ShuffleFilter, no seed |     # ShuffleFilter, no seed | ||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}, |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "quoteVolume"}, | ||||||
|       {"method": "ShuffleFilter"}], |       {"method": "ShuffleFilter"}], | ||||||
| @@ -347,6 +347,9 @@ def test_VolumePairList_refresh_empty(mocker, markets_empty, whitelist_conf): | |||||||
|     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "bidVolume"}, |     ([{"method": "VolumePairList", "number_assets": 5, "sort_key": "bidVolume"}, | ||||||
|       {"method": "StaticPairList"}], |       {"method": "StaticPairList"}], | ||||||
|      "BTC", 'static_in_the_middle'), |      "BTC", 'static_in_the_middle'), | ||||||
|  |     ([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"}, | ||||||
|  |       {"method": "PriceFilter", "low_price_ratio": 0.02}], | ||||||
|  |         "USDT", ['ETH/USDT', 'NANO/USDT']), | ||||||
| ]) | ]) | ||||||
| def test_VolumePairList_whitelist_gen(mocker, whitelist_conf, shitcoinmarkets, tickers, | def test_VolumePairList_whitelist_gen(mocker, whitelist_conf, shitcoinmarkets, tickers, | ||||||
|                                       ohlcv_history_list, pairlists, base_currency, |                                       ohlcv_history_list, pairlists, base_currency, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user