本記事は情報提供を目的としており、特定の金融商品の購入・売却を推奨するものではありません。FX取引にはリスクが伴い、投資元本を失う可能性があります。投資判断はご自身の責任において行ってください。
MT4で長年使われてきたMQL4に対し、MT5の登場とともにMQL5が開発されました。「MQL4で十分では?」と思う方も多いかもしれませんが、MQL5にはEA開発を効率化する多くの改良が加えられています。この記事では、MQL5の主要な進化ポイントをMQL4との比較で解説し、移行のメリットと具体的な手順を紹介します。
MQL5とは?MQL4からの進化ポイント
MQL5はMetaTrader 5用のプログラミング言語で、MQL4から大幅に進化しています。最大の変更点はオブジェクト指向プログラミング(OOP)への完全対応と、ポジション管理モデルの刷新です。
MQL4は手続き型プログラミングが中心で、グローバル変数や関数の羅列になりがちでした。一方、MQL5ではクラス・継承・インターフェースを活用した設計が可能になり、数千行規模のEAでもコードの保守性が飛躍的に向上しています。
📊 MQL4 vs MQL5 主要な違い
| 項目 | MQL4 | MQL5 |
|---|---|---|
| OOP対応 | 部分的(クラスは使えるが制約多い) | 完全対応(継承・多態性・インターフェース) |
| 注文管理 | OrderSend()の直接呼び出し | CTradeクラスで抽象化 |
| ヘッジ | 標準対応(常にヘッジ) | ヘッジ/ネッティング選択可 |
| テスター | シングルスレッド | マルチスレッド(最大100倍速) |
| インジケータ | iMA()で直接値取得 | ハンドル方式(メモリ効率◎) |
| 時間足 | 9種類 | 21種類(2分足・8時間足等も) |
MQL5の基本構造
MQL5のEAはOnInit()、OnDeinit()、OnTick()の3つのイベントハンドラで構成されます。MQL4と同じ構造ですが、内部のAPI呼び出しが大きく異なります。
特に注目すべきはCTradeクラスです。MQL4ではOrderSend()に多数の引数を渡す必要がありましたが、MQL5ではtrade.Buy()やtrade.Sell()のようにメソッドチェーンで直感的に注文を出せます。エラーハンドリングもtrade.ResultRetcode()でシンプルに判定可能です。
CTrade trade;
int OnInit() {
trade.SetExpertMagicNumber(123456);
trade.SetDeviationInPoints(10); // 許容スリッページ
return(INIT_SUCCEEDED);
}
void OnTick() {
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double sl = ask – 100 * _Point;
double tp = ask + 200 * _Point;
if(trade.Buy(0.1, _Symbol, ask, sl, tp, “MQL5 Test”)) {
Print(“注文成功: “, trade.ResultOrder());
} else {
Print(“エラー: “, trade.ResultRetcodeDescription());
}
}
ポジション管理の違い
MQL4ではOrderSelect()でループしていましたが、MQL5ではPositionSelect()やCPositionInfoクラスを使います。ヘッジモードでは同一通貨ペアで複数ポジションを持てる点もMQL4と異なります。
MQL5のポジション管理で最も重要な概念は「ネッティングモード」と「ヘッジモード」の違いです。ネッティングモードでは同一シンボルのポジションが自動的に統合され、ヘッジモードではMQL4と同様に複数ポジションを持てます。EA開発時はどちらのモードで動作するかをAccountInfoInteger(ACCOUNT_MARGIN_MODE)で確認し、両方に対応するコードを書くのがベストプラクティスです。
CPositionInfo posInfo;
int CountMyPositions(int magic) {
int count = 0;
for(int i = PositionsTotal()-1; i >= 0; i–) {
if(posInfo.SelectByIndex(i)) {
if(posInfo.Magic() == magic && posInfo.Symbol() == _Symbol)
count++;
}
}
return count;
}
💡 ポイント:MQL5ではCTradeクラスを使うことで、注文処理のエラーハンドリングが格段にシンプルになります。OrderSend()の戻り値を直接チェックするMQL4と比べ、コードの可読性が大幅に向上します。
インジケータの呼び出し方の違い
MQL4ではiMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0)のように一行で値を取得できましたが、MQL5では「ハンドル方式」に変わりました。最初にハンドルを作成し、CopyBuffer()で値を配列にコピーする2ステップが必要です。
一見面倒に思えますが、ハンドル方式にはメリットがあります。同じインジケータを何度参照しても内部で1回しか計算されないため、複数ロジックで同じMAを参照するEAではパフォーマンスが大幅に向上します。
double maBuffer[];
int OnInit() {
maHandle = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE);
ArraySetAsSeries(maBuffer, true);
return(INIT_SUCCEEDED);
}
void OnTick() {
CopyBuffer(maHandle, 0, 0, 3, maBuffer);
// maBuffer[0]=現在足, [1]=1本前, [2]=2本前
Print(“MA(20): “, maBuffer[0]);
}
MQL4からMQL5への移行手順
既存のMQL4 EAをMQL5に移植するには、段階的なアプローチが効果的です。一度に全てを書き換えるのではなく、以下の順序で進めることでミスを最小限に抑えられます。
OrderSend()をCTradeクラスのtrade.Buy()/Sell()に置き換え。エラーハンドリングもResultRetcode()に統一。
iMA()等の直接呼び出しをハンドル方式に変更。OnInit()でハンドル作成、OnTick()でCopyBuffer()。
OrderSelect()ループをPositionSelectByTicket()またはCPositionInfoクラスに書き換え。
MT5のマルチスレッドテスターで同一期間のバックテストを実施し、MQL4版と結果を比較検証。
まとめ
MQL5はMQL4の上位互換であり、OOP対応・マルチスレッドテスター・柔軟なポジション管理など、EA開発を次のレベルに引き上げる機能が揃っています。学習コストはありますが、1つEAを移植すればコツを掴めるはずです。
次のステップとして、まずはEA開発環境の構築から始めて、移動平均線クロスEAのようなシンプルなロジックから実装してみましょう。
EA開発でお困りですか?
ロジックの構想はあるけどコーディングが難しい…そんな方はプロに相談しましょう。
EA CreatorsLABでは、あなたのアイデアをMQL4/MQL5で形にします。


コメント