Summary: 深入对比EA参数优化中的网格搜索与遗传算法。遗传算法可减少80%计算时间,包含过拟合检测(前进式验证)及代码示例,帮助进阶用户避免曲线拟合,提升策略鲁棒性。




参数优化是EA开发中最易误导的环节。对10个参数各取100步进行网格搜索,需要10^200次回测——不可能完成。遗传算法(GA)将迭代次数压缩到可行范围。

1. 网格搜索的局限
MT4原生策略测试器采用暴力枚举。假设对止盈、止损、移动止损3个参数各取50个值:
```cpp
// 伪代码:12.5万次回测
for(int tp = 10; tp <= 500; tp += 10)
for(int sl = 10; sl <= 500; sl += 10)
for(int ts = 0; ts <= 100; ts += 10)
RunBacktest(tp, sl, ts);
```
典型硬件耗时约43小时。遗传算法可在2小时内达到相近结果。

2. 遗传算法实现逻辑
GA模拟自然选择:种群规模N=50,代数G=30,交叉率0.7,变异率0.05。
```cpp
// MT4 GA适应度函数示例
double Fitness(double ¶ms[]) {
double tp = params[0], sl = params[1];
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, sl, tp, "GA_EA", 0, 0, Green);
// 返回夏普比率或盈利因子
return GetProfitFactor();
}
```
选择策略:锦标赛法(规模3)。交叉:单点随机交叉。变异:添加高斯噪声,sigma = 0.05 * 参数范围。

3. 过拟合检测公式
前进式验证(WFV):将数据分为样本内(80%)和样本外(20%)。仅当样本外性能衰减小于15%时接受参数。
```
衰减率 = (PF_样本内 - PF_样本外) / PF_样本内
接受条件:衰减率 < 0.15
```
其中PF = 盈利因子。

4. 实践优化流程
第一步:运行GA(30代,种群50)。第二步:选出前5组参数。第三步:对每组执行前进式验证。第四步:仅保留衰减率<15%的参数集。

5. 代码:导出GA优化后的参数
```cpp
// 保存最优参数至文件
void SaveOptimalParams(double &best[]) {
int handle = FileOpen("OptimizedParams.dat", FILE_WRITE|FILE_BIN);
if(handle != INVALID_HANDLE) {
FileWriteArray(handle, best);
FileClose(handle);
}
}
```

参考来源:Kaufman, P. J.(2019),《交易系统与方法》,Wiley出版社,第12章“优化技术”。