From 67152ad48a1fbf7a621acb779fe4b7aa2b200cac Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 24 Feb 2024 14:56:42 +0100 Subject: [PATCH] Improve and parametrize pairlist tests --- .../plugins/pairlist/VolatilityFilter.py | 1 - .../plugins/pairlist/rangestabilityfilter.py | 1 + tests/plugins/test_pairlist.py | 35 ++++++++++++++----- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/freqtrade/plugins/pairlist/VolatilityFilter.py b/freqtrade/plugins/pairlist/VolatilityFilter.py index 301a92b7d..ca375fcda 100644 --- a/freqtrade/plugins/pairlist/VolatilityFilter.py +++ b/freqtrade/plugins/pairlist/VolatilityFilter.py @@ -3,7 +3,6 @@ Volatility pairlist filter """ import logging import sys -from copy import deepcopy from datetime import timedelta from typing import Any, Dict, List, Optional diff --git a/freqtrade/plugins/pairlist/rangestabilityfilter.py b/freqtrade/plugins/pairlist/rangestabilityfilter.py index 0bd35997c..730bb3d78 100644 --- a/freqtrade/plugins/pairlist/rangestabilityfilter.py +++ b/freqtrade/plugins/pairlist/rangestabilityfilter.py @@ -44,6 +44,7 @@ class RangeStabilityFilter(IPairList): if self._sort_direction not in [None, 'asc', 'desc']: raise OperationalException("RangeStabilityFilter requires sort_direction to be " "either None (undefined), 'asc' or 'desc'") + @property def needstickers(self) -> bool: """ diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index 5d7497273..57affc731 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -774,12 +774,34 @@ def test_VolatilityFilter_error(mocker, whitelist_conf) -> None: PairListManager(exchange_mock, whitelist_conf, MagicMock()) -@pytest.mark.parametrize('sort_direction', ['asc', 'desc']) -def test_VolatilityFilter_sort( - mocker, whitelist_conf, tickers, time_machine, sort_direction) -> None: +@pytest.mark.parametrize('pairlist,expected_pairlist', [ + ({"method": "VolatilityFilter", "sort_direction": "asc"}, + ['XRP/BTC', 'ETH/BTC', 'LTC/BTC', 'TKN/BTC']), + ({"method": "VolatilityFilter", "sort_direction": "desc"}, + ['TKN/BTC', 'LTC/BTC', 'ETH/BTC', 'XRP/BTC']), + ({"method": "VolatilityFilter", "sort_direction": "desc", 'min_volatility': 0.4}, + ['TKN/BTC', 'LTC/BTC', 'ETH/BTC']), + ({"method": "VolatilityFilter", "sort_direction": "asc", 'min_volatility': 0.4}, + ['ETH/BTC', 'LTC/BTC', 'TKN/BTC']), + ({"method": "VolatilityFilter", "sort_direction": "desc", 'max_volatility': 0.5}, + ['LTC/BTC', 'ETH/BTC', 'XRP/BTC']), + ({"method": "VolatilityFilter", "sort_direction": "asc", 'max_volatility': 0.5}, + ['XRP/BTC', 'ETH/BTC', 'LTC/BTC']), + ({"method": "RangeStabilityFilter", "sort_direction": "asc"}, + ['ETH/BTC', 'XRP/BTC', 'LTC/BTC', 'TKN/BTC']), + ({"method": "RangeStabilityFilter", "sort_direction": "desc"}, + ['TKN/BTC', 'LTC/BTC', 'XRP/BTC', 'ETH/BTC']), + ({"method": "RangeStabilityFilter", "sort_direction": "asc", 'min_rate_of_change': 0.4}, + ['XRP/BTC', 'LTC/BTC', 'TKN/BTC']), + ({"method": "RangeStabilityFilter", "sort_direction": "desc", 'min_rate_of_change': 0.4}, + ['TKN/BTC', 'LTC/BTC', 'XRP/BTC']), +]) +def test_VolatilityFilter_RangeStabilityFilter_sort( + mocker, whitelist_conf, tickers, time_machine, pairlist, expected_pairlist) -> None: whitelist_conf['pairlists'] = [ {'method': 'VolumePairList', 'number_assets': 10}, - {"method": "VolatilityFilter", "sort_direction": sort_direction}] + pairlist + ] df1 = generate_test_data('1d', 10, '2022-01-05 00:00:00+00:00', random_seed=42) df2 = generate_test_data('1d', 10, '2022-01-05 00:00:00+00:00', random_seed=2) @@ -817,10 +839,7 @@ def test_VolatilityFilter_sort( plm.refresh_pairlist() assert ohlcv_mock.call_count == 1 assert exchange.ohlcv_candle_limit.call_count == 2 - assert plm.whitelist == ( - ['XRP/BTC', 'ETH/BTC', 'LTC/BTC', 'TKN/BTC'] if sort_direction == 'asc' - else ['TKN/BTC', 'LTC/BTC', 'ETH/BTC', 'XRP/BTC'] - ) + assert plm.whitelist == expected_pairlist plm.refresh_pairlist() assert exchange.ohlcv_candle_limit.call_count == 2