【即解決】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:口座残高ではなく、注文後の余剰証拠金(Free Margin)は足りているか?
OrderModify error 130 の場合
StopLevelだけでなく、変更禁止範囲を示すFreezeLevelも確認すると原因を切り分けやすくなります。

本記事では、よく出るエラー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を満たしていない
  • OrderModify() 時にFreezeLevel(変更禁止範囲)へ入っている

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;  // 5ポイントしか離していない

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

Point は「pips」ではなくMT4上の最小価格単位です。5桁表示のFX通貨ペアでは、一般に10ポイント=1pipsとして扱われます。

解決方法

  • 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以上離れているか を確認しましょう。

StopLevelだけでなくFreezeLevelも確認

OrderModify() では、ブローカーが設定する FreezeLevel(変更禁止範囲) が原因で変更できないケースもあります。
現在価格の近くにある注文やSL・TPは、FreezeLevel内では変更・取消が制限されることがあります。

int stopLevel   = (int)MarketInfo(Symbol(), MODE_STOPLEVEL);
int freezeLevel = (int)MarketInfo(Symbol(), MODE_FREEZELEVEL);

Print("StopLevel: ", stopLevel,
      " / FreezeLevel: ", freezeLevel);

特にOrderSend()は成功するのにOrderModify()だけ130になる場合は、 StopLevelに加えてFreezeLevelも確認すると切り分けやすくなります。

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側でロット数をブローカー条件に合わせて調整する

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

// ロット刻み幅から必要な小数桁数を取得
int LotDigitsFromStep(double lotStep)
{
    for(int digits = 0; digits <= 8; digits++)
    {
        if(MathAbs(lotStep - NormalizeDouble(lotStep, digits)) < 0.00000001)
            return digits;
    }
    return 8;
}

// 指定ロットをブローカー条件に合わせて調整
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;

    // LotStepに合わせて切り下げ
    lot = MathFloor((lot + 0.00000001) / lotStep) * lotStep;

    int lotDigits = LotDigitsFromStep(lotStep);
    return NormalizeDouble(lot, lotDigits);
}

// 使用例
double myLot = 0.037;
double adjustedLot = AdjustLot(myLot);
Print("調整後ロット数: ", adjustedLot);

上記のように MODE_LOTSTEP から必要な桁数も合わせておくと、 0.01刻みだけでなく0.001刻みなどの口座にも対応しやすくなります。 なお、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のバグと決めつけず、 まずはロット数・初期証拠金・レバレッジ設定を確認しましょう。

残高ではなくFree Marginを確認する

Balance(口座残高)がある=新規注文できるとは限りません。
すでに保有ポジションがある場合は証拠金が拘束されるため、注文判定では余剰証拠金(Free Margin)を見る必要があります。

MQL4では、注文前に AccountFreeMarginCheck() を使うと、 指定ロットで新規注文した後の余剰証拠金を確認できます。

double lots = 0.10;
double freeMarginAfter = AccountFreeMarginCheck(Symbol(), OP_BUY, lots);

if(freeMarginAfter <= 0)
{
    Print("証拠金不足の可能性があります。Error: ", GetLastError());
}
else
{
    Print("注文後の余剰証拠金: ", freeMarginAfter);
}

「残高はあるのにOrderSend error 134が出る」という場合は、 現在のFree Marginと、注文後に必要な証拠金を確認すると原因を切り分けやすくなります。


その他のエラー

ここで紹介した以外にも、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() で注文できていても、変更後のSL・TPがStopLevelを満たしていない場合や、FreezeLevel内に入っている場合は変更できないことがあります。

MQL4のStopLevelとは何ですか?

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

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

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

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

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

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

エラー134は、注文時に必要な証拠金が不足していることを意味します。
口座残高があっても、保有ポジションで証拠金が拘束されて余剰証拠金(Free Margin)が不足していると発生します。

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

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

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

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

まとめ

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

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

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

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

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

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

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

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

コメント

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