【即解決】MT4 OrderSend error 130/131/134の原因と直し方

MT4のOrderSend error130 131 134の原因と対処法を解説するアイキャッチ画像
EA・MT4ノウハウ集

MT4でOrderSend error 130 が出てエントリーできない。
「Invalid Stops」と表示されて原因が分からない。
OrderSend error 131 や 134 が出て注文が通らない。

MT4で「OrderSend error 130」や「MT4 error 130」と表示される場合、 これはMQL4のランタイムエラー130(ERR_INVALID_STOPS)を意味します。

これらは 価格指定・ストップ距離・ロット条件・証拠金 のいずれかが原因です。 まずは以下を確認してください。

  • 130 → StopLevel(最小ストップ距離)を満たしているか?
  • 131 → 最小ロット・ロット刻みに合っているか?
  • 134 → 証拠金は足りているか?

本記事では、よく出るエラー129・130・131・134の原因と具体的な直し方を実例コード付きで整理します。

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

以下は 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(無効なストップレベル)

内容

MT4で「OrderSend error 130(Invalid Stops)」と表示される場合、
これはMQL4のランタイムエラー130(ERR_INVALID_STOPS)に該当します。

ストップロスや指値注文を「現在価格に近すぎる値」で設定したときに出るエラーです。

原因

  • ブローカーごとに「StopLevel(最小ストップ距離)」が決められている
  • スプレッドが広いと、許容範囲を超えてしまう
  • SL・TP・指値注文の価格が現在価格に近すぎる
  • OrderModify() で変更したSL・TPがStopLevelを満たしていない

MQL4のStopLevelとは?

StopLevelとは、ブローカーが決めている 現在価格からSL・TP・指値注文まで最低限離さないといけない距離 のことです。

MQL4では、以下のコードで現在の通貨ペアのStopLevelを確認できます。

int stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
Print("StopLevel: ", stopLevel);

例えば StopLevel が 20 の場合、SLやTPを現在価格のすぐ近くに置くと、 OrderSend error 130OrderModify error 130 が発生します。

FXTFなどの国内FX業者に限らず、StopLevelはブローカー・口座タイプ・通貨ペアによって変わる場合があります。 EAでSL・TPを自動設定する場合は、入力したpipsだけで判断せず、 StopLevelとスプレッドを考慮して少し余裕を持たせる ことが大切です。

よくある失敗例

double sl = Ask - 5 * Point;  // 5pipsしか離していない

例えばブローカーのStopLevelが20(=20ポイント)なのに、
5ポイントしか離していない場合は、必ずエラー130になります。

解決方法

  • MarketInfo(Symbol(), MODE_STOPLEVEL) で最小距離を取得する
  • パラメータ入力時に自動調整する
  • SL・TPを現在価格から十分に離す
  • スプレッド拡大時でもエラーにならないよう余裕を持たせる
int stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
double minStop = stopLevel * Point;

OrderModify error 130 が出るケース

OrderSend() ではなく、OrderModify() で error 130 が出る場合も、 基本的な原因は SL・TPの位置が現在価格に近すぎること です。

特に、エントリー後にストップロスやテイクプロフィットを変更するEAでは、 変更後の価格が StopLevel を満たしていないと OrderModify error 130 が発生します。

  • 買いポジションのSLが現在価格に近すぎる
  • 売りポジションのSLが現在価格に近すぎる
  • TPを現在価格のすぐ近くに変更している
  • スプレッド拡大時に、想定より近い位置になっている

OrderModify() でエラー130が出る場合は、注文時だけでなく、 変更後のSL・TPもStopLevel以上離れているか を確認しましょう。

bool result = OrderModify(
    OrderTicket(),
    OrderOpenPrice(),
    NormalizeDouble(newSL, Digits),
    NormalizeDouble(newTP, Digits),
    0,
    clrBlue
);

if(!result)
{
    Print("OrderModify error: ", GetLastError());
}

StopLevel や価格条件が複雑な場合は、 デバッガを使って1行ずつ処理を追うことで 原因を正確に特定できます。

MT4のEAをデバッグしてソースコードを1行ずつ確認する方法


エラー131:Invalid Trade Volume(無効なロットサイズ)

内容

ロットサイズ(Lots)がブローカーの条件に合っていないと出るエラーです。

MT4で「OrderSend error 131」や「Invalid Trade Volume」と表示される場合、 指定したロット数が最小ロット・最大ロット・ロット刻みに合っていない可能性があります。

原因

  • 最小取引ロット未満(例:0.01未満)
  • ロットステップに合っていない(例:0.03は不可で、0.01刻みのみ)
  • 最大ロットを超えている
  • バックテスト環境と実口座環境でロット条件が異なる

解決方法

  • MarketInfo(Symbol(), MODE_MINLOT) で最小ロットを取得
  • MODE_LOTSTEP で刻み幅を確認
  • MODE_MAXLOT で最大ロットを確認
  • EA側でロット数をブローカー条件に合わせて調整する

以下の関数を使うと、ロットを調整してくれるのでロットチェックの面で便利です。

//+------------------------------------------------------------------+
//| 指定ロットをブローカー条件に合わせて調整する関数               |
//| 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(証拠金不足)

