折腾均线型EA的代码实现教程半天,终于搞明白了

新帖
登录发帖
Exness 推荐平台

入金门槛低,出金到账快,支持多种账户类型

FSA(塞舌尔)/FCA(英国) / CySEC(塞浦路斯) · 最低入金 $130
李四儿
李四儿 楼主 1 小时前 浏览 13 回复 2 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 3 帖数 19 积分 1207 汇币 790
1楼
之前帮一个汇友排查他的均线EA,明明复盘信号全对,实盘挂上去就是不开单,折腾了大半天才发现是他把 iMA() 的返回句柄当成了均线数值直接用,这种坑新手几乎都会踩一遍 😂 索性把我自己整理均线型EA代码实现的思路写出来,给刚接触MQL4/MQL5的汇友参考。
先说清楚一件事,均线型EA的核心逻辑其实就三层:取均线值、判断交叉、下单执行。难的不是思路,是代码里的细节。我按顺序拆开讲。
第一步,均线句柄的获取。MT5里用 iMA() 函数,参数依次是品种、周期、均线周期、偏移、均线模式、应用价格。比如要拿欧美H1的20周期EMA收盘价:

  • handle = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_EMA, PRICE_CLOSE);
  • 注意这个函数返回的是句柄,不是数值,必须先调用一次,后续用 CopyBuffer() 取值
  • 句柄建议放在 OnInit() 里初始化,别放在 OnTick() 里反复取,否则会拖慢执行速度

第二步,用CopyBuffer拿具体数值。这一步是新手最容易出错的地方。CopyBuffer的第三个参数是起始位置,0代表当前K线,1代表上一根,以此类推。我一般这样写:

  • double maFast[];
  • ArraySetAsSeries(maFast, true); 这句千万别漏,漏了数组顺序是反的,交叉判断全乱
  • CopyBuffer(handle, 0, 0, 3, maFast); 取最近3根K线的值备用

我第一次写的时候就是忘了 ArraySetAsSeries,结果复盘看着信号完美,实盘完全反向,查了两天才定位到。这个坑真的值得单独记一笔。
第三步,交叉判断的逻辑。均线策略常见的就两种:价格穿越均线,或者快慢均线交叉。以双均线为例,用 maFast[1] > maSlow[1] 且 maFast[2] < maSlow[2] 判断金叉。这里要注意,必须用已收盘的K线(索引1和2),不要用索引0,因为当前K线的均线值会随价格跳动,信号会反复触发,导致同一根K线开好几单。我建议加一个 lastBarTime 变量记录上次开仓的K线时间,同一根K线只允许执行一次。
第四步,下单与过滤条件。用 OrderSend() 之前,至少要加两个过滤:点差过滤和交易时段过滤。点差用 SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) 读取,比如欧美点差超过20个点(0.0002)就跳过;时段上我一般避开凌晨低流动性时段,镑美和黄金在亚盘早段的滑点特别明显。止损止盈建议用 ATR 动态计算,固定点数在波动率变化时很容易被扫。
最后提醒几个实盘部署的细节。EA跑在VPS上时,确保VPS与经纪商服务器的时间同步,否则K线时间错位,均线计算会偏;另外 OnTick() 里所有循环和数组操作都要控制规模,我见过有人每tick遍历几百根K线,CPU直接拉满导致报价延迟。测试阶段建议先用 策略测试器的“每次报价”模式跑一遍,再上模拟盘挂两周,确认开平仓时间和复盘一致再考虑实盘。
代码这块我贴的是核心框架,完整的订单管理、魔术号区分、错误重试逻辑还没展开,篇幅有限。有汇友在写均线EA时遇到 CopyBuffer返回-1 或者信号不触发的情况吗?可以把你卡住的那段逻辑发出来,我帮你一起看看是句柄问题还是数组序列的问题 🙌
0 回复 众裁0 复制
#1
南城
南城 #3· 4 分钟前
3楼
句柄放OnInit这个我赞同,但CopyBuffer取3根其实没必要,取2根够判断交叉了。另外记得加个CopyBuffer返回值检查,取不到数据时直接return,不然数组是空的照样往下跑,下单逻辑就乱了。
赞 回复 众裁0 复制
4 分钟前 #3
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 交易里要不要设每日止损上限,到底该怎么处理 下一帖 → 在易汇跑EA三个月的执行感受,交流