MT4のエラー130を直す確認手順とFX自動売買の注文条件

MT4のログに「OrderSend error 130」が出ると、EAの売買条件は成立しているのに注文できない状態になります。FX自動売買でこのエラーを直すときは、損切りを外して注文を通すより、注文の種類、価格の向き、最小距離、数値の単位を順番に確認することが大切です。
エラー130は、不正なストップ条件を示すコードです。損切り・利確だけでなく、指値や逆指値の新規注文価格が条件に合わない場合も対象になります。この記事では、ログから原因を絞る方法と、成行・予約注文の具体例、デモ口座で修正を確かめる手順を整理します。業者ごとの制限まで一律の設定値で解決できるわけではありません。
- 買いと売りで異なるBid・Askの基準を確認できる
- StopLevelを価格差へ換算して注文距離を比較できる
- 130と145を分け、動的な制約も調べられる
- 損切りを維持してデモで修正結果を判定できる
MT4のエラー130とFX自動売買の注文条件

発注と変更のどちらが失敗したか
最初に、エラーが出た処理を特定します。新規の成行注文や未約定注文を出すOrderSendなのか、すでに存在する注文の損切りなどを変更するOrderModifyなのかを見てください。「注文できない」と「注文はあるが損切りを変更できない」では、比較する価格や次の操作が違います。
エキスパート欄の同じ時刻のメッセージを読み、銘柄、売買方向、注文種別、SL、TPを確認します。EA名だけでは複数チャートの注文を取り違えることがあるため、変更処理ならチケット番号も照合します。画面の最新レートだけを見ても、失敗した瞬間の価格が分からない場合は原因を断定できません。
| コード | 公式の意味 | 最初に調べる項目 |
|---|---|---|
| 130 | ERR_INVALID_STOPS | SL・TPと未約定注文価格の条件 |
| 129 | ERR_INVALID_PRICE | 注文価格の有効性や桁 |
| 131 | ERR_INVALID_TRADE_VOLUME | 注文数量と数量刻み |
| 134 | ERR_NOT_ENOUGH_MONEY | 必要証拠金 |
| 145 | ERR_TRADE_MODIFY_DENIED | 市場に近すぎる注文の変更制限 |
この表はMQL4公式の取引エラー一覧を基にした読み分けです。130を見て証拠金を追加したり、通信環境だけを変えたりしても、価格条件の不一致は修正できません。一度の発注失敗の後に別のコードが出た場合は、最新の処理とコードを組にして再確認します。
そもそも注文処理まで進んでいるか不明なら、MT4のEAが動かないときの設定チェックで権限や配置を先に確認できます。ここから先は130が確認できた注文の価格条件に絞って進めます。
買いと売りの価格方向を合わせる
MT4の成行買いの新規注文はAsk、成行売りはBidを使います。一方、買いポジションを閉じる側はBid、売りを閉じる側はAskです。SL・TPの距離を判定するときに、新規注文の価格と決済側の価格を混同しないことが、最初の確認ポイントになります。
買いのSLは決済側のBidより下、TPはBidより上に置く関係です。売りのSLはAskより上、TPはAskより下になります。建値から何pips離したかだけを計算すると、現在のスプレッドを含めた距離が制約を満たさないことがあります。買いと売りで同じ符号の式を使っていないかも点検しましょう。

