看到不少朋友在问EA参数优化的具体方法,今天抽空把我这几年实盘跑下来的一些经验和教训整理一下,发在这里供大家参考。这不是什么高深的理论,纯粹是实战中踩坑总结出来的,希望能帮到刚入门的朋友。
先说说优化的大原则。参数优化不是让EA去拟合历史数据,而是找到一组能在未来行情中保持稳定表现的参数。很多新手上来就把EA跑在默认参数上,然后发现回测曲线漂亮得不行,一上实盘就爆仓,这就是典型的过度优化。我这里分享一个我常用的三步法:粗筛、精调、验证。
第一步,粗筛阶段。打开MT4的策略测试器,选择OHLC M1模式(别用Every Tick,那太慢了),时间范围建议选最近3到5年,包含明显的趋势和震荡行情。比如EURUSD,我会从2020年1月拉到2024年6月,覆盖疫情后的剧烈波动和2022年的加息周期。参数范围不要设得太窄,比如移动平均线周期从5到50,步长设5,这样一次能跑出几个较好的区域。注意看Optimization结果里的Profit Factor、Sharpe Ratio和Max Drawdown,优先选Profit Factor大于1.5、最大回撤不超过20%的组合。
第二步,精调阶段。粗筛出来的参数组通常会集中在某个区域,比如MA周期在15到25之间表现都不错。这时把步长缩小到1,时间范围缩短到最近1年,用2000个左右的固定点差跑回测,重点观察参数变化对净值曲线的影响。我习惯用蒙特卡洛模拟来测试参数稳定性,具体做法是:对每组参数跑100次随机订单执行延迟和滑点,然后看收益率分布的方差。方差越小,说明参数对市场微观结构的敏感性越低。这一步通常需要跑几个小时,但值得。
第三步,验证阶段。这是最关键也是很多人忽略的。把精调出来的参数放到未来数据上测试,比如用2023年6月到2024年6月的数据做样本外验证。如果样本外表现和样本内回测差距超过30%,那这组参数就是无效的。我自己的标准是:样本外Profit Factor至少达到样本内的80%,且最大回撤不超过样本内的1.2倍。另外,不同品种之间参数往往不通用,比如EURUSD和GBPUSD虽然都是主要货币对,但波动特性差异很大,不要偷懒直接复制。
这里贴一段我常用的MQL4代码片段,用来做参数稳定性测试。这段代码会输出每个参数组合的稳定性评分,数值越大越好。
double StabilityScore(int param1, int param2, double profit, double drawdown, int trades) {
double score = 0;
if(trades < 50) return 0; // 交易次数太少,统计意义不足
score += profit / MathMax(drawdown, 0.1) * 0.6;
score += MathLog(trades) * 0.2;
score += (param1 % 2 == 0 ? 0.1 : -0.1); // 偶参数稳定性略好,个人经验
score += (param2 % 5 == 0 ? 0.1 : 0); // 5的倍数参数常见于震荡策略
return NormalizeDouble(score, 2);
}
注意,这段代码里的权重系数是我根据自己的策略调出来的,不同策略需要重新调整。比如趋势跟踪策略更看重Profit Factor,震荡策略更看重回撤控制。不要把这段代码直接复制到你的EA里就用,要去理解背后的逻辑。
最后说几个常见的坑。第一,不要用盘口数据回测,用真实点差数据,否则实盘会被点差吃掉利润。第二,优化时记得把交易成本算进去,EURUSD的浮动点差通常在1到3点,固定点差模式会低估成本。第三,别迷信遗传算法优化,它虽然快但容易陷入局部最优,手动跑网格搜索更可靠,就是慢点。第四,每次优化后至少跑20次蒙特卡洛测试,确认参数鲁棒性。
写到这里感觉有点啰嗦了,但参数优化确实需要耐心和系统性思维。建议新手先拿一个简单策略练手,比如双均线交叉,按这三步走一遍,感受一下过程。等熟悉了再上复杂策略。有什么具体问题欢迎留言,我会尽量回复。下期准备写写如何用MQL5的OnTester函数做自定义优化指标,有兴趣的可以关注。
先说说优化的大原则。参数优化不是让EA去拟合历史数据,而是找到一组能在未来行情中保持稳定表现的参数。很多新手上来就把EA跑在默认参数上,然后发现回测曲线漂亮得不行,一上实盘就爆仓,这就是典型的过度优化。我这里分享一个我常用的三步法:粗筛、精调、验证。
第一步,粗筛阶段。打开MT4的策略测试器,选择OHLC M1模式(别用Every Tick,那太慢了),时间范围建议选最近3到5年,包含明显的趋势和震荡行情。比如EURUSD,我会从2020年1月拉到2024年6月,覆盖疫情后的剧烈波动和2022年的加息周期。参数范围不要设得太窄,比如移动平均线周期从5到50,步长设5,这样一次能跑出几个较好的区域。注意看Optimization结果里的Profit Factor、Sharpe Ratio和Max Drawdown,优先选Profit Factor大于1.5、最大回撤不超过20%的组合。
第二步,精调阶段。粗筛出来的参数组通常会集中在某个区域,比如MA周期在15到25之间表现都不错。这时把步长缩小到1,时间范围缩短到最近1年,用2000个左右的固定点差跑回测,重点观察参数变化对净值曲线的影响。我习惯用蒙特卡洛模拟来测试参数稳定性,具体做法是:对每组参数跑100次随机订单执行延迟和滑点,然后看收益率分布的方差。方差越小,说明参数对市场微观结构的敏感性越低。这一步通常需要跑几个小时,但值得。
第三步,验证阶段。这是最关键也是很多人忽略的。把精调出来的参数放到未来数据上测试,比如用2023年6月到2024年6月的数据做样本外验证。如果样本外表现和样本内回测差距超过30%,那这组参数就是无效的。我自己的标准是:样本外Profit Factor至少达到样本内的80%,且最大回撤不超过样本内的1.2倍。另外,不同品种之间参数往往不通用,比如EURUSD和GBPUSD虽然都是主要货币对,但波动特性差异很大,不要偷懒直接复制。
这里贴一段我常用的MQL4代码片段,用来做参数稳定性测试。这段代码会输出每个参数组合的稳定性评分,数值越大越好。
double StabilityScore(int param1, int param2, double profit, double drawdown, int trades) {
double score = 0;
if(trades < 50) return 0; // 交易次数太少,统计意义不足
score += profit / MathMax(drawdown, 0.1) * 0.6;
score += MathLog(trades) * 0.2;
score += (param1 % 2 == 0 ? 0.1 : -0.1); // 偶参数稳定性略好,个人经验
score += (param2 % 5 == 0 ? 0.1 : 0); // 5的倍数参数常见于震荡策略
return NormalizeDouble(score, 2);
}
注意,这段代码里的权重系数是我根据自己的策略调出来的,不同策略需要重新调整。比如趋势跟踪策略更看重Profit Factor,震荡策略更看重回撤控制。不要把这段代码直接复制到你的EA里就用,要去理解背后的逻辑。
最后说几个常见的坑。第一,不要用盘口数据回测,用真实点差数据,否则实盘会被点差吃掉利润。第二,优化时记得把交易成本算进去,EURUSD的浮动点差通常在1到3点,固定点差模式会低估成本。第三,别迷信遗传算法优化,它虽然快但容易陷入局部最优,手动跑网格搜索更可靠,就是慢点。第四,每次优化后至少跑20次蒙特卡洛测试,确认参数鲁棒性。
写到这里感觉有点啰嗦了,但参数优化确实需要耐心和系统性思维。建议新手先拿一个简单策略练手,比如双均线交叉,按这三步走一遍,感受一下过程。等熟悉了再上复杂策略。有什么具体问题欢迎留言,我会尽量回复。下期准备写写如何用MQL5的OnTester函数做自定义优化指标,有兴趣的可以关注。
专注交易策略编程实现,分享MQL开发技巧与代码优化方案