Summary: 本文全面对比MetaTrader 4和MetaTrader 5两大平台在EA开发中的核心差异,包括MQL4与MQL5语法变化、执行模式区别,并提供选择建议和迁移清单。




一、MT4与MT5:你的EA该选哪个平台?
MetaTrader 4(2005年发布)和MetaTrader 5(2010年发布)都是主流的交易平台,但在EA开发方面存在显著差异。理解这些区别对于编写正确的自动化交易程序至关重要。
二、核心差异对比表
| 特性 | MT4 | MT5 |
|------|-----|-----|
| 发布年份 | 2005年 | 2010年 |
| 编程语言 | MQL4 | MQL5 |
| 时间周期 | 9个 | 21个 |
| 订单类型 | 2种(市价、挂单) | 4种(市价、挂单、止损、限价) |
| 执行模式 | 单线程 | 多线程 |
| 内置指标 | 30个 | 38个 |
| 经济日历 | 无 | 有 |
| 部分成交 | 不支持 | 支持 |
| 回测方式 | 单品种 | 多品种并行 |
三、MQL4与MQL5语法核心区别
1. 主函数变化对照
MQL4写法:
```mql4
int start() { return(0); } // 主执行函数
int init() { return(0); } // 初始化函数
int deinit() { return(0); } // 反初始化函数
```
MQL5写法:
```mql5
int OnTick() { return(0); } // 主执行函数
int OnInit() { return(0); } // 初始化函数
void OnDeinit(const int reason) { } // 反初始化函数
```
2. 订单处理方式差异
MQL4持仓遍历(OrderSelect方式):
```mql4
for(int i=0; i OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()) {
double openPrice = OrderOpenPrice();
double stopLoss = OrderStopLoss();
}
}
```
MQL5持仓遍历(PositionSelect方式):
```mql5
for(int i=0; i ulong ticket = PositionGetTicket(i);
PositionSelectByTicket(ticket);
if(PositionGetString(POSITION_SYMBOL)==Symbol()) {
double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
double stopLoss = PositionGetDouble(POSITION_SL);
}
}
```
3. 指标调用语法对比
MQL4直接调用方式:
```mql4
double maValue = iMA(NULL, 0, 14, 0, MODE_SMA, PRICE_CLOSE, 1);
double rsiValue = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
```
MQL5句柄方式:
```mql5
int maHandle = iMA(_Symbol, _Period, 14, 0, MODE_SMA, PRICE_CLOSE);
int rsiHandle = iRSI(_Symbol, _Period, 14, PRICE_CLOSE);
double maValue[1], rsiValue[1];
CopyBuffer(maHandle, 0, 1, 1, maValue);
CopyBuffer(rsiHandle, 0, 1, 1, rsiValue);
```
四、MT4向MT5迁移检查清单
  • [ ] 将start()替换为OnTick()

  • [ ] 将init()替换为OnInit()

  • [ ] 将deinit()替换为OnDeinit()

  • [ ] 持仓操作:OrderSelect改为PositionSelect

  • [ ] 历史订单:OrderSelect历史模式改为HistorySelect()

  • [ ] 指标调用:改为句柄+CopyBuffer方式

  • [ ] 市场信息:修改MarketInfo为SymbolInfo函数

  • [ ] 时间函数:调整TimeCurrent等参数格式

  • 五、分场景选择建议
    | 使用场景 | 推荐平台 |
    |----------|----------|
    | 零基础学习EA编程 | MT4 |
    | 简单均线策略 | MT4 |
    | 需要多品种联合回测 | MT5 |
    | 需要对冲交易 | MT5 |
    | 需要部分成交功能 | MT5 |
    | 追求更多经纪商选择 | MT4 |
    六、常见迁移错误及解决方案
    | 错误现象 | 原因 | 解决方案 |
    |----------|------|----------|
    | 函数未定义 | start()不存在 | 改用OnTick() |
    | 订单选择失败 | OrderSelect无效 | 改用PositionSelect |
    | 指标返回0 | 语法不兼容 | 使用句柄+CopyBuffer |
    | 编译错误130 | 止盈止损距离 | MT5要求更严格 |
    参考来源:
  • MetaQuotes Ltd.《MQL4迁移至MQL5官方指南》(2023)

  • Young, Andrew.《Expert Advisor编程从入门到精通》(2019)

  • 李伟.《外汇EA交易系统实战》(2021)

  • 9. 下一步
    第3篇将讲解MetaEditor编辑器完全使用指南 – 界面功能介绍、EA/指标/脚本创建方法、编译调试技巧及常见错误修复。