なりさんBLOG

金融・FIXプロトコルの相談。いつでも承ります。機械学習のコンテンツを充実させてきます。

FIX Protocol

FIX プロトコル 基本

 

FIXプロトコルとは?

TCPのソケット通信で、送るメッセージの形式を定めたものが、FIXプロトコルです。

 

フォーマット

タグ番号=値

が繰り返す、テキスト平文。

  • タグ番号 1-1000程度まで共通の意味をもつ。例えばTag35はメッセージタイプ、Tag49はSenderCompIDなど。
  • 1000番以降は、カスタムタグと呼ばれ、各FIXベンダーが独自の意味を持たせる。TCPのポートの概念を考えるとわかりやすい、かも。
  • 値には整数、小数点含む数字、文字一文字、複数文字など。共通タグでも、最大文字数などは定まっていないので、結局各ベンダー仕様にあわせる
  • 区切り文字はSOHというASCII制御コード0x01。SOHは通常のエディターで表示できないため、便宜的に| や □で 表すことが多い。

メッセージの構成

    • StandardHeader(全メッセージ共通)

      FixVersion,メッセージタイプ、SeqNumなどを含む。OnBehalfOfCompIDなどはオプショナル

    • Body(メッセージタイプによって違う)

      メッセージ本体。注文株数など

    • Tailer(全メッセージ共通)

      CheckSum。メッセージ全体が正しく送られてるかチェックできる。

       

メッセージサンプル

  • HeartBeat

8=FIX.4.1|9=53|35=0|49=yana|56=test|34=268|52=20100528-04:26:51|10=133|

8から52がヘッダ、10がトレーラー

  • Logon

8=FIX.4.1|9=71|35=1|49=yana|56=test|34=277|52=20100528-04:33:48|112=20100528-12:20:20|10=187|

8から52がヘッダ、112がボディ、10がトレーラー

  • NewOrderSingle

8=FIX.4.1|9=180|35=D|49=yana|56=てst|34=280|52=20100528-04:36:20|
115=TEST||59=0|21=1|11=12750213803|54=1|38=10000|40=2|44=2860
|55=6758|60=20100414-08:17:34|10=242|

8から115がヘッダ、59から60がボディ、10がトレーラー

 

メッセージの種類

メッセージタイプ(タグ35)に応じて、大きく二つの種類に分かれます。

  • Admin Message

セッション管理用メッセージ。Logon(35=A)やHeartBeat(35=0)など

  • Application Message

業務メッセージ。注文メッセージ、訂正メッセージ、出来など

 

Admin Message

原則

  • Incomingの通番に対して、低い番号がきたらリジェクト(致命的なエラーが考えられるから)
  • Incomingの通番に対して、高い番号がきたらResendRequest(あまりに離れてるときはRejectもある)
  • 次に送られてくる(送る)番号がIncoming (Outgoing)
    例:In-1,Out-1のセッションに対して、最初に送るLogonの34は1。返答のLogonも1

代表的な流れ

  • SeqNumが合っている
  1. Initiater から Logon (35=A) 送信
  2. Acceptor が Logon (35=A) 返信
  3. HeartBeart (35=0) もしくは Application Message
  • SeqNumが合っていない(Incomingに対して、大きい数字)
  1. Initiater から Logon (35=A) 送信
  2. Acceptor が Logon (35=A) 返信
  3. Incomingの番号が合わない方が、Resend Request
  4. Resendするか、SeqResetを返答
  5. Seqが合ったらHeartBeartを送信
  • SeqNumが合っていない(Incomingに対して、小さい数字。もしくは大きいギャップ)
  1. Initiater から Logon (35=A) 送信
  2. AccepterがReject (35=3)送信。Tag58に理由がある場合が殆ど(例 Expecting Incoming SeqNum=100 but received 5)

各メッセージ

  • TestRequest (35=1)

コネクションのチェックや、HBを催促するときに発行。返答のHBはTestRequestIDを含む。

  • ResendReques(35=2)

再接続時や、受信側のIncomingと、送信されたメッセージの通番があわないときに受信側が発行

  • Reject(35=3)

プロトコルレベルでの違反(必須タグがない、値の形式が違う)ときに返答。それ以外はExecution Report Reject(35=8,150=8)

  • SeqReset(35=4)

送信側がRRに対してResendしないときに、相手側のIncomingの設定を以来

・123がタグなしもしくはNなら、34は無視される。123=Yなら34は無視されないべき。
・36は、次に送るメッセージの通番

下は例

8=FIX.4.0|9=89|35=4|49=yana|56=test|34=441|52=20100527-07:23:35|43=Y|122=20100527-07:23:35| 36=443|10=134| 8=FIX.4.0|9=67|35=1|49=yana|56=test|34=443|52=20100527-07:23:35|112=20100527-07:23:35|10=012|

再送時ルール

  • 通番のミスマッチがあって、エンジンが自動でResendする場合やResendRequestへの返答の場合は、同じ通番・同じ内容でPossDupFlag=Y
  • NewOrderに対する応答が無くて、発注側がもう一度送る場合は、新しい通番・同じ内容でPossResend=Y

Application Message

