插件¶
交易对列表和交易对列表处理器¶
交易对列表处理器定义了机器人应交易的交易对列表(pairlist)。它们在配置设置的 pairlists 部分中进行配置。
在您的配置中,您可以使用静态交易对列表(由 StaticPairList 交易对列表处理器定义)和动态交易对列表(由 VolumePairList 和 PercentChangePairList 交易对列表处理器定义)。
此外,AgeFilter、DelistFilter、PrecisionFilter、PriceFilter、ShuffleFilter、SpreadFilter 和 VolatilityFilter 作为交易对列表过滤器,用于移除某些交易对或调整它们在交易对列表中的位置。
如果使用了多个交易对列表处理器,它们将被链式调用,所有交易对列表处理器的组合结果将形成机器人用于交易和回测的最终交易对列表。交易对列表处理器按其配置顺序依次执行。您可以将 StaticPairList、VolumePairList、ProducerPairList、RemotePairList、MarketCapPairList 或 PercentChangePairList 中的任意一个设为起始的交易对列表处理器。
不活跃的市场始终会从最终的交易对列表中移除。明确列入黑名单的交易对(即配置中 pair_blacklist 设置内的交易对)也始终会从最终的交易对列表中移除。
交易对黑名单¶
交易对黑名单(通过配置中的 exchange.pair_blacklist 设置)禁止某些交易对参与交易。例如排除 DOGE/BTC,将仅移除该特定交易对。
交易对黑名单还支持通配符(正则表达式风格),因此 BNB/.* 将排除所有以 BNB 开头的交易对。您也可以使用类似 .*DOWN/BTC 或 .*UP/BTC 的规则来排除杠杆代币(请查阅您所用交易所的交易对命名规范!)
可用的交易对列表处理器¶
StaticPairList(若未另行配置,则为默认选项)VolumePairListPercentChangePairListProducerPairListRemotePairListMarketCapPairListAgeFilterDelistFilterFullTradesFilterOffsetFilterPerformanceFilterPrecisionFilterPriceFilterShuffleFilterSpreadFilterRangeStabilityFilterVolatilityFilter
测试交易对列表
交易对列表的配置可能相当复杂,难以一次配置正确。建议使用 freqUI 的 webserver 模式 或 test-pairlist 工具子命令,快速测试您的交易对列表配置。
静态交易对列表¶
默认情况下使用 StaticPairList 方法,它从配置中静态定义的交易对白名单获取交易对。该交易对列表还支持通配符(正则表达式风格),因此 .*/BTC 将包含所有以 BTC 作为计价货币的交易对。
它使用 exchange.pair_whitelist 和 exchange.pair_blacklist 的配置,在以下示例中,将交易 BTC/USDT 和 ETH/USDT,并阻止 BNB/USDT 的交易。
两个 pair_*list 参数均支持正则表达式,因此像 .*/USDT 这样的值将启用所有不在黑名单中的、以 USDT 结尾的交易对的交易。
"exchange": {
"name": "...",
// ...
"pair_whitelist": [
"BTC/USDT",
"ETH/USDT",
// ...
],
"pair_blacklist": [
"BNB/USDT",
// ...
]
},
"pairlists": [
{"method": "StaticPairList"}
],
默认情况下,仅允许当前启用的交易对。若要跳过对活跃市场的交易对验证,请在 StaticPairList 配置中设置 "allow_inactive": true。此选项在回测已过期的交易对(例如季度现货市场)时非常有用。
当作为“后续”位置使用时(例如在 VolumePairlist 之后),'pair_whitelist' 中的所有交易对将被添加到交易对列表的末尾。
交易量交易对列表¶
VolumePairList 通过交易对的交易量进行排序或筛选。它会根据 sort_key(目前仅支持 quoteVolume)对交易对排序,并选择前 number_assets 个交易对。
当在交易对列表处理器链中以非首位位置使用时(位于 StaticPairList 和其他交易对列表过滤器之后),VolumePairList 将基于前序处理器的输出结果,进一步按交易量对交易对进行排序和筛选。
当在交易对列表处理器链中作为首位使用时,配置中的 pair_whitelist 设置将被忽略。VolumePairList 将从交易所所有可用市场中,选择与质押货币匹配的交易对中交易量最高的资产。
refresh_period 设置用于定义交易对列表刷新的时间间隔(单位为秒),默认为 1800 秒(30 分钟)。VolumePairList 的交易对列表缓存(即 refresh_period)仅适用于生成交易对列表的场景。对于过滤用途的实例(不在列表首位)不会应用缓存(高级模式下仅缓存蜡烛图数据,且缓存时间不超过单根蜡烛的周期),始终使用最新数据。
VolumePairList 默认基于 ccxt 库提供的交易所 ticker 数据:
quoteVolume是指在最近 24 小时内交易的报价(质押)货币数量(买入或卖出总额)。
"pairlists": [
{
"method": "VolumePairList",
"number_assets": 20,
"sort_key": "quoteVolume",
"min_value": 0,
"max_value": 8000000,
"refresh_period": 1800
}
],
你可以通过 min_value 设置最小交易量,从而过滤掉在指定时间段内交易量低于该值的交易对。此外,还可以通过 max_value 设置最大交易量,过滤掉在指定时间段内交易量高于该值的交易对。
VolumePairList 高级模式¶
VolumePairList 还可在高级模式下运行,通过指定的蜡烛图周期和时间段来计算累计交易量。该模式利用交易所的历史蜡烛图数据,计算典型价格((开盘价 + 最高价 + 最低价) / 3),然后将每个蜡烛图的典型价格乘以其成交量,最后将所有结果相加,得到指定时间段内的 quoteVolume。这使得用户可以根据不同场景进行调整:使用较长周期和较大时间框架的蜡烛图可获得更平滑的交易量数据,而使用较短周期和较小时间框架的蜡烛图则更敏感。
为方便起见,可以指定 lookback_days,这将默认使用 1 天(1d)的蜡烛图进行回溯。例如,在下方示例中,交易对列表将基于过去 7 天的数据生成:
"pairlists": [
{
"method": "VolumePairList",
"number_assets": 20,
"sort_key": "quoteVolume",
"min_value": 0,
"refresh_period": 86400,
"lookback_days": 7
}
],
回溯周期与刷新间隔
当同时使用 lookback_days 和 lookback_timeframe 时,refresh_period 不能小于蜡烛图周期的秒数,否则会导致对交易所 API 的不必要请求。
使用回溯周期时的性能影响
如果在与回溯(lookback)结合使用时位于首位,基于范围的成交量计算可能会非常耗时并消耗大量资源,因为它会下载所有可交易交易对的 K 线数据。因此,强烈建议使用标准方法配合VolumeFilter来缩小交易对列表,以便进行后续的范围成交量计算。
不支持的交易所
在某些交易所(例如 Gemini)上,常规的 VolumePairList 无法正常工作,因为其 API 并未原生提供 24 小时成交量数据。这可以通过使用 K 线数据来构建成交量以绕过限制。为了粗略模拟 24 小时成交量,您可以使用以下配置。请注意,这些交易对列表每天仅刷新一次。
"pairlists": [
{
"method": "VolumePairList",
"number_assets": 20,
"sort_key": "quoteVolume",
"min_value": 0,
"refresh_period": 86400,
"lookback_days": 1
}
],
更复杂的实现方式是使用 lookback_timeframe 设置 K 线周期,并使用 lookback_period 指定 K 线数量。以下示例将基于过去 3 天的 1 小时 K 线滚动周期来构建成交量交易对列表:
"pairlists": [
{
"method": "VolumePairList",
"number_assets": 20,
"sort_key": "quoteVolume",
"min_value": 0,
"refresh_period": 3600,
"lookback_timeframe": "1h",
"lookback_period": 72
}
],
注意
VolumePairList 不支持回测模式。
百分比变化交易对列表¶
PercentChangePairList 根据价格在过去 24 小时内(或高级选项中定义的任意时间段)的百分比变化来筛选和排序交易对。这使得交易者可以专注于经历显著价格波动(无论是上涨还是下跌)的资产。
配置选项
number_assets:指定根据 24 小时百分比变化选出的最高交易对数量。min_value:设置最小百分比变化阈值。低于此值的交易对将被过滤掉。max_value:设置最大百分比变化阈值。高于此值的交易对将被过滤掉。sort_direction:指定交易对按百分比变化排序的方向。可接受两个值:asc表示升序,desc表示降序。refresh_period:定义交易对列表刷新的时间间隔(单位为秒),默认为 1800 秒(30 分钟)。lookback_days:回溯的天数。当选择lookback_days时,lookback_timeframe将默认为 1 天。lookback_timeframe:用于回溯期间的时间周期。lookback_period:回溯的周期数量。
当 PercentChangePairList 在其他交易对列表处理器之后使用时,它将基于这些处理器的输出进行操作。如果它是首个交易对列表处理器,则会从所有可用市场中选择指定投注货币的交易对。
PercentChangePairList 使用通过 ccxt 库提供的交易所行情数据:百分比变化是根据过去 24 小时内的价格变化计算得出的。
不支持的交易所
在某些交易所(例如 HTX)上,常规的 PercentChangePairList 无法正常工作,因为其 API 并未原生提供 24 小时价格百分比变化。这可以通过使用 K 线数据来计算百分比变化以绕过限制。为了粗略模拟 24 小时价格百分比变化,您可以使用以下配置。请注意,这些交易对列表每天仅刷新一次。
"pairlists": [
{
"method": "PercentChangePairList",
"number_assets": 20,
"min_value": 0,
"refresh_period": 86400,
"lookback_days": 1
}
],
从行情数据读取的示例配置
"pairlists": [
{
"method": "PercentChangePairList",
"number_assets": 15,
"min_value": -10,
"max_value": 50
}
],
在此配置中:
- 根据过去 24 小时内价格百分比变化最高的前 15 个交易对被选中。
- 仅考虑百分比变化介于 -10% 和 50% 之间的交易对。
从 K 线读取的配置示例
"pairlists": [
{
"method": "PercentChangePairList",
"number_assets": 15,
"sort_key": "percentage",
"min_value": 0,
"refresh_period": 3600,
"lookback_timeframe": "1h",
"lookback_period": 72
}
],
本示例通过使用 lookback_timeframe 设置 K 线周期和 lookback_period 指定 K 线数量,基于 3 天的 1 小时 K 线滚动周期来构建价格涨跌幅配对。
价格涨跌幅通过以下公式计算,该公式表示当前 K 线收盘价与前一根 K 线收盘价之间的百分比差异,具体由指定的时间周期和回溯周期决定:
回溯周期与刷新间隔
当同时使用 lookback_days 和 lookback_timeframe 时,refresh_period 不能小于蜡烛图周期的秒数,否则会导致对交易所 API 的不必要请求。
使用回溯周期时的性能影响
如果将此方法置于首位并结合回溯功能使用,计算基于区间的涨跌幅可能会消耗较多时间和资源,因为它会下载所有可交易交易对的 K 线数据。因此,强烈建议先使用 PercentChangePairList 标准方法缩小交易对列表,再进行后续的涨跌幅计算。
回测
PercentChangePairList 不支持回测模式。
ProducerPairList¶
使用 ProducerPairList,您可以复用来自生产者的交易对列表,而无需在每个消费者中显式定义该列表。
此交易对列表需要启用消费者模式才能正常工作。
该列表会根据当前交易所配置检查活跃交易对,以避免尝试在无效市场中进行交易。
您可以通过可选参数 number_assets 限制交易对列表的长度。设置 "number_assets"=0 或省略该参数将复用当前配置下所有有效的生产者交易对。
"pairlists": [
{
"method": "ProducerPairList",
"number_assets": 5,
"producer_name": "default",
}
],
组合交易对列表
该交易对列表可与其他所有交易对列表和过滤器组合使用,以进一步缩减列表,也可作为已有交易对列表之上的“附加”列表。ProducerPairList 还可多次连续使用,合并来自多个生产者的交易对。显然,在复杂配置中,生产者可能无法为所有交易对提供数据,因此策略必须适配这种情况。
RemotePairList¶
它允许用户从远程服务器或 freqtrade 目录内的本地 JSON 文件中获取交易对列表,从而实现交易对列表的动态更新和自定义。
RemotePairList 在配置设置的 pairlists 部分中定义。它使用以下配置选项:
"pairlists": [
{
"method": "RemotePairList",
"mode": "whitelist",
"processing_mode": "filter",
"pairlist_url": "https://example.com/pairlist",
"number_assets": 10,
"refresh_period": 1800,
"keep_pairlist_on_failure": true,
"read_timeout": 60,
"bearer_token": "my-bearer-token",
"save_to_file": "user_data/filename.json"
}
]
可选的 mode 参数用于指定该交易对列表是作为 黑名单 还是 白名单 使用。默认值为 "whitelist"(白名单)。
RemotePairList 配置中的可选 processing_mode 参数决定了获取的交易对列表的处理方式。它可以设置为 "filter"(过滤)或 "append"(追加)。默认值为 "filter"。
在 "filter"(过滤)模式下,获取的交易对列表用作过滤器。最终交易对列表仅包含原始列表和获取列表中都存在的交易对,其余交易对将被过滤掉。
在 "append"(追加)模式下,获取的交易对列表将被添加到原始列表中。最终列表包含两个列表中的所有交易对,不进行任何过滤。
pairlist_url 参数指定远程服务器上交易对列表的 URL,或本地文件的路径(若以 file:/// 开头)。这使得用户可以选择远程服务器或本地文件作为交易对列表的来源。
save_to_file 选项在提供有效文件名时,会将处理后的交易对列表以 JSON 格式保存到该文件中。此选项为可选,默认情况下不会将交易对列表保存到文件。
共享交易对列表的多机器人示例
Bot1 可使用 save_to_file 将交易对列表保存到文件:
"pairlists": [
{
"method": "RemotePairList",
"mode": "whitelist",
"pairlist_url": "https://example.com/pairlist",
"number_assets": 10,
"refresh_period": 1800,
"keep_pairlist_on_failure": true,
"read_timeout": 60,
"save_to_file": "user_data/filename.json"
}
]
Bot2 或任何其他具有以下配置的机器人可以加载该已保存的交易对列表文件:
"pairlists": [
{
"method": "RemotePairList",
"mode": "whitelist",
"pairlist_url": "file:///user_data/filename.json",
"number_assets": 10,
"refresh_period": 10,
"keep_pairlist_on_failure": true,
}
]
用户需自行提供一个服务器或本地文件,返回具有以下结构的 JSON 对象:
{
"pairs": ["XRP/USDT", "ETH/USDT", "LTC/USDT"],
"refresh_period": 1800
}
pairs 属性应包含一个字符串列表,表示机器人将使用的交易对。refresh_period 属性为可选,用于指定交易对列表在刷新前应被缓存的秒数。
可选的 keep_pairlist_on_failure 用于指定当远程服务器无法访问或返回错误时,是否继续使用上一次接收到的交易对列表。默认值为 true。
可选的 read_timeout 指定从远程源等待响应的最大时间(以秒为单位),默认值为 60。
可选的 bearer_token 将被包含在请求的 Authorization 头中。
注意
如果发生服务器错误且 keep_pairlist_on_failure 设置为 true,则保留最后一次接收到的交易对列表;若设置为 false,则返回空的交易对列表。
MarketCapPairList¶
MarketCapPairList 基于 CoinGecko 的市值排名对交易对进行排序/筛选。返回的交易对列表将按其市值排名进行排序。
"pairlists": [
{
"method": "MarketCapPairList",
"number_assets": 20,
"max_rank": 50,
"refresh_period": 86400,
"categories": ["layer-1"]
}
]
number_assets 定义了交易对列表返回的最大交易对数量。max_rank 决定了创建/筛选交易对列表时所使用的最高排名。由于并非所有代币在您首选的市场/计价货币/交易所组合中都有活跃的交易对,因此部分市值排名在 max_rank 范围内的代币可能不会包含在最终的交易对列表中。
虽然支持使用大于 250 的 max_rank,但不推荐这样做,因为它会导致对 CoinGecko 发起多次 API 请求,可能引发速率限制问题。
refresh_period 设置定义了市值排名数据刷新的时间间隔(以秒为单位),默认为 86,400 秒(1 天)。交易对列表缓存(refresh_period)适用于生成交易对列表(当位于列表首位时)和过滤场景(当不在列表首位时)。
categories 设置指定了要从中选择代币的 CoinGecko 分类。默认为空列表 [],表示不应用分类筛选。如果选择了错误的分类字符串,插件将打印出 CoinGecko 上可用的分类并报错。分类应使用分类的 ID,例如对于 https://www.coingecko.com/en/categories/layer-1,分类 ID 为 layer-1。您可以传递多个分类,如 ["layer-1", "meme-token"],以从多个分类中选择代币。
像 1000PEPE/USDT 或 KPEPE/USDT:USDT 这样的代币会基于前缀 1000 和 K 尽力识别。
多个分类
每个添加的分类对应一次 CoinGecko 的 API 调用。添加的分类越多,生成交易对列表所需时间越长,可能导致速率限制问题。
Coingecko 中的重复符号
Coingecko 经常存在重复的交易符号,即相同的符号被用于不同的币种。Freqtrade 将直接使用该符号并在交易所中进行搜索。如果该符号存在,则会被使用。然而,Freqtrade 不会检查所使用的符号是否是 Coingecko 所指的目标币种。这有时可能导致意外结果,尤其是在低交易量的币种或迷因币类别中。
AgeFilter¶
移除在交易所上市时间少于 min_days_listed 天(默认为 10)或多于 max_days_listed 天(默认为 None,表示无上限)的交易对。
当交易对首次在交易所上线时,在最初的几天内可能会经历巨大的价格下跌和波动,因为该交易对正处于价格发现阶段。交易机器人常常会在价格尚未触底前买入,从而蒙受损失。
此过滤器允许 Freqtrade 忽略那些上市时间不足 min_days_listed 天或已上市超过 max_days_listed 天的交易对。
DelistFilter¶
移除在接下来的 max_days_from_now 天内将被下架的交易对(默认为 0,表示无论多久之后下架的交易对都会被移除)。目前此过滤器仅支持以下交易所:
可用交易所
DelistFilter 仅支持 Binance,其中 Binance Futures 在模拟和实盘模式下均可使用,而 Binance Spot 仅在实盘模式下可用(出于技术原因)。
回测
DelistFilter 不支持回测模式。
FullTradesFilter¶
当交易仓位已满时(即配置中 max_open_trades 未设置为 -1),将白名单缩小为仅包含正在交易的交易对。
当所有交易仓位已满时,无需再为其他交易对(信息对除外)计算指标,因为无法开立新交易。通过将白名单缩小为仅包含当前持仓的交易对,可以提高计算速度并降低 CPU 使用率。当有交易仓位释放(例如交易被平仓或配置中的 max_open_trades 值增加)时,白名单将恢复为正常状态。
当使用多个交易对列表过滤器时,建议将此过滤器放在第二位,紧接在主交易对列表之后,以便在交易仓位已满时,机器人无需为后续过滤器下载数据。
回测
FullTradesFilter 不支持回测模式。
OffsetFilter¶
根据给定的 offset 值对输入的交易对列表进行偏移。
例如,它可以与 VolumeFilter 结合使用,以移除交易量最高的前 X 个交易对,或在两个机器人实例之间拆分较大的交易对列表。
示例:移除交易对列表中的前 10 个交易对,并取接下来的 20 个(即取原始列表中第 10 到第 30 个元素):
"pairlists": [
// ...
{
"method": "OffsetFilter",
"offset": 10,
"number_assets": 20
}
],
警告
当使用 OffsetFilter 与 VolumeFilter 结合将较大的交易对列表分配给多个机器人时,由于 VolumeFilter 的刷新间隔略有不同,无法保证交易对完全不重叠。
注意
若偏移值大于输入交易对列表的总长度,则结果将为空列表。
PerformanceFilter¶
根据历史交易表现对交易对进行排序,规则如下:
- 正向收益。
- 尚未有已平仓交易。
- 负向收益。
交易次数用作并列情况时的优先级判断依据。
你可以使用 minutes 参数,仅考虑过去 X 分钟内的表现(滚动窗口)。如果不定义此参数(或将其设置为 0),则将使用历史总表现。
可选的 min_profit 参数(以比率表示 —> 设置为 0.01 对应 1%)用于定义一个交易对必须达到的最低盈利水平。低于此水平的交易对将被过滤掉。强烈不建议在未使用 minutes 的情况下单独使用此参数,因为它可能导致交易对列表为空且无法恢复。
"pairlists": [
// ...
{
"method": "PerformanceFilter",
"minutes": 1440, // rolling 24h
"min_profit": 0.01 // minimal profit 1%
}
],
由于此过滤器依赖机器人过去的表现,因此需要一定的启动期——建议仅在机器人数据库中已有数百笔交易后使用。
回测
PerformanceFilter 不支持回测模式。
PrecisionFilter¶
过滤掉价值过低、无法设置有效止损的币种。
具体来说,如果由于交易所精度限制导致止损价在四舍五入后产生 1% 或更大的偏差,则该交易对将被列入黑名单,即 rounded(stop_price) <= rounded(stop_price * 0.99)。其目的是避免选择那些价格非常接近其最小交易单位下限的币种,从而无法设置合理的止损。
PrecisionFilter 在期货交易中无意义。
上述情况不适用于做空。而对于做多,在理论上,仓位会在触发止损前先被强平。
回测
PrecisionFilter 不支持使用多个策略的回测模式。
PriceFilter¶
PriceFilter 允许根据价格对交易对进行过滤。目前支持以下几种价格过滤方式:
min_pricemax_pricemax_valuelow_price_ratio
min_price 设置会剔除价格低于指定值的交易对。这在你希望避免交易价格过低的交易对时非常有用。此选项默认关闭,仅当设置为大于 0 时生效。
max_price 设置会剔除价格高于指定值的交易对。这在你只想交易低价币种时非常有用。此选项默认关闭,仅当设置为大于 0 时生效。
max_value 设置会剔除最小价值变动超过指定值的交易对。这在交易所限制不平衡时非常有用。例如,当步长为 1(即只能买入 1、2、3 枚币,不能买 1.1 枚),而价格已大幅上涨至较高水平(如 20 美元)时,由于上次调整交易限制后价格上升,你只能以 20 美元或 40 美元买入,而不能以 25 美元买入。在手续费从收款币种中扣除的交易所(如 Binance),这可能导致所持币种或金额过高而无法卖出,因为实际金额略低于最小交易限制。
low_price_ratio 设置会剔除价格上涨一个最小单位(pip)所导致的涨幅超过 low_price_ratio 比例的交易对。此选项默认关闭,仅当设置为大于 0 时生效。
对于 PriceFilter,必须至少启用 min_price、max_price 或 low_price_ratio 中的一个设置。
计算示例:
SHITCOIN/BTC 的最小价格精度为 8 位小数。如果其价格为 0.00000011,则下一个价格档位为 0.00000012,比前一个价格高出约 9%。你可以通过设置 PriceFilter 的 low_price_ratio 为 0.09(9%),或设置 min_price 为 0.00000011 来过滤掉该交易对。
低价交易对
价格较低且“最小价格变动”较大的交易对存在风险,因为它们通常流动性较差,而且可能无法设置期望的止损位。由于价格需要四舍五入到下一个可交易的价格,这可能导致较大亏损——例如,你本想设置 -5% 的止损,最终却可能变成 -9% 的实际止损。
ShuffleFilter¶
对交易对列表进行随机打乱。可用于防止机器人在所有交易对应具有相同优先级时,更频繁地交易某些交易对。
默认情况下,ShuffleFilter 每根 K 线执行一次打乱。若要在每次迭代时都重新打乱,请将 "shuffle_frequency" 设置为 "iteration",而非默认的 "candle"。
{
"method": "ShuffleFilter",
"shuffle_frequency": "candle",
"seed": 42
}
提示
你可以为此交易对列表设置 seed 值以获得可复现的结果,这在重复进行回测时非常有用。如果未设置 seed,则交易对将以不可重复的随机顺序打乱。当设置了 seed 值时,ShuffleFilter 会自动检测运行模式,并仅在回测模式下应用该 seed。
SpreadFilter¶
移除买卖价差比率超过指定值 max_spread_ratio 的交易对(默认值为 0.005)。
示例:
例如,若 DOGE/BTC 的最高买价为 0.00000026,最低卖价为 0.00000027,则价差比率计算为:1 - 买价/卖价 ~= 0.037,大于 0.005,因此该交易对将被过滤掉。
RangeStabilityFilter¶
移除在过去 lookback_days 天内最低价与最高价之差低于 min_rate_of_change 或高于 max_rate_of_change 的交易对。由于此过滤器需要额外数据,结果会被缓存 refresh_period 时间。
在以下示例中:如果过去 10 天内的交易范围小于 1% 或大于 99%,则从白名单中移除该交易对。
"pairlists": [
{
"method": "RangeStabilityFilter",
"lookback_days": 10,
"min_rate_of_change": 0.01,
"max_rate_of_change": 0.99,
"refresh_period": 86400
}
]
添加 "sort_direction": "asc" 或 "sort_direction": "desc" 可为此交易对列表启用排序功能。
提示
此过滤器可用于自动移除稳定币交易对,因其交易范围极小,难以盈利交易。此外,也可用于自动移除在指定时间段内波动性过高或过低的交易对。
VolatilityFilter¶
波动率衡量的是交易对在历史时间段内的价格变化程度,通过日收益率对数的标准差来计算。假设收益率服从正态分布(实际分布可能不同)。在正态分布中,68% 的数据落在一个标准差范围内,95% 的数据落在两个标准差范围内。假设波动率为 0.05,意味着在 30 天中有约 20 天的预期收益率将低于 5%(即一个标准差)。波动率是预期收益偏离度的正向比率,可能大于 1.00。请参考维基百科关于 volatility 的定义。
此过滤器会移除在 lookback_days 天内的平均波动率低于 min_volatility 或高于 max_volatility 的交易对。由于该过滤器需要额外的数据,结果会被缓存 refresh_period 时间。
此过滤器可用于将交易对限制在特定波动率范围内,或排除波动性过高的交易对。
在以下示例中:如果过去 10 天的波动率不在 0.05-0.50 范围内,则从白名单中移除该交易对。该过滤器每 24 小时应用一次。
"pairlists": [
{
"method": "VolatilityFilter",
"lookback_days": 10,
"min_volatility": 0.05,
"max_volatility": 0.50,
"refresh_period": 86400
}
]
添加 "sort_direction": "asc" 或 "sort_direction": "desc" 可为此交易对列表启用排序模式。
交易对列表处理器完整示例¶
在以下示例中,BNB/BTC 被加入黑名单,使用 VolumePairList 选取 20 个资产,并按 quoteVolume 对交易对进行排序,然后使用 DelistFilter 和 AgeFilter 过滤掉上市时间不足 10 天的交易对。之后应用 PrecisionFilter 和 PriceFilter,过滤掉单个价格单位大于 1% 的资产。接着应用 SpreadFilter 和 VolatilityFilter,最后使用预设的随机种子对交易对进行随机打乱。
"exchange": {
"pair_whitelist": [],
"pair_blacklist": ["BNB/BTC"]
},
"pairlists": [
{
"method": "VolumePairList",
"number_assets": 20,
"sort_key": "quoteVolume"
},
{
"method": "DelistFilter",
"max_days_from_now": 0,
},
{"method": "AgeFilter", "min_days_listed": 10},
{"method": "PrecisionFilter"},
{"method": "PriceFilter", "low_price_ratio": 0.01},
{"method": "SpreadFilter", "max_spread_ratio": 0.005},
{
"method": "RangeStabilityFilter",
"lookback_days": 10,
"min_rate_of_change": 0.01,
"refresh_period": 86400
},
{
"method": "VolatilityFilter",
"lookback_days": 10,
"min_volatility": 0.05,
"max_volatility": 0.50,
"refresh_period": 86400
},
{"method": "ShuffleFilter", "seed": 42}
],
保护机制¶
保护机制可通过暂时停止某个交易对或全部交易对的交易,来保护您的策略免受意外事件和市场状况的影响。所有保护的结束时间都会向上取整到下一个 K 线,以避免在 K 线中途突然发生意外买入。
使用提示
并非所有保护机制都适用于所有策略,参数需要根据您的策略进行调整以提升性能。
每个保护机制可以使用不同参数配置多次,以实现多层级保护(短期/长期)。
回测
回测和超参数优化支持保护机制,但必须通过 --enable-protections 参数显式启用。
可用的保护机制¶
StoplossGuard:在特定时间窗口内发生指定次数的止损后,停止交易。MaxDrawdown:当最大回撤达到设定值时,停止交易。LowProfitPairs:锁定利润较低的交易对。CooldownPeriod:在卖出交易后的一段时间内禁止开新仓。
所有保护机制的通用设置¶
| 参数 | 描述 |
|---|---|
method |
要使用的保护机制名称。 数据类型:字符串,从可用的保护机制中选择 |
stop_duration_candles |
应设置锁定多少根 K 线? 数据类型:正整数(以 K 线数量为单位) |
stop_duration |
保护机制应锁定多少分钟? 不能与 stop_duration_candles 同时使用。数据类型:浮点数(以分钟为单位) |
lookback_period_candles |
仅考虑在过去 lookback_period_candles 根 K 线内已完成的交易。某些保护机制可能会忽略此设置。数据类型:正整数(以 K 线数量为单位) |
lookback_period |
仅考虑在 current_time - lookback_period 之后完成的交易。不能与 lookback_period_candles 同时使用。部分保护机制可能会忽略此设置。 数据类型:浮点数(单位:分钟) |
trade_limit |
所需的最低交易次数(并非所有保护机制都使用此参数)。 数据类型:正整数 |
unlock_at |
定期恢复交易的时间(并非所有保护机制都使用此参数)。 数据类型:字符串 输入格式:"HH:MM"(24 小时制) |
持续时间
持续时间(stop_duration* 和 lookback_period* 可以以分钟或 K 线根数定义)。为了在测试不同时间周期时更具灵活性,以下所有示例均使用“K 线”定义。
止损守卫¶
StoplossGuard 会选择在最近 lookback_period 分钟内(或使用 lookback_period_candles 时为最近若干根 K 线内)的所有交易。如果其中有 trade_limit 次或更多交易触发了止损,则暂停交易 stop_duration 分钟(或使用 stop_duration_candles 时为暂停若干根 K 线,或直到 unlock_at 设定的时间为止)。
此规则默认适用于所有交易对,除非将 only_per_pair 设置为 true,此时将仅针对单个交易对进行判断。
类似地,此保护机制默认会同时检查多头和空头的所有交易。对于期货机器人,设置 only_per_side 后,机器人将只考虑某一方向的交易,并仅锁定该方向,例如在连续多次多头止损后仍允许继续开空头仓位。
required_profit 用于设定触发止损时需满足的相对盈亏阈值。通常情况下无需设置,其默认值为 0.0,表示所有亏损的止损交易都将触发交易封锁。
以下示例表示:如果机器人在过去 24 根 K 线内触发了 4 次止损,则在最后一次交易后的 4 根 K 线内停止所有交易对的交易。
@property
def protections(self):
return [
{
"method": "StoplossGuard",
"lookback_period_candles": 24,
"trade_limit": 4,
"stop_duration_candles": 4,
"required_profit": 0.0,
"only_per_pair": False,
"only_per_side": False
}
]
注意
StoplossGuard 会将所有结果为 "stop_loss"、"stoploss_on_exchange" 和 "trailing_stop_loss" 且最终收益为负的交易视为止损。您需要根据自身策略调整 trade_limit 和 lookback_period 的值。
最大回撤¶
MaxDrawdown 使用最近 lookback_period 分钟内(或使用 lookback_period_candles 时为最近若干根 K 线内)的所有交易来计算最大回撤。如果回撤超过 max_allowed_drawdown,则在最后一次交易后暂停交易 stop_duration 分钟(或使用 stop_duration_candles 时为暂停若干根 K 线),假设市场需要一定时间恢复。
以下示例表示:在过去 48 根 K 线内,若所有交易对的最大回撤超过 20%,且至少完成了 trade_limit 次交易,则暂停交易 12 根 K 线。如有需要,也可使用 lookback_period 和/或 stop_duration 进行设置。
@property
def protections(self):
return [
{
"method": "MaxDrawdown",
"lookback_period_candles": 48,
"trade_limit": 20,
"stop_duration_candles": 12,
"max_allowed_drawdown": 0.2
},
]
低收益交易对¶
LowProfitPairs 使用在 lookback_period 分钟内(或使用 lookback_period_candles 时的 K 线数量)某交易对的所有交易来计算整体盈利比率。如果该比率低于 required_profit,则该交易对将被锁定 stop_duration 分钟(或使用 stop_duration_candles 时的 K 线数量,或使用 unlock_at 时直到指定时间)。
对于期货机器人,设置 only_per_side 将使机器人仅考虑某一方向的交易,并且只会锁定该方向,例如在连续多次做多亏损后仍允许继续做空。
以下示例表示:如果在过去 6 根 K 线内,某个交易对的盈利未达到 2%(且至少有 2 笔交易),则该交易对将停止交易 60 分钟。
@property
def protections(self):
return [
{
"method": "LowProfitPairs",
"lookback_period_candles": 6,
"trade_limit": 2,
"stop_duration": 60,
"required_profit": 0.02,
"only_per_pair": False,
}
]
冷却期¶
CooldownPeriod 在退出交易后,将某个交易对锁定 stop_duration 分钟(或使用 stop_duration_candles 时的 K 线数量,或使用 unlock_at 时直到指定时间),以避免该交易对在接下来的 stop_duration 分钟内重新入场。
以下示例表示:在关闭一笔交易后,该交易对将停止交易 2 根 K 线的时间,使其得以“冷却”。
@property
def protections(self):
return [
{
"method": "CooldownPeriod",
"stop_duration_candles": 2
}
]
注意
此保护机制仅在交易对级别生效,不会全局锁定所有交易对。此保护机制不考虑 lookback_period,因为它只关注最近的一笔交易。
保护机制完整示例¶
所有保护机制可以随意组合,也可以使用不同的参数,从而为表现不佳的交易对建立层层递进的限制。所有保护机制将按照其定义的顺序依次评估。
以下示例假设时间周期为 1 小时:
- 在卖出后,将每个交易对额外锁定 5 根 K 线(
CooldownPeriod),以便让其他交易对有机会成交。 - 如果过去 2 天(
48 * 1h K 线)内发生了 20 笔交易并导致最大回撤超过 20%,则停止该交易对交易 4 小时(4 * 1h K 线)(MaxDrawdown)。 - 如果在 1 天内(
24 * 1h K 线)所有交易对发生了超过 4 次止损,则停止交易(StoplossGuard)。 - 在过去 6 小时(
6 * 1h K 线)内,若某个交易对进行了 2 次交易且综合盈利比率低于 0.02(<2%),则锁定该交易对(LowProfitPairs)。 - 在过去 24 小时(
24 * 1h K 线)内,若某个交易对至少有 4 笔交易且盈利低于 0.01(<1%),则将其锁定 2 根 K 线。
from freqtrade.strategy import IStrategy
class AwesomeStrategy(IStrategy)
timeframe = '1h'
@property
def protections(self):
return [
{
"method": "CooldownPeriod",
"stop_duration_candles": 5
},
{
"method": "MaxDrawdown",
"lookback_period_candles": 48,
"trade_limit": 20,
"stop_duration_candles": 4,
"max_allowed_drawdown": 0.2
},
{
"method": "StoplossGuard",
"lookback_period_candles": 24,
"trade_limit": 4,
"stop_duration_candles": 2,
"only_per_pair": False
},
{
"method": "LowProfitPairs",
"lookback_period_candles": 6,
"trade_limit": 2,
"stop_duration_candles": 60,
"required_profit": 0.02
},
{
"method": "LowProfitPairs",
"lookback_period_candles": 24,
"trade_limit": 4,
"stop_duration_candles": 2,
"required_profit": 0.01
}
]
# ...