ホーム > ブログ > Unsupported filling mode(MT5エラー10030)を完全解決 — 別ブローカーに移した日にEAが発注できなくなる理由と直し方

MT5MQL5エラートラブル解決EA

Unsupported filling mode(MT5エラー10030)を完全解決 — 別ブローカーに移した日にEAが発注できなくなる理由と直し方

公開日: 2026-07-07読了目安: 約2分
本記事は公開日時点の情報です。EAの実績数値(PF・DD・年率)は運用や再検証で変動するため、最新値は各EAページでご確認ください。 最新のEA実績を見る

Unsupported filling mode(MT5エラー10030)を完全解決

昨日まで別のブローカーで普通に動いていたEAを新しい口座に移した途端、Expertタブに Unsupported filling modeOrderSend 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_FOKFill or Kill全量を約定できる場合のみ執行。1ロット注文で0.7ロット分しか流動性がなければ注文ごとキャンセル
ORDER_FILLING_IOCImmediate or Cancel約定できる分だけ即時執行し、残りはキャンセル。0.7ロットだけ約定して0.3ロットは消える
ORDER_FILLING_RETURNReturn約定できる分を執行し、残量は注文として板に残る(後で追加約定を待つ)。取引所型の執行で使われる
ORDER_FILLING_BOCBook 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が「ブローカー移行の古典エラー」と呼ばれる理由はこうです。

  1. 許可される約定方式はブローカーごと・シンボルごとに違う。 あるブローカーはFXシンボルにFOKのみを許可し、別のブローカーはIOCのみ、また別のブローカーは両方許可します。同じブローカー内でもFXとCFD・株式で設定が違うことは普通にあります。
  2. 多くのEAは type_filling をハードコードしている。 例えば request.type_filling = ORDER_FILLING_FOK; と書かれたEAは、FOK許可のブローカーAでは何年でも動きます。作者の環境で動くので、バグとして認識されないまま配布されます。
  3. 移行先のブローカーBがFOKを許可していなければ、初回の発注から全滅。 バックテストでは出ないことも多く(テスターの挙動は実サーバーより寛容)、「実口座に移した日」にだけ顕在化します。

つまり10030はEAのバグというより「環境前提の決め打ち」が露呈したものです。逆に言えば、シンボルの許可フラグを読んで動的に選ぶよう直せば、どのブローカーでも動くEAになります(後述のコード)。

執行モード(SYMBOL_TRADE_EXEMODE)との関係

シンボルには約定方式とは別に執行モードがあり、これがどの約定方式が意味を持つかに影響します。

執行モード定数典型約定方式の傾向
InstantSYMBOL_TRADE_EXECUTION_INSTANT一部のFX(DD系に多い)指定価格での執行。FOK/IOC+リクオートの世界
MarketSYMBOL_TRADE_EXECUTION_MARKET多くのFX/CFD(NDD系)成行執行。FOKまたはIOC(ブローカー設定次第)
ExchangeSYMBOL_TRADE_EXECUTION_EXCHANGE株式・先物板に流す執行。RETURNが基本
RequestSYMBOL_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 mode10030 / 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が前提とする約定方式を許可しているブローカー/口座タイプで運用する必要があります。

📧 5日間メール講座(無料)

FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツを毎日1通お届けします。

※ プライバシーは厳守。配信解除はいつでも可能です。