原則

  • SellSide側が返すメッセージは殆どExecution Report(35=8)のみ。ERの中にさまざまな種類がある。
  • ERのOrdStatus(39)とExecType(150)は一緒
  • Unsolicitedと通常のCancelとの違いはOrderIDとCLOrdIDに何を含むか、だけ。通常UnsolicitedならTag41はブランク。
  • Cancel Request(35=F) および Cancel/Replace Request (35=G)の場合、Execution Report (PendingCancel もしく Pending Cancel/Replace)を返してから、ExecutionReportで結果を送付 (取引所に在る、最新の注文状態を確かめないと結果がわからないから)

代表的な流れ

  1. 顧客->New Order Single(35=D)
    注文を証券会社に送信
  2. 証券会社->Execution Report  NEW (35=8,150=0)
    注文受付したことを返答
  3. 証券会社->Execution Report  Partial Fill (35=8,150=1)
    一部出来を返答
  4. 顧客->Order Cancel/Replace Request (35=G)
    注文訂正を送信
  5. 証券会社->Execution Report Pending Replace (35=8,150=6 or E)
    訂正を処理中と返答
  6. 証券会社->Execution Report Replaced B (35=8,150=5)
    無事訂正できた旨を返答
  7. 証券会社->Execution Report  Fill (35=8,150=2)
    全部出来がついた旨を返答

各メッセージ

  • DoneForDay(35=8,150=3)

一日の終わりに注文の結果を送る。DayOrderならば、注文はTerminateされる。

  • Unsolicited New,Replace,Cancel

OMS側で強制的に注文の状態を変更しメッセージを送信すること。

 

ClOrdID OrigClOrdID
null last ClOrdID
last Cl last Cl
last Cl last OrigClOrdID
  • Trade Bust (35=8,150=1/2 , 20=1)

一度送ったExecution Report(Fill/Partial Fill)についてのキャンセル。すなわち

  • tag20(ExecTransType)=1(Cancel)
  • tag150(ExecType)=1(Partial fill) or 2(Fill)

  • Allocation (35=J)
    出来について、どの口座に何株数割り当てるかを指定するメッセージ。BuySideから送ってくる。
  • Execution Report (35=8)
    ExecType(150)をみて、どの種類か判断する必要がある。

IOI (35=6)

Indication of interest messages market merchandise which the broker is buying or selling in either a proprietary or agency capacity.

23(IOIid)
28(IOITransType)
55(Symbol)
54(Side)
27(IOIShares)
15(Currency) – not required in FIX protocol but major
62(ValidUntilTime) – not required in FIX protocol but major
104(IOIQualifier) – not required in FIX protocol but major

 

ReplaceRequestに対するER

NOS 10000株→
←ER(Ack)
←ER(Part. Fill 4000株)
の後の、OCRR(訂正)時のFIXの仕様は、以下のようになります。

パターン① : 一部出来より多い数量への訂正
OCRR (OrderQty=6000)→
←ER(Pending Replace)
←ER(Replace 150=5、39=1)

パターン② : 一部出来と同数量への訂正
OCRR (OrderQty=4000)→
←ER(Pending Replace )
←ER(Replace 150=5、39=2)

パターン③ : 一部出来よりすくない数量への訂正
OCRR (OrderQty=2000)→
←OCR(35=9)

 

その他

OnewayとTwoway

Oneway:約定だけFIXで送ること。注文は電話などでFIX以外で受ける

Twoway:注文も約定情報もFIXでやりとりすること。

 

とりあえず知っておくべきサイト

Fiximate

必須・オプションタグのチェック、タグ内容のチェックなどが出来る。一番使いやすいサイト。http://www.fixprotocol.org/FIXimate3.0/

つぶやき

  • タグ番号がランダム。せめて通番がタグ1ならわかりやすいのになぁ。。
  • ExecTypeとOrdStatusって一緒なら、どちらかにしてよ~
  • 最大文字長はプロトコルで決めてくれ~。ベンダー毎に違いすぎるよ
  • Rejectのルール、なにを35=3で返すべきで、何が35=8かつ150=8なのかよくわかんない。
  • 委員会は唯のベンダーの宣伝の場になってない?本来の仕様策定を真剣にやって欲しい。
  1. storefive.com 2013.04.21 3:12pm

    I’ve been surfing online greater than 3 hours as of late, yet I by no means found any interesting article like yours. It is pretty price sufficient for me. In my

    opinion, if all web owners and bloggers made

    good content as you did, the net will be a lot more helpful than ever before.

    • 0
    • 0
  2. AKCESORIA ROWEROWE 2013.05.19 5:38pm

    This post will help the internet viewers for setting up
    new web site or even a weblog from start to end.

    • 0
    • 0
  3. ree 2014.03.17 9:45am

    FIXをわかりやすくまとめたいいサイトですね!

    一点気になったとこ:■Unsolicitedと通常のCancelとの違いはOrderIDとCLOrdIDに何を含むか、だけ。通常UnsolicitedならTag47はブランク。
    >>Tag 41ではないでしょうか。

    • 1
    • 0
  4. なりさん 2014.05.19 4:08pm

    Tag41が正しいです。reeさんありがとう。

    • 0
    • 0

This blog is kept spam free by WP-SpamFree.