MQL4とMQL5

MQL言語にはMQL4とMQL5の2つのタイプが存在しています。

  • MQL4:MT4に対応している
  • MQL5:MT5に対応している

MQL4とMQL5はそれぞれ似ていますが厳密には互換性がありません。

そのため、MQL4で作成されたMT4用のインジケータやEAは、MT5では使えない事と同様に、

MQL4のソースコードはMQL5のソースコードとして利用する事はほとんどの場合できません。

基本的にはMT4を使うことが多いのでMQL4を勉強していけば良いです。

MQL4とMQL5の違い

MQL4とMQL5の違いについて説明します。

MQL4
  • 古い
  • MT4に対応
  • C言語ベース
  • 日本語解説が多い
  • コードが短い
  • バックテストや最適化が遅い
  • バッファが最大8個
  • 注文管理はヘッジのみ
MQL5
  • 最新版
  • MT5に対応
  • C++言語ベース
  • 日本語解説が少ない
  • MQL4よりコードが長くなる
  • バックテストや最適化が早い
  • バッファが最大500個
  • ネッティング・ヘッジ両対応

MQL5はMQL4の進化版ですし世界の流れはMQL5です。

MQL5ではC++言語を使用しており、MQL4で使用されているC言語の拡張版です。

そしてバッファが8個しか使えないという制約がMQL4にはあります。

ただしこれは、配列データをシフトさせる動きを記載しておけば良いので工夫すれば問題ありません。

これだけ見るとMQL5の方が良いのではないか?と思う人もいると思いますが、

現状、日本ではMQL5の解説が少なくMQL4が主体です。

また、MQL5だとソースコードがMQL4よりも長くなることがあるので、

プログラミング初心者やMQL言語を触ったことがない人は、

まずはMQL4で基礎を学んだ方が良いと思います。

ちなみにMQL4で書いたプログラムのソースコードはMQL5への変換が可能です。

MQL4からMQL5への変換で失敗しないためのポイント

MQL4とMQL5は似ていますが、書き方が異なります。

そのため、1からMQL5のソースコードを書き直すのは手間です。MQL4とMQL5のソースコードを移植するコンバーターを使うと下地を作れます。

まず以下のファイルをダウンロードしましょう。

そしてこのファイルをMT4のincludeフォルダに入れます。

その後EAの頭に以下のソースコードを入力しましょう。

#include <MQL4toMQL5Converter.mqh>

するとMQL4のソースコードがMQL5用に移植されます。

ただし、これで完全に動くMQL5コードになるわけではありません。文法レベルの下地ができるだけで、実際には次の3つのポイントでエラーや意図しない動作にぶつかることがほとんどです。ここでつまずいて挫折する人が多いので、先に知っておくと移行がぐっと楽になります。

1. 注文管理のモデルが根本的に違う

MQL4では、1回のエントリーが1枚の「チケット」として管理され、OrderSend・OrderClose・OrderSelectといった関数で操作します。

MQL5では、この仕組みが「注文(Order)」「ポジション(Position)」「約定履歴(Deal)」に分かれています。さらに口座の設定によって「ネッティング」(同一銘柄の売買が合算される)と「ヘッジ」(MQL4と同じく個別管理)のどちらかを選ぶ形になり、MQL4時代のコードをそのまま持ってきても意図通りに動きません。

移行時によく対応関係で迷う関数の例です(あくまで考え方の対応であり、引数や返り値の型は異なるため、実装時は必ず公式リファレンスで確認してください)。

  • OrderSend(成行の新規発注) → CTrade::PositionOpen(予約注文はCTrade::OrderOpen)
  • OrderClose(決済) → CTrade::PositionClose
  • OrderModify(変更) → CTrade::PositionModify
  • OrderSelect(注文選択) → PositionSelectByTicket・PositionGetTicketなど

CTradeは取引操作を簡単に呼び出せるMQL5標準ライブラリのクラスです。詳しい書き方はMQL5公式リファレンス「CTradeクラス」で確認してください。

2. インジケーターの値の取得方法が変わった

MQL4では、たとえば移動平均線の値が欲しいときiMA(...)と書けば、その場で数値が返ってきました。

MQL5では、iMA(…)は数値そのものではなく「ハンドル」という識別番号を返す仕組みに変わっています。実際の数値を取り出すには、そのハンドルを使ってCopyBuffer(…)を呼び出し、配列に値をコピーする、という2段階の処理が必要です。

「iMAの戻り値をそのまま条件分岐に使っていたMQL4のコード」をMQL5に移植すると、この構造の違いでほぼ確実にエラーになります。

3. 配列の並び順が初期設定では逆になる

MQL4では、価格の配列(Close[]やOpen[]など)は「index 0 = 直近の足」という時系列順が最初から適用されています。

MQL5では、配列は初期状態では時系列順になっていません。時系列として扱いたい場合は、ArraySetAsSeries(配列名, true)を明示的に呼び出す必要があります。これを忘れると、直近の値のつもりで一番古いデータを参照してしまう、という気づきにくいバグが発生します。

もっと細かい関数単位の変換例(定数・事前定義変数・配列関数・日時関数など)は、MQL5公式サイト「MQL4からMQL5への移植」にまとまっています。あわせて確認してください。

すべてのMQL4資産を無理にMQL5へ移す必要はありません。すでに安定して動いているEAやインジケーターは、そのまま資産として残す選択肢もあります。新しくロジックを検証・開発する場合はMQL5で書き、既存資産はMQL4のまま維持する、という併用も現実的です。

MQL5で開発を行うメリット

では、MQL5は学ばなくてよいのか?という人がいますので、

MQL5の開発を行うメリットをご紹介します。

MT5はMT4よりも最大20倍高速

MT5はMT4よりも最大20倍高速だとメタクォーツ公式発表しています。

最低でも4倍高速になっているようです。そのためMT4ではできない高速なトレードが実現可能です(公式記事: 「メタトレーダー5 – 想像以上の製品です!」)。

アービトラージ取引やHFT取引などは基本的にMT5が使用されます。

バックテスト性能が向上

MT4に比べてバックテスト性能が向上しています。

MT4ではシングルコアをベースのPCが多かったのでそれに応じたソフトが作られていましたが、

MT5ではマルチコアPCが主流になったので演算能力も格段に上がりました。

MT4の場合は複数の通貨を同時に取引するEAのバックテストは検証不可能でしたが、

MT5では複数の通貨を同時にテストを行うことができます。

時間足の種類が多い

MT5では

M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, Monthly1

と細かい時間足の利用が可能です。中には通常見ない時間足の中に優位性があったりする可能性もあります。

約定の遅延も検証できる

従来ではオーダーの遅延がありました。

これはクライアントターミナルからFX業者までのサーバーの遅延になります。

MT5ではそうした遅延を考慮して過去のバックテストを行うことができます。

例えば、スキャルピングなどのテストには便利です。

最適化でクラウドのリソースを使える

MT5ではクラウド上で他のユーザーのPCリソースを使うことができるサービスがあるので、

パラメータの最適化など細かいテストを時短で行うことが可能です。

まとめ

今回はMQL4とMQL5の説明や違い、変換のつまずきポイントについてご紹介しました。

MQL4とMQL5がありますが、個人的にはMQLプログラミング初心者はMQL4をまずは学びましょう。

関連記事