IOC vs FOK、成行・指値注文:アルゴFX執行の注文タイプ 2026年11月04日 – Posted in: Arbitrage Software, Forex trading
IOC、FOK、成行、指値:トレードに合った注文を選ぶ
注文タイプの選択とは、不利な価格、小さな約定数量、まったく約定しないことのうち、どれを受け入れるかを決めることです。このガイドでは、各注文指示がオーダーブック、FIX メッセージ、ラストルックのもとでどのように動作するかを、ミリ秒単位で判断しなければならないアルゴリズムを想定した計算例とともに解説します。
結論:IOC と FOK の違い。Immediate-or-Cancel(IOC)注文は、指定価格またはそれより有利な価格で今すぐ約定できる分だけを取得し、残りをキャンセルするため、部分約定が起こり得ます。Fill-or-Kill(FOK)注文は、ただちに全量が約定しなければ全体がキャンセルされるため、結果は全量か、ゼロかのどちらかです。一部の数量でも役に立つ場合は IOC を、部分的なポジションならないほうがよい場合は FOK を使います。
注文タイプと有効期間は別々の判断です
多くの用語集では、成行、指値、ストップ、IOC、FOK が同じメニューの 5 つの選択肢のように並んでいます。しかし実際はそうではありません。その背後には互いに独立した 2 つの問いがあり、アルゴリズムはすべての注文でその両方に答える必要があります。
- どの価格まで受け入れるか。これが注文タイプです。成行(価格を問わない)、指値(指定価格またはそれより有利な価格)、ストップ(トリガー価格で取引または提示された時点で有効化)があります。
- 注文をどれだけの間有効にするか。これが有効期間(time in force、TIF)です。即時(IOC、FOK)、セッション終了まで(Day)、キャンセルまで(GTC)、指定時刻まで(GTD)があります。
つまり、IOC と FOK は指値注文の代わりになるものではなく、指値注文に付ける有効期間です。「指値 IOC」と「指値 FOK」はアルゴリズム FX で最もよく使われる積極的な注文指示であり、FIX プロトコルでも 2 つの判断は別々のフィールド、OrdType(タグ 40)と TimeInForce(タグ 59)に分かれています。
FX の成行注文:「成行」の本当の意味
成行注文は「今すぐ約定させてほしい、価格は二の次だ」という指示です。指値がないため約定の確実性は最も高い一方で、約定価格に対する保護はありません。オーダーブックが動いていたり薄かったりすると、注文は指定数量に達するまで利用可能な価格帯を順に上っていきます。このコストがスリッページであり、詳しくはFX スリッページの測定と削減方法のガイドで解説しています。
FX には、取引所を前提とした説明では省かれがちな点が 2 つあります。
- 単一の中央オーダーブックは存在しません。ブローカーや ECN が表示するのは、複数のリクイディティプロバイダーからのストリームを集約したものです。「成行」とは、世界共通の市場価格ではなく、その執行先がストリームから得られる最良価格を意味します。
- 成行注文にも暗黙の有効期間があります。多くの執行先は、成行注文を内部的に IOC または FOK として扱います。今約定できる分を約定させ、残りを報告するという処理です。最大乖離幅を指定できる執行先もあり、その場合、注文は実質的に指値になります。思い込みで判断せず、執行先の仕様を確認してください。
アルゴリズムにおける成行注文の実用的な役割は限られています。ヘッジを失ったポジションの決済のように、取引しないことのほうが大きな危険となる場面に向いています。
指値、マーケタブルリミット、ストップ注文
パッシブな指値注文
現在価格から離れた位置に置いた指値注文は、オーダーブックに残って待機します。Ask より下の買い指値は流動性を取るのではなく、提供します。スプレッドを支払う代わりに獲得できる可能性がありますが、キューリスクとアドバースセレクションを負うことになります。パッシブ注文は、相場がその価格を突き抜けていくときに約定しやすいからです。パッシブ注文は通常、Day、GTC、GTD と組み合わせます。
マーケタブルリミット注文
現在の Ask 以上に価格を設定した買い指値は成行注文のように即座に約定しますが、指値を超えて約定することはありません。この「マーケタブルリミット」は自動執行の主力です。IOC と組み合わせると、「この価格まで今すぐ流動性を取り、オーダーブックには何も残さない」という意味になります。
価格改善については誤解されがちです。指値は受け入れられる最も不利な価格であり、約定価格ではありません。1.08510 の指値で買い、Ask が 1.08502 であれば、1.08502 で、あるいはそこから指値までの次の価格帯で約定するはずです。
ストップ注文とストップリミット注文
ストップ注文はトリガーに達するまで休止しており、達すると成行注文になります。ストップリミットは代わりに指値注文になります。前者が保証するのは発動であって価格ではありません。後者は価格に上限を設けますが、相場がギャップしたまさにその瞬間に未約定のまま残る可能性があり、これは保護用ストップとしては好ましくない性質です。ストップをどこに置くかも重要です。執行先に置いたストップは接続が切れても残りますが、自分のソフトウェア内でシミュレートしたストップは残りません。
有効期間:全一覧
| 注文指示 | FIX 59 | 有効期間 | 部分約定 | 主な用途 |
|---|---|---|---|---|
| Day | 0 | セッション終了まで | あり | 特定のセッション中のパッシブな気配提示 |
| GTC (Good Till Cancel) | 1 | キャンセルされるまで | あり | 待機中のエントリー、利益確定、ストップ注文 |
| IOC (Immediate or Cancel) | 3 | 即時に約定し、残りはキャンセル | あり | 一部の数量でも役立つ場合の流動性テイク |
| FOK (Fill or Kill) | 4 | 全量を即時に約定、またはゼロ | なし | 全量か無かのエントリーと固定数量のレッグ |
| GTD (Good Till Date) | 6 | 指定時刻まで(タグ 126 または 432) | あり | ニュース発表前など、明確な期限のある気配提示 |
値は FIX 4.4 仕様に基づきます。執行先が対応しているのは通常この一部のみで、TIF を特定の注文タイプに限定している場合もあります。そのため、記事内の表よりもブローカーの取引ルールが優先されます。
IOC vs FOK vs 成行:同じオーダーブックで 3 つの結果
具体例で見てみましょう。あるアルゴリズムが 2,000,000 EURUSD を買おうとしています。最良 Ask は 1.08500 で、注文到着時の売り側の板は次のとおりです。
| Ask 価格 | 利用可能数量 | 累計 |
|---|---|---|
| 1.08500 | 500,000 | 500,000 |
| 1.08501 | 500,000 | 1,000,000 |
| 1.08503 | 1,000,000 | 2,000,000 |
| 1.08506 | 2,000,000 | 4,000,000 |

