MQL4 エラーコード一覧|GetLastError・取引エラー・リトライの書き方

MQL4 のエラーコードは、GetLastError() で取り出す整数です。公式の一覧(docs.mql4.com)には、161 個の定数が載っています。0〜150 が取引サーバーの返す番号、4000 以降がプログラムの実行中に出る番号です。注文が通らないときは、OrderSend() の戻り値が -1 になり、そのあとで GetLastError() を読むと原因の番号が分かります。この記事では、番号の取り出し方、範囲ごとの数、取引エラーの扱い、やり直しと発注前の確認のサンプル、コンパイルエラーの読み方をまとめました。サンプル 4 本は、MetaEditor(ビルド 5.0.0.2418)で 0 エラー・0 警告でした。

目次

MQL4 エラーコードの取り出し方|GetLastError と ResetLastError

ResetLastError、OrderSend、GetLastError、ErrorDescriptionの順にエラー番号を取り出す流れを4つの箱で示した図
出典: 公式の関数の説明(docs.mql4.com)と MT4 の stdlib.mqh をもとに作った流れ図。

GetLastError の戻り値と、読んだあとの動き

GetLastError() は、直前に起きたエラーの番号を int で返す関数です。公式の説明には、呼び出したあとは内部の変数 _LastError が 0 に戻ると書かれています。同じ番号を 2 回読むことはできないので、読んだ値はすぐ変数に入れて、ログと分岐の両方に使います。

ResetLastError で番号を 0 に戻す

ResetLastError() は、戻り値のない関数で、_LastError を 0 にします。発注の直前に呼んでおくと、その前の処理で残っていた番号と、今回の失敗が混ざりません。

ErrorDescription で説明文にする

番号を人が読める文にするのが、ErrorDescription() です。MT4 に付いてくる stdlib.mqh の関数なので、ソースの先頭に #include <stdlib.mqh> が必要です。返る文は英語です。この行を書かずに呼ぶと、コンパイルで 168(関数が定義されていない)になります。下のサンプルは、発注の前にリセットし、失敗したときだけ番号を読んでログに出します。

#property strict
#include <stdlib.mqh>

void SafeOrderSend()
{
	ResetLastError(); // 直前までのエラーを消す
	int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Test", 12345, 0, clrBlue);
	if(ticket < 0)
	{
		int err = GetLastError(); // 読むと0に戻るので、変数に入れてから使う
		Print("注文失敗: ", err, " ", ErrorDescription(err));
	}
	else
	Print("注文成功: ticket=", ticket);
}

MQL5 では、取引の結果が TRADE_RETCODE_* という別の番号で返ります。違いは、MQL5 の公式の取引サーバーの戻りコードの一覧で確かめられます。この記事は MQL4 の番号だけを扱います。

アドバイス

GetLastError は、読むと 0 に戻るよ。変数に入れてから使おうね。

MQL4 エラーコードの一覧|番号の範囲と数

公式一覧の161個のエラーコードを、0〜150や4000番台など8つの範囲に分けた個数を並べた棒グラフ
出典: 公式のエラーコード一覧(docs.mql4.com)の表の行を、番号の範囲で数えた個数。

範囲ごとの読み方

公式のエラーコードの一覧の表を数えると、定数は 161 個ありました。0〜150 の 32 個は、取引サーバーが返す番号です。4000 以降は、プログラムの実行中に出る番号で、4000〜4030 が 31 個、4050〜4075 が 26 個、4099〜4112 が 14 個です。そのあとに、オブジェクトとチャートの 4200〜4220 が 13 個、通知と FTP の 4250〜4266 が 11 個、ファイル操作の 5001〜5029 が 29 個、5200〜5203 と 65536 が 5 個と続きます。

「エラーなし」を表す番号は 2 つある

一覧の説明文が「No error returned」になっている番号は、0(ERR_NO_ERROR)と 4000(ERR_NO_MQLERROR)の 2 つです。1(ERR_NO_RESULT)は「エラーはないが、結果が分からない」という意味で、0 とは別です。1 が返ったときの扱いは、自分のプログラムで決めておきます。

5200〜5203 は WebRequest の番号で、65536(ERR_USER_ERROR_FIRST)は、自分で決めるエラー番号の始まりです。配列の番号は MQL4 の配列関数の記事、チャートの番号は MQL4 のチャート操作の記事もあわせて見てください。

アドバイス

