第 10 章 · 05 策略迁移与常见问题


文档摘要

第 10 章 · 05 策略迁移与常见问题 本节摘要:这是全书的收尾节。两部分:一是策略迁移——freqtrade 从 v2 到 v3 做了大规模术语重命名(buy→entry、sell→exit),为了让策略能做空和加杠杆,本节给出完整的迁移清单(方法名、列名、回调参数、配置项、webhook/通知术语),老策略照着改即可;二是常见问题(FAQ)——汇总部署、交易、数据、错误日志等高频疑问的答案,比如「bot 不交易」「12 笔就亏」「币灰尘」「充钱后 bot 不识别」「想只平仓不开新仓」等。读完你能顺利升级老策略,并独立排查大多数运行问题。 内容来源:原项目文档 、 ,汉化并套用体系化模板。 ⚠️ 风险提示:升级策略前务必备份。

第 10 章 · 05 策略迁移与常见问题

本节摘要:这是全书的收尾节。两部分:一是策略迁移——freqtrade 从 v2 到 v3 做了大规模术语重命名(buy→entry、sell→exit),为了让策略能做空和加杠杆,本节给出完整的迁移清单(方法名、列名、回调参数、配置项、webhook/通知术语),老策略照着改即可;二是常见问题(FAQ)——汇总部署、交易、数据、错误日志等高频疑问的答案,比如「bot 不交易」「12 笔就亏」「币灰尘」「充钱后 bot 不识别」「想只平仓不开新仓」等。读完你能顺利升级老策略,并独立排查大多数运行问题。

内容来源:原项目文档 docs/strategy_migration.mddocs/faq.md,汉化并套用体系化模板。

⚠️ 风险提示:升级策略前务必备份。迁移出错可能导致信号错位(比如把 exit 信号写成了 enter),实盘会乱下单。改完先回测验证再上实盘。

学习目标

阅读完本节,你应当能够:

  1. 把 v2 策略手动迁移到 v3。
  2. 掌握 buy→entry / sell→exit 的全量术语映射。
  3. 排查 bot 不交易/不启动等常见问题。
  4. 理解币灰尘、充钱不识别等现象的原因。
  5. 知道重置数据库、只平不开等操作的命令。

一、为什么有迁移:v3 引入做空与杠杆

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_trendpopulate_exit_trend,列 sellexit_long

三、回调、配置与术语的全量映射

回调方法重命名:

v2 v3
custom_sell() custom_exit()
check_buy_timeout() check_entry_timeout()
check_sell_timeout() check_exit_timeout()

部分回调新增 side 参数(表示 long/short):custom_stake_amountconfirm_trade_entrycustom_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 通知:webhookbuyentrywebhookbuyfillentry_fillwebhooksellexit 等;Telegram 通知设置 buyentrysellexit 全套对应。

Trade 对象新属性:is_shortentry_sideexit_sidetrade_directionsell_reasonexit_reasonnr_of_successful_buysnr_of_successful_entries

其他:INTERFACE_VERSION 设为 3;stoploss_from_openstoploss_from_absolute 新增 is_short 参数;informative pairs 元组可加第三元素定义 K 线类型;@informative 装饰器新增 candle_type 参数。

💡 迁移没有一键工具,靠按清单手动改。建议用 VSCode/PyCharm 的全局搜索替换,改完先回测对比结果与旧版是否一致,再上实盘。

四、FAQ:启动与不交易类

bot 启动报 freqtrade: command not found:虚拟环境没激活。运行 source .venv/bin/activate(Linux)或对应激活命令后再试;或安装未完成,检查安装日志。

bot 启动了但处于 STOPPED 模式:配置里 initial_state 要设成 "running"

等了 5 分钟还没交易:正常——取决于入场策略、白名单大小、行情,可能几小时甚至几天才有合适入场点。回测能告诉你大致交易频率,但不保证均匀分布(可能某天 20 笔、本周其余 0 笔)。先看日志:如果只有心跳消息说明没信号(正常),如果有 error/exception 说明有问题。

做了 12 笔总盈亏为负:12 笔样本太小,什么也说明不了。回测里看着正期望的策略,也是经过几千笔交易后才显现的,且某些币可能交易几十上百次仍是亏的。量化交易本质是概率游戏,短期波动正常。

五、FAQ:交易与资金类

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 管的仓位。

六、FAQ:数据与日志类

"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);③ 复现步骤。这样别人才能高效帮你。

八、全书回顾与下一步

恭喜你读完整本教程。回顾各章定位:

  • 第 1~2 章:装好 freqtrade、理解配置体系。
  • 第 3~4 章:写策略(IStrategy、入场出场、回调定制)。
  • 第 5 章:数据获取与分析。
  • 第 6 章:回测与诊断(避免自欺)。
  • 第 7 章:Hyperopt 超参优化。
  • 第 8 章:FreqAI 机器学习(高阶核心)。
  • 第 9 章:交易所底层、杠杆、做空、集群。
  • 第 10 章:运维(Telegram、FreqUI、插件、SQL、迁移)。

下一步建议:

  1. 从模拟开始:用 Dry-Run 跑足够长时间(几周到几个月),验证策略的真实表现。
  2. 小资金实盘:确认模拟稳定后再上小资金,逐步加码。
  3. 持续学习:freqtrade 文档和源码在持续更新,关注 release notes;社区 Discord 和 GitHub issues 有大量实战讨论。
  4. 敬畏市场:工具再好,策略烂照样亏;回测好≠实盘好。永远把风险控制放第一位。

量化交易是一场长跑,祝你在加密市场里稳健前行。

本节要点回顾

  1. v3 迁移动机:支持做空和杠杆,buy/sell 二分法不够,统一改为 entry/exit + long/short。
  2. 方法与列:populate_buy_trendpopulate_entry_trendpopulate_sell_trendpopulate_exit_trend;列 buyenter_longsellexit_longbuy_tagenter_tag;新增 enter_short/exit_short
  3. 全量映射:回调(custom_sell→custom_exit 等)、配置(use_sell_signal→use_exit_signal 等)、出场原因(sell_signal→exit_signal 等)、webhook/通知术语全套对应;Trade 对象新增 is_short/exit_reason 等;迁移靠手动按清单改,无一键工具。
  4. 启动类 FAQ:虚拟环境激活、initial_state: running、5 分钟没交易可能是正常的(看日志区分无信号 vs 报错)。
  5. 交易资金类 FAQ:币灰尘(交易所从接收币扣费)、充钱不识别(余额定时刷新,用 /reload_config)、只平不开(/stopentry+/forceexit all)。
  6. 数据日志类 FAQ:Missing data fillup(低流动性)、Outdated history(查时间/交易所)、重置数据库(删 sqlite 或换 db-url)。

至此,freqtrade 中文教程全 10 章完结。回到任意章节深入复习,或开始你的量化交易实践。


发布者: 作者: 灏天文库 转发
评论区 (0)
U