ERR_NO_MONEY(MT5/MQL5)を完全解決 — 「資金不足」でEAが発注できない原因と直し方
Mục lục
- ERR_NO_MONEY とは(134 と 10019 の違い)
- ① ERR_NO_MONEY = 134(`GetLastError()` のランタイムエラー)
- ② TRADE_RETCODE_NO_MONEY = 10019(`OrderSend()` のリターンコード)
- まず30秒でできる切り分け
- 原因と対処(6パターン)
- ① 純粋に証拠金が足りない
- ② ロットが大きすぎる(残高に対して)
- ③ レバレッジが低い/週末・イベントで制限された
- ④ 既存ポジションで証拠金が拘束されている
- ⑤ ボーナス・クレジットを証拠金に含めている
- ⑥ 口座タイプの契約サイズ違い(スタンダード vs セント/マイクロ)
- ブローカー別の注意点
- MQL5でこのエラーを防ぐコード(EA開発者向け)
- 発注前に必要証拠金をチェックする
- ロットを最小・ステップに正規化する
- OrderSend の retcode を必ず見る
- 証拠金維持率での緊急停止
- 優先度チェックリスト
- まとめ
- FAQ
- Q: 残高は十分あるのに ERR_NO_MONEY が出ます。なぜ?
- Q: 134 と 10019 はどう違いますか?
- Q: バックテストでは出ないのに本番で出ます。
- Q: ナンピン/グリッドEAで段数が深くなると ERR_NO_MONEY になります。
- Q: EAのコードで自動的に回避できますか?
- Q: 最低いくらから無理なく始められますか?
This article is in Japanese only. English articles are coming soon.
ERR_NO_MONEY(MT5/MQL5)を完全解決
EAを動かしていて、Expertタブやジャーナルに ERR_NO_MONEY や not enough money が出ると「もう資金が足りないのか?」と焦りますが、実際には残高に余裕があっても出るエラーです。原因は「資金がゼロ」だけではなく、ロット計算・レバレッジ・既存ポジションによる証拠金拘束など複数あります。
この記事は、MT5でEAを使う人と、MQL5でEAを書く人の両方に向けて、ERR_NO_MONEY の正体・6つの原因・即できる対処・ブローカー別の注意点・コード側での恒久防止までを一本にまとめた決定版です。エラーコード全般の一覧は MQL5 / MT5 エラーコード対処法の総合ガイド を参照してください。
この記事は2026年6月時点のMT5(build 4xxx系)を前提にしています。数値・画面名はブローカーやビルドにより多少異なる場合があります。
ERR_NO_MONEY とは(134 と 10019 の違い)
MQL5で「資金不足」を表す値は、どこで取得したかで2種類あります。ここを混同すると原因究明が遠回りになります。
① ERR_NO_MONEY = 134(GetLastError() のランタイムエラー)
GetLastError() が返すランタイムエラーコードです。OrderCalcMargin() や OrderCalcProfit() 等の計算系関数、または旧スタイルのコードで「必要証拠金が自由証拠金を超えている」と判定されたときに 134 が立ちます。
意味: 取引操作に必要な資金が足りない(not enough money)
定数: ERR_NO_MONEY
値 : 134
② TRADE_RETCODE_NO_MONEY = 10019(OrderSend() のリターンコード)
MQL5で実際に発注する OrderSend() の結果は MqlTradeResult.retcode に入ります。発注がサーバーに拒否されたときの「資金不足」は、134ではなく 10019(TRADE_RETCODE_NO_MONEY) です。これはMT5側のエラーではなく、ブローカーサーバーからの拒否通知です。
意味: 注文実行に十分な資金がない(There is not enough money to complete the request)
定数: TRADE_RETCODE_NO_MONEY
値 : 10019
// ログで確認できる典型的な出力例
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019
実務上の使い分け:
| 取得元 | 値 | 出る場面 |
|---|---|---|
GetLastError() | 134 (ERR_NO_MONEY) | OrderCalcMargin 等の計算、内部チェック |
MqlTradeResult.retcode | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend がサーバーに拒否された |
CTrade.ResultRetcode() | 10019 | CTrade 経由の発注拒否 |
ログに「134」が出るなら計算/内部チェック段階、「10019」やExpertタブの not enough money ならサーバー拒否段階、と切り分けられます。どちらも根本原因は同じ(必要証拠金 > 使える証拠金)なので、対処は共通です。
まず30秒でできる切り分け
MT5の「ツールボックス → 取引」タブで以下の3つを見てください。
残高(Balance) : 口座の現金
有効証拠金(Equity) : 残高 ± 含み損益
余剰証拠金(Free Margin): いま新規に使える証拠金 ← これが効く
証拠金維持率(Margin Level %): Equity / Margin × 100
- 余剰証拠金(Free Margin)が、これから建てる1ポジションの必要証拠金より小さい → 100% ERR_NO_MONEY になります。
- 残高は十分あるのに出る場合は、後述の「②ロット過大」「④既存ポジで証拠金拘束」「⑥口座タイプ違い」のいずれかです。
1ポジションの必要証拠金は、MT5の「気配値 → シンボル右クリック → 仕様」で確認できます(1ロットの証拠金)。ざっくりは下式です。
必要証拠金 ≈ (ロット × 契約サイズ × 価格) / レバレッジ
原因と対処(6パターン)
① 純粋に証拠金が足りない
症状: 含み損が膨らみ、Free Margin が新規分を下回った。連敗後やナンピン段数が深いときに多い。
対処:
- 追加入金する、または
- 保有ポジションを一部手動決済して証拠金を回収する
- EA側の
RiskPercentを下げて以後のロットを小さくする
このパターンが繰り返し出るEAは、そもそもロットが資金に対して過大です。②へ。
② ロットが大きすぎる(残高に対して)
症状: 残高はあるのに、最初の1発目から ERR_NO_MONEY。固定ロット運用に多い。
原因: FixedLot が口座残高・レバレッジに見合っていない。例えば10万円(≈$670)の口座で XAUUSD を 0.1 ロット建てようとすると、レバレッジ次第で必要証拠金が残高を超えます。
対処:
- 固定ロットを最小(0.01)に下げて起動できるか確認
- リスク%自動計算(
UseFixedLot=false/RiskPercent)に切り替える - それでも0.01が建てられないなら、口座のレバレッジか資金が不足 → ③・⑥へ
目安:10万円(≈$670)スタンダード口座で最低ロット0.01から始められる設計が無理のない基準です。これを下回る資金や、より安全に小さく回したい場合は次の「マイクロ(セント)口座」を検討してください。
③ レバレッジが低い/週末・イベントで制限された
症状: 同じEA・同じロットが、別口座では建つのにこの口座だけ ERR_NO_MONEY。あるいはエラーが金曜夕方〜月曜朝に集中する。
原因: 口座のレバレッジが低い(例: 1:30 のEU規制口座 vs 1:1000 の海外口座)と必要証拠金が数十倍変わります。さらにブローカーが週末・重要指標前後にレバレッジを引き下げることがあり(XMは週末にレバレッジを200:1へ制限する仕様)、ポジション保有中に必要証拠金が突然増えて発生します。ゴールドや暗号はシンボル単位でレバレッジ上限が別途設定されていることもあります。
対処:
- 口座のレバレッジを確認(ブローカーのマイページ/MT5の口座情報)
- シンボル仕様の「証拠金率」を確認(銘柄別に低い場合あり)
- 週末をまたがない設定(
CloseAllBeforeWeekend=true等)を使う、または週末レバレッジ制限のないブローカーへ - 高レバレッジ口座へ切り替えるか、ロットを下げる
④ 既存ポジションで証拠金が拘束されている
症状: 1つ目は建ったが、2つ目以降や増し玉(ナンピン)で ERR_NO_MONEY。
原因: 既に保有中のポジションが証拠金を拘束し、Free Margin が新規分を下回った。複数ペア・複数EAを1口座で回していると起きやすい。
対処:
- 「取引」タブで使用中証拠金(Margin)と Free Margin を確認
- EA同士が同じ口座で証拠金を食い合っていないか(複数EA運用の場合)
- 同時ポジション数の上限をEAパラメーターで制限する
- ナンピン/グリッドEAは段数が深いほど一気に証拠金を消費する → 段数上限・ロット倍率・緊急決済の設定を見直す
⑤ ボーナス・クレジットを証拠金に含めている
症状: 「残高 + ボーナス」では足りるはずなのに ERR_NO_MONEY。
原因: ブローカーによってはクレジット(ボーナス)が証拠金計算に含まれない/一部しか含まれない設定があります。表示残高とサーバーが使う証拠金がずれます。
対処: ブローカーのボーナス規約で「クレジットが証拠金に算入されるか」を確認。算入されないなら、実入金分だけで必要証拠金を満たすロットに下げる。
⑥ 口座タイプの契約サイズ違い(スタンダード vs セント/マイクロ)
症状: 同じ「0.01ロット」なのに、口座を変えたら急に ERR_NO_MONEY。あるいは逆に過大ロットになる。
原因: セント(マイクロ)口座とスタンダード口座では契約サイズが約100倍違います。 セント口座の0.01は実エクスポージャーが約1/100。EAが口座タイプを区別せず固定ロットを使うと、片方で証拠金不足になります。
対処:
- 少額・安全運用ならセント/マイクロ口座を使い、最小ロットでも過大リスクにならないようにする
- EAは口座タイプをハードコードせず、
OrderCalcMargin()で実際の必要証拠金を見てロットを決める設計にする(次章)
ブローカー別の注意点
| ブローカー | 特徴 | ERR_NO_MONEY 頻度 |
|---|---|---|
| XM | 週末レバレッジ制限あり・Stop Out 20% | 中(週末は高め) |
| Exness | 無制限レバレッジ口座あり・Stop Out 0% | 低 |
| HFM / FXGT 等 | 高レバレッジ口座あり | 低 |
Exnessの無制限レバレッジ口座(Pro/Raw Spread口座)は、余剰証拠金が事実上ゼロでも新規注文が通るケースが多く、このエラーが出にくい。ナンピン系EAとの相性が良い一方、ストップアウトが効きにくく損失が膨らみやすい裏返しのリスクがある点には注意してください。ブローカー比較は ブローカー比較ページ も参照。
MQL5でこのエラーを防ぐコード(EA開発者向け)
「直す」だけでなく、そもそも ERR_NO_MONEY を発注前に握りつぶすのがEAの正しい設計です。ポイントは「発注する前に必要証拠金を計算し、足りなければ建てない/ロットを縮める」こと。
発注前に必要証拠金をチェックする
// 発注前ゲート: 必要証拠金 <= 余剰証拠金 を確認してから OrderSend する
bool HasEnoughMargin(ENUM_ORDER_TYPE type, double lots)
{
double price = (type == ORDER_TYPE_BUY)
? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
: SymbolInfoDouble(_Symbol, SYMBOL_BID);
double margin = 0.0;
if(!OrderCalcMargin(type, _Symbol, lots, price, margin))
{
Print("OrderCalcMargin failed: ", GetLastError()); // 134 等
return false;
}
double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
if(margin > freeMargin)
{
PrintFormat("Skip: need %.2f > free %.2f (ERR_NO_MONEY guard)", margin, freeMargin);
return false; // 建てない=ERR_NO_MONEYを未然に防ぐ
}
return true;
}
ロットを最小・ステップに正規化する
リスク%で計算した値をそのまま送ると、最小ロット・ロットステップに合わず拒否されます(正規化漏れは発注拒否の典型原因)。建てられない場合は諦めるのではなく建てられる範囲に縮めると機会損失を減らせます。
double NormalizeLot(double lots)
{
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lots = MathFloor(lots / step) * step; // ステップに丸める
lots = MathMax(minLot, MathMin(maxLot, lots)); // 最小〜最大にクランプ
return NormalizeDouble(lots, 2);
}
OrderSend の retcode を必ず見る
OrderSend() の戻り値(bool)だけでなく result.retcode を見て、10019(TRADE_RETCODE_NO_MONEY)を個別にハンドリングします。
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... req を組み立て ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
if(res.retcode == TRADE_RETCODE_NO_MONEY) // 10019
Print("Not enough money. ロットを縮小するか入金が必要です。");
else
PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}
CTradeを使う場合は trade.ResultRetcode() が 10019 か、trade.ResultRetcodeDescription() で確認できます。
証拠金維持率での緊急停止
維持率が一定%を下回ったら新規を止める/全決済する安全装置を入れておくと、ERR_NO_MONEY の連発と口座溶解の両方を防げます。
double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // 維持率%
if(level > 0 && level < EmergencyMarginLevel) // 例: 150%
{
// 新規エントリーを停止する/必要なら保有を一部決済する
}
FXEA365が配布しているEAは、この「リスク%自動ロット」「発注前の証拠金チェック」「証拠金維持率での緊急停止(UseMarginEmergencyClose)」を標準実装しているため、最小資金から無理なく動かせます。
優先度チェックリスト
| 優先 | 確認 | 対処 |
|---|---|---|
| 🚨 まず | 余剰証拠金 < 必要証拠金 か | 入金 or 一部決済 or ロット↓ |
| 🚨 まず | 固定ロットが残高に対して過大か | 0.01へ/リスク%自動へ |
| ⚠️ 次 | 口座レバレッジが低い・週末制限か | 高レバ口座/週末クローズ/ロット↓ |
| ⚠️ 次 | 既存ポジ・他EAで証拠金拘束か | 同一口座の建玉を整理 |
| ✅ 確認 | セント/スタンダードの契約サイズ違い | 口座タイプに合うロットへ |
| 🛠 開発 | 発注前に OrderCalcMargin で防御 | 上記コードを実装 |
まとめ
ERR_NO_MONEYは 134(GetLastError) と 10019(OrderSendのretcode = TRADE_RETCODE_NO_MONEY) の2つの顔があるが、根本は「必要証拠金 > 使える証拠金」で共通。- 残高があっても、ロット過大・低レバレッジ(週末制限含む)・既存ポジの証拠金拘束・口座タイプ違いで出る。
- EA運用者は「リスク%自動ロット」「適正な口座タイプ」で予防、EA開発者は「発注前
OrderCalcMarginゲート」「ロット正規化」「retcode 10019 のハンドリング」で恒久対策する。
エラーコード全般は MQL5 / MT5 エラーコード対処法の総合ガイド を、無理のない資金設定で動く無料EAは EA一覧 を参照してください。当サイトのEAを使用中で設定変更でも解決しない場合は、サポートフォームから口座の証拠金状況スクリーンショットを添付してご連絡ください。
FAQ
Q: 残高は十分あるのに ERR_NO_MONEY が出ます。なぜ?
残高(Balance)ではなく**余剰証拠金(Free Margin)**で判定されるためです。含み損や既存ポジションの証拠金拘束でFree Marginが減っていると、残高があっても新規分を建てられません。「取引」タブのFree Marginを確認してください。
Q: 134 と 10019 はどう違いますか?
134(ERR_NO_MONEY)は GetLastError() が返すランタイムエラー、10019(TRADE_RETCODE_NO_MONEY)は OrderSend() の結果(retcode)です。出る場所が違うだけで、原因(資金不足)は同じです。
Q: バックテストでは出ないのに本番で出ます。
本番口座のレバレッジ・口座タイプ(セント/スタンダード)・既存ポジションがテスト設定と異なるためです。特にレバレッジ差と契約サイズ差が大きく効きます。
Q: ナンピン/グリッドEAで段数が深くなると ERR_NO_MONEY になります。
正常な挙動の一歩手前です。段数が増えるほど証拠金消費が加速します。段数上限・ロット倍率を下げ、UseMarginEmergencyClose 等の緊急決済を必ず有効にし、失っても問題ない資金で運用してください。
Q: EAのコードで自動的に回避できますか?
できます。発注前に OrderCalcMargin() で必要証拠金を計算し、AccountInfoDouble(ACCOUNT_MARGIN_FREE) を超えるなら建てない(またはロットを縮める)ゲートを入れます。本文のコード例を参照してください。
Q: 最低いくらから無理なく始められますか?
10万円(≈$670)スタンダード口座で最低ロット0.01から、が無理のない基準です。それより少額・より安全に回したい場合はセント(マイクロ)口座を使うと、最小ロットでも実エクスポージャーが小さくなり ERR_NO_MONEY を避けやすくなります。
Liên quan
Khóa học Email 5 Ngày (Miễn phí)
Nhận một email mỗi ngày bao gồm các nguyên tắc cơ bản về giao dịch FX tự động, cách đọc backtest đúng cách và mẹo chọn môi giới.
* Quyền riêng tư được bảo vệ nghiêm ngặt. Bạn có thể hủy đăng ký bất cứ lúc nào.