|
|
|
|
@ -2212,7 +2212,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"pairlists,trade_mode,result",
|
|
|
|
|
"pairlists,trade_mode,result,coin_market_calls",
|
|
|
|
|
[
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2222,6 +2222,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"spot",
|
|
|
|
|
["BTC/USDT", "ETH/USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2231,6 +2232,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"spot",
|
|
|
|
|
["BTC/USDT", "ETH/USDT", "XRP/USDT", "ADA/USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2240,6 +2242,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"spot",
|
|
|
|
|
["BTC/USDT", "ETH/USDT", "XRP/USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2249,6 +2252,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"spot",
|
|
|
|
|
["BTC/USDT", "ETH/USDT", "XRP/USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2257,6 +2261,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"spot",
|
|
|
|
|
["BTC/USDT", "ETH/USDT", "XRP/USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2265,6 +2270,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"spot",
|
|
|
|
|
["BTC/USDT", "ETH/USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2273,6 +2279,7 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"futures",
|
|
|
|
|
["ETH/USDT:USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
@ -2281,11 +2288,34 @@ def test_FullTradesFilter(mocker, default_conf_usdt, fee, caplog) -> None:
|
|
|
|
|
],
|
|
|
|
|
"futures",
|
|
|
|
|
["ETH/USDT:USDT", "ADA/USDT:USDT"],
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
# MarketCapPairList as generator - futures, 1 category
|
|
|
|
|
{"method": "MarketCapPairList", "number_assets": 2, "categories": ["layer-1"]}
|
|
|
|
|
],
|
|
|
|
|
"futures",
|
|
|
|
|
["ETH/USDT:USDT", "ADA/USDT:USDT"],
|
|
|
|
|
["layer-1"],
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
[
|
|
|
|
|
# MarketCapPairList as generator - futures, 1 category
|
|
|
|
|
{
|
|
|
|
|
"method": "MarketCapPairList",
|
|
|
|
|
"number_assets": 2,
|
|
|
|
|
"categories": ["layer-1", "protocol"],
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"futures",
|
|
|
|
|
["ETH/USDT:USDT", "ADA/USDT:USDT"],
|
|
|
|
|
["layer-1", "protocol"],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
def test_MarketCapPairList_filter(
|
|
|
|
|
mocker, default_conf_usdt, trade_mode, markets, pairlists, result
|
|
|
|
|
mocker, default_conf_usdt, trade_mode, markets, pairlists, result, coin_market_calls
|
|
|
|
|
):
|
|
|
|
|
test_value = [
|
|
|
|
|
{"symbol": "btc"},
|
|
|
|
|
@ -2309,8 +2339,16 @@ def test_MarketCapPairList_filter(
|
|
|
|
|
markets=PropertyMock(return_value=markets),
|
|
|
|
|
exchange_has=MagicMock(return_value=True),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
mocker.patch(
|
|
|
|
|
"freqtrade.plugins.pairlist.MarketCapPairList.FtCoinGeckoApi.get_coins_categories_list",
|
|
|
|
|
return_value=[
|
|
|
|
|
{"category_id": "layer-1"},
|
|
|
|
|
{"category_id": "protocol"},
|
|
|
|
|
{"category_id": "defi"},
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
gcm_mock = mocker.patch(
|
|
|
|
|
"freqtrade.plugins.pairlist.MarketCapPairList.FtCoinGeckoApi.get_coins_markets",
|
|
|
|
|
return_value=test_value,
|
|
|
|
|
)
|
|
|
|
|
@ -2319,6 +2357,15 @@ def test_MarketCapPairList_filter(
|
|
|
|
|
|
|
|
|
|
pm = PairListManager(exchange, default_conf_usdt)
|
|
|
|
|
pm.refresh_pairlist()
|
|
|
|
|
if isinstance(coin_market_calls, int):
|
|
|
|
|
assert gcm_mock.call_count == coin_market_calls
|
|
|
|
|
else:
|
|
|
|
|
assert gcm_mock.call_count == len(coin_market_calls)
|
|
|
|
|
for call in coin_market_calls:
|
|
|
|
|
assert any(
|
|
|
|
|
"category" in c.kwargs and c.kwargs["category"] == call
|
|
|
|
|
for c in gcm_mock.call_args_list
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert pm.whitelist == result
|
|
|
|
|
|
|
|
|
|
|