不用写代码在 MT5 里做一个 MACD EA 智能交易系统,办法是放一个 Start 节点、两个 MACD 积木——一个读主线,一个读信号线——在它们之间放一个 Cross 条件,再加一个下单积木。服务器会替你生成并编译 MQL5,交还给你一个真正的 .ex5。十五分钟,不碰语法。
接下来才是决定这个文件值不值钱的那一半。这套配方有一份实测记录,而其中最讨人喜欢的那个数字,恰恰是你最不该信的那个。
你最终会做出什么
一个只做一个货币对的单持仓 EA:MACD 线上穿信号线时买入,下穿时卖出,配一个固定止损和一个固定止盈,编译成一个真正的 .ex5。八个积木。
这个数目里有两个积木的存在只有一个理由:MACD 指标积木一次只返回一条线。
开始之前:MACD 报告的是什么,以及你在读哪一条线
你需要一个邮箱已验证的免费账户(设计免费,也不需要登录;编译成 .ex5 才需要)、大约十五分钟,以及一个 MetaTrader 5 终端。
MACD 用一条快速移动平均线减去一条慢速移动平均线,然后再把这个差值平滑一次。所以主线量的是两条均线彼此拉开了多远,而信号线就是这个量度被平滑之后的样子。一条 MACD 规则所能说出的一切,都是关于两条均线之间距离的陈述——这意味着它是一件穿着振荡指标外衣的趋势工具,而且它继承了造出它的那两条均线各自的滞后。
Builder 的 MACD 积木暴露出下面这些参数:
| 积木参数 | 默认值 | 它控制什么 |
|---|---|---|
fast_ema | 12 | 那条更快的均线。取值范围 1–999 |
slow_ema | 26 | 更慢的那条。这两条之间的差距就是整个信号 |
signal_period | 9 | 在你去比较它之前,这个差值被平滑到什么程度 |
line | MODE_MAIN | 这个积木输出哪一条线——MODE_MAIN 或 MODE_SIGNAL |
applied_price | PRICE_CLOSE | 哪个价格进入计算 |
shift | 0 | 0 是正在形成的那根K线,1 是最后一根已收盘的 |
timeframe | 当前图表 | M1 到 MN1 中的任意一个,与图表本身无关地读取 |
line 是那一行会改变你整个流程形状的参数。它是一个二选一的下拉项,所以一个积木只给你一条线。因此信号线交叉需要两个 MACD 积木;零轴交叉只需要一个,外加一次与常数的比较。
分步操作:在 Builder 里把这个 MACD EA 搭出来
- 打开 EA Builder,从图库载入
macd_signal模板,或者从一张空白画布开始自己接线。 - 从 Utility 面板放一个 Start 节点。没有它,校验会以
EAB-E202中止构建。 - 加一个 MACD 积木,把
line留在MODE_MAIN。第一次搭的时候把 12/26/9 原样留着,这样你的结果才能和下面那条基线对得上。 - 再加第二个 MACD 积木,周期完全相同,把
line设成MODE_SIGNAL。同一个指标、同样的参数、不同的输出——这一步就是人们会跳过的那一步,而跳过它,正是他们的流程在拿一条线和它自己作比较的原因。 - 把两者都接进一个 Cross 条件。Cross 接收两个输入,问的是其中一条有没有在这根K线上穿越另一条;它的
cross_type是crossover或crossunder,所以买入一侧和卖出一侧是两个各自独立的条件,而不是一个反过来用。 - 把每个条件分别接进它自己的 Open Buy / Open Sell 积木。把指标直接接到下单积木上会被
EAB-E205打回来——一个原始数值并不是一个决策。 - 在 Settings 标签页里设定风险。共享的默认值是 50 点止损、100 点止盈和固定
0.01手;一个没有有效止损的流程,会在构建之前触发CRITICAL级预检诊断。 - 按 Measure,然后对照面板打印出来的那条线来读结果:盈利因子至少 1.2、至少 60 笔交易、回撤不差于 20%。
- 按 Compile .ex5,通过 File > Open Data Folder 把文件移进
MQL5/Experts,刷新导航器,然后在策略测试器里测一遍,再让它靠近任何一个账户。
- Start 节点
- MACD 积木,line = MODE_MAIN
- MACD 积木,line = MODE_SIGNAL
- Cross —— 买入用 crossover,卖出用 crossunder
- Open Buy 和 Open Sell
- 止损与止盈
- 编译成 .ex5
如果你想要的是零轴那一版,就删掉第二个 MACD 积木,把 Cross 换成 Compare,它的运算符是 > < >= <= == !=,它的 offset 默认为 0。“MACD 主线在零轴之上”这句话说的是快速均线压根就在慢速均线之上——这是一个比两条线相触罕见得多、也晚得多的事件。面板里还随附了 OsMA,它直接把主线减信号线的差值作为一个数值输出,所以一条柱状图规则只需要一个积木,而不是两个。
MACD 的进场、出场与参数设置
| 参数 | 模板取值 | 改动它会怎样 |
|---|---|---|
fast_ema | 12 | 调低反应更早,交叉也频繁得多;交易笔数会比胜率先动 |
slow_ema | 26 | 调高会拉大快线必须跨过的那段距离,于是信号来得更晚也更少 |
signal_period | 9 | 比较线上的平滑量。越短交叉越多,其中大多是噪声 |
line | MODE_MAIN | 这不是一个调参旋钮——它决定你搭出来的是哪一条规则 |
shift | 0 | 设为 1 表示只在已收盘的K线上做决定 |
| 止损 | 50 点(共享默认值) | 被搜索过的范围是 30–80 |
| 止盈 | 100 点(共享默认值) | 被搜索过的范围是 60–250 |
关于滞后,这也是对这个指标最诚实的那一句抱怨。 这里的每一个数值,都是两条均线叠在第三条上的输出。所以一次交叉是一份报告,说的是某段行情已经发生了——问题只在于晚了多少。缩短 fast_ema 买来的是提前,代价付在假交叉上;拉长 slow_ema 买来的是可靠,代价付在行情走完之后才到的入场上。这个模板自己的记录透露了它落在哪里:一年 698 笔交易,在同一套条件下实测的十三个趋势与动能模板里排第二多。那是一套在不停触发的设计,而不停触发正是短滞后的代价。
那次搜索动了什么,又没动什么。 记录在案的参数搜索只改动了止损和止盈——SL30-80 × TP60-250,H1 上跨三个窗口的 12 组组合。它一次都没有改动过 fast_ema、slow_ema 或 signal_period。 所以本页上没有任何东西能支持“12/26/9 是对的、是错的、或者还能改进”这一类主张。它支持的是一个窄得多、也有用得多的主张:没有任何一组止损与止盈组合救得了这套设计。
回测这个 MACD EA
这是 Builder 自己的实测记录,不是一次重跑,而这份对比里的每一个模板都共用下面那一套条件。我们如何测试说明了这些记录被要求达到的标准。
macd_signal 基线 | 数值 |
|---|---|
| 盈利因子 | 0.93 |
| 交易笔数 | 698 |
| 最大回撤 | -1.05% |
| 净利 | -93.93 |
| 按盈利因子在邻居中的排名 | 13 个中排第 8 |
| 按交易笔数在邻居中的排名 | 13 个中排第 2 |
| 通过 Measure 面板自身的合格线 | 否 |
| 测试条件 | |
|---|---|
| 实验编号 | EXP-MACD-RECIPE-BASELINE-001 |
| 父实验 | EXP-BUILDER-TEMPLATE-BASELINE-001 |
| 品种 / 时间周期 | USDJPYm M5 |
| 期间 | 2025-06-01 – 2026-06-09 |
| 模型 | M1 OHLC (Model=1) |
| 入金 | 10,000 |
| 环境 | Exness MT5 |
| 基线实测于 | 2026-06-18 |
| 最近验证 | 2026-08-25 |
这个搜索结果值得多写几句。 图库里有八个模板带着记录在案的参数搜索,而这八个全部以 no_robust_edge 收场。但它们失败的方式有两种,而这个差别比它们共有的那个结论更要紧。其中两个压根就没产出过一组盈利的设置,连搜索被拟合的那段时期上都没有。macd_signal 是唯一一个产出过样本外越过 1.0 的设置的模板——在最宽的止盈上是 1.14 到 1.15——然后在它前面那个窗口上得分 0.74 到 0.77。清单自己对这件事的用词是依赖市场状态。
请读一读这对测试意味着什么。如果你把数据切成两半,在前半段上拟合、在后半段上检验,这个模板会递给你一个通过的结果。唯一抓住它的,是去检验搜索从未见过的第三段时期。这就是前进分析在一个具体案例里的论据,而它比任何一句关于过拟合的泛泛警告都更值钱。
MACD 在它的邻居中间处在什么位置,下面全部是在上面那一套条件下实测的:
| 模板 | 积木数 | 盈利因子 | 回撤 | 交易笔数 |
|---|---|---|---|---|
ma_perfect_order_trend | 10 | 1.07 | -0.36% | 305 |
mtf_osc_filter | 27 | 1.04 | -0.64% | 187 |
consecutive_bars_momentum | 7 | 1.03 | -0.36% | 377 |
ao_ama_trend | 14 | 0.97 | -0.95% | 239 |
adx_trend | 12 | 0.96 | -0.76% | 534 |
multi_tf_trend | 15 | 0.96 | -0.51% | 247 |
ma_crossover | 9 | 0.95 | -0.84% | 420 |
macd_signal | 8 | 0.93 | -1.05% | 698 |
ma_slope_trend | 7 | 0.92 | -1.00% | 478 |
mtf_adx_filter | 14 | 0.92 | -0.84% | 343 |
elder_ray | 9 | 0.90 | -1.34% | 529 |
pitch_trail_trend | 9 | 0.77 | -1.61% | 467 |
dynamic_sl_trend | 9 | 0.68 | -1.62% | 708 |
把这十三个按它们自己的交易笔数中位数 420 切开,两半会干净地分离。交易更少的那六个,平均盈利因子 1.00、283 笔交易、回撤 -0.61%。交易更多的那六个,平均 0.86、569 笔交易、回撤 -1.23%——结果更差,深度是两倍。全部三个越过 1.0 的设计都坐在更安静的那一半里。MACD 坐在更忙的那一半。
这是对一套设置下十三个设计的描述,不是一条定律:入场逻辑、节点数和出场方式也都不一样,所以触发频率并没有被确立为原因。但这就是摆在你面前的规律,而随附的 MACD 模板站在它不好的那一边。
需要避开的常见错误
相信一次样本外通过。 这正是这个模板用来演示的那个错误。一段被留出来的时期只是一个样本,而一条动能规则可以赢下单个样本,因为市场在那段时间里恰好在走趋势。在你相信一个数字之前,先用搜索从未见过的第三个窗口去测它。
拿一条线和它自己作比较。 如果两个 MACD 积木都被留在 MODE_MAIN 上,Cross 条件比较的就是两个完全相同的值,于是永远不会触发——或者靠舍入误差触发。在你纳闷交易笔数为什么是零之前,先检查两个积木上的 line 参数。
把一次交叉读成一个预测。 MACD 是一条均线的两条均线。一次交叉报告的是某段行情已经进行了若干根K线。这里的设计选择是你接受多大的迟到,而不是要不要接受迟到。
一直调止损和止盈,直到资金曲线好看为止。 记录在案的那次搜索已经系统性地做过这件事了——12 组组合、三个窗口——报出来的是 no_robust_edge。如果你手工调参赢过了一次系统性搜索,请先怀疑调参。
堆叠动能过滤器。 上面那套组合就是这种直觉的实测版本:回撤放大到 3.76 倍,换来一个略差一点的盈利因子。
和另一个 EA 并排运行却不把它们分开。 同一个账户上的每一个 EA 都需要自己的魔术号,否则其中一个 EA 的出场逻辑会把另一个的持仓平掉。
下一步与变体
什么时候干脆别用 MACD。 在一个震荡区间里,两条均线会反复交叉,而每一次交叉都是噪声——一个触发飞快的默认设置,恰恰是震荡区间最会惩罚的东西。如果你说不出一个能在横盘期间把这条规则关掉的条件,那就要么补上一个,要么换一个不依赖两条均线拉开距离的思路。
按证据强弱排序、值得一试的变体。 先试零轴那一版:它少一个积木,触发也少得多,而邻居圈里更安静的那一半,正是每一个越过 1.0 的结果所在的地方。然后在 MACD 积木内部把同一条规则放到更高的 timeframe 上试,这样能在不动图表的前提下把信号放慢。只有在这之后才去动周期——而且一次只改一个。
然后认真测一遍。 Measure 面板是K线级别的、近似的;它是一道筛子,不是一份判决。MT5 回测怎么做从头到尾走了一次真实运行,包括报告里那两个回撤数字该信哪一个。不用写代码做一个 RSI EA 是这套配方的姊妹篇,失效方式正好相反——它的搜索什么都没赢过,所以它更容易被否掉,也因此比这一篇更不具启发性。不用写代码做一个 MT5 EA 覆盖了更宽的积木词汇表,而回测指南会更深入地讲本页所主张的那个前进分析步骤。
而如果你想校准一份有文档的记录长什么样,已发布的 EA 每一个都带着完整的平仓交易清单和一份运行清单。在你相信任何一套策略之前——包括你自己搭出来的那一套——先拿其中一份去对照上面那张表。