| 注文指示 | 約定数量 | 平均価格 | 最良 Ask 比のコスト | 結果 |
|---|---|---|---|---|
| 成行、2M | 2,000,000 | 1.085018 | 0.175 pip、約 $35 | 完了、ただし価格は選べない |
| 指値 1.08502 IOC、2M | 1,000,000 | 1.085005 | 0.05 pip、約 $5 | 数量の半分、1M はキャンセル |
| 指値 1.08502 FOK、2M | 0 | なし | $0 | キャンセル:指値以下に 1M しかない |
| 指値 1.08503 FOK、2M | 2,000,000 | 1.085018 | 0.175 pip、約 $35 | 約定:指値に十分な余裕があった |
注目すべきは最後の行です。わずか十分の一 pip 広げただけで、FOK は不成立から全量約定に変わり、しかも平均価格は指値より有利でした。FOK は「タイト」という意味ではありません。「この瞬間、この価格以下に全数量が収まらなければならない」という意味です。同じ指値の IOC と FOK が見ている流動性は同じです。違うのは、それが足りないときの動作だけです。
また、どの場合でも安上がりな注文指示というものはありません。$5 の IOC は $35 の成行注文より割安に見えますが、確保できたポジションは半分だけです。残りの 1M を後でより不利な価格で買うことになれば、比較は変わります。この不足分のコストこそが、このガイドの以降のテーマです。
FIX での注文の表現
FIX API 接続では、各指示を NewOrderSingle メッセージ(35=D)で明示します。重要なフィールドに絞って簡略化すると、先ほどの例の IOC 注文は次のようになります。
59=3 を 59=4 に変えると、同じ注文が FOK になります。価格を削除して 40=1 を設定すると成行注文になります。ここではヘッダー、チェックサム、タイムスタンプ、口座フィールドを省略しています。また、シンボルの形式は執行先によって異なり、数値のシンボル ID を使うところもあります。
| タグ | フィールド | 主な値 |
|---|---|---|
| 40 | OrdType | 1 成行、2 指値、3 ストップ、4 ストップリミット、D 事前提示(Previously quoted) |
| 59 | TimeInForce | 0 Day、1 GTC、3 IOC、4 FOK、6 GTD |
| 110 | MinQty | 約定しなければならない最小数量(対応している場合) |
| 150 | ExecType | 0 New(新規)、F Trade(約定)、4 Canceled(取消)、8 Rejected(拒否)、C Expired(失効) |
| 39 | OrdStatus | 0 New(新規)、1 Partially filled(一部約定)、2 Filled(全量約定)、4 Canceled(取消)、8 Rejected(拒否)、C Expired(失効) |
| 14 / 151 | CumQty / LeavesQty | これまでの約定数量 / 未約定の数量。LeavesQty 0 は注文の完了を意味します |
| 31 / 32 / 6 | LastPx / LastQty / AvgPx | 今回の約定の価格と数量 / 全約定の平均 |
難しいのは注文の送信ではなく、応答の読み取りです。1 つの IOC から一連の ExecutionReport(35=8)が返ることがあり、残りの数量の報告方法は執行先によって異なります。

