Summary: 在MQL5中使用遗传算法进行EA参数优化,涵盖适应度评分、过拟合度量、种群多样性公式及前进验证,附带完整代码示例。




参数优化是大多数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):前70%数据用于GA优化

  • 样本外(OOS):剩余30%用于验证


  • 若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参数设置
  • 种群规模:200-500(参数超过10个时取更大值)

  • 代数限制:30-50代(之后收益递减)

  • 变异概率:0.02-0.05

  • 交叉方式:均匀交叉,比率0.7

  • 精英策略:保留最优的5%个体不变


  • 参考来源
  • MQL5文档:“策略测试器遗传算法”(www.mql5.com/zh/docs/tester/ga)

  • 《量化交易系统》Howard B. Bandy博士著,第6-7章。