在 MT5 里做一次回测的办法是:用 View > Strategy Tester(或 Ctrl+R)打开策略测试器,选好智能交易系统、品种、时间周期、日期区间和建模模式,然后按 Start。五分钟后你手上就有了一份报告。真正棘手的问题并不是怎么走到这一步——而是那份报告上的数字,究竟哪一个真的是你以为的那个意思。
本文把两半都写了:操作流程,以及读法。读法这一半正是本页证据的来源,因为我们手上有 23 次已完成的运行,而它们的报告在一个几乎没人去核对的地方自相矛盾。
一次跑完的运行会给你什么
产出物是一份分两半的报告:结果区块(交易笔数、盈利因子、回撤、净利)和它背后的成交清单。两半都重要,而被引用的永远只有第一半。
你在最后应该能说出口的,不是“它赚了 3,023 美元”。而是:这一套规则,在这个品种和这个时间周期上,在这段窗口里,用这个 tick 模型,在一个 10,000 美元的账户上,产生了这么多笔交易,盈利因子是多少,最糟的时候曾经浮亏到这个程度。 这句话里的每一个分句都是你选定的一项设置,其中任何一项改变,答案都会变。这也是本文把设置放在流程前面的原因。
设置:真正决定结论的数据与选项
下面是我们真实跑过并已经发布的一次运行,把输入和输出并排引出来,方便你对照着看。它是 Stillwater 背后的那份记录——一套只做多的美元/日元 5 分钟图策略。
| 设置项 | 本次运行 | 为什么这样设 |
|---|---|---|
| Expert | Stillwater(19 个输入参数) | 报告被核实携带的每一个输入参数——你要复现它就必须重新录入的那一整片界面 |
| Symbol | USDJPY_DUKA | 一个专用的 tick 历史品种,与实盘报价的那个分开,运行因此可复现 |
| Period | M5 | 规则据以评估的那张图;趋势过滤是在 EA 内部读取 M30 的 |
| Date range | 2019-01-01 → 2026-07-01 | 7.5 年,长到足以包含不止一种行情格局 |
| Modelling | Every tick based on real ticks (Model 4) | 任何在日内进出的东西,都需要把K线内部的路径测出来,而不是插值出来 |
| Deposit | 10,000 USD | 本站每一次运行都固定为这个数,回撤百分比才有可比性 |
| Leverage | 请求 1:500 —— 实际按 1:100 运行 | 见下文。这一行不是它看上去的样子 |
| Optimisation | 关闭 | 单次通过。搜索参数是另一件事,也有另一套陷阱 |
其中有两行值得比一个表格单元格更多的篇幅。
数据质量是整个结果的立足点。 报告里其他每一个数字,都是在测试器所用的那条价格序列之上算出来的,所以建模质量这个数字,界定了报告的其余部分究竟有多少是在讲你的策略。上面那次运行的公开记录写明:在 2.29 亿个真实 tick 上,历史质量 100%,直接读自测试器的报告。一次跑在插值K线数据上的运行,产生的会是另一组交易,而不仅仅是另一组成交价——测试器会在它已知的两个价格之间假设一条平滑路径,而一套止损很紧的策略,正是在拿这个假设做交易。如果你还没查过自己的终端对这个品种究竟持有什么 tick 数据,那应该是你第一件要做的事,比看策略还靠前。
杠杆那一栏是一个请求,不是一项设置。 在手上全部 23 次运行里,测试器被要求的是 1:500,而测试是按 1:100 跑的——23 次里有 0 次让请求的那个数字真正生效。这不是把输入框读回来之后的猜测:它是靠测量测试内部一笔持仓真正占用的保证金钉死的,126.39 USD,这个数对得上按 100 倍杠杆的算法,对不上 500 倍的那个。实际后果是,一个对保证金敏感的设计——网格、马丁格尔,任何会叠仓的东西——可能在一个它永远见不到的杠杆下通过回测,也可能在一个它本来不会用的杠杆下没通过。请拿报告里的保证金数字和你自己的算术对一遍,而不是相信你填进那个框里的东西。
分步操作:在 MT5 里把这次测试跑出来
- 用 View > Strategy Tester(
Ctrl+R)打开。面板会停靠在终端底部,标签页依次是 Settings、Inputs、Agents 和 Journal。 - 在 Settings 标签页里选定智能交易系统,然后选 Symbol 和 Period。选你真正会去交易的那个品种——合约规格(而不只是价格)来自它,而同一个货币对在一家经纪商的不同变体之间,合约大小和保证金规则是不一样的。
- 设定日期区间。用带明确 From 和 To 日期的自定义区间,而不是“Last month”,这样只读你报告的人也能把这次运行复现出来。
- 选 Modelling 模式。日内的一律用 Every tick based on real ticks;慢速系统用 Every tick generated from M1 bars;更粗的那几档是用来扫参数的,绝不能用于你要发布的数字。
- 设 Deposit、货币和杠杆,第一次通过时把 Optimisation 关着。记下你请求的杠杆——你会拿报告里的保证金数字去验证它,而不是假定它生效了。
- 打开 Inputs 标签页,把每一个值都读一遍。这个标签页会不声不响地沿用上一次运行的改动,这也正是为什么我们的记录是拿成品报告去核对输入参数,而不是拿我们以为自己载入的那个文件。本组里有一次运行带着 362 个输入参数。
- 按 Start。除非你在调试入场逻辑,否则把 Visual mode 关掉——它慢得多,而且会诱使你去看,而不是去测。
- 跑完之后,打开 Results、Graph 和 Backtest 标签页,然后在报告里点右键把它保存下来。日后你要拿来比对的是这份保存下来的报告,而不是资金曲线的截图。
- 把终端版本号连同结果一起记下来。我们这 23 次运行横跨 6090 和 6140 两个版本;同一套策略在不同版本下的两次运行,并不自动算作同一个实验。
- 先查这个品种究竟持有什么历史数据
- 让建模模式与持仓时间相匹配
- 设定品种、周期和一个明确的日期区间
- 把 Inputs 标签页上的每一个值都读一遍
- 关掉优化,只跑单次通过
- 保存报告,而不是截图
- 先读两条回撤,再读盈利那一行
读结果:报告里的数字究竟指的是什么
还是同一次运行的输出。传回来的是这些:
| 结果 | 数值 | 在你继续之前它必须过的那一关 |
|---|---|---|
| 交易总笔数 | 416 | 多到足以让平均值描述的是一个样本,而不是一则轶事 |
| 盈利因子 | 1.28 | 高于 1.0,且这个余量要扛得住你没有建模的那些成本 |
| 净利润 | 3,023.01 USD | 建立在 10,000 的入金上——这是一个回报,不是一个分数 |
| 余额回撤 | 5.82%(747.57) | 已平仓资金曲线上最糟的一段下探 |
| 净值回撤 | 6.11%(787.60) | 把未平仓持仓算在内最糟的一段下探——你当时真正会盯着看的那一个 |
| 胜率 | 60.82% | 单看毫无意义;要对照止损和目标来读,这里是 100 点和 200 点 |
| 测试条件 | |
|---|---|
| 实验编号 | EXP-BACKTEST-RUNBOOK-001 |
| 运行编号 | stillwater__gate_v2_duka_realticks__2019-01-01_2026-07-01 |
| MT5 版本号 | 6140 |
| 合约规格 | Exness-MT5Trial5 |
| 品种 / 时间周期 | USDJPY_DUKA M5 |
| 期间 | 2019-01-01 – 2026-07-01 |
| 模型 | Every tick based on real ticks (Model 4) |
| 入金 | 10,000 USD |
| 请求杠杆 | 1:500 |
| 实际杠杆 | 1:100 |
| 实测于 | 2026-08-23 |
| 最近验证 | 2026-08-25 |
那份报告里有三处经常被读错。
两条回撤问的是两个不同的问题。 余额回撤衡量的是已平仓的那条资金曲线;净值回撤则把仍然开着的持仓的浮动盈亏也算进去。在我们这 23 次运行里,净值那条每一次都更深,而两者差距的大小,无法从策略的描述里推出来:最窄的一次差 0.04 个点(0.67% 对 0.71%),最宽的一次差 11.10 个点(14.52% 对 25.62%,比值 1.76)。平仓快的策略差距小。会坐着扛过不利波动的策略差距大,而那恰恰是你在投入资金之前最需要知道其回撤的那一类策略。
MT5 会按两种定义,把每条回撤各打印一次。 Maximal 回撤是在金额最大的那一刻测的;Relative 是在百分比最大的那一刻测的。它们是同一次运行里的两个不同时刻,所以这两个数字并不是同一个事件的两个视角。我们的运行里,16 次记录在 Maximal 定义下,5 次在 Relative 下——而写这些记录的流水线,拒绝把一个 Maximal 的余额数字和一个 Relative 的净值数字配成一对,因为把两者同时展示的页面,比较的是两个不同的瞬间。你引用一个回撤时,请把定义一起写上。
报告自己的总计是四舍五入过的,而它的窗口也未必是你说的那个窗口。 从公开的成交清单重新算过,同一次运行的盈利因子是 1.2843,而不是报告里的 1.28——在这里无伤大雅,但当你要比较两个只差三位小数的候选时,就不再无伤大雅了。更要紧的是,那次 416 笔交易的运行,会拆成截至 2026-04-01 发布截止日之前的 404 笔和之后的 12 笔。后面这 12 笔录得的盈利因子是 2.3317。两个数字都没有错;它们回答的是不同的问题,而那条截止线是一个人选定的日期,不是测试器打印出来的东西。如果你打算把一次运行切成“我拟合过的那部分”和“我没拟合过的那部分”,请在看第二半之前,先把线画在哪里写下来。读懂一份 MT5 回测报告把这个切分放在全部 23 次运行上做了一遍,并给出头条数字因此移动了多少。
会悄悄让一次运行作废的陷阱
改进它:一次只改一样,重跑,比较
这个循环刻意地无聊。每次只改一个变量,重跑,然后把两次结果都写下来。一次改两个,你就没法把差异归给其中任何一个。
每一次运行能带来最多信息的顺序是:
- 先改窗口,再改策略。 把 2019–2022 和 2022–2026 分开跑。如果两半对不上,那这套参数描述的只是其中一段时期,再怎么调都修不好这一点。
- 改品种。 一条只在一个货币对上有效的规则,是关于那个货币对的一个事实。我们这一组里,同样的几类做法覆盖了美元/日元、欧元/英镑、澳元/加元、纽元/美元,还有一个指数和一个加密货币对,正是为了这个原因。
- 改建模模式。 把活下来的候选拿到更粗的模型上重跑。如果结果崩了,那条优势就活在K线内部,而K线内部的路径是任何仿真里最不可信的部分。
- 最后才去改参数——并且请把任何你必须搜索才找到的设置,当成一个比你事先选定的设置更弱的主张。
当一个改动不再能把结果推出前几次运行的噪声范围时,就停下来;或者当你发现自己是因为上一份报告说了什么才去选设置时,也停下来。后一个才是真正的停止条件,而且它来得比人们预期的早。回测分析器在这里很有用,因为它能把一份保存好的报告里的关键数字读回来,让比较两次运行变成一道算术题,而不是一次回忆。
下一步:上真实账户之前先做前进测试
一次干净的回测是四步里的第一步,不是终点线。
如果规则里有值得搜索的参数,就做优化。 把整个搜索范围记下来,而不是只记那个胜出的通过——一个你必须去找才找到的结果,是关于这次搜索的证据,而范围才是告诉读者你找得有多用力的那个东西。参数优化把这一次通过完整走了一遍,并读了我们自己记录在案的八次搜索:116 个组合,而我们愿意发布的设置一个也没有。
然后做前进分析。 在一段上拟合,在下一段上测量,如此重复。这是四步里唯一直接攻击过拟合的一步,也正因为如此,它比一次更长的回测更值钱。
然后在模拟账户上做前进测试。 延迟、重新报价和真实的点差扩大,是在这里才终于进入实验的。跑得久一点,久到能看见这套策略亏一段再涨回来,因为你真正需要的那个数字不是回报——而是你能不能坐着熬过上面测出来的那个回撤。
然后做决定。 事先写下那个一旦出现就会让你把它关掉的亏损数字。你在投入资金之前设定的止损是一个决策;你在回撤过程中设定的止损是一个反应。
如果你想在自己动手之前先看一份完整的参考,已发布的 EA 目录里每一项都带着完整的平仓交易清单、两条回撤线,以及它们背后的运行清单,而我们如何测试说明了这些记录被要求达到的标准。其余的回测指南会更深入地讲这一页只是指了个方向的优化和前进分析。这里没有任何内容承诺结果:本页上的每一个数字,描述的都是已经发生过的运行。