Summary: 为MT4专家顾问实现实战遗传算法框架。涵盖编码、选择、交叉、变异与适应度地形分析。附完整MQL4代码。




MT4优化中的网格搜索效率低下。对于高维参数空间,遗传算法(GA)收敛速度更快。本指南在MQL4内部实现GA框架用于EA参数优化,绕过内置优化器的局限。

1. 问题建模
优化向量θ = (p1, p2, ..., pn),其中每个pi ∈ [min_i, max_i]。适应度函数F(θ) = 利润因子 * sqrt(交易笔数) - 最大回撤百分比。

2. 种群编码
对每个参数采用二进制编码。参数i的范围[Li, Ui],精度10^-d,所需比特数:b_i = ceil(log2((Ui - Li) * 10^d + 1))。

解码公式:
```
value = Li + (Ui - Li) * (decimal_value / (2^b_i - 1))
```

3. MQL4中的GA算子实现
染色体结构体:
```cpp
struct Chromosome {
double genes[10]; // 解码后的参数值
double fitness;
int bits[10][16]; // 二进制表示(每个参数最多16位)
};
```
均匀随机初始化种群:
```cpp
void InitPopulation(Chromosome &pop[], int size, int nParams) {
for(int i = 0; i < size; i++) {
for(int p = 0; p < nParams; p++) {
pop[i].genes[p] = minParam[p] + (maxParam[p] - minParam[p]) * MathRand()/32767.0;
}
}
}
```
适应度评估需要对每个染色体运行回测——使用`OnTester()`返回值。

4. 选择:锦标赛选择
锦标赛规模k=3选出父代:
```cpp
int TournamentSelect(Chromosome &pop[], int popSize, int tournamentSize) {
int bestIdx = MathRand() % popSize;
for(int i = 1; i < tournamentSize; i++) {
int idx = MathRand() % popSize;
if(pop[idx].fitness > pop[bestIdx].fitness) bestIdx = idx;
}
return bestIdx;
}
```

5. 交叉:单点交叉
单点交叉概率Pc = 0.75:
```cpp
void Crossover(Chromosome &parent1, Chromosome &parent2, Chromosome &child1, Chromosome &child2, int nParams) {
if(MathRand()/32767.0 > 0.75) {
int point = MathRand() % (totalBits);
// 在交叉点前后复制基因
return;
}
// 无交叉:子代为父代副本
}
```

6. 变异:比特翻转
变异率Pm = 1 / totalBits per gene。自适应变异公式:Pm(t) = Pm0 * (1 + cos(pi * t / T)) / 2,其中t为当前代数,T为最大代数。

```cpp
void Mutate(Chromosome &ch, double pm) {
for(int p = 0; p < nParams; p++) {
if(MathRand()/32767.0 < pm) {
// 翻转参数p的随机一个比特位
int bitPos = MathRand() % bitsPerParam[p];
ch.bits[p][bitPos] = 1 - ch.bits[p][bitPos];
}
}
DecodeChromosome(ch);
}
```

7. 适应度地形与精英策略
精英策略每代保留最优的N_e = 2个染色体不变,防止性能退化。

精英策略实现:
```cpp
void Elitism(Chromosome &oldPop[], Chromosome &newPop[], int eliteSize) {
// 按适应度降序排序oldPop
for(int i = 0; i < eliteSize; i++) {
newPop[i] = oldPop[i];
}
}
```

8. 收敛判据
当适应度标准差σ_F < ε或达到最大代数时停止。多样性度量:D = (1/n) * Σ|μ - xi| / range。

参考来源
  • Mitchell, M. (1998).《遗传算法导论》。MIT出版社。第4-5章。

  • MQL4文档:“OnTester”与“优化”(docs.mql4.com)