自动回测:在缓存的 K 线上运行脚本策略

回放界面的自动回测模式会把一套已保存的策略脚本运行在数周至数年的缓存 K 线上,强制计入交易成本,采用与研究用回测器相同的保守成交规则,并把结果记入性能面板。

Senzoukria · 文档 · 更新于 2026 年 9 月


位置

位置
回放 → 准备 → 模式“自动回测”(“数月的 K 线 —— 你的策略自动运行”)
默认值
周期 1 个月,颗粒度 15 分钟,点值 2 美元,往返手续费 1.24 美元,滑点 1 跳
成交规则
以下一根 K 线的开盘价加滑点入场,离场按影线判定,模棱两可的 K 线上止损优先,每笔交易都计手续费
回溯长度
策略在每次决策时可见最近 500 根 K 线

它做什么

手动回放逐笔播放一天,而自动回测则把在 Scripting 页面编写的策略运行在本地缓存的 K 线上。策略暴露 decide(bars, params, ctx, state),bars 由新到旧,并返回一个动作:buy、sell 或 close,可选带 qty、stopTicks 和 targetTicks。整个循环在沙箱 worker 中运行(ofsandbox 协议,自带 CSP),以 300 ms 为步长推进,以保持界面响应;同一份循环代码也在 blob worker 中运行以支持测试和网站,从而保证结果完全一致。

面板首先读取所选合约和颗粒度的缓存,并报告覆盖情况(“请求的 {n} 个时段中已缓存 {n} 个”)。缺失的时段可以从经纪商下载(K 线,或在策略读取逐档失衡时下载足迹逐笔历史),也可以导入一份 Databento ohlcv-1m 文件。服务器 K 线含 OHLC、成交量和 delta,但不含足迹价位明细,而导入的 K 线完全不含 delta。

设置

自动回测卡片的各项设置
设置默认值它改变什么
策略“选择…”来自 Scripting 页面的已保存策略;“编辑策略”打开代码,修改后的草稿无需保存即可运行,Ctrl+Enter 重新运行。
周期1 个月1 周、1 个月、3 个月、6 个月、1 年、2 年、5 年(7 至 1,825 天)。
颗粒度15 分钟1 分钟、5 分钟、15 分钟、1 小时。六个月的 1 分钟 K 线约为 250,000 根,每种配置需要数分钟。
点值($)2(MNQ)每张合约一个完整点的美元价值;最小 0.01。
每张合约的往返手续费($)1.24从每一笔交易中扣除;最小 0。
滑点(跳)1始终不利于入场:买入成交更高,卖出成交更低;最小 0。
前推关闭启用切片数、训练比例、选择标准和参数维度(见前推分析页面)。
运行回测启动运行;“中断”可中止。结果标题为“结果 · {n} 根 K 线”。

模拟规则

  • 决策在收盘的 K 线上作出,并在下一根 K 线的开盘处执行:绝不以决策产生之时已成过去的价格成交。
  • 止损和目标按 K 线的最高价和最低价判定,而不是收盘价。
  • 当同一根 K 线同时触及止损和目标时,止损优先:没有 tick 就无法知道先后顺序,因此引擎按对你不利的方式裁定。
  • 每一笔交易都收取手续费;成本提示提醒你,一旦交易频繁,零成本会把一个亏损策略变成盈利策略。
  • 反向信号会先平掉当前持仓(原因为“reverse”);close 动作则是平仓(原因为“flatten”)。
  • 每笔交易都会记录 MAE、MFE 和入场时的风险(止损距离 × 数量 × 点值),用于浮动区间和 R 倍数图表。
  • 脚本日志最多保留 200 行;Python 策略通过在 Scripting 页面安装的解释器运行;C++ 策略目前还无法回测。

局限与陷阱

结果会以“自动”运行的形式连同实际覆盖天数记入性能面板;当覆盖不足请求窗口的 90 % 时,列表会显示“{req} 天中的 {n} 天”。在部分覆盖上运行的回测只覆盖那个窗口,面板会直说这一点。

历史 K 线是经纪商的权限:面板会区分“permission denied”(rp_code 13,账户未开通 K 线)与档案没有回溯到那么早。回测不会下达任何订单;自动化策略永远只驱动模拟考核账户。

其他语言版本

常见问题

为什么回测在下一根 K 线的开盘价成交?
决策只有在 K 线收盘后才存在。用同一根 K 线内的价格入场,就用到了当时还没有的信息,这正是朴素回测器的头号缺陷。
我能把手续费设为零吗?
字段接受 0,但提示会警告:一旦策略交易频繁,零成本回测就会说谎。默认的 1.24 美元是自营公司一次往返的量级参考。
为什么我的合约没有任何缓存?
当你在图表中以该颗粒度打开该合约时,缓存就会填充;也可以从回测面板下载缺失的历史。此外还可以导入一份 Databento ohlcv-1m 文件。