参数优化是EA开发中最危险的环节——对历史数据的过拟合会摧毁未来表现。遗传算法(GA)提供概率性搜索,但使用不当会放大过拟合。本文聚焦于MT4/MT5中稳健的GA设计。
1. EA优化的GA核心组件
GA在参数集(染色体)群体上运行。标准流程:
2. 适应度函数设计——避免单一指标
仅使用净利润会导致曲线拟合。应组合多个目标:
```
Fitness = w1 * 利润因子 + w2 * (平均每笔交易 / 最大回撤) - w3 * 交易次数
```
更好的选择:使用夏普比率或卡玛比率。MQL5中的适应度计算示例:
```cpp
double CalculateFitness(double profitFactor, double sharpeRatio, double maxDrawdownPct) {
if(maxDrawdownPct <= 0) return 0;
double score = profitFactor * 0.4 + sharpeRatio * 0.4 - (maxDrawdownPct / 100.0) * 0.2;
return MathMax(0, score);
}
```
绝不要仅基于总净利润进行优化。
3. 变异与交叉公式
对于连续参数(例如止损=20-200点):
sigma衰减:`sigma(t) = sigma_initial * exp(-t / tau)`,tau为衰减常数(例如20代)
MQL5代码片段:
```cpp
double Mutate(double value, double minVal, double maxVal, double sigma) {
double mutation = MathRandNormal(0, sigma);
double newVal = value + mutation;
if(newVal < minVal) newVal = minVal + (minVal - newVal);
if(newVal > maxVal) newVal = maxVal - (newVal - maxVal);
return MathMax(minVal, MathMin(maxVal, newVal));
}
```
`MathRandNormal`需要实现Box-Muller变换。
4. 避免过拟合——前进式验证
GA必须在样本外进行验证。标准协议:
稳健性评分公式:
```
Robustness = min(1.0, OOS_利润因子 / IS_利润因子) * (1 - OOS_回撤增幅)
```
接受稳健性 > 0.7。
5. 多目标帕累托优化
单一适应度评分会掩盖目标间的权衡。帕累托前沿包含这样的参数集:无法在不损害其他目标的前提下改进任一目标。常见目标:利润、夏普比率、最大回撤、交易次数。
在MQL5中实现非支配排序:
```cpp
bool IsDominated(double obj1[], double obj2[]) {
bool betterInAny = false;
for(int i = 0; i < ArraySize(obj1); i++) {
if(obj1[i] > obj2[i]) return false; // 假设最大化目标
if(obj1[i] < obj2[i]) betterInAny = true;
}
return betterInAny;
}
```
导出帕累托边界集,而不仅仅是单个“最佳”参数。
6. MT4与MT5的GA能力对比
MT5策略测试器内置原生GA优化,可配置种群大小、交叉概率(0.7-0.9)和变异率(0.01-0.1)。MT4需要外部GA封装(例如通过DLL或将参数导出到Python)。MT4用户推荐工作流:导出分笔数据,通过Python的`DEAP`库优化,然后导入最佳参数。
参考来源