MT4 的 EA 放不进 MT5。不能拖进去,不能用插件,没有什么取巧的办法。MT4 跑的是 MQL4,MT5 跑的是 MQL5——两种不同的语言,编译后的 .ex4 文件锁死在 MT4 的运行环境里。
但如果你手上有源码(.mq4 文件),有办法。有的方法甚至快得离谱。没源码的话选项少,但也不是完全没出路。
第一个问题:你有源码吗
接下来走哪条路,全看这个。打开 MetaEditor 或者 EA 所在的文件夹,看文件后缀。
| 你手上有什么 | 文件后缀 | 能转吗 |
|---|---|---|
| 源代码 | .mq4 | 能——下面四种方法 |
| 只有编译文件 | .ex4 | 不能——看"没源码"那节 |
| 两个都有 | .mq4 + .ex4 | 能——用 .mq4 那个 |
如果你是从卖家手里买的 EA,只收到 .ex4 文件,那就是没源码。.ex4 是编译加密过的,没有正规途径从里面提取 MQL4 代码。网上有人卖"反编译"服务——别碰,出来的东西不能用,还有法律风险。
没源码的出路
按成功率排序:
1. 问卖家有没有 MT5 版。 很多 EA 卖家已经做了 MT5 版本或者在做。查一下他们的网站、MQL5 Market 页面,或者直接发邮件问。这是最快的路。
2. 问卖家要 .mq4 源码。 有些卖家愿意给,尤其是你已经买了授权的情况下。拿到 .mq4 文件就可以自己转,用下面的方法。不抱希望也值得试试。
3. 继续在 MT4 上跑。 MT4 还好好的,你的 broker 大概率还支持。如果 EA 在 MT4 上赚钱,没有紧迫的理由搬去 MT5——除非你的 broker 要淘汰 MT4(有些在做),或者你需要<a href="/zh/classroom/mt4-vs-mt5">MT5 才有的功能</a>,比如多线程回测器、更多时间框架。
找 freelancer 重写?也行,但你得把策略逻辑详细描述出来——没源码的话,这不是"转换"而是"重新开发"。预算 $200-$1,000+,取决于复杂度。MQL5 的<a href="https://www.mql5.com/en/job" target="_blank" rel="noopener">自由职业者板块</a>是这类活儿的主要去处。
有源码:四种方法
从快到慢。
方法 1:兼容性库(最快)
兼容性库把 MQL4 的函数包装一层,让它们能在 MQL5 环境里跑。你加一行代码,在 MetaEditor 5 里重新编译——如果 EA 逻辑简单的话,就直接能用了。
一个热门选项是 MQL5 CodeBase 上的 <a href="https://www.mql5.com/en/code/53546" target="_blank" rel="noopener">MT5Compat.mqh</a>(5 星评价,11,000+ 浏览)。它覆盖了最常出问题的函数:Ask、Bid、Close、Open、High、Low、Digits、Point,还有 iClose()、iOpen() 等数据读取函数。
步骤:
- 下载 MT5Compat.mqh,放到 MT5 的
MQL5\Include\文件夹 - 用 MetaEditor 5 打开你的 .mq4 文件
- 在文件顶部加一行
#include <MT5Compat.mqh> - 把文件后缀从 .mq4 改成 .mq5
- 按 F7 编译
- 修剩下的报错(对照下面的差异表)
我们内部转过几个简单的 EA。趋势跟踪类的,用基础 OrderSend() 逻辑的,基本第一次或第二次编译就过了。但做复杂订单管理的——循环 OrdersTotal()、检查 OrderMagicNumber()、批量改单——交易函数那块得手动重写,因为 MQL5 的持仓管理跟 MQL4 完全不是一回事。
适用:简单 EA,标准指标调用,基础下单逻辑。 不适用:复杂订单管理、自定义指标、DLL 调用。
方法 2:用 AI 转换(2026 年的新选项)
如果你装了 Claude Code 或 Codex,这大概是最快的路。这俩工具能直接读你的 .mq4 文件、转写、输出 .mq5,还能自动调 MetaEditor 编译、改报错——全程不用你复制粘贴一行代码。
推荐做法:Claude Code 或 Codex
指着你的源文件告诉它干什么:
把 MQL5/Experts/MyEA.mq4 转换成 MQL5。下单用 CTrade,
指标用句柄+CopyBuffer,策略逻辑保持不变。
输出到 MQL5/Experts/MyEA.mq5,调 MetaEditor 编译。
工具会读文件、改写、编译、修报错,一条龙。一个 300 行的趋势 EA,我们见过从 .mq4 到编译通过不到 10 分钟。
交叉审核很重要:用一个工具转,另一个审。比如 Codex 转完代码,让 Claude Code 审一遍输出——重点看交易方向有没有搞反、手数计算对不对、止损逻辑有没有变。反过来也行。两个模型互相查错,比信任任何一个都靠谱得多。
退而求其次:贴到 AI 聊天窗口
没装命令行工具?也可以把 .mq4 内容贴到浏览器里的 Claude 或 ChatGPT,让它转。能用,但你得手动来回复制代码、喂报错信息,没有自动编译-修复的循环。慢、容易出错。做一次性的简单转换凑合,复杂的 EA 不建议。
AI 擅长的:机械性的语法替换——start() → OnTick()、OrderSend() → CTrade、iMA() → 句柄+CopyBuffer()、预定义数组 → CopyClose()。这类模式化转换 AI 做得比人快且一致。
AI 会犯的错:编译过了但逻辑不对。订单方向搞反了。止损用了 points 而不是 pips。手数公式在 MQL4 的 4 位报价下没问题,到 MQL5 的 5 位报价就不对了。这些错不报编译错误——会变成实盘上的错误交易。所以交叉审核不能省,测试清单也不能省。
适用:标准逻辑的 EA——趋势跟踪、突破系统、指标驱动的入场。 不适用:有 DLL 调用、Windows API、或非常规第三方库的 EA——模型对这些依赖的 MQL5 等价物见得不够多,转换不靠谱。
方法 3:条件编译(想两个平台都维护的选这个)
一套代码同时编译 MT4 和 MT5,用预处理指令隔离不同的部分。
#ifdef __MQL5__
// MQL5 专用代码
#else
// MQL4 代码
#endif
GitHub 上 <a href="https://github.com/mazmazz/Mql4ToMql5" target="_blank" rel="noopener">Mql4ToMql5 指南</a>介绍了这种做法,有跨平台编译的示例。核心思路:你 EA 的大部分代码——策略逻辑、指标计算、风控——跟平台无关。只有下单执行层和少量函数签名不同。
FXTool 自己维护双平台 EA 就用这个方法。策略代码通用,交易函数套在 #ifdef 块里。前期工作比方法 1 多,但如果你打算两个平台都跑、以后一起更新,这个方法长期最省心。
方法 4:完全重写成 MQL5(最彻底)
用 MQL4 版本做参考,从零写 MQL5 版。最干净——标准 MQL5 架构,能用所有 MT5 功能,没有兼容层的额外开销。
也最花时间。中等复杂的 EA(200-500 行),几个小时到一整天。复杂的(多种订单类型、自定义指标、DLL 调用),可能要好几天。
什么时候值得:这个 EA 是你的主力,你准备彻底告别 MT4,或者你需要 MT5 才有的东西——<a href="/zh/classroom/mt5-build-5800-update-ea-impact">ONNX 模型集成</a>、多线程策略测试器、经济日历 API。
MQL4 → MQL5 差异速查表
做方法 2 或 3 的时候对着这张表查。
| 改了什么 | MQL4 | MQL5 |
|---|---|---|
| 主事件函数 | start() | OnTick() |
| 初始化/反初始化 | init() / deinit() | OnInit() / OnDeinit() |
| 价格获取 | Ask、Bid(全局变量) | SymbolInfoDouble(_Symbol, SYMBOL_ASK) |
| 下单 | OrderSend(Symbol, OP_BUY, lots, Ask, slip, sl, tp) | CTrade trade; trade.Buy(lots, _Symbol, ask, sl, tp)(ask 需先用 SymbolInfoDouble 取值),或用 MqlTradeRequest 结构体调 OrderSend(request, result) |
| 订单类型常量 | OP_BUY、OP_SELL、OP_BUYLIMIT... | ORDER_TYPE_BUY、ORDER_TYPE_SELL... |
| 遍历订单 | OrdersTotal() + OrderSelect() | PositionsTotal() + PositionGetTicket() 看持仓;OrdersTotal() 只管挂单 |
| 持仓模式 | 只有对冲(hedging) | 对冲或净持仓(netting),看账户设置 |
| 指标调用 | iMA(Symbol, 0, 14, 0, MODE_SMA, PRICE_CLOSE, 0) | 先 iMA() 拿句柄,再 CopyBuffer() 读值 |
| 时间框架常量 | PERIOD_M1、PERIOD_H1 | 名字一样,但多了 M2、M3、M6、H2 等 |
| 预定义数组 | Close[]、Open[]、High[]、Low[] | 没有全局等价物——用 CopyClose()、CopyOpen() 等复制(单根 K 线可用 iClose()/iOpen();自定义指标通过 OnCalculate() 拿数组) |
最大的观念转变在订单管理。MQL4 里所有订单在一个池子里,用 OrdersTotal() 遍历。MQL5 把已开仓和挂单分成两个池子。如果你的 EA 不只是简单的开平仓——改止损、管网格、查历史订单——转换时间基本都花在这里。
完整的逐条对照,看 <a href="https://github.com/mazmazz/Mql4ToMql5" target="_blank" rel="noopener">GitHub 上的 Mql4ToMql5 指南</a>。官方文档的话,<a href="https://www.mql5.com/en/docs/migration" target="_blank" rel="noopener">MQL5 Migration Guide</a> 覆盖了主要差异,具体函数查 <a href="https://www.mql5.com/en/docs" target="_blank" rel="noopener">MQL5 完整参考手册</a>。
转完了别急着上实盘
编译通过不等于交易逻辑一样。我们见过编译零报错的 EA,放到 MT5 上跑出完全不同的结果——因为两个平台处理 tick 数据、点差、成交方式有微妙差异。
测试清单:
- 同一时段回测对比——MT4 上跑 MT4 版,MT5 上跑 MT5 版,同品种、同周期、同日期范围。比总交易笔数、净利润、最大回撤。不会一模一样(tick 数据不同),但应该接近。如果 MT5 版开了 200 笔而 MT4 只有 50 笔,逻辑肯定转错了
- 检查方向——确认买卖信号没搞反。听着蠢,但
OP_BUY/ORDER_TYPE_BUY的映射在指标逻辑里确实会出错 - 验证手数计算——如果 EA 用动态手数,用<a href="/zh/tools/position-size-calculator">仓位计算器</a>交叉验证一下数字对不对
- 先跑 demo——至少在 MT5 demo 账户上跑一周。盯着 Experts 选项卡看有没有<a href="/zh/classroom/mt4-mt5-error-guide">报错</a>
- 实盘从最小手数开始——<a href="/zh/classroom/backtest-vs-live-trading-gap">回测和实盘的差距</a>本来就有,转换又多加了一层不确定性
常见问题
能直接把 .ex4 文件放到 MT5 里用吗?
不能。.ex4 是 MT4 编译文件,MT5 打不开也执不了。要转换必须有 .mq4 源码,或者找卖家要 MT5 版本。
转换后的 EA 结果会一样吗?
接近但不完全一样。MT4 和 MT5 的回测器 tick 生成方式不同,点差处理不同,订单成交策略也不同。策略逻辑一样,但具体的进出场点位可能差几个 pip。做回测对比确认行为一致就行。
我不会 MQL5,能转吗?
方法 1(兼容库)基本不用会——复制、include、编译、修报错。方法 2(AI 转换)不需要会 MQL5——AI 处理语法,但你要审查输出。方法 3(条件编译)需要对两种语言有基础了解。方法 4(重写)需要扎实的 MQL5 知识或者愿意花时间学。<a href="https://www.mql5.com/en/docs" target="_blank" rel="noopener">MQL5 官方文档</a>写得详细,就是读着有点枯燥。
EA 用了自定义指标,指标也能转吗?
能,但指标要单独转。先转指标,再改 EA 让它调用 MT5 版的指标。最大的变化:MQL4 里 iCustom() 直接返回值。MQL5 里 iCustom() 返回句柄,再用 CopyBuffer() 读值。多一步,逻辑一样。
到底该不该搬去 MT5?
如果 EA 在 MT4 上赚钱、broker 也还支持 MT4,不急。等你需要 MT5 才有的东西——更多时间框架、内置经济日历、ONNX 模型、更快的回测——再搬。详细的对比我们写在<a href="/zh/classroom/mt4-vs-mt5">《MT4 vs MT5:到底该用哪个》</a>里。
转换一般要多久?
方法 1(兼容库):15 分钟到几小时,看编译报多少错。方法 2(AI 转换):20 分钟到几小时——对大多数人来说最快。方法 3(条件编译):几小时到一天,中等复杂度。方法 4(重写):一天到一周。DLL 多的、订单管理复杂的(网格、马丁、多品种联动)最费时间。
在找 MT5 原生 EA? <a href="/zh/products">FXTool 的 EA</a> 全部原生 MT5 开发,不需要转换。
关于作者:FXTool 团队每天都在开发和测试 MetaTrader 交易工具。我们同时维护 MT4 和 MT5 代码库,本文的转换方法来自实际操作经验。