内容

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

MT4で「OrderSend error 134」や「Not Enough Money」と表示される場合、 ロット数に対して必要証拠金が足りていない可能性があります。

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

原因

  • ロットサイズが大きすぎる
  • レバレッジ不足
  • 残高が少ない
  • バックテストの初期証拠金が少ない
  • 通貨ペアや口座通貨の条件で必要証拠金が想定より大きい

解決方法

  • ロット数を減らす
  • レバレッジを上げる(ただしリスクも上がる)
  • 証拠金を追加する
  • バックテスト時は初期証拠金や口座通貨を確認する

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

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

証拠金があるのに error 134 が出る理由

口座残高が残っていても、必要証拠金に対してロット数が大きすぎる場合は OrderSend error 134 が発生します。

特にバックテストでは、初期証拠金・レバレッジ・通貨ペアの証拠金条件によって、 実際には注文できないロット数になっていることがあります。

  • 残高はあるが、必要証拠金に対してロットが大きい
  • バックテストの初期証拠金が少ない
  • レバレッジ設定が低い
  • 通貨ペアや口座通貨の条件で必要証拠金が想定より大きい

この場合は、EAのバグと決めつけず、 まずはロット数・初期証拠金・レバレッジ設定を確認しましょう。


その他のエラー

ここで紹介した以外にも、MQL4には多くのエラーコードが存在します。 発生頻度は低いものの、実運用や検証環境によっては遭遇する可能性があります。

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

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


❓ MQL4エラーに関するよくある質問【EA初心者向けFAQ】

💬 EA開発中によく出るエラー129・130・131・134について、初心者がつまずきやすい疑問をQ&A形式でまとめました。

MQL4のエラーコードはどこで確認できますか?

MQL4のエラーコードは、MT4の「エキスパート」タブや「操作履歴」ログで確認できます。
OrderSend() が失敗した場合は、直後に GetLastError() を使うことで具体的なエラー番号を取得できます。

エラー129(Invalid Price)はどんなときに発生しますか?

エラー129は、注文価格が現在の Bid / Ask や注文ルールに合っていない場合に発生します。
Buy注文でBidを指定したり、Sell注文でAskを指定している場合に特によく起こります。

エラー130(Invalid Stops)が頻発する原因は何ですか?

エラー130は、ストップロスやテイクプロフィットが現在価格に近すぎる場合に発生します。
ブローカーごとに定められている StopLevel や、スプレッドの影響を考慮していないことが主な原因です。

OrderModify error 130 はなぜ発生しますか?

OrderModify error 130 は、変更後のストップロスやテイクプロフィットが現在価格に近すぎる場合に発生します。
OrderSend() で注文できていても、OrderModify() で変更するSL・TPがStopLevelを満たしていないとエラーになります。

MQL4のStopLevelとは何ですか?

StopLevelとは、現在価格からSL・TP・指値注文まで最低限離さないといけない距離のことです。
MQL4では MarketInfo(Symbol(), MODE_STOPLEVEL) で確認できます。

エラー131(Invalid Trade Volume)はなぜ起こるのですか?

エラー131は、指定したロットサイズがブローカーの取引条件に合っていない場合に発生します。
最小ロット未満、ロット刻み幅に合わない数値を指定しているケースが多いです。

バックテスト中にだけエラー131が出るのはなぜですか?

バックテストでは、初期証拠金や通貨設定の影響でロット条件が変わることがあります。
特に XM のMT4バックテストでは、実口座と条件が異なりエラー131が発生しやすくなります。

エラー134(Not Enough Money)はどんな意味ですか?

エラー134は、注文時に必要な証拠金が不足していることを意味します。
ロット数が大きすぎる、レバレッジが低い、口座残高が少ない場合に発生します。

エラー134はEAのバグではないのですか?

エラー134はEAのロジックエラーではなく、資金条件によるエラーです。
ロット計算や証拠金管理のロジックを見直すことで防げるケースが多いです。

MQL4エラーが出たときの基本的な対処手順はありますか?

まず GetLastError() でエラー番号を確認し、
次にブローカー仕様(StopLevel・最小ロット・証拠金条件)を確認します。
最後に Print() ログで変数の値を出力すると、原因を特定しやすくなります。

まとめ

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

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

エラー内容が分かっても解決できない場合は、 Print()ログを使ってEA内部の状態を確認すると、 どの条件・どの値で失敗しているかが一目で分かります。

Print()でEAがエントリーしない原因を特定する方法

エラー番号は分かっていても、実際のEAコード内でどこが原因か分からない場合は、 注文価格・ロット計算・SL/TP設定のどこで失敗しているかを確認する必要があります。

自作EAや修正中のEAで原因特定が難しい場合は、 EA作成・修正相談 も参考にしてください。

EAを開発する際には、「なぜそのエラーが出たか」を理解することが成長の近道 になります。 エラーは「失敗」ではなく、EAの挙動を理解するための重要なヒントです。

MT4トラブル全体を知りたい場合は MT4 EAトラブル解決ガイド も参考にしてください。

コメント

タイトルとURLをコピーしました