161 個のうち、取引の番号は 32 個だよ。まずはそこから覚えよう。

MQL4 エラーコード 0〜150|取引サーバーが返す番号

発注でよく出る取引エラー11個の番号と意味を、サンプルでやり直す番号と打ち切る番号に分けて並べた表
出典: 公式のエラーコード一覧(docs.mql4.com)の番号と意味に、この記事のサンプルでの扱いを足した表。

やり直す番号と打ち切る番号

図の右の列は、この記事のサンプルでの扱いです。公式の一覧には、番号の意味は書かれていても、やり直すかどうかの指示は書かれていません。「やり直す」は、4(サーバーがビジー)・6(接続できない)・8(リクエストが多すぎる)・135(価格が変わった)・136(提示価格がない)・137(ブローカーがビジー)・138(リクオート)・146(取引スレッドが使用中)の 8 個で、この記事の書き手が決めたものです。待てば状況が変わりそうな番号を選んでいます。

129(価格が正しくない)・130(SL/TP が近すぎる)・134(証拠金が足りない)は、そのまま送り直しても同じ結果になるので、打ち切ります。128(取引がタイムアウト)は、注文が通ったかどうかが分からないため、サンプルではやり直しに入れていません。送り直す場合は、先に OrderSelect() でマジックナンバーが同じ自分の注文が残っていないかを確かめます。

OrderSend の説明に出てくる番号

OrderSend() は、成功するとチケット番号、失敗すると -1 を返します。公式の説明には、番号が出る場面が書かれています。要求した価格が価格の流れにない、または桁数に合わせていないと 129。価格が古すぎると 138。SL/TP が市場に近すぎる、または桁数に合わせていないと 130。予約注文の有効期限をサーバーが使えないと 147。注文の数が上限を超えると 148 です。MODE_STOPLEVEL が 0 の場合は、制限が無いか、サーバーが外部の仕組みで動的に決めているかのどちらかで、後者では 130 が返ることがある、とも書かれています。

図に載せなかった番号

番号定数意味
1ERR_NO_RESULTエラーなし、結果は不明
2ERR_COMMON_ERROR一般的なエラー
3ERR_INVALID_TRADE_PARAMETERS取引の引数が正しくない
128ERR_TRADE_TIMEOUT取引がタイムアウト
131ERR_INVALID_TRADE_VOLUME数量が正しくない
139ERR_ORDER_LOCKED注文がロックされている
141ERR_TOO_MANY_REQUESTSリクエストが多すぎる
145ERR_TRADE_MODIFY_DENIED市場に近すぎて変更できない
147ERR_TRADE_EXPIRATION_DENIED有効期限が使えない
148ERR_TRADE_TOO_MANY_ORDERS注文の数が上限に達した
149ERR_TRADE_HEDGE_PROHIBITED両建てが禁止されている
150ERR_TRADE_PROHIBITED_BY_FIFOFIFO の規則に反する
出典: 公式のエラーコード一覧(docs.mql4.com)。意味は一覧の英語の説明を訳した。

表の「番号」は GetLastError() の戻り値、「定数」は MQL4 にあらかじめ用意された名前、「意味」は公式の説明の訳です。140(買いだけ許可)もあります。自分の口座で出た番号は、公式の一覧と照らして読みます。

アドバイス

やり直す番号は、待てば変わるものだけだよ。128 は通ったか分からないから、先に注文を確かめようね。

MQL4 エラーコード 4109・133・7|発注が通らない番号の違い

発注が通らないときに出る7つの番号(7・132・133・4109・4110・4111・4112)と意味を並べた表
出典: 公式のエラーコード一覧(docs.mql4.com)の番号と意味を、似た意味のものにしぼって並べた表。

EA の設定で止まる 4109・4110・4111

4109(ERR_TRADE_NOT_ALLOWED)の公式の説明は「Enable checkbox “Allow live trading” in the Expert Advisor properties」で、EA のプロパティの、自動売買を許可するチェックを入れる、という意味です。4110 は買い、4111 は売りが、EA のプロパティで許可されていない場合です。この 3 つは、EA を付けるときの設定画面で直せます。4109 は 4 とは別の番号で、4 は取引サーバーがビジーのときの番号です。

サーバー側で止まる 7・132・133・4112

7(ERR_NOT_ENOUGH_RIGHTS)は権限が足りない、132 は市場が閉じている、133(ERR_TRADE_DISABLED)は取引が無効になっている場合です。4112 は、取引サーバーが EA とスクリプトによる自動売買を止めている場合で、公式の説明は「Automated trading by Expert Advisors/Scripts disabled by trade server」です。どの場面でどの番号が出るかは、公式の説明の範囲までしか確かめていません。

番号から原因をしぼる順番

4109・4110・4111 が出たら EA のプロパティを、132 なら時間帯を、133・4112・7 なら口座とサーバー側の設定を見ます。発注の前に、プログラム側で許可の状態を確かめる書き方は、次の節にまとめています。

アドバイス

4109 から 4111 は EA の設定、133 と 4112 はサーバー側の止まり方だよ。

MQL4 エラーコードを減らす書き方|発注前の確認とやり直し

IsTradeContextBusy、IsTradeAllowed、AccountFreeMarginCheck、OrderSend、GetLastErrorの順に発注前に確かめる流れ図
出典: 公式の各関数の説明(docs.mql4.com)をもとに作った、発注前に確かめる順番の図。

発注の前に確かめる 3 つ

IsTradeContextBusy() は、取引スレッドが別の EA に使われていると true を返します。IsTradeAllowed() は、EA が取引を許可されていて、かつ取引スレッドが使われていないと true です。つまり、IsTradeAllowed() の false には、許可がない場合と、スレッドが使用中の場合があります。そのため、サンプルでは先にスレッドが空くまで待ち、そのあとで許可を確かめています。最後の AccountFreeMarginCheck() は、その注文を出したあとに残る余剰証拠金を返し、足りないときは 134 を発生させます。

#property strict
#include <stdlib.mqh>

// 取引スレッドが空くまで待つ(timeoutSeconds 秒で打ち切り)
bool WaitForTradeContext(int timeoutSeconds = 30)
{
	datetime startTime = TimeCurrent();
	while(IsTradeContextBusy())
	{
		if(TimeCurrent() - startTime > timeoutSeconds)
		{
			Print("取引スレッドが空きませんでした");
			return false;
		}
		Sleep(100);
	}
	return true;
}

// 発注の前に確かめる3つ: 取引スレッド、自動売買の許可、証拠金
bool PreOrderCheck(int cmd, double lots)
{
	if(!WaitForTradeContext())
	return false;
	if(!IsTradeAllowed())
	{
		Print("自動売買が許可されていません");
		return false;
	}

	ResetLastError();
	double freeAfter = AccountFreeMarginCheck(Symbol(), cmd, lots);
	if(freeAfter <= 0 || GetLastError() == ERR_NOT_ENOUGH_MONEY)
	{
		Print("証拠金が足りません");
		return false;
	}
	return true;
}

やり直し付きの発注

やり直しは、ループの中で、毎回 RefreshRates() で価格を新しくし、NormalizeDouble() で桁数にそろえて送ります。失敗したら番号を読み、前の節の 8 個ならもう一度、それ以外は打ち切ります。待つ時間は、1 回目が 1 秒、2 回目が 2 秒と 1 秒ずつ延ばします。この回数と待ち時間は、サンプルで決めた値です。

#property strict
#include <stdlib.mqh>

// このサンプルで「やり直す」と決めたエラー
bool IsRetryable(int err)
{
	switch(err)
	{
		case ERR_SERVER_BUSY: // 4
		case ERR_NO_CONNECTION: // 6
		case ERR_TOO_FREQUENT_REQUESTS: // 8
		case ERR_PRICE_CHANGED: // 135
		case ERR_OFF_QUOTES: // 136
		case ERR_BROKER_BUSY: // 137
		case ERR_REQUOTE: // 138
		case ERR_TRADE_CONTEXT_BUSY: // 146
		return true;
	}
	return false;
}

// 成行の買い・売りをやり直し付きで出す(成功したらチケット、失敗は -1)
int OrderSendRetry(int cmd, double lots, int slippage,
	double sl, double tp, string comment, int magic,
	int maxRetry = 5)
{
	for(int retry = 0; retry < maxRetry; retry++)
	{
		ResetLastError();
		RefreshRates(); // 最新の Ask/Bid にそろえる
		double price = (cmd == OP_BUY) ? Ask : Bid;
		price = NormalizeDouble(price, Digits);

		int ticket = OrderSend(Symbol(), cmd, lots, price, slippage,
			sl, tp, comment, magic, 0, clrNONE);
		if(ticket >= 0)
		return ticket;

		int err = GetLastError();
		Print("注文失敗(", retry + 1, "/", maxRetry, "): ", err, " ", ErrorDescription(err));

		if(!IsRetryable(err))
		return -1; // 対象外のエラーは打ち切る
		Sleep(1000 * (retry + 1)); // 待つ時間を1秒ずつ延ばす
	}
	Print("やり直しの上限に達しました");
	return -1;
}

