From e8fbe77ebc4cdcd2ab9e490fb69715b30993982f Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 30 Nov 2018 06:34:56 +0100 Subject: [PATCH] Refactor static whitelist to module --- freqtrade/freqtradebot.py | 47 ++++----------------- freqtrade/pairlist/StaticList.py | 70 ++++++++++++++++++++++++++++++++ freqtrade/pairlist/__init__.py | 0 3 files changed, 79 insertions(+), 38 deletions(-) create mode 100644 freqtrade/pairlist/StaticList.py create mode 100644 freqtrade/pairlist/__init__.py diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index a73a2e98f..3e8874bb6 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -25,6 +25,7 @@ from freqtrade.resolvers import StrategyResolver from freqtrade.state import State from freqtrade.strategy.interface import SellType, IStrategy from freqtrade.exchange.exchange_helpers import order_book_to_dataframe +from freqtrade.pairlist.StaticList import StaticList logger = logging.getLogger(__name__) @@ -59,6 +60,7 @@ class FreqtradeBot(object): self.persistence = None self.exchange = Exchange(self.config) self.wallets = Wallets(self.exchange) + self.pairlists = StaticList(self, self.config) # Initializing Edge only if enabled self.edge = Edge(self.config, self.exchange, self.strategy) if \ @@ -148,11 +150,13 @@ class FreqtradeBot(object): try: nb_assets = self.config.get('dynamic_whitelist', None) # Refresh whitelist based on wallet maintenance - sanitized_list = self._refresh_whitelist( - self._gen_pair_whitelist( - self.config['stake_currency'] - ) if nb_assets else self.config['exchange']['pair_whitelist'] - ) + self.pairlists.refresh_whitelist() + sanitized_list = self.pairlists.whitelist + # sanitized_list = self._refresh_whitelist( + # self._gen_pair_whitelist( + # self.config['stake_currency'] + # ) if nb_assets else self.lists.get_whitelist() + # ) # Keep only the subsets of pairs wanted (up to nb_assets) self.active_pair_whitelist = sanitized_list[:nb_assets] if nb_assets else sanitized_list @@ -227,39 +231,6 @@ class FreqtradeBot(object): pairs = [s['symbol'] for s in sorted_tickers] return pairs - def _refresh_whitelist(self, whitelist: List[str]) -> List[str]: - """ - Check available markets and remove pair from whitelist if necessary - :param whitelist: the sorted list (based on BaseVolume) of pairs the user might want to - trade - :return: the list of pairs the user wants to trade without the one unavailable or - black_listed - """ - sanitized_whitelist = whitelist - markets = self.exchange.get_markets() - - markets = [m for m in markets if m['quote'] == self.config['stake_currency']] - known_pairs = set() - for market in markets: - pair = market['symbol'] - # pair is not int the generated dynamic market, or in the blacklist ... ignore it - if pair not in whitelist or pair in self.config['exchange'].get('pair_blacklist', []): - continue - # else the pair is valid - known_pairs.add(pair) - # Market is not active - if not market['active']: - sanitized_whitelist.remove(pair) - logger.info( - 'Ignoring %s from whitelist. Market is not active.', - pair - ) - - # We need to remove pairs that are unknown - final_list = [x for x in sanitized_whitelist if x in known_pairs] - - return final_list - def get_target_bid(self, pair: str, ticker: Dict[str, float]) -> float: """ Calculates bid target between current ask price and last price diff --git a/freqtrade/pairlist/StaticList.py b/freqtrade/pairlist/StaticList.py new file mode 100644 index 000000000..ea4a9ac98 --- /dev/null +++ b/freqtrade/pairlist/StaticList.py @@ -0,0 +1,70 @@ +""" +Static List provider + +Provides lists as configured in config.json + + """ +import logging +from typing import List, Optional + +logger = logging.getLogger(__name__) + + +class StaticList(object): + + def __init__(self, freqtrade, config: dict) -> None: + self._freqtrade = freqtrade + self._config = config + self._whitelist = self._config['exchange']['pair_whitelist'] + self._blacklist = self._config['exchange'].get('pair_blacklist', []) + self.refresh_whitelist() + + @property + def whitelist(self) -> List[str]: + """ Contains the current whitelist """ + return self._whitelist + + @property + def blacklist(self) -> List[str]: + return self._blacklist + + def refresh_whitelist(self) -> bool: + """ + Refreshes whitelist. + """ + return self.validate_whitelist(self._config['exchange']['pair_whitelist']) + + def validate_whitelist(self, whitelist: List[str]) -> bool: + """ + Check available markets and remove pair from whitelist if necessary + :param whitelist: the sorted list (based on BaseVolume) of pairs the user might want to + trade + :return: the list of pairs the user wants to trade without the one unavailable or + black_listed + """ + sanitized_whitelist = whitelist + markets = self._freqtrade.exchange.get_markets() + + # Filter to markets in stake currency + markets = [m for m in markets if m['quote'] == self._config['stake_currency']] + known_pairs = set() + + for market in markets: + pair = market['symbol'] + # pair is not int the generated dynamic market, or in the blacklist ... ignore it + if pair not in whitelist or pair in self.blacklist: + continue + # else the pair is valid + known_pairs.add(pair) + # Market is not active + if not market['active']: + sanitized_whitelist.remove(pair) + logger.info( + 'Ignoring %s from whitelist. Market is not active.', + pair + ) + + # We need to remove pairs that are unknown + self._whitelist = [x for x in sanitized_whitelist if x in known_pairs] + + return True diff --git a/freqtrade/pairlist/__init__.py b/freqtrade/pairlist/__init__.py new file mode 100644 index 000000000..e69de29bb