Financial Information eXchange(FIX)金融信息交换协议的制定是由多个致力于提升其相互间交易流程效率的金融机构和经纪商于1992年共同发起。这些企业把他们及他们的行业视为一个整体,认为能够从对交易指示,交易指令及交易执行的高效电子数据交换的驱动中获利。FIX由此诞生,一个不受单一实体控制的开放消息标准,一个能够被调整组建适用于任何一个企业的商务需求的协议。
协议定义
协议格式
—-消息头—-|—-消息体——|—-消息尾——
fix协议由三部分组成,消息头、消息体、消息尾。
- 各自组成
- 消息头:起始tag、消息长度两部分组成。
- 消息体:由约定好的各个tag=value组成,一般由上游厂家制定好协议,提供具体消息格式给下游商家使用。
- 消息尾:消息体校验码,一般类似crc校验,主要是消息体信息的校验码。
数据类型
- fix协议定义的数据类型包括:
- 整数int 没有小数点,逗号,可以包含正负号的数字序列。注,int的值前面可以包含0。(如 “00023” = “23”).
- 浮点数float 可包含小数点和正负号的数字序。累计总长度为15个数字。前面可以有0,小数末尾可加零,或截尾
- 单个字符char 除分界符号SOH外的字符。大小写敏感
- 布尔Boolean
- 字符串String 是大小写敏感的
- 数据data 没有格式和内容限制。之前紧接有一个长度域。长度域应制定data数据域包含的字节数(不好含分界符所占字节)。数据中可能包含分界符字节,所以需要用data类型数据长度来辅助区别。
属性域
fix协议中域的概念类似于消息中表达独立含义的属性,在fix协议中都固化了一个tag来约定特殊含义,比如把xml的node名称使用数字来替代。
- 定义
- 开始部分是消息头,随后是消息体,最后是消息结尾;
- 消息头的前3个域的顺序不能改变:起始(tag=8)、消息体长度(tag=9)、消息类型(tag=35);
- 消息尾的最后一个域是校验和域(tag=10)
- 重复组中,域出现的顺序应遵顼该重复组在消息或组件中定义的顺序;
- 在一条消息中,除重复组域外任何其他域不能重复出现;
域标识
域标识 | 名称 | 备注 |
---|---|---|
8 | BeginString | fix协议消息起始串 |
9 | BodyLength | 消息体长度,不是fix协议消息长度 |
10 | 校验码 | 消息体的校验码参考crc校验码,实现数据有效校验使用 |
11 | CIOrdID | 客户端订单ID |
35 | MsgType | 消息类型,表明该消息是具体哪个业务类型,比如登陆、注销、下订单等 |
37 | OrderID | 服务端订单ID |
41 | OrigCIOrdID | 原始客户端订单ID |
54 | Side | 买卖类型,例如:1 = Buy,2 = Sell |
55 | Symbol | 股票代码。例如:YRD |
安全与加密
- 由于消息有可能在公网或不安全的网络上传输交换,因此需要对相关的敏感数据加密处理。
- 具体加密的方法由连接双方达成的协议而定。
- 消息内除某些需要公开识别的域以明文传输外其他任何域都可以加密放置密文数据域 (SecureData)内。当然,这些被加密的域也可以同时保留明文的表示方式。
- 当决定使用加密方案时,可以对消息正文内所有的域加密。如果消息的重复组内有部分需要加密的,那么要求对整个重复组加密。
- 本协议还提供的一些域用以支持数字签名、密钥交换和正文加密等安全技术。
消息
消息头
每一个会话或应用消息有一个消息头,该消息头指明消息类型、消息体长度、发送目的地、消息序号、发送起始点和发送时间。
域标识 | 名称 | 是否必须 | 备注 |
---|---|---|---|
8 | BeginString | Y | 起始串,取值:FIX.4.2(不可加密,消息的第一个域) |
9 | BodyLength | Y | 消息体长度(不可加密,消息的第二个域) |
消息体
消息体是业务数据实体,承载了每个协议具体业务操作和数据
域标识 | 名称 | 是否必须 | 备注 |
---|---|---|---|
35 | MsgType | Y | 消息类型(不可加密,消息的第三个域) |
49 | SenderCompID | Y | 发送方代码(不可加密,发送方标识符) |
56 | TargetCompID | Y | 接收方代码(不可加密,接收方标识符) |
115 | OnBehalfOfCompID | N | 最初发送方标识符(可加密),用于经第三方发送。 |
128 | DeliverToCompID | N | 最终接收方标识符(可加密),用于经第三方发送。 |
90 | SecureDataLen | N | 密文数据长度 |
91 | SecureData | N | 密文数据(紧跟密文数据长度域) |
34 | MsgSeqNum | Y | 消息序号(可加密),如果交易双方不采用 FIX 会话 机制,可将该 tag 置为一个固定的值,例如 0。 |
50 | SenderSubID | N | 发送方子标识符(可加密) |
142 | SenderLocationID | N | 发送方方位标识符(可加密) |
57 | TargetSubID | N | 接收方子标识符(可加密) |
143 | TargetLocationID | N | 接收方方位标识符(可加密) |
116 | OnBehalfOfSubID | N | 最初发送方子标识符(可加密) |
144 | OnBehalfOfLocationID | N | 最初发送方方位标识符(可加密) |
129 | DeliverToSubID | N | 最终接收方子标识符(可加密) |
145 | DeliverToLocationID | N | 最终接收方方位标识符(可加密) |
43 | PossDupFlag | N | 可能重复标志,重复发送时,作此标记。(可加密) |
97 | PossResend | N | 可能重发标志。(可加密) |
52 | SendingTime | Y | 发送时间(可加密) |
122 | OrigSendingTime | N | 原始发送时间(可加密) |
347 | MessageEncoding | N | 消息中 Encoded 域的字符编码类型(非 ASCII 码) |
369 | LastMsgSeqNumProcessed | N | 最后处理消息序号(可加密) |
370 | OnBehalfOfSendingTime | N | 最初发送时间(用 UTC 表示时间) |
消息尾
每一个消息(会话或应用消息)有一个消息尾,并以此终止。消息尾可用于分隔多个消息,包含有 3 位数的校验和值。
域标识 | 名称 | 是否必须 | 备注 |
---|---|---|---|
93 | SignatureLength | N | 数字签名长度(不可加密) |
89 | Signature | N | 数字签名(不可加密) |
10 | CheckSum | Y | 校验和,消息的最末域。(不可加密) |