入門

指値・成行・IOC・ポストオンリーの違いと使い分け|ボットの注文タイプ入門


※本記事にはアフィリエイト広告(プロモーション)が含まれています。

自動売買ボットを作り始めると、必ず「どの注文タイプを使うか」という選択に直面します。指値と成行の違いは分かっていても、IOCやポストオンリーが具体的に何をしてくれるのかは、実際に手を動かすまでイメージしづらいものです。この記事では、ボット開発でよく登場する注文タイプの違いと、それぞれをどんな場面で選ぶべきかを整理します。

板情報の読み方については 板情報(オーダーブック)とは?ボットで見るべき数値と使い方 で解説しているので、注文がどう約定するかのイメージが薄い方は先にそちらを読むと理解しやすくなります。

注文タイプが「約定条件」を決めるという基本

注文タイプは、大きく分けると次の2つの性質の組み合わせで決まります。

  • 価格条件: いくらで約定させたいか(指値=価格を指定する / 成行=価格を指定しない)
  • 執行条件: どのタイミング・範囲まで約定を許すか(即時全量のみ・部分約定OK・板に残すか、など)

この2つを分けて考えると、名前は違っても中身が近い注文タイプの関係が整理しやすくなります。以下、代表的なものを順に見ていきます。

成行注文(Market Order)

価格を指定せず、「今の板にある最良の価格で即座に約定させる」注文です。

  • メリット: 約定が速く、確実性が高い
  • デメリット: スリッページ(想定価格とのズレ)が発生しやすい。板が薄い銘柄や急変動時は特に大きくズレることがある

ボットで成行を使う典型的な場面は、損切り(ストップロス)のように「価格より約定の確実性を優先したい」ケースです。資金管理の観点からの損切り設計は 自動売買ボットの資金管理術 で詳しく扱っています。

import ccxt

exchange = ccxt.mexc({'apiKey': 'YOUR_API_KEY', 'secret': 'YOUR_SECRET'})

# 成行の買い注文(0.001 BTC)
order = exchange.create_order(
    symbol='BTC/USDT',
    type='market',
    side='buy',
    amount=0.001,
)

指値注文(Limit Order)

「この価格以下(以上)でなければ約定しない」という価格条件をつける注文です。

  • メリット: 想定していない価格での約定を防げる。板に注文を出す(メイカー)側になれば、取引所によっては手数料が成行より安くなることもある
  • デメリット: 価格が指定水準に届かなければ約定せず、機会を逃す可能性がある
# 指値の買い注文(50,000 USDTで指定)
order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',
    side='buy',
    amount=0.001,
    price=50000,
)

グリッドボットのように「複数の価格帯に指値を並べておく」戦略は、指値注文の性質をそのまま利用した設計です。レンジ設定の考え方の実例は グリッドトレードは本当に稼げる? で紹介しています。

IOC(Immediate or Cancel)

指値注文に「即時に約定できる分だけ約定させ、残りはキャンセルする」という執行条件を追加したものです。板に注文が残らないのが最大の特徴です。

  • 通常の指値: 約定しなければ板に残り続け、後から約定する可能性がある
  • IOC: 発注した瞬間に約定できる分だけ処理され、約定しなかった分(または全部)は即座に消える

「今すぐ約定させたいが、成行のように無制限に価格が滑るのは避けたい」という場面で使われます。たとえば、想定レンジの外側まで滑る成行の代わりに、許容できる価格の上限(下限)を指定したIOC注文を使う、という組み合わせです。

order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',
    side='buy',
    amount=0.001,
    price=50000,
    params={'timeInForce': 'IOC'},
)

FOK(Fill or Kill)

IOCに似ていますが、より厳格です。指定した数量の全量が即座に約定できない場合は、注文全体がキャンセルされます。 部分約定は一切許容されません。

まとまった数量を「約定するなら全部、できないなら何もしない」という形で処理したいときに使います。板の厚みが十分でない銘柄で使うと、キャンセルばかりになることもあるため、事前に板の厚みを確認しておくことが重要です。

order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',
    side='buy',
    amount=0.001,
    price=50000,
    params={'timeInForce': 'FOK'},
)

ポストオンリー(Post Only)

「必ず板に指値として残る(メイカーになる)ことを保証し、即座に約定してテイカーになってしまう場合は注文自体を拒否する」という条件です。

多くの取引所ではメイカー(板に注文を残して他の注文を待つ側)とテイカー(板にある注文に即座に合わせにいく側)で手数料率が異なり、メイカーの方が手数料が低く設定されていることが一般的です。ポストオンリーは、意図せずテイカー手数料を払ってしまう事故を防ぐための注文条件です。

order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',
    side='buy',
    amount=0.001,
    price=50000,
    params={'postOnly': True},
)

※ timeInForceやpostOnlyの指定方法・対応状況は取引所によって異なり、ccxtでのparamsの渡し方も変更されることがあります。実装前に必ず該当取引所の公式ドキュメントとccxtの対応表を確認してください。

注文タイプの比較表

種類 価格指定 板に残るか 部分約定 主な用途
成行 しない 残らない 可 確実性重視の即時執行(損切りなど)
指値 する 残る 可 想定価格での約定を待つ
IOC する 残らない 可 価格上限を決めた即時執行
FOK する 残らない 不可(全量約定 or 全キャンセル) まとまった数量の一括執行
ポストオンリー する 残る(保証) 可 メイカー手数料の確保

ボットで使い分けるときの考え方

戦略のロジック自体よりも、「注文がどう執行されてほしいか」を先に言語化すると選びやすくなります。

  1. とにかく今のポジションを解消したい(損切り・緊急停止) → 成行、または広めの価格を許容したIOC
  2. 想定した価格帯でしか約定してほしくない(エントリー・利確) → 指値
  3. 手数料をメイカー水準に抑えたい → ポストオンリー
  4. まとまった数量を分割約定させたくない → FOK
  5. 板が薄い銘柄で価格の滑りを限定したい → IOC

同じ「買い注文を出す」処理でも、これらの条件を戦略のコードにハードコードしてしまうと、後から取引所を追加したときに挙動が変わってしまうことがあります。複数取引所に対応する設計では、この注文条件の差異を吸収する層を用意しておくと安全です。詳しくは 複数取引所に同時対応するボットの設計 をご覧ください。

PR

ポストオンリーやIOCなどの執行条件は取引所によって対応状況が異なります。Bitgetは自動売買ボット機能が内蔵されており、注文条件の違いを画面上で確認しながら試すこともできます。

Bitgetの口座を無料で開設する(紹介リンク)

まとめ

  • 注文タイプは「価格条件」と「執行条件」の組み合わせで理解すると整理しやすい
  • 成行は確実性重視、指値は価格重視という基本の対比がベース
  • IOCは「即時約定・板に残さない」、FOKは「全量約定できなければ全キャンセル」という執行条件の違い
  • ポストオンリーはメイカーとして板に残ることを保証し、意図しないテイカー手数料を防ぐ
  • 取引所ごとに対応状況やパラメータの指定方法が異なるため、実装前に必ず公式ドキュメントを確認する
  • 戦略ロジックと注文条件を分離しておくと、複数取引所対応やあとからの変更がしやすくなる

注文タイプの選択は地味に見えますが、スリッページや手数料に直結する部分です。まずは ccxtとは?Pythonで仮想通貨ボットを自作する第一歩 で基本の発注方法を押さえたうえで、本記事の使い分けを自分のボットに反映してみてください。