参数优化是大多数EA实盘失效的根本原因——过拟合。MQL5策略测试器内置的遗传算法(GA)提供了高效的搜索能力,但缺少有效验证时,你只是在拟合历史噪音。
1. MQL5中遗传算法的核心机制
MQL5内置GA使用选择、交叉(均匀或单点)和变异操作。默认适应度基于盈利,这很危险。自定义适应度应包含稳定性指标。
加入过拟合惩罚的适应度公式:
```
F = (净利润 * 风险调整) - (最大回撤 * 0.5) - (交易次数 < 100 ? 1000 : 0)
```
无法直接修改MQL5优化器,但可通过`OnTester()`返回值实现自定义适应度:
```cpp
double OnTester() {
double profit = TesterStatistics(STAT_PROFIT);
double dd = TesterStatistics(STAT_MAX_DRAWDOWN);
int trades = TesterStatistics(STAT_TRADES);
double fitness = profit - dd * 0.5;
if(trades < 100) fitness -= 1000;
return(fitness);
}
```
返回值驱动GA的筛选过程。适应度越高,被选中的概率越大。
2. 种群多样性保持
当多样性低于阈值时会发生早熟收敛。多样性公式:
```
D = 1 - (1/N) * Σ|Pi - P均值| / 取值范围
```
其中Pi为参数值。MQL5 GA默认交叉率0.9、变异率0.01。对于100的种群规模,最优变异率=1/L(L为参数编码位数)。可通过自定义测试器中的`OptimizationSetMutationProbability()`调整。
3. 前进验证协议
单次优化永远不够。实现IS/OOS样本分割:
若IS适应度比OOS高出30%以上,存在过拟合。前进验证方法:每6个月优化一次,验证后续3个月,滑动窗口。
通过自定义时间段实现前进验证的MQL5代码:
```cpp
input datetime forwardStart = D'2024.01.01';
input datetime forwardEnd = D'2024.04.01';
double OnTester() {
datetime testStart = forwardStart, testEnd = forwardEnd;
// 仅在OOS周期上计算适应度
double oosProfit = TesterStatistics(STAT_PROFIT);
return(oosProfit);
}
```
在IS日期范围内运行优化,然后使用`forwardStart`进行测试,不要重新优化。
4. 过拟合检测指标
使用夏普比率替代原始盈利:
```
夏普 = (平均收益率 - 无风险利率) / 收益率标准差
```
夏普 > 2 为可接受。蒙特卡洛排列检验:随机打乱交易顺序100次,若原始适应度优于95%的打乱结果 → 过拟合。
实现方法:
```cpp
double SharpeRatio() {
double returns[];
// 从权益数组填充returns
double avg = returns.Mean();
double std = returns.StdDev();
return(avg / std);
}
```
5. 外汇EA的实用GA参数设置
参考来源