Allow blacklist-verification from all pairlists

This commit is contained in:
Matthias 2019-11-09 07:19:46 +01:00
parent 1059586226
commit eaf3fd80c5
4 changed files with 21 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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})