約定の前に追加の確認応答(150=0)を送る執行先もあれば、約定を 1 件に集約して送る執行先もあります。FIX 4.2 セッションでは約定の ExecType の値(1 と 2)が FIX 4.3 以降(F)と異なります。そのため、堅牢なハンドラーはメッセージの固定数ではなく、CumQty、LeavesQty、OrdStatus を基準に処理します。これらのメッセージの下にあるセッション層については、FIX プロトコルの解説をご覧ください。
フルアマウント流動性とラストルック:FX が異なる理由
株式市場を前提とした説明は、表示された売り気配が確定している中央指値注文板を想定しています。FX の執行先は、IOC と FOK に直接影響する 2 つの点で異なる動作をすることがあります。
スウィープ可能な流動性とフルアマウント流動性。スウィープ可能なオーダーブックでは、上の例のように、注文が複数のプロバイダーの複数の価格帯を取得できます。フルアマウント価格では、プロバイダーが全数量に対して 1 つの価格を提示し、各階層は加算できません。そのため 2M の FOK は、1M の気配の合計ではなく 2M の階層と照合されるはずです。見た目が同じ板情報でも、意味が異なることがあるのです。
ラストルック。プロバイダーがラストルックを適用している場合、注文は依頼にすぎず、短い保留の後に拒否されることがあります。送信時に十分な数量が表示されていても FOK が拒否されることがあり、IOC の約定数量が表示より小さくなることもあります。FX Global Code(外国為替市場の行動規範)は、ラストルックを使うプロバイダーに対し、この慣行を顧客へ開示するよう求めているので、開示を求めてください。ラストルックによる拒否は、自分で記録しない限りログには現れません。仕組みについてはブローカーの執行、A-book、B-book、ラストルックのガイドで解説しています。
指値の置き方:計算モデル
IOC や FOK で重要なパラメーターは、TIF ではなく指値価格です。現在の気配に置けばシグナルの大半を逃し、無制限にすれば最悪の約定がエッジを食いつぶします。この両極端の間に、計算で求められる答えがあります。
手数料控除後の期待エッジがシグナル価格から 1.2 pips である、短命なシグナルを考えます。シグナルから執行先への到着までに価格は動きます。2 つの局面を仮定します。80% のケースでは価格が約 0.2 pip 不利に動き(標準偏差 0.3 pip)、20% のケースでは急激な動きで約 2 pips 離れます(標準偏差 1 pip)。これらの入力値は説明用です。実際には自身の注文ログから推定します。

