MT4のEAをMT5へ移植するときの注意点|注文処理・配列・インジケーターの違いを解説
MT4で使っていたEAをMT5へ移植したい場合、mq4の拡張子をmq5へ変えるだけでは動きません。
注文の管理方法、価格データの取得、配列の向き、インジケーターの呼び出し方など、MQL4とMQL5には移植時に見落としやすい違いがあります。
特に注意したいのは、MT4のチケット単位で注文を扱う感覚のままMT5へ移すことです。MT5のネットティング口座では、同じ通貨ペア・銘柄の売買が1つのポジションへ統合されるため、意図しない決済やドテンにつながることがあります。

MT4で正常に動いているEAなら、MT5へ移すときは関数名を書き換えるだけでよいですか?

いいえ。最初に注文処理を確認してください。そのうえで配列、価格取得、インジケーター、テスト環境をMT5向けに見直す必要があります。
この記事では、MT4のEAをMT5へ移植するときに確認したい注意点を、優先度の高い順に解説します。
- MT4とMT5で注文管理が大きく変わる理由
- ネットティング口座とヘッジング口座で確認すべきこと
- 配列の向き、Bid・Ask、Digitsなどを移植するときの注意点
- MT5で必要になるインジケーターハンドルとCopyBuffer()の考え方
- MT5のバックテスト環境を移植後の検証へ活かす方法
最初に確認したいのは注文処理の違い
MT4からMT5へEAを移植するとき、最も重要なのは注文・ポジションの管理方法です。
MT4では、売買注文をチケット単位で管理する考え方が基本です。複数回買い注文を出せば、原則としてそれぞれに別のチケットが発行され、個別に選択・決済・変更する処理を書きます。
一方、MT5は注文・約定・ポジションが分かれて管理されます。さらに、口座がネットティング方式かヘッジング方式かによって、同じ通貨ペア・銘柄へ注文したときのポジションの扱いが変わります。
| 項目 | MT4 | MT5 |
|---|---|---|
| 基本的な管理単位 | 注文チケット単位 | 注文・約定・ポジションを分けて管理 |
| 同じ通貨ペアへ複数回買う場合 | 複数のチケットとして保持しやすい | ネットティング口座では1つのポジションへ統合される |
| 買い保有中に売る場合 | 売り注文を追加し、両建てにできる | ネットティング口座では買いの縮小・決済・売りへの反転になる場合がある |
| 移植時の確認点 | チケット単位の処理 | 口座方式と、反対注文時の処理を明文化する |
MT5はすべての口座がネットティングではない
「MT5は同じ通貨ペアの注文がすべて1つにまとまる」と説明されることがありますが、正確には口座方式によって異なります。
ネットティング口座では、同じ銘柄に同時に保有できるポジションは1つです。買いポジションを持っている状態で売り注文を出すと、買いポジションが減少・決済されるか、売り方向へ反転することがあります。
一方、ヘッジング口座では、同じ銘柄でも複数ポジションを持てるため、MT4に近い形で買いと売りを同時に保有できます。
OrderSend()の感覚のまま移すと起きやすい問題
MT4のOrderSend()は、成行注文または予約注文を出し、成功時には注文チケットを返します。そのため、移植前のEAでは「チケットを保存して、あとでそのチケットを選択して決済する」という構成になっていることが多くあります。
MT5のOrderSend()は、MqlTradeRequestとMqlTradeResultを使ってリクエストを送る形式です。関数がtrueを返しても、注文が最終的に約定したことまでは保証しないため、結果コードや取引イベントまで確認する設計が必要です。
特に移植時は、次のような処理を明確にします。
- 買いポジション保有中に売り条件が出たら、買いを決済するだけか
- 決済直後に売りエントリーまで行うのか
- ネットティング口座で、反対注文を何ロット出すのか
- 部分決済後に残るポジションをどう管理するか
- マジックナンバーごとのポジションをどう識別するか
- 発注成功の判定を、戻り値だけで終わらせず結果コードまで確認するか

