初心者向けMQL4エラーコード解説|129・130・131・134の原因と解決方法

EA・MT4ノウハウ集
記事内に商品プロモーションを含む場合があります
スポンサーリンク

EA(エキスパートアドバイザー)を作成していると、必ず遭遇するのが MQL4 のエラーコードです。
特に初心者がつまずきやすいのは、注文に直結する以下のエラーです。

  • 129:Invalid Price(無効な価格)
  • 130:Invalid Stops(無効なストップレベル)
  • 131:Invalid Trade Volume(無効なロットサイズ)
  • 134:Not Enough Money(証拠金不足)

本記事では、これらの代表的なエラーの原因と具体的な解決方法をわかりやすく整理しました。
「エラーで取引が通らない…」と困ったときに役立つ内容です。

代表的なエラーコード一覧

以下は MQL4 でよく出る主要なエラーコードと対処法のまとめです。

コードエラー名内容(日本語)対処法
129ERR_INVALID_PRICE無効な価格で注文しようとした注文の価格は正しく指定する
130ERR_INVALID_STOPSストップロスや指値注文が価格に近すぎるStopLevelやSpreadを考慮して設定値を広げる
131ERR_INVALID_TRADE_VOLUME無効なロットサイズブローカーの最小ロット/ステップに合わせる
132ERR_MARKET_CLOSED市場がクローズしている取引可能時間を確認する
133ERR_TRADE_DISABLED取引が無効口座やサーバーの設定を確認する
134ERR_NOT_ENOUGH_MONEY証拠金不足ロット数を減らす / 証拠金を増やす
4107ERR_INVALID_PRICE_PARAM価格指定が不正Ask/Bidの取得タイミングを見直す

エラー129:Invalid Price(無効な価格)

内容

無効な価格 を指定して注文しようとした場合に出るエラーです。
たとえば OrderSend() で指定した price が、現在のBid/Askやブローカーのルールに合っていないケース。

原因

  • 成行注文で不正な価格を指定
    • Buyなのに Bid を指定している
    • Sellなのに Ask を指定している
  • 指値注文(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;

エラー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);

エラー134:Not Enough Money(証拠金不足)

内容

注文時に必要な証拠金が不足している場合に出ます。

バックテストで日本円に変えてチェックするとよく発生するエラーです。
EAのバックテストを日本円(JPY)で行う方法はこちら
証拠金維持率からロット数を調整したい場合の処理

原因

  • ロットサイズが大きすぎる
  • レバレッジ不足
  • 残高が少ない

解決方法

  • ロット数を減らす
  • レバレッジを上げる(ただしリスクも上がる)
  • 証拠金を追加する

計算例(必要証拠金の目安):

double margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lots;

その他のエラー

今回はよくあるエラーを取り上げました。全てのエラーを確認する場合は公式で確認しましょう。
※以下のサイトを日本語翻訳してください

【公式】MQL4 – ランタイムエラー集


まとめ

以上、『MQL4エラーコード主要解説』でした。EAを開発している(動かしている)際にエラーに出くわした際は以下を思い出してください。

  • MQL4でよく出るエラーは 129・130・131・134 の4つ
  • 対処の基本は「ブローカー仕様を調べる」「パラメータを調整する」
  • 解決できないときは エキスパート(操作履歴)ログを確認 して原因を特定するのが一番早い

EAを開発する際には、「なぜそのエラーが出たか」を理解することが成長の近道 になります。


✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまなFX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント