Skip to content

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 实盘账号「模型交易选模拟」≠「柜台是模拟资金」
手续费 / 滑点回测设定和柜台真实成交差一截

排错顺序

  1. 逻辑是否写在回测会进的回调里
  2. 是否误用了只在实盘才有数据的接口
  3. 下单是否用回调 / get_trade_detail_data 对账,而不是只看 passorder 返回值
  4. 后缀、账号类型、opType / prType 是否按 passorder

相关:委托回调 · API 查询

策略要从聚宽 / PTrade / QMT 互转或接到账户,可在 公众号 后台留言「策略代写」。不代操盘。