freqtrade_origin/freqtrade/plugins/pairlist/pairlist_helpers.py

50 lines
2.2 KiB
Python
Raw Normal View History

2020-12-30 08:55:44 +00:00
import re
2022-09-18 11:31:52 +00:00
from freqtrade.constants import Config
2020-12-30 08:55:44 +00:00
2024-05-12 14:37:11 +00:00
def expand_pairlist(
wildcardpl: list[str], available_pairs: list[str], keep_invalid: bool = False
) -> list[str]:
2020-12-30 08:55:44 +00:00
"""
Expand pairlist potentially containing wildcards based on available markets.
This will implicitly filter all pairs in the wildcard-list which are not in available_pairs.
:param wildcardpl: List of Pairlists, which may contain regex
:param available_pairs: List of all available pairs (`exchange.get_markets().keys()`)
:param keep_invalid: If sets to True, drops invalid pairs silently while expanding regexes
2022-10-10 14:16:37 +00:00
:return: expanded pairlist, with Regexes from wildcardpl applied to match all available pairs.
:raises: ValueError if a wildcard is invalid (like '*/BTC' - which should be `.*/BTC`)
2020-12-30 08:55:44 +00:00
"""
result = []
if keep_invalid:
for pair_wc in wildcardpl:
try:
comp = re.compile(pair_wc, re.IGNORECASE)
2024-05-12 14:37:11 +00:00
result_partial = [pair for pair in available_pairs if re.fullmatch(comp, pair)]
# Add all matching pairs.
# If there are no matching pairs (Pair not on exchange) keep it.
result += result_partial or [pair_wc]
except re.error as err:
raise ValueError(f"Wildcard error in {pair_wc}, {err}")
2024-09-15 08:37:28 +00:00
# Remove wildcard pairs that didn't have a match.
2024-05-12 14:37:11 +00:00
result = [element for element in result if re.fullmatch(r"^[A-Za-z0-9:/-]+$", element)]
else:
for pair_wc in wildcardpl:
try:
comp = re.compile(pair_wc, re.IGNORECASE)
2024-05-12 14:37:11 +00:00
result += [pair for pair in available_pairs if re.fullmatch(comp, pair)]
except re.error as err:
raise ValueError(f"Wildcard error in {pair_wc}, {err}")
2020-12-30 08:55:44 +00:00
return result
def dynamic_expand_pairlist(config: Config, markets: list[str]) -> list[str]:
2024-05-12 14:37:11 +00:00
expanded_pairs = expand_pairlist(config["pairs"], markets)
if config.get("freqai", {}).get("enabled", False):
corr_pairlist = config["freqai"]["feature_parameters"]["include_corr_pairlist"]
expanded_pairs += [pair for pair in corr_pairlist if pair not in config["pairs"]]
return expanded_pairs