第 10 章 · 05 策略迁移与常见问题 本节摘要:这是全书的收尾节。两部分:一是策略迁移——freqtrade 从 v2 到 v3 做了大规模术语重命名(buy→entry、sell→exit),为了让策略能做空和加杠杆,本节给出完整的迁移清单(方法名、列名、回调参数、配置项、webhook/通知术语),老策略照着改即可;二是常见问题(FAQ)——汇总部署、交易、数据、错误日志等高频疑问的答案,比如「bot 不交易」「12 笔就亏」「币灰尘」「充钱后 bot 不识别」「想只平仓不开新仓」等。读完你能顺利升级老策略,并独立排查大多数运行问题。 内容来源:原项目文档 、 ,汉化并套用体系化模板。 ⚠️ 风险提示:升级策略前务必备份。
本节摘要:这是全书的收尾节。两部分:一是策略迁移——freqtrade 从 v2 到 v3 做了大规模术语重命名(buy→entry、sell→exit),为了让策略能做空和加杠杆,本节给出完整的迁移清单(方法名、列名、回调参数、配置项、webhook/通知术语),老策略照着改即可;二是常见问题(FAQ)——汇总部署、交易、数据、错误日志等高频疑问的答案,比如「bot 不交易」「12 笔就亏」「币灰尘」「充钱后 bot 不识别」「想只平仓不开新仓」等。读完你能顺利升级老策略,并独立排查大多数运行问题。
内容来源:原项目文档
docs/strategy_migration.md、docs/faq.md,汉化并套用体系化模板。
⚠️ 风险提示:升级策略前务必备份。迁移出错可能导致信号错位(比如把 exit 信号写成了 enter),实盘会乱下单。改完先回测验证再上实盘。
阅读完本节,你应当能够:
freqtrade v3 的核心变化是支持做空和杠杆。为此,「买/卖」这套二分法不够用了——需要区分「做多入场/做空入场/做多出场/做空出场」。所以项目把术语从 buy/sell 统一改成更通用的 entry/exit,并引入 long/short 方向。
💡 如果你只在现货市场交易,理论上不迁移也能用(向后兼容)。但建议迁移,因为新功能和文档都基于 v3 术语。
最核心的改动是两个方法名和对应的列名:
| v2(旧) | v3(新) | 说明 |
|---|---|---|
populate_buy_trend() |
populate_entry_trend() |
入场信号 |
populate_sell_trend() |
populate_exit_trend() |
出场信号 |
列 buy |
列 enter_long |
做多入场 |
列 sell |
列 exit_long |
做多出场 |
列 buy_tag |
列 enter_tag |
入场标签(多空共用) |
| — | 列 enter_short / exit_short |
新增:做空入场/出场 |
迁移前:
def populate_buy_trend(self, dataframe, metadata): dataframe.loc[ (qtpylib.crossed_above(dataframe['rsi'], 30)) & (dataframe['volume'] > 0), ['buy', 'buy_tag']] = (1, 'rsi_cross') return dataframe
迁移后:
def populate_entry_trend(self, dataframe, metadata): dataframe.loc[ (qtpylib.crossed_above(dataframe['rsi'], 30)) & (dataframe['volume'] > 0), ['enter_long', 'enter_tag']] = (1, 'rsi_cross') return dataframe
出场同理:populate_sell_trend → populate_exit_trend,列 sell → exit_long。
回调方法重命名:
| v2 | v3 |
|---|---|
custom_sell() |
custom_exit() |
check_buy_timeout() |
check_entry_timeout() |
check_sell_timeout() |
check_exit_timeout() |
部分回调新增 side 参数(表示 long/short):custom_stake_amount、confirm_trade_entry、custom_entry_price。新增 leverage() 回调(上一章讲过)。
配置项重命名:
| v2 | v3 |
|---|---|
order_time_in_force 的 buy/sell |
entry/exit |
order_types 的 buy/sell |
entry/exit |
unfilledtimeout 的 buy/sell |
entry/exit |
use_sell_signal |
use_exit_signal |
sell_profit_only |
exit_profit_only |
sell_profit_offset |
exit_profit_offset |
ignore_roi_if_buy_signal |
ignore_roi_if_entry_signal |
forcebuy_enable |
force_entry_enable |
bid_strategy/ask_strategy |
entry_pricing/exit_pricing |
ask_last_balance/bid_last_balance |
price_last_balance |
出场原因术语:
| v2 | v3 |
|---|---|
sell_signal |
exit_signal |
custom_sell |
custom_exit |
force_sell |
force_exit |
emergency_sell |
emergency_exit |
Webhook 与 Telegram 通知:webhookbuy → entry、webhookbuyfill → entry_fill、webhooksell → exit 等;Telegram 通知设置 buy → entry、sell → exit 全套对应。
Trade 对象新属性:is_short、entry_side、exit_side、trade_direction;sell_reason → exit_reason;nr_of_successful_buys → nr_of_successful_entries。
其他:INTERFACE_VERSION 设为 3;stoploss_from_open 和 stoploss_from_absolute 新增 is_short 参数;informative pairs 元组可加第三元素定义 K 线类型;@informative 装饰器新增 candle_type 参数。
💡 迁移没有一键工具,靠按清单手动改。建议用 VSCode/PyCharm 的全局搜索替换,改完先回测对比结果与旧版是否一致,再上实盘。
bot 启动报 freqtrade: command not found:虚拟环境没激活。运行 source .venv/bin/activate(Linux)或对应激活命令后再试;或安装未完成,检查安装日志。
bot 启动了但处于 STOPPED 模式:配置里 initial_state 要设成 "running"。
等了 5 分钟还没交易:正常——取决于入场策略、白名单大小、行情,可能几小时甚至几天才有合适入场点。回测能告诉你大致交易频率,但不保证均匀分布(可能某天 20 笔、本周其余 0 笔)。先看日志:如果只有心跳消息说明没信号(正常),如果有 error/exception 说明有问题。
做了 12 笔总盈亏为负:12 笔样本太小,什么也说明不了。回测里看着正期望的策略,也是经过几千笔交易后才显现的,且某些币可能交易几十上百次仍是亏的。量化交易本质是概率游戏,短期波动正常。
bot 不把买的币全卖了(币灰尘):常见现象。很多交易所从「接收币」扣手续费——买 100 COIN 只到账 99.9 COIN,而 COIN 按 1 个为单位交易,卖不出 0.9 COIN。bot 会卖 99 COIN,留 0.9 灰尘。下次再买 COIN 时会消化部分灰尘。Binance 上用 BNB 付手续费可避免(开启「用 BNB 付手续费」)。
充钱到交易所后 bot 不识别:bot 在下单前才更新余额;Telegram /balance 或 API /balance 最多每小时触发一次更新。adjust_trade_position 启用时每小时刷新一次钱包。要立即更新可用 /reload_config(会重启 bot)。
想只平仓不开新仓:Telegram 用 /stopentry(或 /pause//stopbuy)阻止新开仓,已有仓位继续按规则管理;再用 /forceexit all 平掉所有仓位。
卖掉了 bot 的本金导致日志报错:bot 假设它开的仓只由它管理。误卖后 bot 会尽力重新匹配链上订单恢复,但这是 best-effort,不一定成功(尤其用了 OCO、iceberg 等不支持的单子类型,或交易太久交易所已不提供完整订单信息)。所以别手动动 bot 管的仓位。
"Missing data fillup" 日志:警告最近 K 线有缺失——某币在你的时间周期内没有成交,交易所只返回有成交的 K 线(低流动性币常见)。freqtrade 会用「空 K 线」(OHLC=前一根收盘、成交量为 0)填补,图表上像 _。所有币都这样可能是交易所宕机,看交易所公告。
"Outdated history for pair xxx":bot 拿到的最新 K 线过时(不是最后一根完整 K 线),所以不为该币开仓。可能原因:交易所宕机、系统时间不准(务必校准 NTP)、低流动性币、API 返回异常。
"Price jump between 2 candles detected":相邻 K 线价格跳变超 30%——可能是币停止交易后发生代币置换(如 COCOS 2021 年从 0.0000154 跳到 0.01621)。常伴随 Missing data fillup。
"Impossible to load Strategy":策略加载失败。检查:策略名大小写是否与类名(非文件名)一致;是否在 user_data/strategies/ 且 .py 后缀;日志里有无依赖缺失警告;Docker 下策略目录是否正确挂载。用 freqtrade list-strategies 列出所有策略及加载状态。
想重置数据库:删掉 tradesv3.sqlite(实盘)或 tradesv3.dryrun.sqlite(模拟),或用 --db-url sqlite:///new.sqlite 指定新库。
想用未完成的 K 线:freqtrade 不会把未完成 K 线给策略——会导致重绘(ghost buys),无法回测和事后验证。要拿实时行情用 dataprovider 的 orderbook/ticker 方法(回测不可用)。
运行多个 bot 同一机器:每个 bot 要用不同的数据库、端口、配置。参考 advanced-setup 文档的多实例部署。
遇到问题时,按这个顺序排查能快速定位多数故障:
第一步永远是看日志。Telegram 的 /logs 或日志文件会告诉你:是没产生信号(正常的心跳),还是有报错。错误堆栈会指明模块(数据、交易所、策略)。
常见错误类别与对策:
| 症状 | 可能原因 | 对策 |
|---|---|---|
command not found |
虚拟环境没激活 | 激活 venv 或用完整路径 |
Impossible to load Strategy |
策略名/路径/依赖错 | list-strategies 检查;确认类名大小写 |
Rate limit exceeded |
请求太频繁 | 调大 rateLimit(毫秒) |
Insufficient funds |
余额不够或被灰尘占用 | 检查余额;用 BNB 付手续费 |
| 不交易 | 无信号/被锁/白名单空 | 看日志;/locks;/whitelist |
| 回测与实盘差异 | 数据不全/滑点/资金费率 | 补数据;检查 futures_funding_rate |
保持系统时间准确:freqtrade 严重依赖准确时间与交易所通信。务必开启 NTP 时钟同步,时钟漂移会导致「Outdated history」、下单失败等一系列问题。这是第 1 章就强调的运维基础,但也是最常见的隐性故障源。
💡 求助前的自查:去 GitHub issues 或 Discord 求助前,先准备好——① freqtrade 版本(
/version);② 完整错误堆栈;③ 你的配置(隐去 key/secret);③ 复现步骤。这样别人才能高效帮你。
恭喜你读完整本教程。回顾各章定位:
下一步建议:
量化交易是一场长跑,祝你在加密市场里稳健前行。
populate_buy_trend→populate_entry_trend、populate_sell_trend→populate_exit_trend;列 buy→enter_long、sell→exit_long、buy_tag→enter_tag;新增 enter_short/exit_short。is_short/exit_reason 等;迁移靠手动按清单改,无一键工具。initial_state: running、5 分钟没交易可能是正常的(看日志区分无信号 vs 报错)。/reload_config)、只平不开(/stopentry+/forceexit all)。至此,freqtrade 中文教程全 10 章完结。回到任意章节深入复习,或开始你的量化交易实践。