ストップ幅の確認と決済のログ

130 を避けるには、SL/TP が現在値から MODE_STOPLEVEL(点数)× Point 以上離れているかを、発注の前に確かめます。MarketInfo() に MODE_STOPLEVEL を渡すと、最小の距離が点数で返ります。決済は OrderClose() が false を返したときに、番号と説明をログに残します。口座や相場の取り方は 口座情報と相場情報の記事、EA 全体の作り方は EA の作り方の記事にあります。

#property strict
#include <stdlib.mqh>

// 買いの成行で、損切り・利確が現在値から StopLevel 以上離れているか
bool StopsFarEnough(double sl, double tp)
{
	double minDist = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
	if(sl > 0 && Bid - sl < minDist)
	return false;
	if(tp > 0 && tp - Bid < minDist)
	return false;
	return true;
}

// 成行の注文を決済し、失敗したらエラーを残す
void CloseWithLog(int ticket)
{
	if(!OrderSelect(ticket, SELECT_BY_TICKET))
	{
		Print("OrderSelect 失敗: ", GetLastError());
		return;
	}
	double price = (OrderType() == OP_BUY) ? Bid : Ask;
	ResetLastError();
	if(!OrderClose(ticket, OrderLots(), price, 3, clrNONE))
	{
		int err = GetLastError();
		Print("OrderClose 失敗: ", err, " ", ErrorDescription(err));
	}
}
アドバイス

先にスレッド、次に許可、最後に証拠金の順だよ。この順だと、IsTradeAllowed の false の意味が 1 つに決まるね。

MQL4 エラーコード(コンパイル)|出た番号の読み方

わざと間違えた18行のコードをコンパイルして出た番号8個を、エラーと警告に分けて出た順に並べた表
出典: 自社の測定。わざと間違えた 18 行のコードを MetaEditor 5.0.0.2418 でコンパイルした結果。

実際に出た番号

コンパイルの番号は、GetLastError() の番号とは別の体系です。公式には、コンパイルエラーが 268 個、コンパイルの警告が 63 個、それぞれ載っています。図の 18 行のコードには、宣言していない変数・定義していない関数・セミコロンの抜け・OrderSend() の引数不足・値を返さない分岐・小数の定数の int への代入・数値の string への代入・使っていない変数を入れました。結果は 5 エラー・3 警告で、番号は図のとおりです。

番号の読み方で気づいたこと

10 行目の末尾のセミコロンを抜くと、エラーは 11 行目に出て、152(演算子が必要)と 168(関数が定義されていない)の 2 つが同じ行に並びました。エラーの行が、原因の 1 行あとになることがあります。公式のエラーの一覧には 181(数値から string への暗黙の変換)が載っていますが、このビルドでは警告として出ました。

配列 int arr[3] に arr[5] = 1; と書いた行は、コンパイルでは何も出ませんでした。範囲外の添字は、実行時の 4002(Array index is out of range)の対象です。実行はしていません。コンパイルが通っても、実行時のエラーは別に確かめます。

アドバイス

エラーの行は、1 行あとにずれることがあるよ。出た行の 1 つ前も見ようね。

MQL4 エラーコードの測定|公式の一覧と手元のヘッダの照合

公式一覧とMT4のstderror.mqhの照合、161個の定数のコンパイル、本文のサンプル4本の結果をまとめた表
出典: 自社の測定。MetaEditor 5.0.0.2418 と MT4 の stderror.mqh で、2026 年 10 月 29 日に測った結果。

測った条件

測ったのは 2026 年 10 月 29 日(日本時間)です。公式の一覧の表から、番号・定数・説明の 161 行を取り出しました。手元では、MT4 に付いてくる stderror.mqh から、定数 155 個の番号と名前を取り出しました。2 つを番号で突き合わせた結果、155 個は名前も一致し、番号の違いは 0 個でした。公式の 161 個の定数を並べたソースを MetaEditor 5.0.0.2418 でコンパイルすると、0 エラー・0 警告でした。

