MQL5の10030エラー|注文執行タイプ(FOK・IOC・RETURN)の選び方

EAの発注が失敗して、結果のコードが 10030(TRADE_RETCODE_INVALID_FILL) だった時は、その銘柄が許可していない「注文執行タイプ」(type_filling)を指定しているのが典型的な原因です。MQL5リファレンスでは、10030は「無効な注文執行タイプ」と説明されています。EAを別の業者や別の銘柄に持っていった時に、急に出ることがあります。

この記事では、注文執行タイプ(FOK・IOC・RETURN)の意味、執行モードごとの使える組み合わせ、銘柄が許可するタイプを調べて選ぶコードをまとめます。

(確認:MQL5リファレンス「取引サーバのリターンコード」「銘柄のプロパティ(SYMBOL_FILLING_MODE ほか)」「OrderSend」。確認日:2026年10月16日。コードは、MetaEditorでコンパイルして 0 errors, 0 warnings を確認しました。実際の取引サーバーでの発注は、この記事では行っていません)

注文執行タイプとは

注文を出す時、リクエストした数量のすべてを、希望の価格で市場から取れるとは限りません。そこで、数量が足りない時にどう扱うかのルールを、注文に指定します。それが注文執行タイプ(ボリュームの実行ポリシー)で、OrderSendで使うMqlTradeRequest構造体の type_filling に設定します。

タイプ 定数 意味(MQL5リファレンス)
FOK ORDER_FILLING_FOK 指定した数量のすべてでしか実行しない。市場にその量がなければ実行されない
IOC ORDER_FILLING_IOC 市場で出せる最大の量で実行し、残りはキャンセルする
リターン ORDER_FILLING_RETURN 部分的にだけ実行された場合、残りの注文はキャンセルされず、さらに処理される

type_filling を指定しなかった場合は、ORDER_FILLING_RETURN が自動で設定されます。

執行モードごとに使えるタイプ

銘柄ごとに「執行モード」(SYMBOL_TRADE_EXEMODE)が決まっています。リファレンスの表を整理すると、次のとおりです。

執行モード FOK IOC RETURN
リクエスト実行(REQUEST) 使える(銘柄の設定に関係なく) 使える 常に使える
即時実行(INSTANT) 使える(銘柄の設定に関係なく) 使える 常に使える
成行執行(MARKET) 銘柄の設定による 銘柄の設定による 使えない
取引所実行(EXCHANGE) 銘柄の設定による 銘柄の設定による 常に使える

ここで大事なのは、成行執行(MARKET)の銘柄では、RETURNが使えず、FOK・IOCも銘柄の設定次第という点です。type_fillingを省略した(=RETURNになる)EAを成行執行の銘柄で動かすと、10030になる可能性があります。なお、未決注文では、実行タイプに関わらずRETURNを使うとリファレンスに書かれています。

自分の使う口座・銘柄が、どの執行モードかは、この記事では確かめていません(確認したTitan FXの取引条件のページには、MT5の執行モードの名称は書かれていませんでした)。次の節のスクリプトで、自分の画面で調べてください。

銘柄が許可するタイプを調べる

SYMBOL_FILLING_MODE は、銘柄が許可するタイプをフラグの組み合わせで返します。FOKは1、IOCは2のフラグで、論理積(&)で調べます。次のコードは、リファレンスの例をもとに、チャートの銘柄の執行モードと、FOK・IOCの可否、許可されたものから選んだタイプを出力します。

// 特定の実行タイプが許可されているかどうかを調べる
bool IsFillingAllowed(const string symbol, const int fill_flag)
  {
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
   return((filling & fill_flag) == fill_flag);
  }

// type_filling の一例:FOK→IOC→RETURN の順に、許可されたものを選ぶ
ENUM_ORDER_TYPE_FILLING PickFilling(const string symbol)
  {
   if(IsFillingAllowed(symbol, SYMBOL_FILLING_FOK)) return(ORDER_FILLING_FOK);
   if(IsFillingAllowed(symbol, SYMBOL_FILLING_IOC)) return(ORDER_FILLING_IOC);
   return(ORDER_FILLING_RETURN);
  }

void OnStart()
  {
   string sym = _Symbol;
   ENUM_SYMBOL_TRADE_EXECUTION exe = (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(sym, SYMBOL_TRADE_EXEMODE);
   PrintFormat("%s 執行モード: %s", sym, EnumToString(exe));
   PrintFormat("FOK: %s / IOC: %s", IsFillingAllowed(sym, SYMBOL_FILLING_FOK) ? "可" : "不可",
               IsFillingAllowed(sym, SYMBOL_FILLING_IOC) ? "可" : "不可");
   PrintFormat("選ばれる type_filling: %s", EnumToString(PickFilling(sym)));
  }

PickFillingの「FOK→IOC→RETURN」の順は、説明のための一例です。FOKは全量でしか実行しないため、流動性が薄い時は実行されないことがあります。IOCは一部だけ約定する可能性があります。どちらを優先するかは、EAの設計で決めてください。成行執行の銘柄でFOKもIOCも不可と出た場合、RETURNは使えないので、この単純な関数では対応できません(その場合の扱いは、この記事では確かめていません)。

実行結果は、エキスパートタブ(スクリプトの場合)に出ます。見る場所はMT5の「操作ログ」と「エキスパート」ログの違いにあります。

10030が出た時の確認順

  1. OrderSendのリクエストの type_filling が、省略されていないか・固定値になっていないか
  2. 銘柄を変えたか、口座(業者)を変えたか。変えたなら、上のスクリプトで許可されたタイプを確かめる
  3. 未決注文を出していないか。未決注文はRETURNを使う
  4. 注文エラー全般はMT5で注文できない時の確認|表示されるエラー別の原因で、他の原因も切り分ける

まとめ

  • 10030は「無効な注文執行タイプ」。銘柄が許可していないtype_fillingを指定した時に出る
  • FOK・IOCは銘柄の設定、成行執行ではRETURNは使えない。省略するとRETURNになる
  • SYMBOL_FILLING_MODE で許可されたタイプを調べてから、type_fillingを選ぶ

本記事はプログラミングの説明であり、特定の売買を推奨するものではありません。