From ea58be2705cb6a685cd79365a89d5e38660653f8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 21 Jun 2024 14:09:30 +0200 Subject: [PATCH] Classify individual pairlists for backtestability --- freqtrade/plugins/pairlist/AgeFilter.py | 4 +++- freqtrade/plugins/pairlist/FullTradesFilter.py | 4 +++- freqtrade/plugins/pairlist/MarketCapPairList.py | 3 ++- freqtrade/plugins/pairlist/OffsetFilter.py | 4 +++- freqtrade/plugins/pairlist/PerformanceFilter.py | 4 +++- freqtrade/plugins/pairlist/PrecisionFilter.py | 4 +++- freqtrade/plugins/pairlist/PriceFilter.py | 4 +++- freqtrade/plugins/pairlist/ProducerPairList.py | 3 ++- freqtrade/plugins/pairlist/RemotePairList.py | 4 +++- freqtrade/plugins/pairlist/ShuffleFilter.py | 4 +++- freqtrade/plugins/pairlist/SpreadFilter.py | 4 +++- freqtrade/plugins/pairlist/StaticPairList.py | 3 ++- freqtrade/plugins/pairlist/VolatilityFilter.py | 4 +++- freqtrade/plugins/pairlist/VolumePairList.py | 3 ++- freqtrade/plugins/pairlist/rangestabilityfilter.py | 4 +++- 15 files changed, 41 insertions(+), 15 deletions(-) diff --git a/freqtrade/plugins/pairlist/AgeFilter.py b/freqtrade/plugins/pairlist/AgeFilter.py index 917dad45c..88f0d23d8 100644 --- a/freqtrade/plugins/pairlist/AgeFilter.py +++ b/freqtrade/plugins/pairlist/AgeFilter.py @@ -13,7 +13,7 @@ from freqtrade.constants import ListPairsWithTimeframes from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers from freqtrade.misc import plural -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.util import PeriodicCache, dt_floor_day, dt_now, dt_ts @@ -21,6 +21,8 @@ logger = logging.getLogger(__name__) class AgeFilter(IPairList): + supports_backtesting = SupportsBacktesting.NO + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/FullTradesFilter.py b/freqtrade/plugins/pairlist/FullTradesFilter.py index 13586611d..caa69cb1e 100644 --- a/freqtrade/plugins/pairlist/FullTradesFilter.py +++ b/freqtrade/plugins/pairlist/FullTradesFilter.py @@ -7,13 +7,15 @@ from typing import List from freqtrade.exchange.types import Tickers from freqtrade.persistence import Trade -from freqtrade.plugins.pairlist.IPairList import IPairList +from freqtrade.plugins.pairlist.IPairList import IPairList, SupportsBacktesting logger = logging.getLogger(__name__) class FullTradesFilter(IPairList): + supports_backtesting = SupportsBacktesting.NO_ACTION + @property def needstickers(self) -> bool: """ diff --git a/freqtrade/plugins/pairlist/MarketCapPairList.py b/freqtrade/plugins/pairlist/MarketCapPairList.py index 648766e20..9bbc7aa64 100644 --- a/freqtrade/plugins/pairlist/MarketCapPairList.py +++ b/freqtrade/plugins/pairlist/MarketCapPairList.py @@ -11,7 +11,7 @@ from cachetools import TTLCache from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.util.coin_gecko import FtCoinGeckoApi @@ -20,6 +20,7 @@ logger = logging.getLogger(__name__) class MarketCapPairList(IPairList): is_pairlist_generator = True + supports_backtesting = SupportsBacktesting.TODAYS_DATA def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/OffsetFilter.py b/freqtrade/plugins/pairlist/OffsetFilter.py index bd981358e..5defaaf60 100644 --- a/freqtrade/plugins/pairlist/OffsetFilter.py +++ b/freqtrade/plugins/pairlist/OffsetFilter.py @@ -7,13 +7,15 @@ from typing import Dict, List from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting logger = logging.getLogger(__name__) class OffsetFilter(IPairList): + supports_backtesting = SupportsBacktesting.YES + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/PerformanceFilter.py b/freqtrade/plugins/pairlist/PerformanceFilter.py index c10ae7394..77a2caf56 100644 --- a/freqtrade/plugins/pairlist/PerformanceFilter.py +++ b/freqtrade/plugins/pairlist/PerformanceFilter.py @@ -9,13 +9,15 @@ import pandas as pd from freqtrade.exchange.types import Tickers from freqtrade.persistence import Trade -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting logger = logging.getLogger(__name__) class PerformanceFilter(IPairList): + supports_backtesting = SupportsBacktesting.NO_ACTION + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/PrecisionFilter.py b/freqtrade/plugins/pairlist/PrecisionFilter.py index b2f767a67..50a5fe121 100644 --- a/freqtrade/plugins/pairlist/PrecisionFilter.py +++ b/freqtrade/plugins/pairlist/PrecisionFilter.py @@ -8,13 +8,15 @@ from typing import Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange import ROUND_UP from freqtrade.exchange.types import Ticker -from freqtrade.plugins.pairlist.IPairList import IPairList +from freqtrade.plugins.pairlist.IPairList import IPairList, SupportsBacktesting logger = logging.getLogger(__name__) class PrecisionFilter(IPairList): + supports_backtesting = SupportsBacktesting.TODAYS_DATA + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/PriceFilter.py b/freqtrade/plugins/pairlist/PriceFilter.py index d651533ce..c8405dc9b 100644 --- a/freqtrade/plugins/pairlist/PriceFilter.py +++ b/freqtrade/plugins/pairlist/PriceFilter.py @@ -7,13 +7,15 @@ from typing import Dict, Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Ticker -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting logger = logging.getLogger(__name__) class PriceFilter(IPairList): + supports_backtesting = SupportsBacktesting.TODAYS_DATA + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/ProducerPairList.py b/freqtrade/plugins/pairlist/ProducerPairList.py index 09a0c49d2..18af7a734 100644 --- a/freqtrade/plugins/pairlist/ProducerPairList.py +++ b/freqtrade/plugins/pairlist/ProducerPairList.py @@ -9,7 +9,7 @@ from typing import Dict, List, Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting logger = logging.getLogger(__name__) @@ -31,6 +31,7 @@ class ProducerPairList(IPairList): """ is_pairlist_generator = True + supports_backtesting = SupportsBacktesting.NO def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/RemotePairList.py b/freqtrade/plugins/pairlist/RemotePairList.py index 26fadb9ae..25c5a56d5 100644 --- a/freqtrade/plugins/pairlist/RemotePairList.py +++ b/freqtrade/plugins/pairlist/RemotePairList.py @@ -16,7 +16,7 @@ from freqtrade import __version__ from freqtrade.configuration.load_config import CONFIG_PARSE_MODE from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -25,6 +25,8 @@ logger = logging.getLogger(__name__) class RemotePairList(IPairList): is_pairlist_generator = True + # Potential winner bias + supports_backtesting = SupportsBacktesting.TODAYS_DATA def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index 59ac1ac7c..3882ec8a8 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -9,7 +9,7 @@ from typing import Dict, List, Literal from freqtrade.enums import RunMode from freqtrade.exchange import timeframe_to_seconds from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.util.periodic_cache import PeriodicCache @@ -19,6 +19,8 @@ ShuffleValues = Literal["candle", "iteration"] class ShuffleFilter(IPairList): + supports_backtesting = SupportsBacktesting.YES + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/SpreadFilter.py b/freqtrade/plugins/pairlist/SpreadFilter.py index 736903abd..00109abb3 100644 --- a/freqtrade/plugins/pairlist/SpreadFilter.py +++ b/freqtrade/plugins/pairlist/SpreadFilter.py @@ -7,13 +7,15 @@ from typing import Dict, Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Ticker -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting logger = logging.getLogger(__name__) class SpreadFilter(IPairList): + supports_backtesting = SupportsBacktesting.NO + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/StaticPairList.py b/freqtrade/plugins/pairlist/StaticPairList.py index 922d0fd94..c4f322353 100644 --- a/freqtrade/plugins/pairlist/StaticPairList.py +++ b/freqtrade/plugins/pairlist/StaticPairList.py @@ -9,7 +9,7 @@ from copy import deepcopy from typing import Dict, List from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting logger = logging.getLogger(__name__) @@ -17,6 +17,7 @@ logger = logging.getLogger(__name__) class StaticPairList(IPairList): is_pairlist_generator = True + supports_backtesting = SupportsBacktesting.YES def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/VolatilityFilter.py b/freqtrade/plugins/pairlist/VolatilityFilter.py index f5af2d0a7..2d11e45ef 100644 --- a/freqtrade/plugins/pairlist/VolatilityFilter.py +++ b/freqtrade/plugins/pairlist/VolatilityFilter.py @@ -15,7 +15,7 @@ from freqtrade.constants import ListPairsWithTimeframes from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers from freqtrade.misc import plural -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.util import dt_floor_day, dt_now, dt_ts @@ -27,6 +27,8 @@ class VolatilityFilter(IPairList): Filters pairs by volatility """ + supports_backtesting = SupportsBacktesting.NO + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/VolumePairList.py b/freqtrade/plugins/pairlist/VolumePairList.py index ea172f140..7cc91f743 100644 --- a/freqtrade/plugins/pairlist/VolumePairList.py +++ b/freqtrade/plugins/pairlist/VolumePairList.py @@ -14,7 +14,7 @@ from freqtrade.constants import ListPairsWithTimeframes from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_minutes, timeframe_to_prev_date from freqtrade.exchange.types import Tickers -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.util import dt_now, format_ms_time @@ -26,6 +26,7 @@ SORT_VALUES = ["quoteVolume"] class VolumePairList(IPairList): is_pairlist_generator = True + supports_backtesting = SupportsBacktesting.NO def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) diff --git a/freqtrade/plugins/pairlist/rangestabilityfilter.py b/freqtrade/plugins/pairlist/rangestabilityfilter.py index 473e003b6..175e5b18a 100644 --- a/freqtrade/plugins/pairlist/rangestabilityfilter.py +++ b/freqtrade/plugins/pairlist/rangestabilityfilter.py @@ -13,7 +13,7 @@ from freqtrade.constants import ListPairsWithTimeframes from freqtrade.exceptions import OperationalException from freqtrade.exchange.types import Tickers from freqtrade.misc import plural -from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting from freqtrade.util import dt_floor_day, dt_now, dt_ts @@ -21,6 +21,8 @@ logger = logging.getLogger(__name__) class RangeStabilityFilter(IPairList): + supports_backtesting = SupportsBacktesting.NO + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs)