ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

外汇EA大全筛选与实盘避坑:从源码分类到回测组合

外汇EA大全筛选与实盘避坑:从源码分类到回测组合

简介:这是外汇自动化交易策略源码合集,面向外汇交易者、EA开发者和量化入门者,可帮助理解EA的编写逻辑与运行机制,也可作为策略筛选、参数调整与二次开发的素材库。压缩包共447个文件,主体为mq4源码,配合少量mqh头文件与ex4编译程序,另附必读手册与更多资源导航页;整体仅1.43MB,轻量紧凑,便于分类查阅。目前已有1467人学习下载。资源覆盖多种策略思路,包括基于技术指标、价格行为的常用逻辑,以及篮子交易、仓位管理类实例;初学者可对照手册梳理挂单、止损、止盈与风险控制的实现方式,进阶者则可直接导入MetaTrader平台回测,修改边界条件或融合不同模块,构建个性化自动化交易系统。同时,手册对历史回测局限和过度拟合风险做了提醒,有助于更理性地评估每个EA的实际表现。

1. 445个外汇EA大全:这不是“程序包”,是一套“筛子活”

“445个外汇EA大全”这类资源包,很多做程序化交易的人手里都有一份。我第一次拿到之后,连续一周都在干同一件事:编译、报错、关掉、换下一个。后来才明白,这个大全不能当“装上就能赚钱”的程序包用,它本质上是一个 MQL4/MQL5 的策略样本库:里面可能有一大半是同一个逻辑改了参数、换了名字的“套娃货”,还有一部分根本编译不过去。它真正能解决的事,是让你在短时间内大量拆解别人的策略,建立起“什么是能跑的EA、什么是花架子”的判断力。适合两类人:刚学EA编写、想拆源码入门的交易者;以及已经跑过一阵实盘、想从批量策略里做筛选和组合的量化爱好者。

2. 拆开看:445个EA里到底装着哪几类策略

双击任何一个 .mq4 文件之前,先给这份大全做一次“人口普查”会省下大量时间。表面上文件名五花八门,内里其实逃不出四类底层逻辑。你先清楚自己要找什么,后面才不会被几百个名字绕晕。

2.1 趋势型、网格型、震荡型、剥头皮型:先给EA分个类

外汇EA说到底就是在MT4/MT5上跑的一段自动化脚本,替你完成盯盘、下单、平仓这些重复动作。命名再花哨,策略逻辑绕不开下面四类:

类型核心逻辑常见命名特征主要风险
趋势跟踪均线交叉、突破通道、动量确认Trend、Breakout、MA_震荡行情反复止损
网格型分档加仓、越亏越买Grid、Martingale、Recovery单边行情快速爆仓
震荡型均值回归、超买超卖RSI、Reversion、Range强趋势里逆势死扛
剥头皮型超短持仓、赚点差Scalper、Pip、Fast点差与滑点吃掉利润

445个EA里,趋势型和网格型最常见,剥头皮型最少。原因很简单:趋势型代码短、回测好看,适合“包装成产品”;网格型逻辑粗暴、参数少,写起来也快。如果你看到名字带 Stable、Stealth、Recovery 这类词的EA,先默认它是马丁(网格/加仓)策略,再打开源码验证。这不算偏见,只是这类叫法的EA十有八九都是加仓逻辑穿了件马甲。

分类这一步不用打开每个文件,写一个简单的文件清单脚本按文件名关键词归个类就够了。文件名分类只是起点,真正的分类要看源码结构,下一步说。

2.2 按源码质量而不是按名字挑EA:一眼看穿“套娃货”

“套娃货”是这类资源包里最普遍的现象:同一条核心逻辑,改几个参数、换个名字,就变成一个新EA。要识别它,看三个地方。

第一,看订单函数是否写死了手数和止损。规范的做法是把手数、止损、止盈、魔术数全部做成 input 参数放在源码顶部,方便你在弹窗里改;“套娃货”常常把数值直接写在 OrderSend 里,一眼看去全是硬编码。第二,看有没有循环加仓结构。常见写法是外层 while 循环里反复调用 OrderSend,这种要么是马丁要么是网格,你心里要有数。第三,看有没有时段过滤。用了 Hour() 或 DayOfWeek() 判断的EA,至少说明作者考虑过交易时段的影响,靠谱程度会高一些。

