diff --git a/freqtrade/main.py b/freqtrade/main.py index ff5d4b5aa..7fc7654ed 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -27,23 +27,27 @@ _CONF = {} def refresh_whitelist(whitelist: List[str]) -> List[str]: """ Check wallet health and remove pair from whitelist if necessary - :param whitelist: the pair the user might want to trade + :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 = [] + sanitized_whitelist = whitelist health = exchange.get_wallet_health() + known_pairs = set() for status in health: pair = '{}_{}'.format(_CONF['stake_currency'], status['Currency']) + known_pairs.add(pair) if pair not in whitelist or pair in _CONF['exchange'].get('pair_blacklist', []): continue - if status['IsActive']: - sanitized_whitelist.append(pair) - else: + if not status['IsActive']: + sanitized_whitelist.remove(pair) logger.info( 'Ignoring %s from whitelist (reason: %s).', pair, status.get('Notice') or 'wallet is not active' ) - return sanitized_whitelist + + # 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 _process(nb_assets: Optional[int] = 0) -> bool: diff --git a/freqtrade/tests/test_acl_pair.py b/freqtrade/tests/test_acl_pair.py index 0067eb302..1368ac25c 100644 --- a/freqtrade/tests/test_acl_pair.py +++ b/freqtrade/tests/test_acl_pair.py @@ -16,24 +16,43 @@ def whitelist_conf(): "BTC_SWT", "BTC_BCC" ], + "pair_blacklist": [ + "BTC_BLK" + ], }, } def get_health(): return [{'Currency': 'ETH', - 'IsActive': True + 'IsActive': True, + 'BaseVolume': 42 }, {'Currency': 'TKN', - 'IsActive': True - }] + 'IsActive': True, + 'BaseVolume': 1664 + }, + {'Currency': 'BLK', + 'IsActive': True, + 'BaseVolume': 4096 + } + ] def get_health_empty(): return [] -# below three test could be merged into a single -# test that ran randomlly generated health lists + +def test_refresh_market_pair_not_in_whitelist(mocker): + conf = whitelist_conf() + mocker.patch.dict('freqtrade.main._CONF', conf) + mocker.patch.multiple('freqtrade.main.exchange', + get_wallet_health=get_health) + refreshedwhitelist = refresh_whitelist(conf['exchange']['pair_whitelist'] + ['BTC_XXX']) + # List ordered by BaseVolume + whitelist = ['BTC_ETH', 'BTC_TKN'] + # Ensure all except those in whitelist are removed + assert whitelist == refreshedwhitelist def test_refresh_whitelist(mocker): @@ -42,9 +61,10 @@ def test_refresh_whitelist(mocker): mocker.patch.multiple('freqtrade.main.exchange', get_wallet_health=get_health) refreshedwhitelist = refresh_whitelist(conf['exchange']['pair_whitelist']) + # List ordered by BaseVolume whitelist = ['BTC_ETH', 'BTC_TKN'] # Ensure all except those in whitelist are removed - assert set(whitelist) == set(refreshedwhitelist) + assert whitelist == refreshedwhitelist def test_refresh_whitelist_dynamic(mocker): @@ -53,9 +73,9 @@ def test_refresh_whitelist_dynamic(mocker): mocker.patch.multiple('freqtrade.main.exchange', get_wallet_health=get_health) # argument: use the whitelist dynamically by exchange-volume - whitelist = ['BTC_ETH', 'BTC_TKN'] + whitelist = ['BTC_TKN', 'BTC_ETH'] refreshedwhitelist = refresh_whitelist(whitelist) - assert set(whitelist) == set(refreshedwhitelist) + assert whitelist == refreshedwhitelist def test_refresh_whitelist_dynamic_empty(mocker):