在MT4/MT5上跑EA自动化交易整整三个月了,今天想跟各位同行交流一些实战中的体会,希望对刚入门的朋友有帮助。
先说结论:EA不是万能钥匙,但它能帮你把策略执行得比手动更干净。我用的是自己写的基于布林带和RSI的突破系统,回测时看起来很美,但实盘三个月下来,净值曲线跟回测差了大概12%。原因其实很简单——回测时忽略了点差波动和滑点,尤其是在数据发布时段。
具体说几个踩过的坑。第一个是时间过滤。我的EA原本全天候运行,但后来发现亚洲早盘和欧美盘后半段,布林带的突破信号质量很差,虚假突破率超过60%。我加了个时间过滤函数,只在北京时间14:00到次日凌晨2:00之间开仓,效果立竿见影。代码片段如下:
```mql4
bool IsTradingTime() {
datetime currentTime = TimeCurrent();
int hour = TimeHour(currentTime);
if(hour >= 2 && hour < 14) return false;
return true;
}
```
当然,这个时间范围要根据你交易品种调整,比如EURUSD的活跃时段跟GBPJPY就不完全一样。
第二个是止盈止损的优化。我原来用的是固定点数,但后来发现震荡行情中,EA经常在盈利20点时就平仓,然后价格继续朝方向跑100点。我改成了基于ATR的动态止盈,公式是:止盈=入场价+ATR(14)*1.5。这样在波动小时目标小,波动大时目标大,利润空间明显改善。代码实现:
```mql4
double atr = iATR(NULL,0,14,1);
double stopLoss = NormalizeDouble(Ask - atr * 1.5, Digits);
double takeProfit = NormalizeDouble(Ask + atr * 1.5, Digits);
```
注意这里用的是Ask作为基准,如果是做多的话。
第三个是资金管理。一开始我用的是固定手数,0.1手跑了一个月,收益率只有5%左右。后来改成基于账户净值的比例下单,比如每次开仓用2%的风险资金,配合ATR止损,这样在连续亏损时手数自动缩小,盈利时手数增大。核心代码:
```mql4
double riskPercent = 2.0;
double accountEquity = AccountEquity();
double lotSize = NormalizeDouble(riskPercent/100 * accountEquity / (atr * 10), 2);
if(lotSize < MarketInfo(Symbol(), MODE_MINLOT)) lotSize = MarketInfo(Symbol(), MODE_MINLOT);
```
这里除以atr*10是因为假设每点价值10美元的标准手。
还有一个容易被忽视的点:Tick数据质量。我一开始用MT4自带的tick数据回测,结果实盘时发现信号触发频率跟回测差很多。后来换了Dukascopy的tick数据重新回测,才接近实盘表现。建议各位至少用1分钟数据回测,然后手动调参数。
三个月下来,我的EA平均每天交易3-5单,胜率从开始的42%提升到现在的51%,但最大回撤控制在18%以内。这个成绩不算惊艳,但至少比手动交易时稳定。最大的收获是学会了用日志文件记录每笔交易的原因和结果,方便复盘。我每天跑完EA都会检查日志,看有没有异常开仓,比如因为网络延迟导致重复建仓。
最后说一个可能争议的点:我不建议用马丁格尔策略。我的EA最初版本加过马丁,回测曲线漂亮得很,但实盘遇到一次单边行情,账户直接就爆了。后来改成纯趋势跟踪,虽然利润少了,但睡得着觉。
以上就是三个月的真实体会,欢迎各位指正。如果谁有更好的风险控制思路,欢迎分享代码,大家一起进步。
先说结论:EA不是万能钥匙,但它能帮你把策略执行得比手动更干净。我用的是自己写的基于布林带和RSI的突破系统,回测时看起来很美,但实盘三个月下来,净值曲线跟回测差了大概12%。原因其实很简单——回测时忽略了点差波动和滑点,尤其是在数据发布时段。
具体说几个踩过的坑。第一个是时间过滤。我的EA原本全天候运行,但后来发现亚洲早盘和欧美盘后半段,布林带的突破信号质量很差,虚假突破率超过60%。我加了个时间过滤函数,只在北京时间14:00到次日凌晨2:00之间开仓,效果立竿见影。代码片段如下:
```mql4
bool IsTradingTime() {
datetime currentTime = TimeCurrent();
int hour = TimeHour(currentTime);
if(hour >= 2 && hour < 14) return false;
return true;
}
```
当然,这个时间范围要根据你交易品种调整,比如EURUSD的活跃时段跟GBPJPY就不完全一样。
第二个是止盈止损的优化。我原来用的是固定点数,但后来发现震荡行情中,EA经常在盈利20点时就平仓,然后价格继续朝方向跑100点。我改成了基于ATR的动态止盈,公式是:止盈=入场价+ATR(14)*1.5。这样在波动小时目标小,波动大时目标大,利润空间明显改善。代码实现:
```mql4
double atr = iATR(NULL,0,14,1);
double stopLoss = NormalizeDouble(Ask - atr * 1.5, Digits);
double takeProfit = NormalizeDouble(Ask + atr * 1.5, Digits);
```
注意这里用的是Ask作为基准,如果是做多的话。
第三个是资金管理。一开始我用的是固定手数,0.1手跑了一个月,收益率只有5%左右。后来改成基于账户净值的比例下单,比如每次开仓用2%的风险资金,配合ATR止损,这样在连续亏损时手数自动缩小,盈利时手数增大。核心代码:
```mql4
double riskPercent = 2.0;
double accountEquity = AccountEquity();
double lotSize = NormalizeDouble(riskPercent/100 * accountEquity / (atr * 10), 2);
if(lotSize < MarketInfo(Symbol(), MODE_MINLOT)) lotSize = MarketInfo(Symbol(), MODE_MINLOT);
```
这里除以atr*10是因为假设每点价值10美元的标准手。
还有一个容易被忽视的点:Tick数据质量。我一开始用MT4自带的tick数据回测,结果实盘时发现信号触发频率跟回测差很多。后来换了Dukascopy的tick数据重新回测,才接近实盘表现。建议各位至少用1分钟数据回测,然后手动调参数。
三个月下来,我的EA平均每天交易3-5单,胜率从开始的42%提升到现在的51%,但最大回撤控制在18%以内。这个成绩不算惊艳,但至少比手动交易时稳定。最大的收获是学会了用日志文件记录每笔交易的原因和结果,方便复盘。我每天跑完EA都会检查日志,看有没有异常开仓,比如因为网络延迟导致重复建仓。
最后说一个可能争议的点:我不建议用马丁格尔策略。我的EA最初版本加过马丁,回测曲线漂亮得很,但实盘遇到一次单边行情,账户直接就爆了。后来改成纯趋势跟踪,虽然利润少了,但睡得着觉。
以上就是三个月的真实体会,欢迎各位指正。如果谁有更好的风险控制思路,欢迎分享代码,大家一起进步。
专注交易策略编程实现,分享MQL开发技巧与代码优化方案