MT5へ移植する前に、反対注文・部分決済・両建てを口座方式に合わせて再設計します。
関数と配列の向きをMT5用に見直す
注文処理の次に確認したいのが、価格取得や配列の扱いです。
MT4では、Bid、Ask、Digits、Pointなどの定義済み変数をそのまま使うコードが多くあります。MT5では、現在価格をMqlTick構造体やSymbolInfoDouble()で取得し、桁数やポイント値は_Digits、_Point、SymbolInfoInteger()などで扱う形へ見直します。
Bid・Ask・Digitsをそのまま置き換えない
MT5では、現在のBid・Askをまとめて取得できるSymbolInfoTick()を使う方法が分かりやすく、複数シンボルを扱うEAでも管理しやすくなります。
MqlTick tick;
if(!SymbolInfoTick(_Symbol,tick))
return;
double ask = tick.ask;
double bid = tick.bid;
int digits = (int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
移植元のEAが複数通貨ペアを扱う場合は、_Symbolだけで処理せず、対象シンボルごとに価格・桁数・最小ロット・ストップレベルなどを取得する必要があります。
配列の向きを明示しないと、参照する足がずれる
MT4の時系列データでは、一般的に[0]が現在足、[1]が1本前の確定足という感覚でコードを書くことが多くあります。
MT5でも時系列のように扱えますが、動的配列やCopyBuffer()で受け取る配列を、何も指定せずMT4と同じ感覚で読むと、古いデータと新しいデータを取り違える原因になります。
MT5では、使用する配列を時系列方向で読むのか、通常配列として読むのかをArraySetAsSeries()で明示し、[0]に何が入るかを統一しておくことが大切です。
配列処理で確認したいこと
- [0]を現在足として使うのか、直近の確定足として使うのか
- CopyBuffer()でコピーした値を、どのインデックスから読むのか
- ArraySetAsSeries()を使う配列と、通常配列のまま使う配列を分けているか
- 現在足で一時的に成立したシグナルを使うのか、確定足で判定するのか
インジケーターはハンドルを作ってから値を取得する
MT4からMT5へ移植するときに、コードの書き換え量が増えやすいのがインジケーター部分です。
MT4では、iMA()やiRSI()へシフト番号まで指定し、その場でインジケーター値を取得するコードを書けます。
MT5のiMA()やiRSI()は、基本的に値ではなくインジケーターハンドルを返します。まずOnInit()でハンドルを作成し、その後CopyBuffer()で必要なバーの値を読み込む2段階の処理になります。
MT5での移植イメージ
int maHandle = INVALID_HANDLE;
int OnInit()
{
maHandle = iMA(_Symbol,PERIOD_CURRENT,20,0,MODE_EMA,PRICE_CLOSE);
if(maHandle == INVALID_HANDLE)
return(INIT_FAILED);
return(INIT_SUCCEEDED);
}
bool GetClosedBarMA(double &maValue)
{
double maBuffer[];
ArraySetAsSeries(maBuffer,true);
// start_pos=1:直近の確定足
if(CopyBuffer(maHandle,0,1,1,maBuffer) != 1)
return(false);
maValue = maBuffer[0];
return(true);
}
void OnDeinit(const int reason)
{
if(maHandle != INVALID_HANDLE)
IndicatorRelease(maHandle);
}
この例では、20期間EMAのハンドルをOnInit()で作り、CopyBuffer()で直近の確定足の値を取得しています。
移植時は、インジケーターの値だけでなく、ハンドル作成に失敗した場合、必要なヒストリーがまだ準備できていない場合、CopyBuffer()が必要な本数を返さない場合の処理も入れておくと安定しやすくなります。

MT5では、インジケーターを作成する処理と値を取得する処理を分けて実装します。
MT5で作ったEAはMT4では動かない
MT4からMT5への移植はできますが、逆互換性はありません。
MT5用に作成・コンパイルしたmq5・ex5は、MT4では実行できません。MT4で使う場合は、MT4向けにmq4として別途コードを管理し、ex4としてコンパイルする必要があります。
MT4版とMT5版の両方を配布・販売する場合は、片方を修正したときにもう片方へ反映漏れが出ないよう、機能差とバージョン管理の方法も決めておくことが大切です。

MT5へ移植するメリットはバックテスト環境にもある
MT5への移植は、コードを書き換える作業だけが目的ではありません。移植後は、MT5のストラテジーテスターを使って、より条件に近い検証を行いやすくなります。
複数通貨ペア・複数銘柄を使うEAを検証できる
MT5のストラテジーテスターは、複数シンボルを使って売買するEAのテストに対応しています。
たとえば、EURUSDのシグナルを見ながらUSDJPYを取引するEA、複数通貨ペアの相関を使うEA、複数銘柄のポジション数をまとめて制御するEAなども、MT5ではテスト対象にできます。
履歴スプレッドや実ティックを使った確認ができる
MT5のテスターでは、ヒストリカルデータに含まれるスプレッドを使って検証できます。また、ブローカーが保有する実ティックデータがある場合は、実ティックを使ったテストも選択できます。
スキャルピング、ナンピン、短時間の利確・損切り、スプレッドフィルターなど、約定価格やスプレッドの影響を受けやすいEAでは、移植後にテスト条件を見直す意味があります。

MT5への移植後は、複数シンボルや履歴データを使った検証を行いやすくなります。
MT4Orders.mqhを使う方法もあるが、万能な移植方法ではない
MT4の注文処理を多く使っているEAでは、MQL5 Code Baseで公開されているMT4Orders.mqhのようなラッパーライブラリを使い、MT4に近い注文関数で処理する方法もあります。
この方法は、MT4形式の注文処理をMT5のヘッジング環境で扱いたい場合に、注文関連コードの書き換えを減らせることがあります。
ただし、MT4Orders.mqhは注文システムを補助するためのライブラリです。配列の向き、インジケーターハンドル、Bid・Askの取得、チャートオブジェクト、ファイル処理などまで、すべてを自動変換するものではありません。

MT4からMT5へ移植するときのチェックリスト
移植前に次の項目を確認しておくと、コンパイルが通った後に「動作が変わった」「決済方法が想定と違う」といった問題を減らしやすくなります。
- 移植先口座がネットティングかヘッジングかを確認した
- 反対注文時に、決済・ドテン・両建てのどれを行うか決めた
- ナンピン・部分決済・複数ポジションの処理を見直した
- Bid・Ask・桁数・ポイント値の取得方法をMT5向けに変更した
- CopyBuffer()で取得する配列の向きを確認した
- 現在足と確定足のどちらを使うか確認した
- iMA()、iRSI()などのハンドル作成・解放処理を実装した
- 注文結果のretcodeや取引イベントを確認する処理を入れた
- MT5のテスターで、移植前後の動作を比較した
- 販売・配布用なら、MT4版とMT5版のバージョン管理方法を決めた
EA制作を依頼する前に、ロジックや仕様を整理したい方は次の記事もご覧ください。


MT5 EAへの移植について相談する
「MT4のEAをMT5へ移植したい」「ネットティング口座向けに注文処理を作り直したい」「mq4のソースコードはあるが、どこまで修正が必要か知りたい」といった相談に対応しています。
mq4のソースコード、現在のEAの動作、使いたいブローカー口座、移植後に追加したい機能などを確認し、MT5向けに必要な修正範囲を整理します。
よくある質問
- mq4の拡張子をmq5へ変えるだけでMT5用になりますか?
-
なりません。MQL4とMQL5では、注文処理、インジケーターの取得、価格情報、配列、イベント処理などに違いがあります。mq4のソースコードをもとに、MT5の仕様へ合わせて修正・テストする必要があります。
- MT5用のEAをMT4でも使えますか?
-
使えません。MT5用のmq5・ex5はMT4では実行できません。MT4とMT5の両方で使う場合は、それぞれの環境に合わせたmq4・mq5を管理する必要があります。
- MT4版と同じロジックなら、MT5でも同じバックテスト結果になりますか?
-
必ずしも同じにはなりません。口座方式、スプレッド、価格データ、ティック生成、注文の約定処理、現在足と確定足の扱いなどによって結果は変わる可能性があります。移植後はMT5のテスターで動作と取引内容を確認してください。
- MT4Orders.mqhを使えば、すべて自動で移植できますか?
-
いいえ。MT4Orders.mqhは主に注文処理をMT4に近い形で扱うためのライブラリです。配列、インジケーター、価格取得、口座方式、テストなどは別途MT5向けに確認・修正する必要があります。
まとめ
MT4のEAをMT5へ移植するときは、関数名を置き換える前に注文処理を確認することが重要です。
- MT5のネットティング口座では、同じ銘柄の注文が1つのポジションへ統合される
- 両建て、ナンピン、部分決済、反対注文の動作を口座方式に合わせて見直す
- Bid・Ask・桁数・配列の向きは、MT5の仕様に合わせて修正する
- iMA()やiRSI()はハンドル作成とCopyBuffer()による値取得へ変更する
- MT5の複数シンボル・履歴スプレッド・実ティックを活かして、移植後に再検証する
- MT5用のmq5・ex5はMT4では動かないため、両対応する場合は別々に管理する
MT4版のEAがある場合は、mq4のソースコードと現在の注文管理を確認したうえで、MT5向けの口座方式・検証環境に合わせて移植を進めてください。
“`