我筛“套娃货”的方式是:把所有 .mq4 文件按字节数排个序,大小接近、开头注释风格一致的,大概率是同一作者的同族EA。再用代码比较工具只比对核心函数段,三分钟内就能找出七八组“同逻辑变体”。这一步做完,445个EA里真正独立的策略通常只剩几十个,后面所有回测工作都该围绕这些独立样本展开,而不是对着几百个文件空转。

2.3 445个EA的“能跑”度量:能在MT4上编译不等于能跑

编译通过和能跑之间,隔着一道看不见的坎。在 MetaEditor 里按 F7 编译,常见的结果是几行红字:一种报 undeclared identifier,另一种报 function is not defined。前者大多是EA调用了某个自定义指标文件,你没有一并放进指标目录;后者是源码里引用了 lib 库但没复制过去。

除了编译错误,还要看是不是调用了 DLL 接口。很多EA源码顶部写着:

#import "user32.dll"

有这个导入,MT4 加载时会弹窗问你是否允许 DLL 调用,新手经常卡在这里:不勾选,EA不动;勾选了,心里又没底。我的习惯是:实盘里凡是要调 DLL 的EA一律不用,除非我能完整看懂那几行调用在干什么。模拟盘上可以勾,但心里要清楚它可能不只是读取行情数据。

编译通过只是最低门槛。我还会在策略测试器里用“仅用开盘价”模式先快速跑一遍,能跑出正收益的再换“每个报价”模型重测。这一步能再淘汰掉三成EA。到这里,445个EA里真正值得你花时间细看的,通常不超过 40 个。

3. 把EA跑起来:从MT4加载到首笔模拟单

初筛之后,把能编译的EA放到图表上跑起来。这个环节看起来简单,实际操作中有一半的“EA不工作”问题都出在加载动作上,而不是策略本身。

3.1 加载EA的标准动作:拖到图表、开自动交易、挂TF

步骤如下,每一步都不要跳:

  1. 打开MT4,菜单栏进入“文件 → 打开数据文件夹”,进入 MQL4\Experts 目录
  2. 把筛选出来的 .mq4 和 .ex4 文件一起放进去
  3. 回到MT4,在“导航器”窗口右键“智能交易系统”,点刷新
  4. 把一个EA从导航器拖到 EURUSD 日线图表上
  5. 弹出的对话框中勾选“允许算法交易”,点确定
  6. 确认工具栏上的“算法交易”按钮处于绿色开启状态

常见误区在第5步和第6步的分工上。图表上那个小笑脸是单个EA的允许开关,工具栏里的“算法交易”按钮是全局总开关,两个都要开。很多人只开了图表上的笑脸,EA图标显示得挺精神,但日志里一行“automated trading is disabled”挂在那边,订单一单都不出。

MT5 用户要注意:MT5 的数据目录结构不同,文件要放进 MQL5\Experts,而且不少 MT4 EA 直接拿过来是编译不过的,别在这上面死磕。我的建议是先把 MT4 环境跑通,再看这份资源包里有没有 MT5 版本的独立目录。

3.2 一个标准EA骨架:MQL4里最基础的订单逻辑

从445个EA里随便抽出一个能用的,底层骨架长什么样?我给你一个最简版的双均线交叉EA,包含开仓、平仓、仓位计数三件事。它不复杂,但足够说明一份EA源码的关键部件。

// 双均线交叉EA骨架:快线上穿慢线买入,下穿平仓 #property strict input double LotSize = 0.01; // 每单手数 input int FastMAPeriod = 5; // 快线周期 input int SlowMAPeriod = 20; // 慢线周期 input int SLPoints = 300; // 止损点数 input int TPPoints = 600; // 止盈点数 input int MagicNumber = 240201; // 魔术号,区分本EA的订单 // 获取指定偏移位置的均线值 double FastMA(int shift) { return iMA(_Symbol, _Period, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, shift); } double SlowMA(int shift) { return iMA(_Symbol, _Period, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, shift); } // 统计当前该魔术号下的持仓单数量 int CountOrders(int magic) { int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic) count++; } } return count; } void OnTick() { double fast0 = FastMA(0), slow0 = SlowMA(0); double fast1 = FastMA(1), slow1 = SlowMA(1); // 金叉且当前无同魔术号持仓时,才开买单 if(fast1 <= slow1 && fast0 > slow0 && CountOrders(MagicNumber) == 0) { OrderSend(_Symbol, OP_BUY, LotSize, Ask, 3, Bid - SLPoints * _Point, Ask + TPPoints * _Point, "MA EA", MagicNumber, 0, clrGreen); } // 死叉时平掉该魔术号下的全部买单 if(fast1 >= slow1 && fast0 < slow0) { for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) { OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrWhite); } } } } }

