MENU

MQL5 EA開発入門|MQL4との違いを徹底解説

※免責事項
本記事は情報提供を目的としており、特定の金融商品の購入・売却を推奨するものではありません。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()でシンプルに判定可能です。

// MQL5 EA基本構造
#include <Trade/Trade.mqh>
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)で確認し、両方に対応するコードを書くのがベストプラクティスです。

// MQL5 ポジション管理の例
#include <Trade/PositionInfo.mqh>
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ではパフォーマンスが大幅に向上します。

// MQL5 インジケータのハンドル方式
int maHandle;
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に移植するには、段階的なアプローチが効果的です。一度に全てを書き換えるのではなく、以下の順序で進めることでミスを最小限に抑えられます。

Step 1
注文処理の移行

OrderSend()をCTradeクラスのtrade.Buy()/Sell()に置き換え。エラーハンドリングもResultRetcode()に統一。

Step 2
インジケータの移行

iMA()等の直接呼び出しをハンドル方式に変更。OnInit()でハンドル作成、OnTick()でCopyBuffer()。

Step 3
ポジション管理の移行

OrderSelect()ループをPositionSelectByTicket()またはCPositionInfoクラスに書き換え。

Step 4
テスト・検証

MT5のマルチスレッドテスターで同一期間のバックテストを実施し、MQL4版と結果を比較検証。

まとめ

MQL5はMQL4の上位互換であり、OOP対応・マルチスレッドテスター・柔軟なポジション管理など、EA開発を次のレベルに引き上げる機能が揃っています。学習コストはありますが、1つEAを移植すればコツを掴めるはずです。

次のステップとして、まずはEA開発環境の構築から始めて、移動平均線クロスEAのようなシンプルなロジックから実装してみましょう。

EA開発でお困りですか?

ロジックの構想はあるけどコーディングが難しい…そんな方はプロに相談しましょう。
EA CreatorsLABでは、あなたのアイデアをMQL4/MQL5で形にします。

EA制作を依頼する →
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次