Allow blacklist-verification from all pairlists
This commit is contained in:
parent
1059586226
commit
eaf3fd80c5
@ -6,6 +6,7 @@ Provides lists as configured in config.json
|
|||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
from abc import ABC, abstractmethod, abstractproperty
|
from abc import ABC, abstractmethod, abstractproperty
|
||||||
|
from copy import deepcopy
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
|
|
||||||
from freqtrade.exchange import market_is_active
|
from freqtrade.exchange import market_is_active
|
||||||
@ -15,8 +16,9 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class IPairList(ABC):
|
class IPairList(ABC):
|
||||||
|
|
||||||
def __init__(self, exchange, config, pairlistconfig: dict) -> None:
|
def __init__(self, exchange, pairlistmanager, config, pairlistconfig: dict) -> None:
|
||||||
self._exchange = exchange
|
self._exchange = exchange
|
||||||
|
self._pairlistmanager = pairlistmanager
|
||||||
self._config = config
|
self._config = config
|
||||||
self._pairlistconfig = pairlistconfig
|
self._pairlistconfig = pairlistconfig
|
||||||
|
|
||||||
@ -54,6 +56,15 @@ class IPairList(ABC):
|
|||||||
:return: new whitelist
|
:return: new whitelist
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _verify_blacklist(self, pairlist: List[str]) -> List[str]:
|
||||||
|
|
||||||
|
for pair in deepcopy(pairlist):
|
||||||
|
if pair in self._pairlistmanager.blacklist:
|
||||||
|
logger.warning(f"Pair {pair} in your blacklist. Removing it from whitelist...")
|
||||||
|
pairlist.remove(pair)
|
||||||
|
return pairlist
|
||||||
|
|
||||||
def _whitelist_for_active_markets(self, whitelist: List[str]) -> List[str]:
|
def _whitelist_for_active_markets(self, whitelist: List[str]) -> List[str]:
|
||||||
"""
|
"""
|
||||||
Check available markets and remove pair from whitelist if necessary
|
Check available markets and remove pair from whitelist if necessary
|
||||||
|
@ -85,7 +85,9 @@ class VolumePairList(IPairList):
|
|||||||
sorted_tickers = sorted(tickers, reverse=True, key=lambda t: t[key])
|
sorted_tickers = sorted(tickers, reverse=True, key=lambda t: t[key])
|
||||||
# Validate whitelist to only have active market pairs
|
# Validate whitelist to only have active market pairs
|
||||||
pairs = self._whitelist_for_active_markets([s['symbol'] for s in sorted_tickers])
|
pairs = self._whitelist_for_active_markets([s['symbol'] for s in sorted_tickers])
|
||||||
|
pairs = self._verify_blacklist(pairs)
|
||||||
logger.info(f"Searching {self._number_pairs} pairs: {pairs[:self._number_pairs]}")
|
# Limit to X number of pairs
|
||||||
|
pairs = pairs[:self._number_pairs]
|
||||||
|
logger.info(f"Searching {self._number_pairs} pairs: {pairs}")
|
||||||
|
|
||||||
return pairs
|
return pairs
|
||||||
|
@ -5,7 +5,6 @@ Provides lists as configured in config.json
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
from copy import deepcopy
|
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from freqtrade.pairlist.IPairList import IPairList
|
from freqtrade.pairlist.IPairList import IPairList
|
||||||
@ -25,7 +24,7 @@ class PairListManager():
|
|||||||
self._tickers_needed = False
|
self._tickers_needed = False
|
||||||
for pl in self._config.get('pairlists', [{'method': "StaticPairList"}]):
|
for pl in self._config.get('pairlists', [{'method': "StaticPairList"}]):
|
||||||
pairl = PairListResolver(pl.get('method'),
|
pairl = PairListResolver(pl.get('method'),
|
||||||
exchange, config,
|
exchange, self, config,
|
||||||
pl.get('config')).pairlist
|
pl.get('config')).pairlist
|
||||||
self._tickers_needed = pairl.needstickers or self._tickers_needed
|
self._tickers_needed = pairl.needstickers or self._tickers_needed
|
||||||
self._pairlists.append(pairl)
|
self._pairlists.append(pairl)
|
||||||
@ -57,18 +56,10 @@ class PairListManager():
|
|||||||
if self._tickers_needed:
|
if self._tickers_needed:
|
||||||
tickers = self._exchange.get_tickers()
|
tickers = self._exchange.get_tickers()
|
||||||
|
|
||||||
|
# Process all pairlists in chain
|
||||||
for pl in self._pairlists:
|
for pl in self._pairlists:
|
||||||
pl.filter_pairlist(pairlist, tickers)
|
pairlist = pl.filter_pairlist(pairlist, tickers)
|
||||||
|
|
||||||
# Validation against blacklist happens after the pairlists to ensure blacklist is respected.
|
# Validation against blacklist happens after the pairlists to ensure blacklist is respected.
|
||||||
pairlist = self.verify_blacklist(pairlist, self.blacklist)
|
pairlist = self.verify_blacklist(pairlist, self.blacklist)
|
||||||
self._whitelist = pairlist
|
self._whitelist = pairlist
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def verify_blacklist(pairlist: List[str], blacklist: List[str]) -> List[str]:
|
|
||||||
|
|
||||||
for pair in deepcopy(pairlist):
|
|
||||||
if pair in blacklist:
|
|
||||||
logger.warning(f"Pair {pair} in your blacklist. Removing it from whitelist...")
|
|
||||||
pairlist.remove(pair)
|
|
||||||
return pairlist
|
|
||||||
|
@ -20,13 +20,14 @@ class PairListResolver(IResolver):
|
|||||||
|
|
||||||
__slots__ = ['pairlist']
|
__slots__ = ['pairlist']
|
||||||
|
|
||||||
def __init__(self, pairlist_name: str, exchange, config: dict, pairlistconfig) -> None:
|
def __init__(self, pairlist_name: str, exchange, pairlistmanager, config: dict, pairlistconfig) -> None:
|
||||||
"""
|
"""
|
||||||
Load the custom class from config parameter
|
Load the custom class from config parameter
|
||||||
:param config: configuration dictionary or None
|
:param config: configuration dictionary or None
|
||||||
"""
|
"""
|
||||||
self.pairlist = self._load_pairlist(pairlist_name, config,
|
self.pairlist = self._load_pairlist(pairlist_name, config,
|
||||||
kwargs={'exchange': exchange,
|
kwargs={'exchange': exchange,
|
||||||
|
'pairlistmanager': pairlistmanager,
|
||||||
'config': config,
|
'config': config,
|
||||||
'pairlistconfig': pairlistconfig})
|
'pairlistconfig': pairlistconfig})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user