继续迈进优化(第一部分):操控优化报告(基础篇)
📘

继续迈进优化(第一部分):操控优化报告(基础篇)

第 1/3 篇

优化报告里那些被忽略的列

MT5 的策略测试器在跑完参数优化后,会生成一张报告表,多数交易者只盯着最后的盈利和回撤,却漏看了中间几列隐藏的筛选价值。比如 2020 年 1 月官方示例里一次 3009 次 pass 的优化,报告默认按利润排序,但同样利润下夏普比率可能差出 2 倍以上。 把报告导出成 CSV 后,用列「Trades」和「Recovery Factor」做二维过滤,能剔除那些靠极重仓位堆出利润的脆弱组合。外汇与贵金属杠杆高,这类组合实盘爆仓概率显著偏大,必须加限定词看待任何历史结果。 小布盯盘的知识库里建议:开 MT5 跑一次自己的 EA 优化,别只截利润最高的那行,把报告全列拉出来比对,才可能找到稳健参数区。

「让外部进程接管滑动优化」

前面两篇讲过了用第三方进程在终端里拉起优化的机制,本质是把优化器做成类似 EA 的常驻算法:正向测试与历史回测按预设间隔平移且彼此重叠,全程无需人工点按钮。 这种滑动优化比单次优化更能压测策略稳健性,同一套流程既测稳定性、又筛指标最优组合。难点在于:每个时间间隔都可能要跑系数过滤和组合选择,手工做不仅慢,还容易碰上数据传输错误或人为漏操作。 本文先落一个操控优化报告的工具箱:从终端导出的报告用 *xml 承载,人和程序都能读,还能按模块分组方便抽数。实现上走 C# 第三方进程 + MQL5 调用,报告读写模块封装成 DLL,两边代码都能复用。 这一节只把函数库的参数结构说清,下一篇才给可跑的 MQL5 调用代码和参数生成逻辑。外汇与贵金属市场杠杆高、滑点突变频繁,任何自动化优化都只是概率层面的辅助,不能直接当实盘依据。

◍ 自构优化报告的字段骨架

MT5 标准优化通关报告能单独导出,但字段厚度远不及「回测」栏里按指定参数跑完生成的完整报告。想要在后续筛选时拥有更大操作空间,就得自己拼一份报告:把测试器设置、机器人参数、交易结果系数三类数据全塞进去,且允许继续挂自定义字段。 报告根节点用 Optimisation_Report 包住,内分两大块。Optimiser_Settings 放全局一致的三项:机器人相对 Experts 目录的路径、存款货币与数额、账户杠杆。优化结果块 Optimisation_Results 里则重复嵌套 Result 模块,每一次通关对应一块,并带 Symbol、TF、Start_DT、Finish_DT 四个随测试区间变化的属性。 每个 Result 下的 Coefficients 模块收纳分组系数,例如 VaR 下挂 90/95/99 分位数,无法归组的就直接写进 Item 并以 Name 区分。下面这段 XML 片段展示了俄股 SBRF Splice、1 分钟周期、Unix 时间 1481327340 至 1512776940 的一次通关:存款 100000 RUR、杠杆 1,VaR99 为 -1827.31。外汇与贵金属品种杠杆动辄百倍,自构报告时务必把 Leverage 如实写入,否则回测风险读数会严重失真。

MQL5 / C++
<Optimisation_Report Created="class="num">06.10.class="num">2019 class="num">10:class="num">39:class="num">02">
  <Optimiser_Settings>
    <Item Name="Bot">StockFut\StockFut.ex5</Item>
    <Item Name="Deposit" Currency="RUR">class="num">100000</Item>
    <Item Name="Leverage">class="num">1</Item>
  </Optimiser_Settings>
<Optimisation_Results>
  <Result Symbol="SBRF Splice" TF="class="num">1" Start_DT="class="num">1481327340" Finish_DT="class="num">1512776940">
    <Coefficients>
      <VaR>
        <Item Name="class="num">90">-class="num">1055,class="num">18214207419</Item>
        <Item Name="class="num">95">-class="num">1323,class="num">65133343373</Item>
        <Item Name="class="num">99">-class="num">1827,class="num">30841143882</Item>

