标准的FIX协议分为会话层(FIXT)和应用层。
证监会发布的STEP协议在会话层是直接采用的FIX会话层协议(FIXT 1.1) 。而在应用层,STEP协议以FIX4.4为基础,删除了短期内中国证券市场不会推出的业务;同时向FIX组织申请了中国证券市场专用的域号区段,在其基础上,增加中国证券市场特有的消息类型、域号及相关域值,同时保证所取域值不与标准FIX发生冲突。
后来上交所和深交所又合作发布了轻量级STEP会话层协议(记作LFIXT),对FIXT进行了简化。《轻量级STEP会话协议接口规范》http://www.szse.cn/marketServices/technicalservice/interface/P020180328467247901955.pdf
本文以下主要描述的就是LFIXT规范,以及它跟FIXT的不同点。
一个真实的深交所行情消息如下所示:
LFIXT每一条消息组成如下:
标准消息头包含如下字段:
其中tag 35表示了消息的类型MsgType,下表枚举了tag 35不同值的含义。
MsgType值 (Tag 35) | 消息类型 | 消息体携带的Tag | 消息说明 | 与标准FIXT的异同 |
0 | Heartbeat 心跳消息 | 112 TestReqID | 接收方如果在两倍的([HeartBtInt]+[合理传输时间] )内没有收到来自对方的心跳消息,就认为连接失败,此时可以不发送 Logout 消息,立即关闭 TCP 连接。 | |
1 | TestRequest 测试请求消息 | 112 TestReqID | 强制对方发出心跳消息。 | LFIXT不会主动发送该消息。 若LFIXT收到该消息,则会以Heartbeat消息来响应。 |
2 | Resend 重发请求消息 | 7 BeginSeqNo 16 EndSeqNo | 向发送方申请某些消息重复发送。 | LFIXT不会主动发送该消息。 若LFIXT收到该消息,则会以SeqReset消息来响应。 |
3 | Reject 会话拒绝消息 | 45 RefSeqNum 371 RefSeqNum 372 RefMsgType 373 SessionRejectionReason 58 Text | 由于违反了会话层规则而不能适当地处理消息时,发出 Reject消息。 | LFIXT中,如果收到的消息不能被解析或不能通过数据完整性检查时,应当记录日志后回送 Logout消息并立刻断开连接。 而标准 FIXT中建议忽略并丢弃本消息,以期望后续收到的正确格式的消息能触发一个消息缺口,从而能通过重传请求再度拿回这条混乱的消息。 |
4 | SeqReset 序号重设消息 | 123 GapFillFlag 36 NewSeqNo | 用于告知接收方下一个消息的消息序号。 | 标准FIXT中,序号重设消息有两种模式:序号重设-缺口填补(SeqReset-Gap Fill)和 序号重设-重设(SeqReset-Reset)。 在LFIXT中,只使用SeqReset-Reset消息,用来回应 ResendRequest消息。 其中MsgSeqNum域按标准 FIX 协议规定可以任意填写且接收方不会检查,在 LFIXT 中规定固定填写 1。NewSeqNo域则建议填写为 max{ResendRequest消息的 EndSeqNo 字段值,本方 NxtOut 值}。 |
5 | Logout 注销消息 | 1409 SessionStatus 58 Text | 注销消息是发起或确认会话终止的消息。 | |
A | LogOn 登录消息 | 98 EncryptMethod 108 HeartBtInt 141 ResetSeqNumFlag 789 NextExpectedMsgSeqNum 553 Username 554 Password 1137 DefaultApplVerID 1407 DefaultAplExtID 1408 DefaultCstmApplVerID | 登录消息应是请求建立一个会话的应用所发送的第一个消息。 | LFIXT规定必须等到返回的登录消息收到之后才实施正常的消息交换。 LFIXT 会话协议实现者若作为会话发起方,其发送的 Logon 消息需将 MsgSeqNum设置为 1、ResetSeqNumFlag 设置为 Y、NextExpectedMsgSeqNum 设置为 1。 |
参考文档:
1. https://istock.ssetech.com.cn/wiki/doku.php?id=service:techmag:201406_015:03&s[]=%2Afast&s[]=step%2A