Unsupported filling mode(MT5エラー10030)を完全解決 — 別ブローカーに移した日にEAが発注できなくなる理由と直し方
目次
- 10030(TRADE_RETCODE_INVALID_FILL)とは
- 約定方式(type_filling)の4種類
- なぜ「不正」になるのか — SYMBOL_FILLING_MODE
- なぜ「ブローカーを変えた日」に出るのか
- 執行モード(SYMBOL_TRADE_EXEMODE)との関係
- まず30秒でできる切り分け
- ① シンボルの許可方式を見る(MT5画面)
- ② EAの入力パラメータを見る
- ③ コードで確認する(開発者向け)
- 恒久対策 — 許可フラグを読んで自動選択するMQL5コード
- 自動判別関数
- OrderSend での使い方
- CTrade を使っている場合
- 指値注文(BOC)を使う場合の注意
- ブローカーに関する注意(移行時の再チェック)
- 優先度チェックリスト
- まとめ
- FAQ
- Q: 昨日まで動いていたEAが、ブローカーを変えたら10030で全く発注できません。EAの故障ですか?
- Q: FOK と IOC はどちらを使うべきですか?
- Q: バックテストでは出ないのに実口座で10030が出ます。
- Q: 同じブローカーなのに、シンボルによって10030が出たり出なかったりします。
- Q: EAのコードを直せません(.ex5のみ所有)。どうすれば?
Unsupported filling mode(MT5エラー10030)を完全解決
昨日まで別のブローカーで普通に動いていたEAを新しい口座に移した途端、Expertタブに Unsupported filling mode や OrderSend error 10030 が並んで1件も発注できなくなる — これはMT5のEA運用で最も「あるある」なブローカー移行トラブルです。EAが壊れたわけでも、口座に問題があるわけでもありません。注文の「約定方式(filling mode)」の指定が、新しいブローカーのそのシンボルでは許可されていない、それだけです。
この記事は、MT5でEAを使う人と、MQL5でEAを書く人の両方に向けて、TRADE_RETCODE_INVALID_FILL(10030)の正体・FOK/IOC/RETURNの意味・30秒でできる確認・コード側での恒久対策までを一本にまとめた決定版です。エラーコード全般の一覧は MQL5 / MT5 エラーコード対処法の総合ガイド を参照してください。
この記事は2026年7月時点のMT5(build 4xxx系)を前提にしています。画面名・表記はブローカーやビルドにより多少異なる場合があります。
10030(TRADE_RETCODE_INVALID_FILL)とは
OrderSend() の結果は MqlTradeResult.retcode に入ります。そこに返ってくる 10030 = TRADE_RETCODE_INVALID_FILL は、「リクエストで指定した type_filling(約定方式)が、このシンボルでは許可されていない」というサーバー側からの拒否通知です。
意味: 指定された約定方式(filling type)がサポートされていない
定数: TRADE_RETCODE_INVALID_FILL
値 : 10030
表示: Unsupported filling mode / Invalid order filling type
// ログで確認できる典型的な出力例
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: OrderSend error 10030
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: failed market buy 0.10 EURUSD [Unsupported filling mode]
ポイントは、資金・ロット・価格は一切関係ないということです。10030はリクエストの中の MqlTradeRequest.type_filling フィールドただ1つの問題であり、そこを直せば同じ注文がそのまま通ります。
約定方式(type_filling)の4種類
MQL5の ENUM_ORDER_TYPE_FILLING には4つの値があります。
| 定数 | 通称 | 意味 |
|---|---|---|
ORDER_FILLING_FOK | Fill or Kill | 全量を約定できる場合のみ執行。1ロット注文で0.7ロット分しか流動性がなければ注文ごとキャンセル |
ORDER_FILLING_IOC | Immediate or Cancel | 約定できる分だけ即時執行し、残りはキャンセル。0.7ロットだけ約定して0.3ロットは消える |
ORDER_FILLING_RETURN | Return | 約定できる分を執行し、残量は注文として板に残る(後で追加約定を待つ)。取引所型の執行で使われる |
ORDER_FILLING_BOC | Book or Cancel | 板に載る(受動的に待つ)場合のみ受け付け、即時約定してしまう価格なら拒否。指値/ストップリミット専用(新しめのビルドで追加) |
FXの一般的なEAで実際に使うのはほぼ FOK か IOC です。RETURNは株式・先物などの取引所執行(Exchange execution)で意味を持ち、BOCはメイカー注文を強制したい特殊用途です。
なぜ「不正」になるのか — SYMBOL_FILLING_MODE
どの約定方式を受け付けるかは、ブローカーがシンボルごとに設定するフラグ(SYMBOL_FILLING_MODE)で決まります。MQL5からは次のように読めます。
long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
// SYMBOL_FILLING_FOK フラグが立っていれば FOK 可
// SYMBOL_FILLING_IOC フラグが立っていれば IOC 可
SYMBOL_FILLING_MODE はビットフラグで、FOKとIOCの許可状況が入ります(両方許可なら両フラグが立つ)。RETURNはこのフラグには含まれず、シンボルの執行モード(後述)によって使えるかが決まります。
つまり10030の構図は単純で、
EAが送った type_filling ∉ そのシンボルで許可された約定方式 → 10030
これだけです。
なぜ「ブローカーを変えた日」に出るのか
10030が「ブローカー移行の古典エラー」と呼ばれる理由はこうです。
- 許可される約定方式はブローカーごと・シンボルごとに違う。 あるブローカーはFXシンボルにFOKのみを許可し、別のブローカーはIOCのみ、また別のブローカーは両方許可します。同じブローカー内でもFXとCFD・株式で設定が違うことは普通にあります。
- 多くのEAは type_filling をハードコードしている。 例えば
request.type_filling = ORDER_FILLING_FOK;と書かれたEAは、FOK許可のブローカーAでは何年でも動きます。作者の環境で動くので、バグとして認識されないまま配布されます。 - 移行先のブローカーBがFOKを許可していなければ、初回の発注から全滅。 バックテストでは出ないことも多く(テスターの挙動は実サーバーより寛容)、「実口座に移した日」にだけ顕在化します。
つまり10030はEAのバグというより「環境前提の決め打ち」が露呈したものです。逆に言えば、シンボルの許可フラグを読んで動的に選ぶよう直せば、どのブローカーでも動くEAになります(後述のコード)。
執行モード(SYMBOL_TRADE_EXEMODE)との関係
シンボルには約定方式とは別に執行モードがあり、これがどの約定方式が意味を持つかに影響します。
| 執行モード | 定数 | 典型 | 約定方式の傾向 |
|---|---|---|---|
| Instant | SYMBOL_TRADE_EXECUTION_INSTANT | 一部のFX(DD系に多い) | 指定価格での執行。FOK/IOC+リクオートの世界 |
| Market | SYMBOL_TRADE_EXECUTION_MARKET | 多くのFX/CFD(NDD系) | 成行執行。FOKまたはIOC(ブローカー設定次第) |
| Exchange | SYMBOL_TRADE_EXECUTION_EXCHANGE | 株式・先物 | 板に流す執行。RETURNが基本 |
| Request | SYMBOL_TRADE_EXECUTION_REQUEST | レガシー | リクエスト執行(現在は稀) |
厳密な許可組み合わせはブローカーのサーバー設定次第ですが、実務上は「FX/CFDのMarket実行ならFOKかIOC、取引所型ならRETURN」と覚えておけば十分です。執行モードも SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) で確認できます。
まず30秒でできる切り分け
① シンボルの許可方式を見る(MT5画面)
気配値表示 → シンボルを右クリック → 仕様(Specification) を開き、「約定」(Filling)の行を見ます。Fill or Kill / Immediate or Cancel / 両方、のように表示されます。ここに書かれていない方式をEAが送っていれば10030確定です。
② EAの入力パラメータを見る
出来のいいEAは FillingType / Filling Mode のような入力を持っています。持っていれば、①で確認した許可方式に合わせて変更するだけで解決です(コード修正不要)。
③ コードで確認する(開発者向け)
long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
PrintFormat("%s filling: FOK=%s IOC=%s exemode=%d",
_Symbol,
((flags & SYMBOL_FILLING_FOK) != 0) ? "yes" : "no",
((flags & SYMBOL_FILLING_IOC) != 0) ? "yes" : "no",
(int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE));
これをスクリプトで実行すれば、そのブローカー・そのシンボルの実際の許可状況が1行で出ます。
恒久対策 — 許可フラグを読んで自動選択するMQL5コード
10030の正しい直し方は「移行のたびに手で合わせる」ではなく、EA自身にシンボルの許可フラグを読ませて自動選択させることです。以下がそのまま使える定番実装です。
自動判別関数
// そのシンボルで実際に許可されている約定方式を返す
// 優先順位: FOK → IOC → RETURN(取引所型のフォールバック)
ENUM_ORDER_TYPE_FILLING GetFillingMode(const string symbol)
{
long flags = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
if((flags & SYMBOL_FILLING_FOK) != 0)
return ORDER_FILLING_FOK; // 全量約定できるときだけ執行(部分約定なし)
if((flags & SYMBOL_FILLING_IOC) != 0)
return ORDER_FILLING_IOC; // 約定できる分だけ執行、残りはキャンセル
return ORDER_FILLING_RETURN; // フラグなし=取引所型など。RETURNで送る
}
OrderSend での使い方
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
req.action = TRADE_ACTION_DEAL;
req.symbol = _Symbol;
req.volume = lots;
req.type = ORDER_TYPE_BUY;
req.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
req.deviation = 20;
req.magic = MagicNumber;
req.type_filling = GetFillingMode(_Symbol); // ← ハードコードしない
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
if(res.retcode == TRADE_RETCODE_INVALID_FILL) // 10030
PrintFormat("Unsupported filling mode: sent=%d, allowed flags=%d",
(int)req.type_filling,
(int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE));
else
PrintFormat("OrderSend failed: retcode=%d", res.retcode);
}
これでFOK専用ブローカーでもIOC専用ブローカーでも同じバイナリのまま動きます。移行のたびの手直しが不要になります。
CTrade を使っている場合
標準ライブラリの CTrade には、シンボルの許可フラグから約定方式を自動設定する SetTypeFillingBySymbol() が用意されています。
#include <Trade/Trade.mqh>
CTrade trade;
int OnInit()
{
trade.SetExpertMagicNumber(MagicNumber);
trade.SetTypeFillingBySymbol(_Symbol); // 許可フラグを読んで自動設定
return INIT_SUCCEEDED;
}
古い書き方の trade.SetTypeFilling(ORDER_FILLING_FOK);(決め打ち)が原因で10030が出ているEAは、この1行に置き換えるだけで解決します。手動で指定したい場合も、前掲の GetFillingMode() の結果を SetTypeFilling() に渡せば同じ効果です。
指値注文(BOC)を使う場合の注意
ORDER_FILLING_BOC(Book or Cancel)は指値・ストップリミット専用で、即時約定してしまう価格を指定すると拒否されます。成行注文に指定するのは誤りなので、成行系EAでBOCを選択肢に入れる必要はありません。
ブローカーに関する注意(移行時の再チェック)
- 約定方式の許可設定は、ブローカーごとに違うだけでなく、同じブローカーの中でもシンボル(銘柄グループ)ごとに違います。 FXはIOC可でも、株式CFDはRETURNのみ、といった構成は普通です。
- 口座タイプやサーバーの変更でも設定が変わることがあります。 ブローカー移行だけでなく、同一ブローカー内でのサーバー移設・口座タイプ変更・銘柄仕様の改定後に突然10030が出始めるケースもあります。
- したがって運用ルールとしては、**「口座・サーバー・シンボルのどれかが変わったら、仕様画面(またはスクリプト)で約定方式を再確認する」**を習慣にするのが確実です。自動判別コードを入れたEAなら、この確認自体が不要になります。
特定ブローカーの「このシンボルはFOKのみ」といった情報はサーバー設定変更で古くなるため、この記事では列挙しません。必ず自分の口座のシンボル仕様で確認してください。
優先度チェックリスト
| 優先 | 確認 | 対処 |
|---|---|---|
| 🚨 まず | シンボル仕様の「約定」欄とEAの指定が一致しているか | 許可されている方式に合わせる |
| 🚨 まず | EAに FillingType 入力があるか | 入力変更のみで解決(コード不要) |
| ⚠️ 次 | EAコードで type_filling がハードコードされていないか | GetFillingMode() / SetTypeFillingBySymbol() に置換 |
| ⚠️ 次 | ブローカー移行・サーバー変更・口座タイプ変更をしたか | 変更後は必ず仕様を再確認 |
| ✅ 確認 | 執行モード(Instant/Market/Exchange)の違い | 取引所型銘柄はRETURN前提 |
| 🛠 開発 | 10030を retcode で個別ハンドリングしているか | 送った方式と許可フラグをログ出力 |
まとめ
Unsupported filling mode(10030 / TRADE_RETCODE_INVALID_FILL)は、注文のtype_filling(FOK / IOC / RETURN / BOC)がそのシンボルで許可されていないときのサーバー拒否。資金やロットは無関係。- 許可方式はブローカーごと・シンボルごとに違うため、type_filling をハードコードしたEAはブローカー移行の日に一斉に10030を吐く。これがこのエラーの典型パターン。
- ユーザーは「シンボル仕様の約定欄 → EAの入力変更」で即解決。開発者は
SymbolInfoInteger(SYMBOL_FILLING_MODE)のフラグを読んで自動選択する(またはCTrade::SetTypeFillingBySymbol())ことで恒久解決できる。
エラーコード全般は MQL5 / MT5 エラーコード対処法の総合ガイド を参照してください。FXEA365が配布しているEAは約定方式の自動判別を実装しており、ブローカーを問わず動作します(EA一覧)。
FAQ
Q: 昨日まで動いていたEAが、ブローカーを変えたら10030で全く発注できません。EAの故障ですか?
故障ではありません。EAが指定している約定方式(例: FOK)を新しいブローカーのそのシンボルが許可していないだけです。シンボル仕様の「約定」欄を確認し、EAの入力(FillingType等)を合わせるか、コード側を自動判別に直せば従来どおり動きます。
Q: FOK と IOC はどちらを使うべきですか?
シンボルが両方許可しているなら、動作の違いは「流動性が足りないとき」に現れます。FOKは全量約定できなければ注文ごとキャンセル(ポジションが中途半端にならない)、IOCは約定できた分だけ持つ(部分約定が起きうる)。個人のFX取引のロットサイズでは流動性不足自体が稀なので、実用上はどちらでも大差ありません。自動判別コードのようにFOK優先で問題ありません。
Q: バックテストでは出ないのに実口座で10030が出ます。
ストラテジーテスターの約定処理は実サーバーの設定を完全には再現しないため、type_filling の不一致がテストでは表面化しないことがあります。実口座・デモ口座での初回稼働時に、まずシンボル仕様の約定欄と照合してください。
Q: 同じブローカーなのに、シンボルによって10030が出たり出なかったりします。
正常な(ありうる)挙動です。約定方式の許可はシンボル単位の設定なので、FXペアはIOC可・株式CFDはRETURNのみ、のように銘柄グループごとに異なります。マルチシンボルEAは必ずシンボルごとに SYMBOL_FILLING_MODE を読んでください。
Q: EAのコードを直せません(.ex5のみ所有)。どうすれば?
まずEAの入力パラメータに FillingType 系の項目がないか確認してください。なければ、そのEAは現在のブローカーのそのシンボルでは使えません。作者に対応を依頼するか、EAが前提とする約定方式を許可しているブローカー/口座タイプで運用する必要があります。
関連記事
2026-07-07
Invalid stops(10016/130)を完全解決 — MT5/MT4でSL・TPが設定できない原因と直し方
2026-07-07
自動売買が無効(AutoTrading disabled)でEAが動かない — MT5の10027/10026を完全解決
2026-07-07
Market closed(10018 / エラー132)を完全解決 — MT5「市場が閉鎖」でEAが発注できない原因と直し方
2026-07-07
Off quotes / リクオート(MT5/MQL5)を完全解決 — 10021・10004 で注文が拒否される原因と直し方
📧 5日間メール講座(無料)
FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツを毎日1通お届けします。
※ プライバシーは厳守。配信解除はいつでも可能です。