| 注文種別 | 新規注文価格の位置 | SLとTPの基準 |
|---|---|---|
| Buy・Sellの成行 | BuyはAsk、SellはBid | 買いは現在Bid、売りは現在Askで距離判定 |
| Buy Limit・買い指値 | 現在Askより下 | 注文価格よりSLは下、TPは上 |
| Buy Stop・買い逆指値 | 現在Askより上 | 注文価格よりSLは下、TPは上 |
| Sell Limit・売り指値 | 現在Bidより上 | 注文価格よりSLは上、TPは下 |
| Sell Stop・売り逆指値 | 現在Bidより下 | 注文価格よりSLは上、TPは下 |
未約定注文では、現在価格と新規注文価格の距離に加えて、その新規注文価格からSL・TPまでの距離も調べます。SLが正しい位置でも、買い指値を現在Askより上に置いていれば注文種別と整合しません。上の表は方向の整理なので、正しい側にあるだけで注文が受け付けられるという意味ではありません。
例えばAskが150.020円なら、150.000円で買いたい指定は買い指値側です。150.050円へ上がったら買いたい指定は買い逆指値側になります。同じ「買い予約」でも使う種類が異なります。売りではBidを基準に上下を反転させます。公式の注文種別ごとの価格条件で、使用する注文と照合してください。
StopLevelを価格差に換算する
StopLevelは、ストップや未約定注文に必要な最小距離です。MQL4では対象銘柄を指定してMarketInfo(symbol, MODE_STOPLEVEL)で取得し、ポイント単位の値を価格差へ変換します。画面やEAに表示される「30」などの数字だけで、30pipsと決めないでください。
価格差はStopLevelのポイント数×対象銘柄のPointで求めます。仮にUSD/JPYのPointが0.001円、StopLevelが30ポイントなら、最小距離は0.030円です。これは例の条件での換算であり、特定業者の設定や、すべての銘柄に推奨する幅ではありません。
買いの成行ではBid−SL、TP−Bidを求め、各価格差が最小距離以上か比較します。売りではSL−Ask、Ask−TPを比較します。計算した差がマイナスなら、最小距離の前に価格方向が逆です。ゼロや小さな正の値なら、方向が合っていても距離が不足している可能性があります。
買い指値ではAsk−注文価格、買い逆指値では注文価格−Askが新規注文価格側の距離です。売り指値では注文価格−Bid、売り逆指値ではBid−注文価格を見ます。予約注文のSL・TPは、新規注文価格との距離で比較するため、成行注文用の式をそのまま使わないようにします。
確認結果は「どの距離が足りないのか」まで分けてください。新規注文価格だけが近いなら予約価格の設計、SLだけなら損切り距離、TPだけなら利確距離を見直します。三つを同時に変更すると原因を追いにくくなり、エラーが消えても売買ルールがどう変わったか分からなくなります。
さらに、境界ちょうどで計算した価格は、送信までの値動きや丸めで条件を外れることがあります。必要な余裕は銘柄と運用条件から検証し、固定の数ポイントを足せば必ず通るとは考えないでください。設計した損失幅のまま条件に合わない場合は、新規注文を見送る選択肢もあります。
ポイントと桁数の取り違えを直す
Pointは銘柄の表示単位、Digitsは小数部の桁数です。一般的なFXのpipsと同じとは限りません。例えばEUR/USDのPointが0.00001ドルなら、通常の1pipに当たる0.0001ドルは10ポイントです。USD/JPYのPointが0.001円なら、通常の1pipに当たる0.01円も10ポイントです。

「SLを20に設定した」という説明だけでは、20pips、20ポイント、価格差0.020のどれか分かりません。EAの説明書と入力項目の単位を確認し、最後は実際に送るSL価格から差を逆算してください。小数第3位や第5位なら常に同じ換算、と全銘柄に固定するのも避け、対象シンボルの値を使います。
複数銘柄を扱うEAでは、チャートのPointやDigitsを別銘柄の注文へ流用していないかが重要です。EUR/USDチャートからUSD/JPYへ発注するなら、USD/JPYの単位・桁・Bid・Askを取得する必要があります。末尾記号付きの銘柄名も、実際に発注する名前と一致させます。
計算したSL・TPや未約定注文価格は、対象銘柄の桁に合わせて正規化します。MQL4公式のNormalizeDoubleでは、この価格の正規化が説明されています。ただし、桁を整えるだけでは向きや最小距離は直りません。正規化した後の価格で、もう一度距離を判定します。
例えば境界より少し外にある値が丸めで内側へ戻るなら、丸める前の計算だけを合格扱いにできません。逆に、ログの数値に長い小数の末尾が出たことだけで、正規化に失敗したとも断定できません。確認表示にはDoubleToStringなどを使い、送信値と表示桁の問題を分けます。
FX以外の金属・指数・先物などでは、取引可能な価格刻みも確認します。表示桁への丸めと、業者が許容する刻みへの適合は別の条件です。MQL4の銘柄情報にはMODE_TICKSIZE等もあるため、FX用のpips変換を別商品へ無条件に流用せず、仕様と発注価格を照合してください。
ゼロの制約と変更制限を見分ける
StopLevelが0なら、最小距離の制限がない場合と、端末へ数値として伝えられない動的な制御がある場合の両方が考えられます。したがって0を取得したことだけで、任意の距離が許可されるとは判断できません。MQL4公式の銘柄プロパティでも、動的な制御によって130が返るケースが示されています。
距離も方向も妥当に見えるのに失敗するなら、発生時刻の銘柄仕様と業者の注文条件を確認します。別の業者で通ることや、過去のバックテストで注文できることは、現在のサーバーがその条件を受け付ける証拠にはなりません。動的な幅を端末の0だけから推定し、再送を続ける方法は避けましょう。
FreezeLevelは、注文の変更・取消・決済などを制限する範囲を表す別の項目です。新しく置く価格の最小距離を調べるStopLevelと、既存注文に対する操作を調べるFreezeLevelを混ぜないでください。とくに未約定注文の価格が市場に近い場合は、変更や取消の制約も別に確認します。
変更に失敗したとき、130なら変更後のストップ条件を調べ、145なら市場に近すぎる注文の変更拒否として読むのが出発点です。FreezeLevelの存在だけで、130の原因がそれだと決めることはできません。実際のコード、対象注文、操作を合わせて判定し、業者側の回答で補います。
追従処理だけが止まる場合は、MT4のトレーリングストップ設定と動かない原因で開始条件も確認できます。本記事では追従幅のおすすめを決めるのではなく、130が出た変更価格を注文制約に照らして確かめます。
MT4のエラー130をデモで修正確認する手順

設定を変える前に条件をそろえる
実口座でエラーを繰り返すより、まず新規発注を止め、検証対象をデモ口座へ移します。EAを止めても、すでに保有しているポジションやサーバー側のSL・TPが自動的になくなるわけではありません。停止操作と既存ポジションの管理を分け、残っている注文を確認してから変更へ進めます。
検証ではEAの版、パラメータ、口座タイプ、銘柄、時間足、注文種別をそろえます。同じ通貨ペア名に見えても口座ごとにPointやStopLevelが違う可能性があるため、条件の値も取得します。変更前後で比較するのは、エラーの有無だけでなく、実際に指定されたSL・TP価格と注文の状態です。
- 失敗した処理がOrderSendかOrderModifyかを特定する
- 発生時のBid・Askと送信予定価格を同じ組で確認する
- 注文種別の方向、距離、単位、正規化を順に照合する
- 原因に関係する設定を一つだけ直してデモで再確認する
- 受付結果と保存されたSL・TPを確認し、残る制約は業者へ問い合わせる
SL・TPの入力欄を変更できる市販EAなら、説明書の単位を先に読みます。入力幅を広げる変更は売買戦略も変えるため、エラーが消えたところで検証を終えないでください。想定した損失額や利確幅が維持できるかを再確認します。設定項目がない場合は、配布元へ具体的な値を渡して対応を確認します。
テスターで再現できなくても、「問題なし」とは限りません。今回確かめたいのは対象サーバーの注文条件であり、過去データ上の損益だけではありません。デモでも口座条件が実口座と同一とは限らないので、比較できなかった条件を残し、本番での動作を保証しない形で判断しましょう。
成行と予約注文の数値を比較する
以下は計算方法を確かめるための仮定です。Bid=150.000円、Ask=150.020円、Point=0.001円、StopLevel=30ポイントとします。最小距離は0.030円です。これらは実勢レートや業者の現在条件ではなく、推奨する損切り幅・利確幅でもありません。
成行買いをAskの150.020円で出し、SLを149.995円にすると、建値からは0.025円離れていますが、制約判定側のBidからは0.005円しか離れていません。仮定した最小距離0.030円に届かないため、条件不一致です。SLを149.950円とした場合は、Bidとの差が0.050円になります。

成行売りではAskを基準に反対方向で見ます。SLを150.040円とすると、Askとの差は0.020円で不足します。SLが150.070円なら0.050円です。買いは建値のAsk、売りは建値のBidだけから距離を求めると、この違いを見落とすため、決済側の価格を併記すると整理しやすくなります。
| 未約定注文の例 | 現在価格から注文価格まで | SL・TPから注文価格まで |
|---|---|---|
| 買い指値150.000円 | Askとの差0.020円で不足 | SL・TPが妥当でも新規注文価格側で不一致 |
| 買い指値149.950円 | Askとの差0.070円 | SL149.900円、TP150.050円なら各0.050円・0.100円 |
| 買い逆指値150.080円 | Askとの差0.060円 | SL150.030円、TP150.180円なら各0.050円・0.100円 |
| 売り指値150.060円 | Bidとの差0.060円 | SL150.110円、TP149.960円なら各0.050円・0.100円 |
| 売り逆指値149.940円 | Bidとの差0.060円 | SL149.990円、TP149.840円なら各0.050円・0.100円 |
この表は、仮定した静的な最小距離と価格方向だけのチェックです。ロット条件、取引権限、価格刻み、動的な制限まで確認済みの実注文例ではありません。表の値へそのまま差し替えず、自分の注文について同じ計算欄を埋めるために使ってください。
比較の結果、予約価格とSLの両方で距離が不足していたら、一つだけ直しても130が続くことがあります。条件ごとの合否を分けると、「改善しなかったから元に戻す」といった迷いを減らせます。成行と予約注文で基準が違うので、使用しない注文種別まで一括で設定変更する必要はありません。
コードは発注せず数値から点検する
ソースを確認できる自作EAでは、まず対象銘柄の値を表示する診断を用意すると、単位や基準価格のずれを追いやすくなります。次の例は、実行したチャートの銘柄情報を表示するだけのスクリプトです。OrderSendやOrderModifyを含まず、新規注文や注文変更は行いません。
#property strict
void OnStart()
{
string sym = Symbol();
RefreshRates();
int digits = (int)MarketInfo(sym, MODE_DIGITS);
double point = MarketInfo(sym, MODE_POINT);
double bid = MarketInfo(sym, MODE_BID);
double ask = MarketInfo(sym, MODE_ASK);
double stops = MarketInfo(sym, MODE_STOPLEVEL);
double freeze = MarketInfo(sym, MODE_FREEZELEVEL);
double tickPoints = MarketInfo(sym, MODE_TICKSIZE);
if(point <= 0 || bid <= 0 || ask <= 0)
{
Print("Price data unavailable: ", sym);
return;
}
Print("symbol=", sym, " digits=", digits,
" point=", DoubleToString(point, digits),
" bid=", DoubleToString(bid, digits),
" ask=", DoubleToString(ask, digits),
" stopPoints=", stops, " freezePoints=", freeze,
" tickPoints=", tickPoints);
}

