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;
エラー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エラーコード主要解説』でした。EAを開発している(動かしている)際にエラーに出くわした際は以下を思い出してください。
- MQL4でよく出るエラーは 129・130・131・134 の4つ
- 対処の基本は「ブローカー仕様を調べる」「パラメータを調整する」
- 解決できないときは エキスパート(操作履歴)ログを確認 して原因を特定するのが一番早い
EAを開発する際には、「なぜそのエラーが出たか」を理解することが成長の近道 になります。
✅ 他にも多数のEAサンプルを公開中!
今回紹介した内容以外にも、当サイトではさまざまなFX自動売買EAのサンプルコードを提供しています。
自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。
EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!
コメント