第2章:FIX协议基础概念
好,咱们直接进入正题。FIX协议这东西,说白了就是金融领域里交易所和交易员之间说「黑话」的一套规矩。你想想看,每天几万亿美金的交易量,要是各家说各家的方言,那不乱套了?
我个人习惯把FIX协议拆成两层来理解:会话层和应用层。就像你打电话,会话层是「拨号、接通、挂断」这套流程,应用层才是你真正要说的话。
2.1 会话层 vs 应用层
会话层管的是连接的生命周期。包括登录、心跳检测、序列号管理、登出这些事。我刚开始做接入的时候,总觉得会话层不重要,结果有一次生产环境上,因为心跳超时设置不对,连接被交易所强制断开了,那叫一个惨。
应用层才是业务核心。报单、撤单、成交回报、市场数据,这些都在应用层里跑。会话层保证消息能送到,应用层决定消息里装的是什么。
一句话总结:会话层是快递员,应用层是包裹里的货。
这里我画了一张图,帮你理清这两层的关系:
2.2 消息结构:标准头、体、尾
每一条FIX消息,都长一个样。就像写信,有信封(头)、正文(体)、落款(尾)。我见过不少新手,上来就拼消息体,结果头部的标签没填对,交易所直接拒收。
标准结构是这样的:
8=FIX.4.2|9=78|35=D|34=1|49=CLIENT1|52=20240101-00:00:00|56=EXCHANGE|
11=ORD001|21=1|38=1000|40=1|54=1|55=600519|60=20240101-00:00:00|
10=123|
咱们拆开看:
| 部分 | 说明 | 示例标签 |
|---|---|---|
| 标准头 | 固定以标签8开头,包含协议版本、消息类型、序列号等 | 8, 9, 35, 34, 49, 52, 56 |
| 消息体 | 业务数据,根据消息类型不同而变化 | 11(订单ID), 55(股票代码), 38(数量) |
| 标准尾 | 固定以标签10结束,用于校验完整性 | 10(校验和) |
我的小技巧:调试的时候,先看头部标签35的值,确定消息类型。再看尾部标签10的校验和,确认消息没被篡改。中间的消息体,按业务逻辑解析就行。
2.3 标签-值编码规则
这是FIX协议最核心的编码方式。说白了就是「标签=值」对,用分隔符隔开。我常用的分隔符是ASCII码01(SOH),但在日志里通常显示为竖线「|」或脱字符「^」。
规则其实很简单:
- 每个字段由标签号和值组成,中间用等号连接
- 字段之间用SOH分隔符隔开
- 标签号是整数,从0到9999不等
- 值可以是字符串、整数、浮点数、日期等
举个例子:
35=D → 消息类型是「新订单」
55=600519 → 股票代码是贵州茅台
38=1000 → 数量是1000股
40=1 → 订单类型是市价单
我曾经踩过的坑:标签55的值,有的交易所要求带交易所后缀(比如600519.SH),有的不带。还有标签38的数量,有的按股算,有的按手算。接入前一定要确认清楚,不然报单全被拒。
2.4 常见标签速查表
这里我整理了一份高频标签表,你调试的时候肯定用得上:
| 标签号 | 字段名 | 说明 |
|---|---|---|
| 8 | BeginString | 协议版本,如FIX.4.2 |
| 9 | BodyLength | 消息体长度(不含头和尾) |
| 35 | MsgType | 消息类型,D=新订单,8=成交回报 |
| 34 | MsgSeqNum | 消息序列号,用于顺序控制 |
| 49 | SenderCompID | 发送方ID,你的交易系统标识 |
| 56 | TargetCompID | 接收方ID,交易所标识 |
| 52 | SendingTime | 发送时间,UTC格式 |
| 10 | CheckSum | 校验和,从标签8到标签10之前计算 |
| 11 | ClOrdID | 客户端订单ID,用于撤单和查询 |
| 55 | Symbol | 股票代码或合约代码 |
| 38 | OrderQty | 订单数量 |
| 40 | OrdType | 订单类型,1=限价,2=市价 |
| 54 | Side | 买卖方向,1=买,2=卖 |
2.5 实际解析示例
咱们拿一条真实的成交回报消息来练练手:
8=FIX.4.2|9=65|35=8|34=2|49=EXCHANGE|56=CLIENT1|52=20240101-00:00:01|
11=ORD001|17=EXEC001|37=ORD002|39=2|54=1|55=600519|32=500|31=168.50|
60=20240101-00:00:01|10=234|
解析步骤:
- 看标签35=8,确认是成交回报(ExecutionReport)
- 看标签11=ORD001,对应的是我们之前下的订单
- 看标签39=2,表示订单状态是「完全成交」
- 看标签32=500,成交了500股
- 看标签31=168.50,成交价是168.50元
嗯,这里要注意:标签10的校验和,是整条消息从标签8开始到标签10之前(不包括10本身)所有字节的累加和,然后取模256。很多新手自己拼消息时校验和算不对,交易所直接断开连接。我建议你写个函数自动计算,别手算。
好了,这一章的内容就到这。FIX协议的基础概念其实不复杂,就是会话层管连接,应用层管业务,消息结构固定,标签-值编码简单明了。你把这些搞懂了,后面接入交易所就是水到渠成的事。