逻辑说明:OnTick 每个报价都会触发一次,先计算当前K线和上一根K线的快慢均线值,用两根K线的均线位置关系判断是否发生交叉。金叉信号出现且当前没有同魔术号的持仓,才执行开仓;死叉信号出现则把所有同魔术号的买单全部平掉。CountOrders 函数是个哨兵,防止你已经在场内时重复开单。

参数说明:FastMAPeriod 和 SlowMAPeriod 决定信号频率,数值差距越小信号越多、假信号也越多;SLPoints 和 TPPoints 的单位是“点”,在 EURUSD 这类四位小数品种上,300 点大约等于 300 个 pip 的小数位;MagicNumber 是订单标识,两个EA用同一个魔术号会互相误伤,所以每个EA必须用不同号码。

3.3 参数面板里的关键项:手数、止损、MaxOrders、MagicNumber

加载EA后弹出的参数面板,是唯一在你不动源码时还能控制风险的地方。445个EA里,参数面板大同小异,但需要注意的项目就这几项:

参数含义常见默认值坑
LotSize每单交易手数0.01回测时一律用0.01,不要用自动手数
SLPoints / TPPoints止损/止盈点数300/600不同品种的点值不一样,换品种要重算
MaxOrders最大同时持仓数1马丁EA靠它控制加仓层数
MagicNumber订单魔术号随机数字多个EA同图表时不能重复
StartHour / EndHour交易时段0/23有时段过滤的EA通常更稳定

手数这个参数最容易被忽视。很多EA默认 0.1 手,回测时不改,模拟盘跑一周就亏掉一大截。我的习惯是第一次加载全部改成 0.01,先确认策略逻辑本身能不能赚钱,再谈仓位。MaxOrders 对网格类EA是生死线:设成 1,网格就变成单次加仓;设成 10,遇到单边行情就是十层仓一起套。千万别在模拟盘没跑满之前就动它。

4. 回测才是EA的照妖镜:参数这样设才不是自欺欺人

在445个EA里挑能用的,回测这一步最花时间,也最容易被骗。MT4 自带策略测试器,但默认参数跑出来的曲线只能算“自嗨图”,离实盘十万八千里。要把回测变成照妖镜,先改三样东西。

4.1 回测三件套:报价模型、数据范围、成本参数

回测设置里第一个要改的是报价模型。MT4 测试器提供三个选项:仅用开盘价、控制点、每个报价(真实报价)。仅用开盘价最快,但成交价全按K线开盘价计算,忽略盘中波动,结果基本不可信;控制点介于中间,适合快速初筛;每个报价最慢也最接近实盘,所有严肃回测都应该用它。

数据范围选两年以上,并且要包含高波动和低波动的时段。只选一段单边上涨行情,趋势EA回测会漂亮得不像话,换到震荡市马上现原形。成本参数是第三件套:把点差设成当前平台实际点差的 1.5 倍,再挂上 3 到 5 美元的佣金。很多EA在零成本下曲线平滑,加上真实点差和佣金之后,净利润直接腰斩。

我常跟新人说一句话:如果一个EA在“每个报价”模型下、加上点差和佣金之后年化收益不到 30%,它只是一条好看的曲线,不是一个能打的策略。这标准不严谨,但足够筛掉大半花架子。

4.2 用日内+多品种回测看“假信号密度”

回测不能只看总收益,还要看交易频率和亏损分布。一个趋势EA一天开20单,不是勤劳,是它把噪声当成了信号。判断方法很简单:把回测报告里的“交易次数”除以“回测天数”,得到日均交易频次。趋势型EA日均超过 3 单就要警惕,剥头皮型除外。

多品种回测是另一面镜子。同一个EA在不同品种上的表现差异巨大,下面是一个模拟回测结果的样式:

品种净利润最大回撤胜率最大连续亏损
EURUSD1220 USD11%55%4 笔
GBPUSD-310 USD18%42%7 笔
XAUUSD45 USD24%48%8 笔