| シグナル価格からの指値許容幅 | 約定率 | 約定あたりの平均純益 | シグナルあたりの期待純益 |
|---|---|---|---|
| 0 pip(シグナル価格に指値) | 20.7% | 1.38 pips | 0.29 pip |
| 0.3 pip | 51.3% | 1.18 pips | 0.61 pip |
| 0.6 pip | 74.3% | 1.05 pips | 0.78 pip |
| 1.2 pips(エッジと同じ) | 84.2% | 0.98 pip | 0.82 pip |
| 2.0 pips | 90.0% | 0.89 pip | 0.80 pip |
| 指値なし(成行注文) | 100% | 0.64 pip | 0.64 pip |
この例に限らず、次の 3 つの結論が広く当てはまります。
- 最良の指値は気配ではなく損益分岐価格です。期待利益がプラスで残る約定は、すべて取る価値があります。このモデルでは、許容幅がエッジと等しい点がちょうど最大となります。次の限界的な約定の利益はゼロだからです。
- 曲線の頂点付近は平坦です。0.8 から 2 pips の間では期待利益はほとんど変わりません。厳密な許容幅は不要ですが、許容幅そのものは必要です。
- 平均約定価格は誤解を招く目標です。最もタイトな指値は約定あたりの価格が最良(1.38 pips)ですが、シグナルあたりの結果は最悪(0.29 pip)です。シグナルの 79% が取引に至らないからです。
このモデルはキューの影響を無視し、指値に達すれば全数量が約定すると仮定しています。大きな注文では、実際の板の厚みで計算し直してください。指値はどれだけの数量が収まるかも左右するからです。前提はデータで確認しましょう。バックテストとライブ執行のギャップのガイドでは、執行時間をテストに組み込む方法を解説しています。
新たなリスクを生まない部分約定の処理
部分約定はエラーではありませんが、アルゴリズムがルールを持つべき新しい状態です。FOK はエントリーでこの状態を回避し、IOC は問題をロジック側に移します。稼働前に方針を決めておいてください。
| 残数量の方針 | 適する場面 | 管理すべきリスク |
|---|---|---|
| 約定分を受け入れて管理する | エッジが数量に依存しないエントリー | ポジションが小さすぎて固定費を賄えない |
| 残りを新しい価格で再送する | シグナルが有効で、エッジが許容幅を上回っている | 価格の追いかけ。再試行回数に上限を設け、毎回エッジを再確認する |
| 別の執行先でヘッジまたは完了する | マルチレッグ取引 | ロットステップの違いと、2 度目の未約定の可能性 |
| 約定分を手仕舞う | 実行可能な数量を下回る約定 | スプレッドを二重に支払う |
2 レッグの取引には最大の注意が必要です。ヘッジ取引で、執行先 A で IOC により 2M を買い、執行先 B で売るとします。A が 1M しか約定しないのに、アルゴリズムが予定どおり 2M を売ると、1M のショートが残ります。EURUSD では 100 万通貨あたり 1 pip 約 $100 なので、そのポジションに不利な 10 pips の変動は $1,000 の損失となり、多くの取引のエッジを簡単に上回ります。ルールは単純です。第 2 レッグの数量は、依頼数量ではなく第 1 レッグの CumQty から決めてください。
第 2 の執行先の数量単位への変換も必要です。第 1 レッグが 1,370,000 約定し、執行先 B が 100,000 単位しか受け付けない場合、ヘッジできるのは 1,400,000 か 1,300,000 で、同じ数量にはできません。この端数についてもルールを定め、ヘッジされていない端数はリスク上限の対象として扱ってください。
第 1 レッグの FOK は数量の不一致を解消しますが、取引不成立の回数を増やします。第 2 レッグの FOK は通常、良い選択ではありません。第 1 レッグが約定済みの状態でヘッジがキャンセルされると、全額がエクスポージャーとして残るからです。第 2 レッグこそ、約定の確実性にお金を払う価値がある場所です。
戦略別の注文の選び方

