将专家顾问从MQL4迁移到MQL5并非简单的语法替换。两种语言在交易执行、历史数据访问和事件处理方面存在根本性差异。直接复制粘贴会失败,因为MQL5使用以持仓为中心的模型,而MQL4使用以订单为中心的模型。
关键差异:交易执行模型
MQL4使用独立订单模型,每次部分平仓都会创建新订单。MQL5使用持仓模型(净额或对冲模式)配合独立的交易历史记录。函数映射关系:
| MQL4 | MQL5 |
|------|------|
| `OrderSend()` | `PositionOpen()` / `OrderSend()`(CTrade类) |
| `OrderClose()` | `PositionClose()` |
| `OrderModify()` | `PositionModify()` |
| `OrdersTotal()` | `PositionsTotal()` |
| `OrderSelect()` | `PositionSelect()` |
代码:将OrderSend转换为MQL5开仓
```cpp
// MQL4版本
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, stopLoss, takeProfit, "EA", magic, 0, clrNONE);
// 使用CTrade的MQL5等效版本
#include
CTrade trade;
double sl = 0, tp = 0;
if(stopLoss > 0) sl = Ask - stopLoss * _Point;
if(takeProfit > 0) tp = Ask + takeProfit * _Point;
bool success = trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, Ask, sl, tp, "EA");
```
时间序列索引反转
MQL4中索引0表示当前K线。MQL5默认为数组样式(索引0为最旧K线),除非调用`ArraySetAsSeries()`。
```cpp
// MQL4 - 获取当前K线收盘价
double currentClose = Close[0];
// MQL5 - 必须设置序列方向或使用复制函数
double closeArray[];
ArraySetAsSeries(closeArray, true);
CopyClose(Symbol(), Period(), 0, 10, closeArray);
double currentClose = closeArray[0];
```
事件处理函数映射
| MQL4 | MQL5 |
|------|------|
| `init()` | `OnInit()` |
| `deinit()` | `OnDeinit()` |
| `start()` | `OnTick()` |
| `OnTimer()` | `OnTimer()`(功能相同,但需要`EventSetTimer()`启动) |
回测兼容性修复
MQL5回测不保证每个Tick都重置`_LastError`。必须显式检查返回值:
```cpp
// MQL4风格(在MQL5中不安全)
OrderSend(...);
if(GetLastError() == 0) { ... }
// MQL5安全模式
bool result = trade.PositionOpen(...);
if(result && trade.ResultRetcode() == TRADE_RETCODE_DONE) {
Print("开仓成功");
} else {
Print("错误码: ", trade.ResultRetcode());
}
```
Tick数据结构差异
MQL4的`bid`/`ask`是全局变量。MQL5使用`SymbolInfoTick()`一次性获取买卖价,避免跨Tick的错位问题:
```cpp
// MQL5 - 原子性获取Tick数据
MqlTick currentTick;
SymbolInfoTick(Symbol(), currentTick);
double currentBid = currentTick.bid;
double currentAsk = currentTick.ask;
```
迁移操作顺序
1. 将所有交易函数替换为CTrade类方法
2. 转换时间序列索引(需要时添加`ArraySetAsSeries`)
3. 将事件处理函数更新为MQL5命名规范
4. 将`_Point`替换为`SymbolInfoDouble(Symbol(), SYMBOL_POINT)`
5. 每次交易操作后添加显式错误处理
参考来源:MQL5官方文档 - 从MQL4迁移(https://www.mql5.com/zh/docs/migration),《MQL5交易编程》Andrew R. Young著,2021年。