MQL4→MQL5 変換ツール|MT4インジをMT5へ移行【無料】
このページ上部の変換ツールの使い方はシンプルです。
- 貼る/読み込む:MT4インジのソース(.mq4)を貼り付け、または「ファイルを開く」。コードが無ければ「サンプル」でOK
- その場で変換:MT5用(.mq5)の下書きが出ます
- 保存して動かす:「コピー」か「.mq5を保存」→ MetaEditorでコンパイルすればMT5で動きます
なぜ「変換」が必要かというと、MQL4のインジ(.ex4)はMT5ではそのまま動かないからです。ソースコード(.mq4)をMQL5(.mq5)に「移植」して、MT5でコンパイルし直す必要があります。ただ、つまずく所はだいたい決まっていて、大半は機械的に片付きます。だからツールで自動化できるわけです。
私は自作インジを100本以上MT5へ移植しましたが、つまずく所は決まっていて、慣れれば流れ作業でした。この記事では「MQL4とMQL5は何が違うのか」「手持ちのインジは移行できるのか」「ツールでどこまでできるのか」を順番に解説します。
MQL4とMQL5の違いと互換性|なぜそのまま動かないのか
まず「互換性」の話から。MT4のインジ・EAはMQL4という言語で書かれ、.ex4という実行ファイルにコンパイルされます。MT5が読むのは.ex5。この時点で別物です。
mq4 / ex4 / ex5 の違い
・.mq4…MQL4のソースコード(設計図)。人間が読めて編集できる。
・.ex4….mq4をコンパイルした実行ファイル。MT4が読む。中身は見られない。
・.ex5…MT5用の実行ファイル。MT5が読む。
ポイントは2つです。①.ex4はMT5では動かない(.ex5でないとダメ)。②.ex4から.ex5へ"直接"変換することもできない。必要なのは、.mq4のソースをMQL5(.mq5)に書き直して、MT5でコンパイルし直すこと。これを「移植」と呼びます。
裏を返すと、.ex4しか持っていない(ソースが無い)インジは、自分では移行できません。配布元にMT5版を頼るか、ソース(.mq4)を入手する必要があります。上のツールも「.mq4のソース」が前提です。
では言語そのものの互換性は? MQL4とMQL5は、どちらもC言語系で文法の8割は共通です。MQL4が書ける人なら、ゼロから学び直す必要はありません。ただし、移植で必ず効いてくる差が3つあります。
違い①:配列の「向き」が逆(最凶のサイレントバグ)
MQL4では価格やバッファの配列はindex 0 が「最新の足」。MQL5は既定でindex 0 が「一番古い足」と、真逆です。怖いのはコンパイルは通るのに表示だけ狂うこと。対策は1行で済みます。
// MQL4:index 0 = 最新足。だからこう書ける
double now = RSIBuffer[0];
// MQL5:既定では index 0 = 最古足! 同じコードが「逆」を指す
// → OnInit でこれを入れて MQL4 と同じ向きに直す
ArraySetAsSeries(RSIBuffer, true);
違い②:iMAなどの内蔵インジが「ハンドル返し」に変わった
MQL4のiMA()などは値が直接返りますが、MQL5は「ハンドル(整数)」が返り、別途CopyBufferで値を取り出す設計です。ここが一番"構造"が変わる所です。
// MQL4:値がそのまま返る
double ma = iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, 0);
// MQL5:ハンドルが返る → CopyBufferで取り出す
int h = iMA(_Symbol, _Period, 20, 0, MODE_EMA, PRICE_CLOSE);
double buf[];
CopyBuffer(h, 0, 0, 1, buf);
double ma = buf[0];
違い③:#propertyの分離と、定義済み変数の廃止
MQL5は「バッファ数」と「描画プロット数」を別々に宣言します。さらに、MQL4で当たり前に使えたClose[]やBarsといった定義済みの配列・変数がMQL5には無く、関数に置き換わっています。
// MQL4
#property indicator_buffers 2
double price = Close[i];
int total = Bars;
// MQL5
#property indicator_buffers 2
#property indicator_plots 2 // ← バッファ数とプロット数は別物
double price = iClose(_Symbol, _Period, i); // Close[] は無い → iClose()
int total = Bars(_Symbol, _Period); // Bars は関数になった
逆に言えば、移植でつまずく所はこの3つにほぼ集約されます。パターンが決まっているから、機械(ツール)に任せられるわけです。
結局、MQL4のインジはMT5へ移行できるのか?
できます。しかもインジケーターの移植は、思っているより軽いです。上で挙げた3つの差を直すのが大半で、ロジック本体(計算式やシグナル条件)はほぼそのまま流用できます。
| ツールで自動でいける | 手作業が要る(ツールが印を付ける) |
|---|---|
| init→OnInit / start→OnCalculate | iCustom(他インジ参照)のハンドル化 |
| Close[]→iClose、Bars→Bars()など | ObjectSet(ラベル・矢印の描画)の型分け |
| iMA等のハンドル化(互換ラッパーで吸収) | EAのトレード関数(OrderSend等) |
| 配列の時系列をMQL4と同じ向きに固定 | マイナーな内蔵インジ・特殊な描画 |
100本やった体感は完全に二極化でした。単純なインジは1本数分の流れ作業。オブジェクト描画やマルチタイムフレームが絡む大物は半日仕事。でも平均すれば「思ったより楽」です。ただしEAだけは別物で、覚悟がいります(後述)。
解決策|MQL4→MQL5 変換ツールの使い方(4ステップ)
その移植作業を自動化したのが、このページ上部のツールです。使い方は4ステップ。
- ソースを入れる:.mq4のコードを左に貼り付けるか、「ファイルを開く」で.mq4を選ぶ(ドラッグ&ドロップも可。古いファイルに多いShift_JISも自動判定します)。手元に無ければ「サンプル」を押してください。
- 結果を確認する:「✅ 変換できました」なら基本そのまま使えます。「⚠ 手で直す箇所」が出たら、次の章の直し方へ。
- 保存する:「.mq5を保存」でダウンロード、または「コピー」。
- MetaEditorでコンパイル→MT5へ設置:下記の手順で実際に動かします。
MT5で動かすまで
1. MT5で F4(またはツール→MetaQuotes Language Editor)でMetaEditorを開く
2. 新規インジを作る/保存した.mq5を開いて、変換結果を貼り付ける
3. F7 でコンパイル。エラーが出たら「手で直す箇所」を直す(このツールは完璧ではないので、コンパイルエラーはその箇所と元のMQL4をChatGPTなどのAIに貼って聞くと早いです)
4. 通ると.ex5ができる → MT5の「ファイル→データフォルダを開く→MQL5→Indicators」に置く
5. MT5のナビゲーターを更新 → チャートにドラッグで適用(EAは Experts フォルダ)
関連記事【FX初心者】無料インジケーターを無闇にダウンロードしない方がいい理由|MT4「手で直す箇所」が出たときの直し方
ツールが「⚠ 手で直す箇所」と出すのは、機械が勝手に変換すると壊れるリスクが高い所です。安全のため変換せず印だけ残しています。代表的な3つの直し方を載せておきます。
① iCustom(他のインジを呼ぶ部分)
iCustomもMQL5ではハンドル返しです。OnInitでハンドルを取り、CopyBufferで値を取り出します。末尾のmode・shiftはCopyBuffer側へ移します。
// MQL4
double v = iCustom(NULL, 0, "MyInd", 10, 0, i); // 最後の 0=バッファ番号, i=shift
// MQL5(OnInitでハンドル取得 → 使う所でCopyBuffer)
int hCustom = iCustom(_Symbol, _Period, "MyInd", 10); // OnInitで一度だけ
double buf[];
CopyBuffer(hCustom, 0, i, 1, buf); // 0=バッファ番号, i=shift
double v = buf[0];
② ObjectSet(ラベルや矢印の描画)
MQL5は第1引数にchart_id(0=現在のチャート)が必要で、プロパティの型ごとにObjectSetInteger / ObjectSetDouble / ObjectSetStringに分かれます。
// MQL4
ObjectSet("name", OBJPROP_COLOR, clrRed);
ObjectSet("name", OBJPROP_PRICE1, price);
// MQL5(chart_id を足し、型で関数を分ける)
ObjectSetInteger(0, "name", OBJPROP_COLOR, clrRed); // 色・座標などは Integer
ObjectSetDouble (0, "name", OBJPROP_PRICE, price); // 価格は Double
③ EAのトレード関数(OrderSendなど)
ここだけはハッキリ言っておきます。EAの売買部分はインジより重いです。MQL5ではトレードが「ポジション・注文・約定」に分離し、ネッティング/ヘッジの概念も絡むため、OrderSendはMQL4の感覚では書けません。標準ライブラリのCTradeクラス(trade/Trade.mqh)に置き換えるのが定石です。誤変換は実損に直結するので、ツールもここは自動変換せず必ず止めます。まずはインジから移して、MT5の作法に慣れてからEAに手を出すのがおすすめです。
(補足)MT4とMT5の違い
プラットフォームの違いはご存じの方が多いと思うので、要点だけ。基本的にMT4でできることはMT5でも全部でき、むしろ増えます。
| 項目 | MT4 | MT5 |
|---|---|---|
| 時間足 | 9種類 | 21種類 |
| 板情報・経済指標カレンダー | なし | あり(内蔵) |
| バックテスト | 単一通貨・1スレッド | 64bitマルチスレッド・マルチ通貨 |
| ポジション管理 | ヘッジのみ | ネッティング+ヘッジ |
関連記事【コード付】最速でMQL4言語をプログラミング未経験者がマスターする方法100本以上のインジをMT5へ移植して、何が大変だったか
ここからは一般論ではなく、私が自作インジを100本以上MT5へ移植して実際にやってみてどうだったかの話です。
まず、一括変換は失敗しました。最初は全ファイルに同じ変換ルールを当てて一気に片付けようとしたのですが、見事にコケました。理由は単純で、インジごとに構造(描画方式・データの取り方・イベント処理)がバラバラだからです。結局、1ファイルずつ中身を読んで直すのが一番速かった。このツールが変換前にファイルを"分類"してから処理しているのは、この反省からです。
そして大変さは完全に二極化しました。移動平均にラインを引くような単純なバッファ系は、1本あたり数分の流れ作業。一方、ラベルやボタンを並べるパネルUI+オブジェクト描画+マルチタイムフレームが全部乗った大物は、1本で半日仕事でした。
具体的にハマったのは、この3つです。
- 配列の時系列:一番時間を溶かしたのがこれ。コンパイルは通るのに表示だけ逆になり、原因に気づくまでかなりかかりました。今は
ArraySetAsSeriesを最初に入れる癖で回避しています。 - フィボ系の自作インジ:
iHighest / iLowestの挙動がMT4と違って素直にいかず、MT5ではCopyRatesで高値・安値を自分で走査する形に書き換えた方が安定しました。 - 平均足の大型インジ:行数が多すぎて全面書き直しは地獄。
Time[] / High[] / Low[]の"互換配列"を自分で用意し、元のロジックを温存したまま移植しました。
それと、ObjectSet系の描画は型ごとに関数が分かれていて数が多いので、互換関数を1つ挟むと一気にラクになります(毎回 ObjectSetInteger/Double/String に書き分けない)。
それでも、平均すれば「思ったより大変じゃない」。これが100本やった私の結論です。型さえ一度掴めば9割は同じ作業の繰り返しで、最初の数本を越えると一気にスピードが上がります。唯一EAだけは別腹で、トレード周りの作り直しがあるぶん覚悟がいります。
新規業者向けのMT4ライセンスは2018年に提供終了しており、これから増えるのはMT5です。インジ資産を持っているなら、追い込まれる前に、今のうちに1本ずつ移しておくとラクだと思います。上のツールに貼り付けて、出てきた下書きをMetaEditorでコンパイルしてみてください。たぶん、思っているより手前にゴールがあります。
これからMQL4自体を学ぶ人、基礎を固めたい人は、先にMQL4の学習記事を読むのがおすすめです。MQL4が書ければ、MQL5はその延長で十分に戦えます。
もっと正確に詰めたい人向けに、一次情報も置いておきます。MQL5の仕様は公式が最優先です。次点で、関数の対応を一覧で見たいときは変換表が早いです。
MQL5公式ドキュメントMQL4からMQL5への移行 MQL5公式記事Migrating from MQL4 to MQL5 FXアンテナMQL4⇔MQL5 プログラム変換表LINE追加で18種類以上の特典を無料プレゼント
書籍・インジケーター・カレンダー・為替手帳など












