MT4 上的自定义指标(文件后缀为 .mq4 或编译后的 .ex4)无法直接放入 MT5 中运行。如果你直接将 .ex4 文件拷贝到 MT5 的指标文件夹中,MT5 根本无法识别或加载该指标。
虽然 MT4 和 MT5 都是由 MetaQuotes 公司开发的交易平台,但它们在底层设计上存在本质的区别:
底层语言不同:MT4 指标使用 MQL4 语言开发,而 MT5 指标使用 MQL5 语言。
编程范式不同:MQL4 主要基于面向过程的编程风格;而 MQL5 是完全面向对象编程(OOP)的,结构与 C++ 非常接近。
数据与事件处理机制不同:
价格数据调用:MQL4 使用预定义数组(如 Open[], High[], Low[], Close[], Time[])直接读取历史 K 线数据;MQL5 则取消了这些直接数组,改用 CopyRates() 或 CopyBuffer() 等专门的函数来获取数据。
指标缓冲区(Indicator Buffers):MQL4 的指标缓冲区分配相对简单;MQL5 对内存管理和动态数组的要求更加严格,需要显式映射和管理。
执行逻辑:MQL4 主要依靠 OnCalculate() 或传统的 start() 事件函数处理报价;MQL5 拥有更完善且严格的事件驱动架构(如 OnInit(), OnDeinit(), OnCalculate())。

如果你在 MT4 上有非常依赖的自定义指标,可以通过以下三种方式实现在 MT5 上的使用:
.mq4 源码)如果你手头有指标的原始代码文件(.mq4),可以通过修改源代码将其转换为 MQL5:
使用 #property strict 预处理:早期的 MQL4 代码语法较松散,而 MQL5 非常严格。
重写数据获取函数:将 MQL4 中的 iMA(), iRSI(), High[i] 等直接调用,改为 MQL5 的 iMA() 句柄(Handle)创建以及 CopyBuffer() 内存拷贝逻辑。
修改缓冲区绑定:更新 SetIndexBuffer() 函数的调用方式。
许多常用的 MT4 自定义指标(如各种改版的 MACD、均线通道、自动画线指标等),其开发者或社区爱好者通常已经在官方社区(MQL5.com)发布了对应的 MQL5 版本。
打开 MT5 平台,按 Ctrl + F 打开搜索,或直接在底部的 “工具箱” -> “市场” / “代码库” 中搜索该指标的名称,很多时候能直接下载到免费或现成的 MT5 版本。
自动转换脚本:市面上存在一些 MQL4 转 MQL5 的代码转换工具,但通常只能处理结构极其简单的指标,对于复杂的自定义指标,转换后往往包含大量编译错误。
定制开发:如果指标包含独特的商业策略或复杂逻辑,最稳妥的方式是在 MQL5 官方自由职业者(Freelance)市场聘请程序员将 MQL4 代码重新重写为 MQL5。