この診断は説明用で、実環境でのコンパイル・実行検証は行っていません。表示した時点と、エラーが出た時点の価格が違う場合は比較材料の範囲も変わります。正確な原因調査には、EAが発注直前に計算した注文種別・価格・SL・TPも必要です。口座情報やパスワードを表示するコードは足す必要がありません。
RefreshRatesは、現在チャート銘柄の定義済み変数などを更新するための処理です。MQL4公式のRefreshRatesにあるように、計算中に価格が古くなる場合への対処であり、間違った注文方向や単位を自動で直す機能ではありません。多通貨EAは、実際の対象シンボルから価格を取得します。
既存EAの発注部分を修正するなら、SL・TPを正規化し、その後に方向と距離を再判定してから注文へ進む順にします。条件を満たさなければ発注を見送る分岐を用意し、失敗時に無限ループで連続送信しない構成を検討します。なお、ローカル判定を通過しても、送信後の値動きやサーバーの制御まで保証できません。
失敗コードは、注文処理の戻り値を確認した直後に取得します。GetLastErrorは呼び出すと保持値がリセットされるので、一度取得して変数へ保存し、その値を表示や分岐へ使います。別処理のエラーを取り違えないよう、処理前のResetLastErrorも役立ちます。仕様はGetLastErrorとResetLastErrorで確認できます。
変更後の確認では、OrderModifyのtrue・falseだけで終えず、対象チケットを再選択してSL・TPの値を読み直します。OrderSelectは注文情報をコピーするため、古い選択結果のまま見ると更新前の値を読む可能性があります。MQL4公式のOrderSelectを参照し、保存された価格が意図と一致するかを照合します。
損切りを外さず修正結果を判定する
エラーを消す目的で、SLやTPを0へ変更する対処は、そのまま実運用へ持ち込まないでください。とくにSLを外せば、当初予定した保護注文がないポジションを持つ可能性があります。OrderSendが成功したことと、予定した損失管理が成立したことは別なので、受付成功だけを完了基準にしないことが大切です。

「まずSL・TPなしで発注し、後から変更する」といった実装が特定口座で必要かは、業者の公式仕様を確認して判断します。本記事ではどの口座でも必要な回避策として推奨しません。後付けが失敗した場合や、その間に価格が動いた場合の管理まで設計できなければ、新規取引を止めた状態で開発元に相談してください。
SLの幅を広げて注文が受け付けられた場合も、固定ロットなら損切りまでの価格差が変わります。エントリー条件はそのままでも、許容する損失幅が別物になるため、数量とリスクの設計を改めて確認します。エラーの修正に合わせて数量まで無根拠に増やす方法は避けてください。
デモでの合格基準は、対象注文が一度だけ作られたこと、指定したSL・TPが保存されていること、必要な変更が受け付けられたこと、同じ条件で130を繰り返していないことです。再試行機能があるEAは、チケットや注文数を見て重複発注も確認します。希望した値へ変えられない時は、その注文の状態を把握してから次へ進めます。
業者やEA配布元へ相談するときは、銘柄名、口座タイプ、発生時刻、注文種別、当時のBid・Ask、送信した注文価格・SL・TP、StopLevelとFreezeLevel、実際のエラーコードをまとめます。「130が出ました」だけより、どの条件を検証済みかが伝わります。画像を送るなら口座番号や個人情報を隠し、パスワードは送らないでください。
自作ロジックを見直す場合は、発注方向とSL・TPの設定を別々に説明できる形に整理しましょう。ブラウザでロジックを組む選択肢を検討するなら、NoCode EA StudioのEA作成方法と受け取り条件も確認できます。公式案内ではEAファイルの受け取りに、パートナーリンク経由の口座開設と口座認証が必要です。ツールの利用だけで130の解消や利益が保証されるわけではなく、注文条件の確認とデモ検証は引き続き必要です。
MT4のエラー130を直す要点
MT4のエラー130は、SL・TPの価格だけでなく、未約定注文価格の向きと距離まで含めて確認します。処理が新規発注か変更かを特定し、買いと売りのBid・Ask、注文種別、StopLevelの価格換算、対象銘柄の桁と刻みを順に照合すると、修正対象を絞れます。

StopLevelが0でも動的な制限が残る可能性があります。注文変更ではFreezeLevelや145も別に読み、固定値を大きくするだけで直るとは判断しないでください。方向・距離・単位が合っても拒否が続く場合は、その時刻の条件をそろえて業者や開発元へ確認します。
次の行動は、失敗した一件の注文条件を確かめ、原因に関係する項目を一つずつデモで直すことです。エラーが消えたあとも、SL・TPの保存値、想定損失幅、重複注文の有無を確認してから運用を判断しましょう。損切りを外して注文だけを通すのではなく、予定したリスク管理と注文条件が両立しているかを完了基準にします。