同一套参数,EURUSD 上能跑、GBPUSD 上亏损、XAUUSD 上勉强打平,这是常态而不是意外。所以筛EA不能只看它在 EURUSD 上的表现,要同时拉三个以上主要品种,只保留至少两个品种能盈利的。如果一个EA只适合某一个品种,那它的价值要打七折,因为你已经是在做品种拟合而不是策略验证。

4.3 从445个里挑出能进实盘的那3个:筛选标准与步骤

经过前面两步,你的候选名单应该已经缩到 20 个以内。接下来用四条硬标准继续砍:

  1. 单笔亏损有明确上限,没有止损的EA直接删除
  2. 两年回测内最大回撤不超过 20%
  3. 最大连续亏损不超过 5 笔
  4. 不依赖某一段特定行情,两个以上品种能同时盈利

按这个标准过完,通常剩下的不超过 5 个。再从里面挑 3 个,分别交易不同时段或不同类型,这就是你第一轮能上模拟盘的组合。注意,回测选出来的是“逻辑成立”,不是“实盘必赚”,还得经历下一章的坑。

5. 外汇EA避坑指南:从445个里活下来的5条踩坑记录

在445个EA里折腾了大半年,我踩过的坑不算少。捡最典型的五条写在这里,每条都按“现象、原因、解决”拆开,基本能覆盖你之后会遇到的大部分问题。

5.1 回测漂亮、实盘翻车:过拟合和“每报价模型”幻觉

现象:回测曲线全年陡峭向上,最大回撤不到8%,一上实盘,一周内连亏5笔,直接打回原形。

原因:一是回测报价模型用了“仅用开盘价”或“控制点”,成交价理想化,隐藏了滑点和点差波动;二是参数被优化工具调到了贴合历史行情的“最佳值”,本质是过拟合。历史行情里某个特定形态反复出现,EA的参数就精准卡在这个形态上,实盘遇到类似但不完全一样的形态,策略立刻失效。

解决:改用“每个报价”模型,把点差、佣金、滑点全部按实盘标准填进去,重新回测。另外,把两年数据切成前一年半做“训练”,后半年做“样本外验证”——只在前一段盈利、后一段也盈利的EA才算过关。我在 445 个EA里试过,这一刀能砍掉六成。

5.2 编译通过但不发单:自动交易开关与DLL权限

现象:EA图标正常显示,日志里没有报错,但账户里一单都没有,盯了半个小时像死了一样。

原因:最常见的是图表上的“允许算法交易”勾了,但工具栏上的全局算法交易按钮是红色的;其次是EA调用了 DLL,而MT4弹出询问时你点了“否”,之后即便再点“是”也需要重新加载EA才生效。

解决:先看工具栏按钮颜色,红色就点成绿色;再看日志里有没有 DLL 相关报错,有就右键图表的EA,选择“属性”,在“常用”页重新勾选“允许DLL导入”,然后点确定并重新拖一次EA。如果问题依旧,右键EA选“删除图表中的EA”,再拖一次,强制重新初始化。

5.3 同一个EA换个参数就变成“新EA”:去重不看逻辑只看名字

现象:文件A叫“FX Pro Trader”,文件B叫“Golden Robot”,两个名字八竿子打不着,回测曲线却几乎一模一样。

原因:一份源码改几个参数、换一个输出文件名,就能在资源包里变成两个“独立EA”。真实的独立策略并没有 445 个,多数是几十个底稿的变体。

解决:用文件比较工具对比源码核心函数段,重点关注 OrderSend 所在函数和开仓条件部分。两个文件这部分一致,就是同族EA。去重之后,把同族里参数最保守、止损最明确的那一个留下来参与回测就够。这个习惯能省掉你大量白干活的时间。

5.4 挂单全被扫:点差、滑点与止损距离的隐形成本

现象:回测里止损几乎不会被扫到,实盘里止损单却频繁被触发,而且每次成交的止损价都比设置的更差。

原因:回测设置了零滑点或理想点差,实盘中遇到数据发布或流动性不足的时段,点差瞬间扩大,止损单被“扫”了一圈后才成交。另外很多EA把止损距离设得太贴近现价,比如 50 点,正常波动都能碰到。

解决:把止损距离加大到至少 150 到 300 点,回测设置里加上滑点参数(常见做法是设置 1 到 2 个滑点)。想验证EA会不会被点差扫到,可以在回测的“点差”栏填入平台欧盘时段实际点差的 1.5 倍,再看回撤曲线有没有显著恶化。

5.5 策略开始赚钱,然后连续爆仓:仓位管理与相关性的“伪分散”

