第2章:FIX协议基础概念

好,咱们直接进入正题。FIX协议这东西,说白了就是金融领域里交易所和交易员之间说「黑话」的一套规矩。你想想看,每天几万亿美金的交易量,要是各家说各家的方言,那不乱套了?

我个人习惯把FIX协议拆成两层来理解:会话层应用层。就像你打电话,会话层是「拨号、接通、挂断」这套流程,应用层才是你真正要说的话。

2.1 会话层 vs 应用层

会话层管的是连接的生命周期。包括登录、心跳检测、序列号管理、登出这些事。我刚开始做接入的时候,总觉得会话层不重要,结果有一次生产环境上,因为心跳超时设置不对,连接被交易所强制断开了,那叫一个惨。

应用层才是业务核心。报单、撤单、成交回报、市场数据,这些都在应用层里跑。会话层保证消息能送到,应用层决定消息里装的是什么。

一句话总结:会话层是快递员,应用层是包裹里的货。

这里我画了一张图,帮你理清这两层的关系:

会话层 (Session Layer) 登录(Logon) 心跳(Heartbeat) 序列号管理 登出(Logout) 应用层 (Application Layer) 新订单(NewOrder) 成交回报(Execution) 撤单(Cancel) 市场数据(MD) 会话层保证连接可靠,应用层处理业务逻辑

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 常见标签速查表

这里我整理了一份高频标签表,你调试的时候肯定用得上:

标签号 字段名 说明
8BeginString协议版本,如FIX.4.2
9BodyLength消息体长度(不含头和尾)
35MsgType消息类型,D=新订单,8=成交回报
34MsgSeqNum消息序列号,用于顺序控制
49SenderCompID发送方ID,你的交易系统标识
56TargetCompID接收方ID,交易所标识
52SendingTime发送时间,UTC格式
10CheckSum校验和,从标签8到标签10之前计算
11ClOrdID客户端订单ID,用于撤单和查询
55Symbol股票代码或合约代码
38OrderQty订单数量
40OrdType订单类型,1=限价,2=市价
54Side买卖方向,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|

解析步骤:

  1. 看标签35=8,确认是成交回报(ExecutionReport)
  2. 看标签11=ORD001,对应的是我们之前下的订单
  3. 看标签39=2,表示订单状态是「完全成交」
  4. 看标签32=500,成交了500股
  5. 看标签31=168.50,成交价是168.50元

嗯,这里要注意:标签10的校验和,是整条消息从标签8开始到标签10之前(不包括10本身)所有字节的累加和,然后取模256。很多新手自己拼消息时校验和算不对,交易所直接断开连接。我建议你写个函数自动计算,别手算。

好了,这一章的内容就到这。FIX协议的基础概念其实不复杂,就是会话层管连接,应用层管业务,消息结构固定,标签-值编码简单明了。你把这些搞懂了,后面接入交易所就是水到渠成的事。