首页 / 交易学院 / 小布知识库 / EA 调试、测试与优化实战指南
EA 调试、测试与优化实战指南
🔧

EA 调试、测试与优化实战指南

从消灭编译错误,到用策略测试器找到最佳参数

回测与测试 难度 · 入门 2026-07-15 12 分钟阅读
#MQL5#调试#策略测试#优化#遗传算法

大多数 EA 写不完,卡在两关:编译一堆红叉不知从哪改,以及回测参数怎么调都调不出棒亮曲线。本文用官方《EA 测试与优化指南》的真实案例,把这两关一次性讲透。

一、逐个消灭编译错误

Error 选项卡四要素:①错误说明 ②出错文件 ③行列号 ④错误/警告总数。用 Ctrl+G 或双击错误跳到对应行。关键纪律:逐步改、逐步编译,别一次性堆一堆再编。

✦ 改一处往往消一批
很多错误是连锁的(比如漏一个左括号会让后续十几行全报错)。逐步改+逐步编译,才能看清真正根源。

二、运行时错误:数组越界

编译过了不代表能跑。案例:CopyBuffer 只拷了 3 根柱(索引0/1/2),代码却读 [3] → Array out of range。修正:把拷贝数量放大到 5,覆盖所需索引。

三、策略测试器初步测试

View → Strategy Tester;选 Expert 与周期;优化类型选“市场报价中所有品种”;目标选 Balance + Max Profit Factor;跳完按 Result 排序,找出最赚钱的品种/周期作为优化方向。

四、优化 EA

启用优化 + 快速遗传算法;在 Inputs 里只勾关键参数。Start/Step/Stop 含义:Start=最小值、Stop=最大值、Step=每次递增步长;实际测试值都在 [Start,Stop] 内且为 Step 整数倍。测试总次数 = 各参数组合数。

⚠ 别让组合数爆炸
勾太多参数或步长设太小 → 组合数成千上万、优化跑几天。多数 EA 只依赖 2-3 个参数(尤其指标周期),聚焦它们即可。

五、解读优化结果

右键加列看 Profit Factor(盈利系数)、Expected Payoff(预期收益)、Drawdown%(回撤)。盈利系数=总盈利/总损失,越高越赚;回撤越小策略越稳;恢复系数=盈利/最大回撤,反映风险。综合选高利润且低回撤的那组。结果存为 XML,可用 Excel 打开。

六、终测:最佳参数组合再跑一遍

切到优化图 → 1D Graph,右键选 X 轴参数看曲线峰值,逐个确定最佳值(如止损 34、止盈 78、各周期值)。把最佳值组合进 Inputs,关掉优化跑“终测”,确认结果稳定。

七、遗传算法 vs 完整搜索的取舍

优化器有两种思路:穷举(把参数网格每个点都跑一遍)与遗传(模拟进化,只保留每一代表现好的组合去繁衍)。穷举在小参数空间精确但耗时爆炸;遗传在大空间能快速逼近较优区,但不保证全局最优,可能停在局部。

实务建议:参数少(两三个、范围窄)用穷举求精确;参数多、范围宽用遗传省时间。无论哪种,优化目标都要先定好评分函数,否则跑得再快也是在瞎找。遗传的「代」「种群大小」「变异率」也要调,种群太小容易早熟收敛。

八、用 OnTester 自定义评分防过拟合

默认优化按「净利润」排序,会催生过拟合。在 OnTester 里返回自定义评分,把 profit factor、recovery factor、最少成交笔数、回撤上限都纳入,优化器才会挑稳健参数而非「历史上最赚」的参数。

double OnTester()
{
   double pf = TesterStatistics(STAT_PROFIT_FACTOR);
   double rf = TesterStatistics(STAT_RECOVERY_FACTOR);
   double tr = TesterStatistics(STAT_TRADES);
   if(tr < 50 || pf < 1.2) return 0.0;   // 样本太少或质量差直接弃
   return pf * rf;                         // 兼顾盈利质量与回撤恢复力
}
✦ 评分即目标
优化器只优化你 return 的数字。return 净利润,它就找净利润最大;return 质量乘恢复力,它才找稳健。评分写歪,测试器再强也救不了。

九、样本外与前方测试(forward test)

优化完别直接上实盘。把排名靠前的参数拿到「没参与优化的历史段」重跑(样本外),看表现是否仍接近;再进一步用 Walk-Forward 滚动窗口验证参数可迁移性。样本内漂亮、样本外崩,就是过拟合。

真金白银前还要做前方测试(forward test):用最近一小段未优化数据、或模拟盘小仓跑一段时间,观察参数在「当下市况」是否仍工作。回测是过去,前方测试是现在,两者都过才敢加仓。

十、小结

常见问题

不建议。很多错误是连锁的——改一处会顺带消掉一批;逐步改+逐步编译才能看清真正根源,避免越改越乱。
= 是赋值,== 是比较。在 if 里写成 if(a=b) 会变成“赋值”且条件永远为真/假,是新手高频 bug。
Start 是参数最小值,Stop 是最大值,Step 是每次递增的步长;实际测试值都在 [Start,Stop] 内且是 Step 的整数倍。
切到优化图 → 1D Graph,右键选 X 轴参数看曲线峰值;同时顾高利润与低 Drawdown%,不单看利润。