`GetLastError()`が返す「130」や「4051」のような数字を見ても、
公式リファレンスのどこを見れば意味が分かるのか迷った、
という経験はないでしょうか。
エラーコードは数百種類あり、
しかもMQL4とMQL5では体系そのものが一部異なります。
この記事では、エラーコードがどう分類されているか、
公式リファレンスでの調べ方、実務で頻出するコードの一覧、
MQL5だけに存在する「取引リターンコード」という別体系との違いまで解説します。
・エラーコードが「取引系」「実行時」などに分類されている仕組み
・公式リファレンスでの効率的な調べ方
・実務でよく遭遇するコードの一覧表
・MQL5の「取引リターンコード」という別体系との違い
エラーコードは1つの表ではなく複数のカテゴリに分かれている
まず、エラーコードの全体像を確認します。
MQL4のエラーコードは番号帯でカテゴリが分かれる
MQL4公式リファレンスのエラーコード一覧は、
番号の範囲でおおまかに分類されています。
| 番号帯 | カテゴリの傾向 |
|---|---|
| 0〜150程度 | 取引関連(発注・決済・サーバーとのやりとり) |
| 4000番台 | 実行時エラー(配列・変数・関数呼び出し等) |
| 5000番台 | ファイル操作関連 |
既刊記事との違い: 本記事は「一覧の読み方」が主題
既刊のGetLastError記事は、
エラーコードが自動でリセットされない仕様と、
ResetLastError()との正しい組み合わせ方を主題にしていました。
本記事はその仕様の説明は省き、
「巨大な一覧表をどう分類して読むか」に主題を絞ります。
数値だけでなく定数名(ERR_で始まる名前)で覚える
・ERR_NOT_ENOUGH_MONEY=134のように
・数値には対応する定数名が用意されている
・コード中では数値よりも定数名を使う方が読みやすい
MQL5は体系が違う: 取引リターンコードという別枠
MQL4から移行する人がつまずきやすい、MQL5特有の違いを確認します。
MQL5にも実行時エラー(GetLastErrorで取得)はある
MQL5の`GetLastError()`も、
配列範囲外やファイル操作失敗などの実行時エラーを、
int型で返す点はMQL4と同じです。
発注結果だけは「取引リターンコード」という完全に別の体系
・MQL5のOrderSend()は成功・失敗をTRADE_RETCODE_*という
・10000番台の別の定数で返す
・GetLastError()の番号帯(0〜4000台)とは重複しない別表として扱う
MQL4のOrderSendとMQL5のOrderSendは戻り値の意味が違う
MQL4のOrderSend()は成功時にチケット番号、
失敗時に-1を返し、原因はGetLastError()で確認します。
MQL5のOrderSend()は構造体(MqlTradeResult)の、
`retcode`メンバーに、
TRADE_RETCODE_*の値を直接格納する設計です。
実務でよく出るエラーコード一覧表
既刊記事群で実際に遭遇したものを中心に、
カテゴリ別に整理します。
MQL4: 取引関連
| 定数名 | 番号 | 意味 |
|---|---|---|
| ERR_INVALID_PRICE | 129 | 価格が不正(リクオート等で古くなった) |
| ERR_INVALID_STOPS | 130 | 損切り・利確がブローカーの最小距離未満 |
| ERR_MARKET_CLOSED | 132 | 市場が閉場している |
| ERR_TRADE_DISABLED | 133 | 取引が無効化されている |
| ERR_NOT_ENOUGH_MONEY | 134 | 証拠金不足 |
| ERR_REQUOTE | 138 | リクオート発生 |
| ERR_TRADE_CONTEXT_BUSY | 146 | 別の取引処理が実行中 |
MQL4: 実行時・ファイル関連
| 定数名 | 番号 | 意味 |
|---|---|---|
| ERR_ARRAY_INDEX_OUT_OF_RANGE | 4002 | 配列の範囲外アクセス |
| ERR_NOT_INITIALIZED_ARRAY | 4016 | 初期化されていない配列を参照 |
| ERR_CANNOT_OPEN_FILE | 4103 | ファイルを開けない |
| ERR_UNKNOWN_SYMBOL | 4106 | 存在しない通貨ペア名を指定 |
MQL5: 取引リターンコード(発注結果の別体系)
| 定数名 | 番号 | 意味 |
|---|---|---|
| TRADE_RETCODE_DONE | 10009 | リクエストが完了した(成功) |
| TRADE_RETCODE_REQUOTE | 10004 | リクオート発生 |
| TRADE_RETCODE_REJECT | 10006 | リクエストが却下された |
| TRADE_RETCODE_MARKET_CLOSED | 10018 | 市場が閉場している |
| TRADE_RETCODE_NO_MONEY | 10019 | 証拠金不足 |
| TRADE_RETCODE_PRICE_CHANGED | 10020 | 価格が変更された |
実際に動くコード全体(カテゴリ別にエラーを分類して出力)
番号帯からカテゴリ名を判定し、
ログに出し分けるMQL4のサンプルです。
//+------------------------------------------------------------------+
//| ErrorCodeCategoryDemo.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| 番号帯からおおまかなカテゴリ名を判定する |
//+------------------------------------------------------------------+
string ErrorCategory(int code)
{
if(code == 0)
return("エラーなし");
if(code >= 1 && code <= 150)
return("取引関連(発注・決済・サーバー)");
if(code >= 4000 && code <= 4999)
return("実行時エラー(配列・変数・関数呼び出し等)");
if(code >= 5000 && code <= 5999)
return("ファイル操作関連");
return("未分類(公式リファレンスで個別に確認してください)");
}
void OnStart()
{
ResetLastError();//直前のエラー状態をクリアしてから
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3,
Ask - 200 * Point, Ask + 200 * Point,
"ErrorCodeDemo", 1234, 0, Red);
if(ticket < 0)
{
int code = GetLastError();
Print("発注に失敗しました。コード=", code,
" カテゴリ=", ErrorCategory(code));
}
}
MetaEditorでのコンパイル・実行手順
実際にMT4で動かすまでの手順です。
- MetaEditorで新規スクリプト「ErrorCodeCategoryDemo」を作成し、上のコードを貼り付けてコンパイルする
- デモ口座のチャートへドラッグ&ドロップで実行する
- 「エキスパート」タブに出力されたコードとカテゴリ名を確認する
- StopLoss・TakeProfitの値を極端に近い値へ変更し、ERR_INVALID_STOPS(130)が「取引関連」に分類されることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
番号帯による分類はあくまで目安
・番号帯での分類は「おおまかな当たりをつける」ためのもの
・正確な意味は必ず公式リファレンスで確認する
・将来のバージョンでコードが追加・変更される可能性もある
MQL4とMQL5のエラーコードを混同しない
MQL4の130(ERR_INVALID_STOPS)という数字が、
MQL5の同じ130番に対応しているとは限りません。
必ず該当する言語のリファレンスで確認してください。
取引リターンコードはGetLastError()では取得できない(MQL5)
MQL5で発注が失敗した原因は、
`GetLastError()`ではなく、
`OrderSend()`に渡した`MqlTradeResult`構造体の、
`retcode`メンバーを確認してください。
よくある質問
エラーコード一覧について、よくある疑問に回答します。
エラーコードを全部覚える必要がありますか?
必要ありません。実務では頻出する数個の意味を覚えておき、
それ以外はPrint()でコードを出力してから、
公式リファレンスで都度調べる運用で十分です。
数値と定数名、どちらでコードを書くべきですか?
定数名(ERR_で始まる名前)を使うことをおすすめします。
数値だけだと、コードを読んだときに何のエラーか分からず、
毎回リファレンスを調べ直す手間が増えます。
GetLastError()の仕様自体はこの記事で分かりますか?
エラーコードが自動でリセットされない仕様や、
ResetLastError()との正しい組み合わせ方は、
既刊記事で詳しく解説しています。
本記事はその前提知識を踏まえた「一覧表の読み方」が主題です。
【MQL】エラーコード一覧の読み方(GetLastError()と組み合わせた調べ方、MQL4/MQL5の違い):まとめ
エラーコードは番号帯でおおまかなカテゴリに分かれており、
取引関連・実行時・ファイル操作関連を見分けられると調べる手間が減ります。
MQL5では発注結果だけが「取引リターンコード」という、
完全に別の10000番台の体系で管理されている点が、
MQL4からの移行で特につまずきやすいポイントです。
すべてを覚える必要はなく、頻出コードの意味を押さえつつ、
残りは公式リファレンスで都度調べる運用で十分実務に対応できます。
コメント