回测报告里的 VaR 与最大盈亏片段

这段 XML 片段是某 EA 在 MT5 策略测试器里跑完之后导出的局部统计,重点在 VaR 和最大利润回撤两块。VaR 节点下 Mx 为 -107.03475,Std 为 739.584549199836,说明样本均值偏负、离散程度极大,单看这组数就别指望曲线平滑。 Max_PL_DD 里 Profit 是 1045.9305,DD 是 -630,而且盈利交易和亏损交易都只有 1 笔,连胜连亏也各 1 次。这种样本量在外币或贵金属上基本没有统计意义,外汇贵金属杠杆高、跳空频繁,极小样本的结论可能严重失真。 Trading_Days 的 Mn 子节点中 Profit 直接为 0,意味着按分钟维度聚合时这段没有任何正收益落袋。真要验证,把这段贴进 MT5 的报表对比工具,或自己写个脚本解析同类 XML,看 Mx 和 Std 在你的品种上会不会收敛。

「回测报告里的周维度切片」

把 MT5 策略测试器的 XML 结果按星期拆开看,能暴露策略在哪些交易日真正干活。上面这段是某次回测输出的周三(We)与相邻交易日节点,Mn、Tu 的利润项全是 0,说明那两周一、二没有任何成交或平仓。 到了 We 节点,Profit 项写的是 1045.9305,而 DD、盈利笔数、亏损笔数在片段里未完整给出,但至少说明周三产生了正向权益变动。外汇与贵金属品种受周中流动性切换影响明显,这类切片对识别「只在某天吃肉」的过拟合倾向有帮助。 开 MT5 跑完测试后,直接翻 tester 目录下的 .xml,搜 <We> 就能定位周三里层。若你自己的 EA 在 Mn/Tu 连续多周利润挂 0,大概率触发条件被卡在了周初跳空之外。

MQL5 / C++
<Item Name="DD">class="num">0</Item>
<Item Name="Number Of Profit Trades">class="num">0</Item>
<Item Name="Number Of Lose Trades">class="num">0</Item>
</Mn>
<Tu>
<Item Name="Profit">class="num">0</Item>
<Item Name="DD">class="num">0</Item>
<Item Name="Number Of Profit Trades">class="num">0</Item>
<Item Name="Number Of Lose Trades">class="num">0</Item>
</Tu>
<We>
<Item Name="Profit">class="num">1045,class="num">9305</Item>

◍ 回测节点的盈亏与回撤落点

上面这段 XML 片段记录的是某次策略回测里不同行情分段(We / Th / Fr)的结算指标,直接读原结构就能定位每段的交易质量。 We 段给出 DD=630、盈利交易 1 笔、亏损交易 1 笔,说明这一段走完账户曾扛过 630 点量级的回撤,但最终是一胜一负收场,净值未被单边吃掉。 Th 与 Fr 两段所有 Item 均为 0:Profit=0、DD=0、盈利与亏损交易笔数都是 0,意味着这两个分段在样本期内没有任何开仓动作,属于策略过滤后的静默区。 把这三段拼起来看,回测并不是全程在跑,而是只在 We 类结构里出手;外汇与贵金属品种受跳空与杠杆影响,这类分段过滤在实盘里可能显著降低无效损耗,但也可能漏掉突发行情,开 MT5 用策略测试器复跑时建议把分段标签打印到日志核对。

常见问题

重点看交易次数、期望收益、恢复系数和参数稳定性,这些列能暴露过拟合和样本脆弱,比单看盈利曲线实在。
用外部调度把优化任务丢给独立进程,设定好起止时间和品种周期,跑完自动落盘报告,终端照常看盘不受影响。
小布可自动提取报告里的关键字段并标红异常项,比如VaR突高或某周切片巨亏,你打开品种页就能直接看诊断结论。
VaR看极端周会亏多少,最大盈亏片段看连亏长度;两者同时恶化就说明策略抗冲击差,实盘前先降仓位测试。
先确认样本覆盖不少于半年且跨多个年份,再观察周三亏损是否伴随成交量异常;单一周期规律大概率只是噪声。