QMT 为什么回测和实盘不一样
回测净值好看、盘中一跑就歪,多半不是「回测骗人」,是两边触发的代码路径本来就不一样。按下面逐项对。
1. 定时器回测根本不进
run_time / 部分定时只在盘中运行模式触发。回测不会进这些回调。要回测,逻辑放 handlebar,用 K 线时间卡住。
详见:run_time 回测为什么不跑 · handlebar 和 run_time 怎么选
2. 实时接口在回测里不可用或行为不同
get_full_tick 等实时接口,回测场景常空或不该依赖。见 get_full_tick 回测为什么不能用。
回测行情用 get_market_data_ex 且注意 subscribe=False、本地数据是否下全。
3. 下单时机:quickTrade 与逐 K
实盘默认 quickTrade=0 时常是「K 走完才真正发出」一类行为;quickTrade=2 立刻下。回测撮合按当根高低/收盘规则,和盘中价格笼子、废单不是同一套。
见手册 回测与实盘 · passorder 返回未成交
4. ContextInfo 不要当长期状态
ContextInfo 上的属性可能回滚。盘中状态用模块级 / 普通对象。见 AI 写的 QMT 跑不了 里同类坑。
5. 数据与账号口径
| 点 | 建议 |
|---|---|
| 历史没下全 | 数据管理先下,再回测 |
| 当日日线 | 盘中不是收盘价,注意 end_time |
| 模拟账号 vs 实盘账号 | 「模型交易选模拟」≠「柜台是模拟资金」 |
| 手续费 / 滑点 | 回测设定和柜台真实成交差一截 |
排错顺序
- 逻辑是否写在回测会进的回调里
- 是否误用了只在实盘才有数据的接口
- 下单是否用回调 /
get_trade_detail_data对账,而不是只看passorder返回值 - 后缀、账号类型、
opType/prType是否按 passorder 填
策略要从聚宽 / PTrade / QMT 互转或接到账户,可在 公众号 后台留言「策略代写」。不代操盘。
