第 2 章 · 03 交易对与白名单黑名单 本节摘要:机器人能买哪些币?这由「白名单/黑名单」机制决定。本节讲透 Pairlist 体系:最简单的 StaticPairList(写死一份列表)与最常用的 VolumePairList(按成交量动态筛选),以及用多个过滤器串联成 Pairlist Handlers 链的做法。黑名单用于在白名单之上再做一次「永久排除」。读完本节,你能根据交易风格配置出静态、动态、混合三种白名单,并理解每个过滤器把哪些币留下了、哪些剔除了。 内容来源:原项目文档 的 pairlist 部分、 ,汉化并套用体系化模板。 ⚠️ 风险提示:动态白名单(尤其 VolumePairList)会把高成交量的「热门山寨币」自动纳入——它们波动剧烈、流动性可能瞬间枯竭。
本节摘要:机器人能买哪些币?这由「白名单/黑名单」机制决定。本节讲透 Pairlist 体系:最简单的 StaticPairList(写死一份列表)与最常用的 VolumePairList(按成交量动态筛选),以及用多个过滤器串联成 Pairlist Handlers 链的做法。黑名单用于在白名单之上再做一次「永久排除」。读完本节,你能根据交易风格配置出静态、动态、混合三种白名单,并理解每个过滤器把哪些币留下了、哪些剔除了。
内容来源:原项目文档
docs/configuration.md的 pairlist 部分、docs/plugins.md,汉化并套用体系化模板。
⚠️ 风险提示:动态白名单(尤其 VolumePairList)会把高成交量的「热门山寨币」自动纳入——它们波动剧烈、流动性可能瞬间枯竭。务必配合黑名单排除已知高风险币种,并控制
max_open_trades。
阅读完本节,你应当能够:
回忆第 01 节,FreqtradeBot.process() 的第二步就是「刷新白名单」——确定本轮迭代要为哪些交易对下载行情、跑策略。白名单是「所有后续工作的输入」:
💡 核心心法:白名单先「粗筛」到几十个,再由策略「精筛」出几个真正下单的——分工明确。把策略放在几百个对上跑既慢又无意义,先用白名单收紧范围。
最简单的方式——把要交易的币写死在配置里:
"pairlists": [{"method": "StaticPairList"}], "exchange": { "name": "binance", "pair_whitelist": ["BTC/USDT", "ETH/USDT", "BNB/USDT"] }
特点:
⚠️ 必须使用交易对的完整规范名:
BTC/USDT(现货)或ETH/USDT:USDT(合约)。写错大小写或漏掉:settle会被引擎当作「不存在的对」直接报错。
更常用的方式——按指定 quote 货币(如 USDT)下,近 N 个周期平均成交量排序,自动取前若干名:
"pairlists": [ { "method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume", "min_value": 0, "refresh_period": 1800, "lookback_days": 7, "lookback_timeframe": "1d" } ]
关键参数:
| 参数 | 含义 |
|---|---|
number_assets |
取成交量前 N 名(如 20) |
sort_key |
排序键,常用 quoteVolume(以计价币计的成交额) |
lookback_days |
回看天数(配合滚动平均,避免单日异常) |
refresh_period |
多久刷新一次(秒),1800 即半小时 |
min_value |
最小成交额门槛,过滤僵尸币 |
特点:
pairlists 段是一个列表——可以放多个 handler,引擎会按顺序应用每一个。第一个必须是「生产者」(如 StaticPairList、VolumePairList),后续都是「过滤器」(Filter),每个都拿前一个的输出再筛一次。
"pairlists": [ {"method": "VolumePairList", "number_assets": 50, "lookback_days": 7}, {"method": "AgePairlist", "min_days_listed": 30}, {"method": "PercentPrice", "max_price_change": 200, "min_price_change": -50, "refresh_period": 86400}, {"method": "SpreadFilter", "max_spread_ratio": 0.005} ]
这条链做的事:取成交量前 50 → 排除上市不足 30 天的新币 → 排除一年内涨超 200% 或跌超 50% 的「极端币」 → 排除买卖盘价差超 0.5% 的「流动性差」币。
| 过滤器 | 作用 | 典型参数 |
|---|---|---|
AgePairlist |
排除上市不足 N 天的新币 | min_days_listed: 30 |
PercentPrice |
排除周期内涨/跌幅超阈值的极端币 | max_price_change: 200 |
SpreadFilter |
排除买卖盘价差过大的币(流动性差) | max_spread_ratio: 0.005 |
RangeStabilityFilter |
排除波动率过低/过高的币 | lookback_days, min_rate_of_change |
PriceFilter |
按价格区间筛(如排除低价 meme) | min_price, max_price |
ShufflePairList |
随机打乱顺序(防固定回测偏好) | seed |
ProducerPairList |
从另一进程(Producer)取白名单 | 第 10 章详讲 |
黑名单写在 exchange.pair_blacklist,作用在白名单之上——任何白名单阶段产生的对,只要命中黑名单就最终被剔除。支持正则:
"exchange": { "pair_blacklist": [ "BNB/.*", // 排除所有 BNB 计价的对 ".*DOWN/USDT", // 排除所有杠杆代币 ".*UP/USDT", "(BTC|ETH)/USDT:.*", // 合约下排除 BTC、ETH "PEPE/USDT" // 精准排除某个币 ] }
使用场景:
UP/DOWN)、所有非主流计价币(BNB/.*)。💡 黑名单 vs 白名单的分工:白名单「圈定池子」,黑名单「在池子里勾掉」。两者配合使用——白名单用 VolumePairList 自动选,黑名单手工排除其中你不想碰的。
除了黑名单,还有一种临时的「单对锁定」——通过 Telegram /locks 命令或策略代码 PairLocks.lock_pair(pair, until) 临时锁定某个对一段时间。锁定期内机器人既不开新仓也不管理该对。常用于「这个币近期有异常,先别碰」的场景,详见第 10 章。
lookback_days 内的 quoteVolume 排序取前 N,自动跟随流动性。pairlists 是有序列表,首项是生产者、后续是过滤器(Age/PercentPrice/Spread 等),层层收敛。exchange.pair_blacklist 支持精准与正则,作用在白名单之上做最终排除。PairLocks.lock_pair 临时锁单对,适合短期异常币,与黑名单互补。下一章我们正式进入「策略开发基础」——先从
populate_indicators开始,用 pandas 与 TA-Lib 实打实地算几类常用技术指标。