公式にだけある 6 個

番号定数意味
4112ERR_TRADE_EXPERT_DISABLED_BY_SERVERサーバーが自動売買を止めている
5200ERR_WEBREQUEST_INVALID_ADDRESSURL が正しくない
5201ERR_WEBREQUEST_CONNECT_FAILEDURL に接続できない
5202ERR_WEBREQUEST_TIMEOUT時間切れ
5203ERR_WEBREQUEST_REQUEST_FAILEDHTTP のリクエストが失敗
65536ERR_USER_ERROR_FIRST自分で決める番号の始まり
出典: 公式のエラーコード一覧(docs.mql4.com)と、手元の stderror.mqh の差。

公式の 161 個と手元の 155 個の差は、この 6 個です。表の「番号」は GetLastError() の戻り値、「定数」は定数の名前、「意味」は公式の説明の訳です。161 個を並べたソースは、stderror.mqh を読み込まなくてもコンパイルが通りました。手元のヘッダに無い 6 個も、コンパイラが最初から知っている定数です。ただし、サンプル 4 本は、コンパイルまでを確かめたもので、発注の実行は測っていません。サンプルは、デモ口座で動かして確かめてから使ってください。

アドバイス

公式の 161 個と手元の 155 個は、番号が全部同じだったよ。差は 4112・5200〜5203・65536 の 6 個だけ。

要点
・GetLastError() は、直前のエラー番号を返し、読むと 0 に戻る。発注の前に ResetLastError() を呼ぶ
・公式の一覧の定数は 161 個。0〜150 が取引サーバーの番号で 32 個
・やり直す番号は、サンプルでは 4・6・8・135・136・137・138・146 の 8 個。この選び方は、書き手の設計で、公式の指示ではない
・4109・4110・4111 は EA のプロパティ、133・4112・7 はサーバー側や権限が原因
・IsTradeAllowed() の false には、スレッド使用中も含まれるので、先に IsTradeContextBusy() で待つ
・測ったのは、公式の一覧と stderror.mqh の照合(155 個の番号の違い 0)と、サンプル 4 本のコンパイル。発注の実行は測っていない

MQL4 エラーコードのよくある質問

GetLastError() は何を返しますか?

直前のエラー番号を int で返します。失敗が無ければ 0 です。

エラー 4109 は何ですか?

EA のプロパティで、自動売買の許可が外れています。ERR_TRADE_NOT_ALLOWED の番号です。EA を付けるときの画面でチェックを入れます。

ERR_INVALID_STOPS(130)が出たらどうしますか?

SL/TP の距離と桁数を確かめます。MarketInfo() の MODE_STOPLEVEL で最小の距離を調べ、価格は NormalizeDouble() で桁数にそろえます。

ERR_TRADE_CONTEXT_BUSY(146)はどうしますか?

取引スレッドが空くまで待ちます。IsTradeContextBusy() が false になってから、発注し直します。

ErrorDescription() がコンパイルで通りません。

stdlib.mqh を読み込んでいないためです。ソースの先頭に #include <stdlib.mqh> を書きます。書かないと 168 が出ます。

MQL5 でも同じ番号ですか?

取引の結果は別の番号です。MQL5 では TRADE_RETCODE_* が返ります。この記事の番号は MQL4 用です。

MQL4 エラーコードのまとめ

MQL4 のエラーコードは、発注の前に ResetLastError() を呼び、失敗したら GetLastError() を変数に入れて読み、ErrorDescription() で説明にします。公式の一覧は 161 個で、取引の番号は 0〜150 の 32 個です。やり直す番号と打ち切る番号を分け、IsTradeContextBusy()・IsTradeAllowed()・AccountFreeMarginCheck() で、発注の前に止めるのが、この記事のサンプルの考え方です。

測ったのは、公式の一覧と手元のヘッダの照合、サンプルと間違いコードのコンパイルまでです。発注の実行は測っていません。インジケーターの呼び出しは インジケーター関数の記事、OnTick などの流れは イベントハンドラの記事にまとめています。

この記事のサンプルは、発注と決済の処理を含む、プログラムの書き方の紹介です。特定の取引をすすめるものではありません。FXには価格変動のリスクがあり、元本を超える損失が出ることもあります。動かすときはデモ口座で確かめ、取引は自己責任で行ってください。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

\シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM 記事下バナー
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
\1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次