EA策略原理是区分自动化交易与随机赌博的分界线。很多交易者盲目使用马丁格尔或网格EA,却不理解其数学本质,最终在趋势行情中爆仓。本文解析三大核心EA策略原理,提供实际代码结构,以及必须写入EA的强制风控逻辑。
马丁格尔是最危险也最诱人的EA原理。核心理念很简单:亏损后翻倍仓位,用一次盈利收回之前所有亏损并赚取小利。数学看起来很诱人:从0.01手起步,连续亏损序列0.01、0.02、0.04、0.08、0.16、0.32、0.64,累计仅1.27手,一次盈利就能收回全部亏损外加基础利润。但问题在于市场可能产生极长的连续亏损。连续亏损10次后,仓位从0.01手膨胀到5.12手;连续15次后达到163.84手。普通账户根本无法承受。正如罗伯特·卡弗在《系统化交易》中所言:马丁格尔只在无限资金条件下有效。
强制回本的逻辑形成心理陷阱。交易者相信“下一笔必胜”,在最不利的时刻加仓。如果一定要使用马丁格尔,必须设置三道强制限制。第一,最大倍数限制为基础仓位的4-5倍。第二,设置硬止损限额,触及后EA完全停止。第三,在盈利序列上使用反向马丁格尔,而非亏损序列。以下是MQL4的安全马丁格尔代码结构。
```cpp
double baseLot = 0.01;
double maxLot = 0.05;
double currentLot = baseLot;
int consecutiveLosses = 0;
if(consecutiveLosses > 0 && consecutiveLosses <= 3) {
currentLot = baseLot * MathPow(2, consecutiveLosses);
if(currentLot > maxLot) currentLot = maxLot;
}
if(consecutiveLosses >= 4) {
CloseAllPositions();
DisableTrading();
}
```
网格交易是另一种常见EA原理。策略在固定价格间隔双向挂单,从价格震荡中获利。问题在于方向性偏差。当强趋势发生时,所有网格订单同时被套。没有趋势过滤的网格EA本质上是一个反向马丁格尔。解决方案是添加基于200周期均线的趋势过滤器。只在200MA上方挂多单网格,只在200MA下方挂空单网格。这个简单的过滤器能显著降低最大回撤。
量化交易需要抗过拟合验证。最常见的EA错误是把参数“拟合”到历史数据上。大卫·阿伦森在《基于证据的技术分析》中强调:稳健的系统必须通过样本外测试。将数据分为三段:训练期用于参数发现,验证期用于单参数微调,测试期用于最终验证。看到测试结果后绝不重新优化。采用向前走分析:在六个月数据上优化,然后在接下来一个月上交易且不修改任何参数,记录样本外表现,每月重复。如果样本外表现持续下滑,说明EA缺乏稳健性。
仓位计算逻辑必须是每个EA的组成部分。绝不硬编码固定手数。使用以下基于账户风险百分比的仓位计算函数。
```cpp
double CalculateLotSize(double riskPercent, double stopLossPips) {
double accountEquity = AccountEquity();
double riskAmount = accountEquity * riskPercent / 100.0;
double pipValue = MarketInfo(Symbol(), MODE_TICKSIZE) * 10.0;
double lotSize = riskAmount / (stopLossPips * pipValue);
lotSize = MathMin(lotSize, MarketInfo(Symbol(), MODE_MAXLOT));
lotSize = MathMax(lotSize, MarketInfo(Symbol(), MODE_MINLOT));
return NormalizeDouble(lotSize, 2);
}
```
最大回撤控制必须写在EA内部,而非外部。很多交易者对每笔交易设止损,但没有全局回撤限制,这远远不够。在每个tick函数中写入全局净值检查。
```cpp
double peakEquity = AccountEquity();
if(AccountEquity() > peakEquity) peakEquity = AccountEquity();
double drawdownPercent = (peakEquity - AccountEquity()) / peakEquity * 100;
if(drawdownPercent >= 15) {
CloseAllOrders();
ExpertRemove();
}
```
黑天鹅防御需要在EA代码中加入波动率过滤器。2015年瑞郎事件消灭了大量没有ATR过滤器的EA。实现基于ATR的交易暂停机制。
```cpp
double atrCurrent = iATR(Symbol(), PERIOD_D1, 20, 1);
double atrAverage = iATR(Symbol(), PERIOD_D1, 100, 0);
if(atrCurrent > atrAverage * 2.5) {
if(CountOpenOrders() > 0) CloseAllOrders();
return;
}
```
回测不能只依赖默认设置。避免常见陷阱:使用默认点差和完美成交跑一次回测就下结论。使用可变点差模型,每笔交易加入1-2点的随机滑点,精确建模手续费。在多个历史时期上测试,包括2008年、2015年、2020年。一个只在欧元/美元2023-2024年上有效的EA,实盘必然失败。至少在6-8个不相关的货币对上进行测试。
向前测试是最后的验证步骤。回测完成后,在模拟账户上运行EA三个月。期间绝不调整参数。将向前测试结果与回测预期对比。稳健的EA,向前测试结果应达到回测表现的80%以上。如果向前测试结果低于回测的50%,系统已过拟合,必须重新设计。
参考来源: