Summary: Essential differences between MQL4 and MQL5 for EA migration: trade functions, tick model, historical access, and optimization. Includes runnable code and cross-platform tips.




Migrating an Expert Advisor from MQL4 to MQL5 is not a simple recompile. The execution model, trade functions, and historical access differ fundamentally. This guide focuses on actionable syntax changes and logic adaptation for advanced users.

1. Trade Execution: OrderSend() vs CTrade
MQL4 uses `OrderSend()` with many parameters. MQL5 uses the `CTrade` class, which reduces order placement to method calls. Direct porting fails because MQL5 lacks `OrderSend()`.

MQL4 example:
```cpp
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, stopLoss, takeProfit, "EA", magic, 0, clrNONE);
```
MQL5 equivalent with `CTrade`:
```cpp
#include
CTrade trade;
double sl = Ask - 50 * Point();
double tp = Ask + 100 * Point();
trade.SetExpertMagicNumber(magic);
trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, Ask, sl, tp, "EA");
```

2. Tick and History Model
MQL4 allows direct `Close[1]` for previous bar close. MQL5 requires `CopyClose()` or `CopyRates()`. Also, MQL5 distinguishes tick history from bar history.

Get last 10 closes in MQL5:
```cpp
double closes[];
CopyClose(Symbol(), PERIOD_CURRENT, 0, 10, closes);
```
MQL4 equivalent would simply access `Close[0]` to `Close[9]`. MQL5’s method prevents accidental future function usage—critical for backtest accuracy.

3. Order Selection Loop
In MQL4, `OrdersTotal()` + `OrderSelect()` iterates open orders. MQL5 uses `PositionSelect()` or `PositionsTotal()` with `PositionGetTicket()`.

MQL5 loop:
```cpp
for(int i = PositionsTotal() - 1; i >= 0; i--) {
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket)) {
if(PositionGetInteger(POSITION_MAGIC) == magic) {
// operate
}
}
}
```
MQL4’s `OrderSelect()` ticket selection is not directly portable. Avoid using `OrderSelect()` in MQL5.

4. Parameter Optimization & Genetic Algorithms
MQL5 optimizer supports genetic algorithm (GA) natively, while MQL4 requires external tools. GA convergence formula: population diversity decay `D(t+1) = D(t) * (1 - alpha)` where alpha is crossover rate. MQL5’s built-in GA outperforms brute force in MT4.

Enable GA in MT5 Strategy Tester: set “Optimization” → “Genetic algorithm”. Input parameters range definition same as MQL4.

5. Cross-Platform Compatibility Pattern
To maintain single codebase for both platforms, use preprocessor directives:
```cpp
#ifdef __MQL4__
// MQL4 code
#else
// MQL5 code
#endif
```
But avoid complex logic inside – better to abstract trade execution into separate include files.

6. Common Migration Errors
  • `MarketInfo()` → `SymbolInfoDouble()` / `SymbolInfoInteger()`

  • `TimeCurrent()` → `TimeCurrent()` (same but returns datetime)

  • `iClose()` → `CopyClose()` + array handling

  • `OrderModify()` → `trade.PositionModify()` or `CTrade::PositionModify`


  • Reference
  • MQL5 Documentation: "MQL5 vs MQL4 Differences" (www.mql5.com/en/docs/migration)

  • "Expert Advisor Programming for MQL5" by Andrew R. Young, Chapter 3.