EA参数优化是策略开发中最容易被误解的环节。网格搜索和遗传算法各有适用场景,但选错方法或误读结果会导致曲线拟合,实盘表现远逊于回测。
网格搜索穷举测试用户定义参数范围内的所有组合。它是确定性的,保证在给定步长精度下找到全局最优解,但计算成本呈指数增长。对于5个参数各分20步,需要遍历320万次。
遗传算法通过选择、交叉和变异操作收敛到最优区域。MQL4内置优化器默认使用遗传算法,但许多开发者因迭代代数不足或忽略噪声而误用。
数学模型与稳健性框架
设性能指标 \( P(\theta) \) 为参数向量 \( \theta \) 的函数。优化目标为:
\[
\theta^* = \arg\max_{\theta \in \Theta} P_{\text{OOS}}(\theta)
\]
其中 \( P_{\text{OOS}} \) 为样本外性能。过拟合发生时,样本内性能 \( P_{\text{IS}}(\theta) \) 很高但样本外性能很低。
代码:自定义前进分析验证
```cpp
// MQL4代码片段 - 前进优化核心
input double LotsFixed = 0.1;
input int MAPeriod = 14;
input int ATRPeriod = 14;
double InSampleProfit, OutSampleProfit;
int InSampleBars = 5000;
int OutSampleBars = 1000;
void WalkForwardOptimize() {
int totalBars = Bars;
int inSampleEnd = totalBars - OutSampleBars;
// 在样本内数据上优化
InSampleProfit = RunOptimization(0, inSampleEnd);
// 将最优参数应用于样本外数据
OutSampleProfit = RunForwardTest(inSampleEnd, totalBars);
double RobustnessRatio = OutSampleProfit / InSampleProfit;
if(RobustnessRatio < 0.7) {
Print("检测到过拟合 - 比率: ", RobustnessRatio);
}
}
```
遗传算法关键配置参数
避免未来函数泄漏
MT4回测中最常见的错误是在指标计算中使用索引`0`的`Close[]`或`High[]`,此时当前K线尚未完成。入口决策应始终基于已收盘K线,偏移1使用`Close[1]`。
稳健性验证公式
计算滚动窗口的夏普比率:
\[
S_{\text{rolling}} = \frac{\mathbb{E}[R_{\text{window}}] - R_f}{\sigma_{\text{window}}}
\]
若滚动窗口之间的标准差超过0.5,则该参数集不稳定。
参考来源:MQL4官方文档 - 优化(https://docs.mql4.com/optimization),《交易策略评估与优化》Robert Pardo 著,2008年。