diff --git a/freqtrade/plugins/pairlist/CrossMarketPairList.py b/freqtrade/plugins/pairlist/CrossMarketPairList.py index 2b235b15b..768b179cc 100644 --- a/freqtrade/plugins/pairlist/CrossMarketPairList.py +++ b/freqtrade/plugins/pairlist/CrossMarketPairList.py @@ -20,7 +20,7 @@ class CrossMarketPairList(IPairList): def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) - self._mode: str = self._pairlistconfig.get("mode", "whitelist") + self._pairs_exist_on: str = self._pairlistconfig.get("pairs_exist_on", "both_markets") self._stake_currency: str = self._config["stake_currency"] self._target_mode = "spot" if self._config["trading_mode"] == "futures" else "futures" self._refresh_period = self._pairlistconfig.get("refresh_period", 1800) @@ -39,24 +39,23 @@ class CrossMarketPairList(IPairList): """ Short whitelist method description - used for startup-messages """ - mode = self._mode - target_mode = self._target_mode - msg = f"{self.name} - {mode.capitalize()} pairs that exists on {target_mode} market." + pairs_exist_on = self._pairs_exist_on + msg = f"{self.name} - Pairs that exists on {pairs_exist_on.capitalize()}." return msg @staticmethod def description() -> str: - return "Filter pairs if they exist on another market." + return "Filter pairs if they exist or not on another market." @staticmethod def available_parameters() -> dict[str, PairlistParameter]: return { - "mode": { + "pairs_exist_on": { "type": "option", - "default": "whitelist", - "options": ["whitelist", "blacklist"], + "default": "both_markets", + "options": ["current_market_only", "both_markets"], "description": "Mode of operation", - "help": "Mode of operation (whitelist/blacklist)", + "help": "Mode of operation (current_market_only/both_markets)", }, **IPairList.refresh_period_parameter(), } @@ -67,7 +66,7 @@ class CrossMarketPairList(IPairList): futures_only = True if target_mode == "futures" else False bases = [ v.get("base", "") - for k, v in self._exchange.get_markets( + for _, v in self._exchange.get_markets( quote_currencies=[self._stake_currency], tradable_only=False, active_only=True, @@ -108,7 +107,8 @@ class CrossMarketPairList(IPairList): def filter_pairlist(self, pairlist: list[str], tickers: Tickers) -> list[str]: bases = self.get_base_list() - is_whitelist_mode = self._mode == "whitelist" + pairs_exist_on = self._pairs_exist_on + is_whitelist_mode = pairs_exist_on == "both_markets" whitelisted_pairlist: list[str] = [] filtered_pairlist = pairlist.copy() diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index 9e244d734..c36a0435a 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -2589,68 +2589,68 @@ def test_MarketCapPairList_exceptions(mocker, default_conf_usdt, caplog): [ ( [ - # Whitelist mode on spot + # Spot pairs that exist on both markets {"method": "StaticPairList", "allow_inactive": True}, - {"method": "CrossMarketPairList", "mode": "whitelist"}, + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"}, ], "spot", ["ETH/USDT"], ), ( [ - # Blacklist mode on spot + # Spot pairs that exist only on spot market {"method": "StaticPairList", "allow_inactive": True}, - {"method": "CrossMarketPairList", "mode": "blacklist"}, + {"method": "CrossMarketPairList", "pairs_exist_on": "current_market_only"}, ], "spot", ["LTC/USDT", "XRP/USDT", "NEO/USDT", "TKN/USDT", "BTC/USDT"], ), ( [ - # Whitelist mode on futures + # Futures pairs that exist on both markets {"method": "StaticPairList", "allow_inactive": True}, - {"method": "CrossMarketPairList", "mode": "whitelist"}, + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"}, ], "futures", ["ETH/USDT:USDT"], ), ( [ - # Blacklist mode on futures + # Futures pairs that exist only on futures market {"method": "StaticPairList", "allow_inactive": True}, - {"method": "CrossMarketPairList", "mode": "blacklist"}, + {"method": "CrossMarketPairList", "pairs_exist_on": "current_market_only"}, ], "futures", ["ADA/USDT:USDT"], ), ( [ - # CrossMarketPairList as generator, whitelist mode, spot market - {"method": "CrossMarketPairList", "mode": "whitelist"}, + # CrossMarketPairList as generator, spot market, pairs that exist on both markets + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"}, ], "spot", ["ETH/USDT"], ), ( [ - # CrossMarketPairList as generator, blacklist mode, spot market - {"method": "CrossMarketPairList", "mode": "blacklist"}, + # CrossMarketPairList as generator, spot pairs that exist only on spot market + {"method": "CrossMarketPairList", "pairs_exist_on": "current_market_only"}, ], "spot", ["BTC/USDT", "XRP/USDT", "NEO/USDT", "TKN/USDT"], ), ( [ - # CrossMarketPairList as generator, whitelist mode, futures market - {"method": "CrossMarketPairList", "mode": "whitelist"}, + # CrossMarketPairList as generator, futures pairs that exist on both markets + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"}, ], "futures", ["ETH/USDT:USDT"], ), ( [ - # CrossMarketPairList as generator, blacklist mode, futures market - {"method": "CrossMarketPairList", "mode": "blacklist"}, + # CrossMarketPairList as generator, futures pairs that exist only on futures market + {"method": "CrossMarketPairList", "pairs_exist_on": "current_market_only"}, ], "futures", ["ADA/USDT:USDT"], @@ -2687,7 +2687,9 @@ def test_CrossMarketPairlist_filter( def test_CrossMarketPairlist_gen_pairlist_uses_cache(mocker, default_conf_usdt, markets): default_conf_usdt["trading_mode"] = "spot" - default_conf_usdt["pairlists"] = [{"method": "CrossMarketPairList", "mode": "whitelist"}] + default_conf_usdt["pairlists"] = [ + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"} + ] mocker.patch.multiple( EXMS, @@ -2716,7 +2718,9 @@ def test_CrossMarketPairlist_gen_pairlist_uses_cache(mocker, default_conf_usdt, def test_CrossMarketPairList_breaks_prefix_loop_on_match(mocker, default_conf_usdt, markets): default_conf_usdt["trading_mode"] = "spot" - default_conf_usdt["pairlists"] = [{"method": "CrossMarketPairList", "mode": "whitelist"}] + default_conf_usdt["pairlists"] = [ + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"} + ] mocker.patch.multiple( EXMS, @@ -2750,7 +2754,9 @@ def test_CrossMarketPairList_breaks_prefix_loop_on_delayed_match( mocker, default_conf_usdt, markets ): default_conf_usdt["trading_mode"] = "spot" - default_conf_usdt["pairlists"] = [{"method": "CrossMarketPairList", "mode": "whitelist"}] + default_conf_usdt["pairlists"] = [ + {"method": "CrossMarketPairList", "pairs_exist_on": "both_markets"} + ] mocker.patch.multiple( EXMS,