现象:三个EA分别跑模拟盘都在赚钱,组合在一起上实盘,一个月内全部止损出场,账户缩水一半。

原因:这三个EA表面上是三个策略,实际底层都是趋势跟随或加仓逻辑,遇到同一段单边反转行情,三个EA会同时反向、同时亏损,根本谈不上分散。另一个常见坑是每个EA都开了“自动手数”,行情不利时三份自动加仓叠加在一起,仓位成倍膨胀。

解决:组合上实盘之前,把三个EA的回测净值曲线放在同一张图里看相关性。曲线涨跌方向和时间点高度一致的,只保留一个。仓位方面,所有EA统一改成固定手数 0.01,等模拟盘跑满三个月再逐步加仓。

6. 从“大全”到“自营”:给EA做二次筛选与组合

走到这一步,你已经不为“445”这个数字焦虑了,剩下的问题是怎么把这堆源码变成自己的交易工具。这一章给两个具体做法:用 Python 批量扫源码,再用“时段错峰”组合降低相关性。

6.1 用Python批量扫源码:按关键词给EA打分

逐个打开源码太慢,我一般会写一个小脚本,用关键词命中情况给每个EA打分。评分不严谨,但能快速把候选名单从几十个缩到十个以内。

import os # 改成你自己的数据目录 ea_dir = r"D:\MT4_Data\MQL4\Experts" # 命中这些关键词,说明EA逻辑激进,偏高风险 black_keywords = ["while", "martingale", "grid", "autolot"] # 命中这些关键词,说明EA有基础风控意识 good_keywords = ["stoploss", "takeprofit", "magicnumber", "hour", "dayofweek"] for file in os.listdir(ea_dir): if not file.lower().endswith(".mq4"): continue path = os.path.join(ea_dir, file) with open(path, "r", encoding="utf-8", errors="ignore") as f: src = f.read().lower() black_hits = [k for k in black_keywords if k in src] good_hits = [k for k in good_keywords if k in src] score = len(good_hits) - len(black_hits) print(f"{file}: score={score}, black={black_hits}, good={good_hits}")

逻辑说明:脚本按扩展名筛出 .mq4 文件,读入源码后统一转成小写做关键词匹配。black_keywords 里的“while”非常关键——EA里出现 while 循环,多数和加仓、重试逻辑有关;“martingale”和“grid”直接对应马丁和网格;“autolot”表示按余额自动计算手数,这类EA的仓位不可控。good_keywords 里的 stoploss、magicnumber、hour、dayofweek 代表作者写了止损、订单标识和交易时段过滤。

参数说明:score 只是初筛参考,不是越高越好。一个EA如果同时命中 stoploss 和 martingale,说明它由加仓逻辑但加了止损,这类要人工重点看,不能一棍子打死。这个脚本跑完,你脑海里会对这批源码的整体质量有个直观印象,再决定哪些值得打开细读。

6.2 三个EA按“时段错峰”组合:把相关性当成风控主线

筛选出三个逻辑独立的EA之后,先别急着同时挂上去。我的做法是给它们分配不同的交易时段,让三者在时间上尽量错开:一个只做亚洲盘,一个专门在欧盘开盘后的两个小时跑,第三个只在美盘时段工作。这样就避免了同一波行情被三个策略同时捕捉、同时反向。

很多EA源码里本身就有 StartHour 和 EndHour 参数,直接在图表参数面板里改就行;没有的话,在 OnInit 里加一行判断当前小时数,不满足就 return,这个改动很小,新手也能照着改。组合跑起来之后,每天看一次账户的净值和订单记录,连续三周表现和回测差不多的,才轮到第二步:逐步放大手数。

我自己在这个方向上吃过亏。有一年用某网格EA跑了两个月模拟盘,回撤不到10%,上实盘一周就爆了。后来复盘发现不是策略本身的问题,是我把 MaxOrders 从 3 改成 5,又没有设账户总回撤线,单边行情一来,五层加仓全部套住。那以后我给自己定了一条规矩:任何EA上实盘之前,必须用“每个报价”模型完整重测一遍,然后在模拟盘跑满21个交易日;组合里的EA个数,最多不超过三个。这条规矩到今天还在用,救过我不少次。这份“445个外汇EA大全”能不能变成你的工具箱,不取决于里面有多少个文件,而取决于你愿不愿意花时间把“筛子活”做扎实。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进