「MQL4 error 130」「OrderSend error 134」などのエラーで EAが動かず困っていませんか?
EA(エキスパートアドバイザー)を作成していると、必ず遭遇するのが MQL4 のエラーコードです。
特に初心者がつまずきやすいのは、注文に直結する以下のエラーです。
- 129:Invalid Price(無効な価格)
- 130:Invalid Stops(無効なストップレベル)
- 131:Invalid Trade Volume(無効なロットサイズ)
- 134:Not Enough Money(証拠金不足)
本記事では、これらの代表的なエラーの原因と具体的な解決方法をわかりやすく整理しました。
「エラーで取引が通らない…」と困ったときに役立つ内容です。
代表的なエラーコード一覧
以下は MQL4 でよく出る主要なエラーコードと対処法のまとめです。
| コード | エラー名 | 内容(日本語) | 対処法 |
|---|---|---|---|
| 129 | ERR_INVALID_PRICE | 無効な価格で注文しようとした | 注文の価格は正しく指定する |
| 130 | ERR_INVALID_STOPS | ストップロスや指値注文が価格に近すぎる | StopLevelやSpreadを考慮して設定値を広げる |
| 131 | ERR_INVALID_TRADE_VOLUME | 無効なロットサイズ | ブローカーの最小ロット/ステップに合わせる |
| 132 | ERR_MARKET_CLOSED | 市場がクローズしている | 取引可能時間を確認する |
| 133 | ERR_TRADE_DISABLED | 取引が無効 | 口座やサーバーの設定を確認する |
| 134 | ERR_NOT_ENOUGH_MONEY | 証拠金不足 | ロット数を減らす / 証拠金を増やす |
| 4107 | ERR_INVALID_PRICE_PARAM | 価格指定が不正 | Ask/Bidの取得タイミングを見直す |
エラー129:Invalid Price(無効な価格)
内容
無効な価格 を指定して注文しようとした場合に出るエラーです。
たとえば OrderSend() で指定した price が、現在のBid/Askやブローカーのルールに合っていないケース。
原因
- 成行注文で不正な価格を指定
- Buyなのに
Bidを指定している - Sellなのに
Askを指定している
- Buyなのに
- 指値注文(Pending Order) の条件違反
- BuyLimitがAskより上の価格で設定されている
- SellLimitがBidより下で設定されている
- 小数点桁数のズレ
NormalizeDouble(price, Digits)をしていないため、価格桁数が合わない
解決方法
1.成行注文の価格は正しく指定する
- Buy →
Ask - Sell →
Bid
if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, "buy order", Magic, 0, clrBlue) < 0)
Print("エラー: ", GetLastError());
2.指値注文の条件を守る
- BuyLimit →
Askより下の価格 - BuyStop →
Askより上の価格 - SellLimit →
Bidより上の価格 - SellStop →
Bidより下の価格
double price = Ask - 50 * Point; // BuyLimitなら必ずAskより下エラー130:Invalid Stops(無効なストップレベル)
内容
ストップロスや指値注文を「現在価格に近すぎる値」で設定したときに出るエラーです。
原因
- ブローカーごとに「StopLevel(最小ストップ距離)」が決められている
- スプレッドが広いと、許容範囲を超えてしまう
解決方法
MarketInfo(Symbol(), MODE_STOPLEVEL)で最小距離を取得する- パラメータ入力時に自動調整する
int stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
double minStop = stopLevel * Point;StopLevel や価格条件が複雑な場合は、 デバッガを使って1行ずつ処理を追うことで 原因を正確に特定できます。
▶ MT4のEAをデバッグしてソースコードを1行ずつ確認する方法
エラー131:Invalid Trade Volume(無効なロットサイズ)
内容
ロットサイズ(Lots)がブローカーの条件に合っていないと出るエラーです。
原因
- 最小取引ロット未満(例:0.01未満)
- ロットステップに合っていない(例:0.03は不可で、0.01刻みのみ)
解決方法
MarketInfo(Symbol(), MODE_MINLOT)で最小ロットを取得MODE_LOTSTEPで刻み幅を確認
以下の関数を使うと、ロットを調整してくれるのでロットチェックの面で便利です。
//+------------------------------------------------------------------+
//| 指定ロットをブローカー条件に合わせて調整する関数 |
//| lot:希望ロット数 |
//| return:調整後のロット数 |
//+------------------------------------------------------------------+
double AdjustLot(double lot)
{
double minLot = MarketInfo(Symbol(), MODE_MINLOT); // 最小ロット
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP); // ロット刻み幅
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT); // 最大ロット
// 最小ロット未満の場合は最小ロットに合わせる
if(lot < minLot)
lot = minLot;
// 最大ロット超過の場合は最大ロットに合わせる
if(lot > maxLot)
lot = maxLot;
// ロット刻み幅に合わせて丸める
lot = MathFloor(lot / lotStep) * lotStep;
return NormalizeDouble(lot, 2); // 桁数は通常2桁でOK(必要に応じて変更)
}
// 使用例
double myLot = 0.037; // 希望ロット
double adjustedLot = AdjustLot(myLot); // ブローカー条件に合わせて調整
Print("調整後ロット数: ", adjustedLot);なお、XMのMT4でバックテスト時にエラー131が発生するケースについては、 以下の記事でより詳しく解説しています。
▶ XMのMT4を使ってEAのバックテストをすると「OrderSend error 131」が発生する原因
エラー134:Not Enough Money(証拠金不足)
内容
注文時に必要な証拠金が不足している場合に出ます。
バックテストで日本円に変えてチェックするとよく発生するエラーです。
▶ EAのバックテストを日本円(JPY)で行う方法はこちら
▶ 証拠金維持率からロット数を調整したい場合の処理
原因
- ロットサイズが大きすぎる
- レバレッジ不足
- 残高が少ない
解決方法
- ロット数を減らす
- レバレッジを上げる(ただしリスクも上がる)
- 証拠金を追加する
計算例(必要証拠金の目安):
double margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lots;
その他のエラー
ここで紹介した以外にも、MQL4には多くのエラーコードが存在します。 発生頻度は低いものの、実運用や検証環境によっては遭遇する可能性があります。
今回はよくあるエラーを取り上げました。全てのエラーを確認する場合は公式で確認しましょう。
※以下のサイトを日本語翻訳してください
❓ MQL4エラーに関するよくある質問【EA初心者向けFAQ】
💬 EA開発中によく出るエラー129・130・131・134について、初心者がつまずきやすい疑問をQ&A形式でまとめました。
MQL4のエラーコードは、MT4の「エキスパート」タブや「操作履歴」ログで確認できます。
OrderSend() が失敗した場合は、直後に GetLastError() を使うことで具体的なエラー番号を取得できます。
エラー129は、注文価格が現在の Bid / Ask や注文ルールに合っていない場合に発生します。
Buy注文でBidを指定したり、Sell注文でAskを指定している場合に特によく起こります。
エラー130は、ストップロスやテイクプロフィットが現在価格に近すぎる場合に発生します。
ブローカーごとに定められている StopLevel や、スプレッドの影響を考慮していないことが主な原因です。
エラー131は、指定したロットサイズがブローカーの取引条件に合っていない場合に発生します。
最小ロット未満、ロット刻み幅に合わない数値を指定しているケースが多いです。
バックテストでは、初期証拠金や通貨設定の影響でロット条件が変わることがあります。
特に XM のMT4バックテストでは、実口座と条件が異なりエラー131が発生しやすくなります。
エラー134は、注文時に必要な証拠金が不足していることを意味します。
ロット数が大きすぎる、レバレッジが低い、口座残高が少ない場合に発生します。
エラー134はEAのロジックエラーではなく、資金条件によるエラーです。
ロット計算や証拠金管理のロジックを見直すことで防げるケースが多いです。
まず GetLastError() でエラー番号を確認し、
次にブローカー仕様(StopLevel・最小ロット・証拠金条件)を確認します。
最後に Print() ログで変数の値を出力すると、原因を特定しやすくなります。
まとめ
以上、『MQL4エラーコード主要解説』でした。EAを開発している(動かしている)際にエラーに出くわした際は以下を思い出してください。
- MQL4でよく出るエラーは 129・130・131・134 の4つ
- 対処の基本は「ブローカー仕様を調べる」「パラメータを調整する」
- 解決できないときは エキスパート(操作履歴)ログを確認 して原因を特定するのが一番早い
エラー内容が分かっても解決できない場合は、 Print()ログを使ってEA内部の状態を確認すると、 どの条件・どの値で失敗しているかが一目で分かります。
▶ Print()でEAがエントリーしない原因を特定する方法
EAを開発する際には、「なぜそのエラーが出たか」を理解することが成長の近道 になります。エラーは「失敗」ではなく、EAの挙動を理解するための重要なヒントです。
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 【2025年最新】FX自動売買EAランキングも公開中!
当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。
EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!









コメント