| 状況 | 妥当な初期設定 | 理由 |
|---|---|---|
| レイテンシーアービトラージのエントリー | 損益分岐価格の指値 IOC | エッジはミリ秒単位で減衰します。部分約定でも利益が出て、指値がテールを防ぎます |
| ヘッジペアの第 1 レッグ | 指値 FOK、または CumQty でヘッジする IOC | FOK は数量設計を守り、IOC は約定率を高めますが、より優れたロジックが必要です |
| 第 1 レッグ約定後の第 2 レッグ | 成行または広めの IOC | ヘッジされていないことのほうが大きなリスクです |
| ニュースに基づくエントリー | 指値 IOC、小さめの数量 | スプレッドと板の厚みは急速に変化し、成行注文には上限がありません |
| 緊急決済またはストップアウト | 成行または広めの IOC を、ポジションがゼロになるまで繰り返す | 確実性が最優先です。FOK ではポジションが残る可能性があります |
| ペア取引または統計的取引 | 指値 IOC、または短命なパッシブ指値 | 保有期間が長いため、速度よりも支払うスプレッドが重要です |
| スプレッド獲得とリバランス | パッシブ指値、Day または GTD | 待つことで報酬を得られますが、ニュースとロールオーバーの前にキャンセルが必要です |
執行はタイミングにも左右されます。ロールオーバーやニュースの前後ではスプレッドが広がり、板が薄くなるため、ロンドン時間の正午にうまく約定する指値も、その時間帯には失敗したり割高になったりします。許容幅と数量は一日中固定せず、その時点のスプレッドに連動させましょう。速度に敏感な戦略の詳細は、レイテンシーアービトラージのガイドをご覧ください。
注文執行を設定する 7 つのステップ
自動注文処理でよくある間違い
- 依頼した数量が約定したと思い込む。ポジションは送信した注文ではなく、ExecutionReport から求める必要があります。
- キャンセルされた FOK をシステムエラーとして扱う。これは正常な結果です。1 件ごとにアラートを出すとアラートを無視する習慣がつくので、発生率に対してアラートを設定してください。
- 同じ価格でループ再試行する。価格が動いていれば再試行も失敗し、高速な再試行はメッセージ制限に抵触するおそれがあります。価格を更新するか、停止してください。
- 不明な状態を無視する。応答が届かない場合でも、注文はまだ有効か約定済みかもしれません。代わりの注文を送る前に、OrderStatusRequest(
35=H)で照会するか、再接続後にポジションを照合してください。 - ClOrdID の値を再利用する。再試行を含め、注文ごとに一意のタグ 11 を使うことで、照合が可能になります。
- 古い価格で指値を計算する。遅延した気配から計算した指値は、タイトすぎるか緩すぎるかのどちらかになります。高速な価格フィードがあってこそ、許容幅に意味が生まれます。
- 完璧な約定でテストする。すべての注文が気配どおりに全量約定するバックテストでは、成行、IOC、FOK を区別できません。板の厚みと拒否をモデル化するか、小さな数量でフォワードテストを行ってください。
- 設定を執行先の間で流用する。板の厚み、ラストルック、レイテンシーはすべて異なるため、あるブローカーで調整した許容幅は、別のブローカーではほとんど参考になりません。
測定すべき指標
注文タイプの選択は実証的な問題であり、完全なログだけがその答えを出せます。レポートは完了した取引だけでなく、シグナルと試行も対象にしてください。
| 指標 | 定義 | 分かること |
|---|---|---|
| 約定比率 | 約定数量 / 依頼数量 | 低すぎる場合は、指値がタイトか板が薄い |
| 拒否率 | 拒否またはキャンセルされた注文 / 送信した注文 | 急上昇は流動性またはブローカーの変化を示唆 |
| スリッページ | 約定価格からシグナル時の基準価格を引いた値(符号付き) | 約定取引あたりの執行コスト |
| ラウンドトリップ時間 | 注文送信から最初の ExecutionReport まで | 時間帯別に見た執行先の速度低下の有無 |
| シグナルあたりの純益 | 総損益 / 見送り分を含む全シグナル | 許容幅の決定基準とすべき数値 |
これらの数値をシンボル、執行先、時間帯、注文タイプ別に分け、変更の前後で結果を比較してください。SharpTrader は注文とパフォーマンス統計を PnL、スリッページ、執行時間とともに表示するため、こうした検証の実用的な基盤になります。特定の環境で利用できる注文タイプと TIF の値はコネクターとブローカーによって異なるので、ご自身の口座で確認してください。
自身のデータを基に執行を構築する
SharpTrader は FIX API やその他のプロトコルでブローカーに接続し、アービトラージ戦略と非アービトラージ戦略を実行し、注文ごとにスリッページと執行時間を記録します。そのデータに基づくパラメーター調整には、SharpTrader Optimizer が探索を自動化します。
無料アービトラージスキャナー+短いメール講座
無料スキャナーのリンクと、Boris からの短く実践的なメールをお届けします。コスト差し引き後の価格差が本当に意味すること、実際の資金を投じる前に戦略をテストする方法、あなたの市場に合うツールについて。誇張はありません。 メールは英語で配信されます。
よくある質問
IOC と FOK の違いは何ですか?
どちらも即時に執行され、オーダーブックに残ることはありません。IOC は部分約定を受け入れ、未約定の残りをキャンセルします。FOK は全数量の即時約定を求め、それができなければ注文全体がキャンセルされ、何も取引されません。
FOK は IOC より優れていますか?
一般にどちらが優れているとはいえません。FOK は、部分的なポジションが役に立たない、あるいはヘッジを複雑にする取引に適しています。IOC は一部の数量が約定するため通常は取引機会が多くなりますが、アルゴリズムが部分約定を正しく処理する必要があります。
FOK 注文は部分約定しますか?
いいえ。定義上、FOK 注文は全量が約定するか、まったく約定しないかのどちらかです。部分執行が見られる場合、その注文はその執行先で真の FOK ではなかったということなので、ブローカーが指示をどのようにマッピングしているかを確認してください。
IOC 注文の未約定分はどうなりますか?
ただちにキャンセルされ、オーダーブックに残ることはありません。FIX では注文を終了させる ExecutionReport を受信します。執行先により通常は Canceled または Expired となり、LeavesQty は 0 です。
成行注文と IOC 注文は同じですか?
厳密には異なります。成行注文には価格の制限がありませんが、IOC には通常あります。多くの執行先は成行注文を IOC または FOK の動作で処理するため、有効期間が一致することはありますが、価格を守れるのは指値だけです。
IOC と FOK の FIX の値は何ですか?
TimeInForce フィールド(タグ 59)で、IOC は 3、FOK は 4 です。注文タイプは別途タグ 40 で設定し、1 が成行、2 が指値です。
すべての FX ブローカーが IOC と FOK に対応していますか?
いいえ。対応状況はブローカー、プラットフォーム、接続方式によって異なります。FIX API 接続は通常より細かな制御が可能ですが、受け付ける注文タイプと有効期間の組み合わせは執行先ごとに公開されています。
この記事は教育目的であり、投資助言ではありません。オーダーブックとモデルは説明用の例であり、取引結果ではありません。外国為替取引には大きな損失のリスクが伴います。