学习

⌂学习首页◈学习路线

练习

⌁行情练习◷回放↻复习

我的学习

▥统计☆收藏⌕搜索✦AI

学习原则

先理解风险,再练习决策。

Trade Buty免费 · 中立
👤 登录
📚学习路线📈行情⏮回放✎复习🔍搜索🤖AI👤 登录
Trade Buty

面向全球中文用户的免费中立交易教育平台。分级课程(学)× 真实行情图表与回放(练)。

⚠️ 风险提示:本站全部内容仅用于学习与研究,不构成任何投资建议。市场有风险,投资需谨慎。

导航

学习路线行情回放搜索AI统计隐私政策内容来源 kline-buty反馈建议
© 2026 sun1090 · MIT License内容来源 kline-buty

本页目录

  • 1. FIX 是什么
  • 2. FIX 在交易链路中的位置
  • 3. FIX 消息结构
  • 3.1 三段式:Header / Body / Trailer
  • 3.2 Tag=Value 格式与最小可读示例
  • 3.3 校验和(CheckSum)
  • 3.4 Session 层 vs 业务层
  • 4. 核心消息类型
  • 4.1 35=D NewOrderSingle(下单)
  • 4.2 35=8 ExecutionReport(成交回报)
  • 4.3 35=F OrderCancelRequest(撤单)与 35=G 改单
  • 4.4 35=A Logon(登录)
  • 5. Session 生命周期
  • 6. 订单状态与 ExecType
  • 7. FIX 的优缺点
  • 7.1 优点
  • 7.2 缺点
  • 7.3 与交易所专有 API 的对比
  • 7.4 什么时候需要 FIX 直连
  • 8. 衍生规范:FAST 与加密交易所现状
  • 8.1 FAST(FIX Adapted for STreaming)
  • 8.2 加密交易所对 FIX 的支持现状
  • 风险提示

篇章进度

10 · 系统对接篇

前面的篇章都是给交易者看的:怎么看懂市场、怎么管理仓位、怎么避开坑。本篇完全换一个视角——它是给软件公司/工程师团队看的:当你接下一个「帮客户做一套交易系统」的活,需要对接期货柜台、证券柜台或加密交易所 API 时,你要知道的所有工程知识。

0/11 课0%

下一篇章 →

12 · 市场生态篇→

前面各篇教你「看懂规则、看懂图表」,本篇带你换一个更根本的视角:市场不是一台中性的报价机器,而是一个由参与者构成的生态。你的每一次成交,对面都坐着具体的人或机器——他们的目的、信息、资金体量和你完全不同。

学习路线/10 · 系统对接篇
课程单元 09/9 / 11 节

09 · FIX 协议详解:全球机构交易的通用语言

FIX协议消息格式、核心消息类型、Session保活与海外机构市场选型指南。

📖 约 15 分钟阅读
本页目录▾
  • 1. FIX 是什么
  • 2. FIX 在交易链路中的位置
  • 3. FIX 消息结构
  • 3.1 三段式:Header / Body / Trailer
  • 3.2 Tag=Value 格式与最小可读示例
  • 3.3 校验和(CheckSum)
  • 3.4 Session 层 vs 业务层
  • 4. 核心消息类型
  • 4.1 35=D NewOrderSingle(下单)
  • 4.2 35=8 ExecutionReport(成交回报)
  • 4.3 35=F OrderCancelRequest(撤单)与 35=G 改单
  • 4.4 35=A Logon(登录)
  • 5. Session 生命周期
  • 6. 订单状态与 ExecType
  • 7. FIX 的优缺点
  • 7.1 优点
  • 7.2 缺点
  • 7.3 与交易所专有 API 的对比
  • 7.4 什么时候需要 FIX 直连
  • 8. 衍生规范:FAST 与加密交易所现状
  • 8.1 FAST(FIX Adapted for STreaming)
  • 8.2 加密交易所对 FIX 的支持现状
  • 风险提示

国内期货有 CTP,加密交易所有 REST/WebSocket,而海外机构市场(CME、盈透、全球银行间)的通用语言是 FIX。它是金融界最老、最广的「文本交换格式」——没有 SDK、没有私有二进制,只有一本字段字典和一行行 Tag=Value。

本篇讲清楚 FIX 是什么、消息长什么样、核心消息类型怎么用、Session 怎么保活、状态怎么对齐,最后给出选型建议与衍生规范(FAST 压缩、加密交易所现状)。


1. FIX 是什么

FIX(Financial Information eXchange,金融信息交换协议)是全球金融交易领域的事实标准消息协议,几个关键事实:

事实内容
性质面向交易的消息格式标准(文本协议),规定「消息怎么组织、字段叫什么、状态怎么表达」
起源1992 年由 Fidelity Investments(富达)与 Salomon Brothers 为股票交易开发,目的是摆脱私有格式的耦合
维护由 FIX Protocol Ltd(FPL,前身是 FIX Protocol Organization)与各交易对手共同维护
现状全球股票、期货、固定收益、外汇的机构直连普遍采用,CME、ICE、LSEG、盈透等均为 FIX 会员/支持方
版本主流为 FIX 4.2 / 4.4(Session 层),FIX 5.0+ 引入消息目录组件化;对接时以对手方实际支持版本为准

一个流传很广的说法:FIX 不是软件、不是接口库,而是一本「字典」。它规定的是字节如何编码、消息如何编号、状态如何表示;具体怎么传输(TCP 直连、专线、经认证网络)是各家自己的事情。

FIX 的诞生背景是「每家银行一个私有格式」:90 年代一家机构要对接 N 家对手方就要写 N 套解析器。FIX 的野心是让格式统一,字段字典由行业共同维护——这套思路后来被 XML、JSON 时代继承,但 FIX 在低延迟文本领域至今仍是老大哥。


2. FIX 在交易链路中的位置

text
策略/订单管理系统(OMS)
        │ 内部下单意图
        ▼
┌───────────────────────────────┐
│         FIX 引擎(客户端侧)      │  ← 软件公司/买方机构负责这半边
│  消息组装 / 解析 / Session 管理  │
│  序号维护 / 心跳 / 重传          │
└──────────────┬────────────────┘
               │ FIX 连接(专线 / 认证网络 / 公网 + 加密)
┌──────────────▼────────────────┐
│         FIX 网关(对手方侧)      │  ← 交易所 / 做市商 / 银行 / 清算所
│  通常由对方提供接入文档与测试环境  │
└──────────────┬────────────────┘
               ▼
     交易所撮合 / 做市商内部系统 / 银行间市场

一句话定位:FIX 是「订单管理系统(OMS)与对手方之间」的最后一公里协议。你的系统内部可以用任何技术栈(消息队列、REST、gRPC),但只要对外走机构通道,出口就是 FIX。

典型使用方:

角色用 FIX 做什么
买方(**对冲**基金、资管)通过 FIX 连卖方执行通道(券商/银行),下单+拿回报
卖方(做市商、银行)对外提供 FIX 接口,接受客户订单
交易所/清算所(CME 等)提供 FIX/FAST 直连,供会员与 ISV 接入
经纪商(盈透等)机构客户用 FIX 替代桌面端

3. FIX 消息结构

3.1 三段式:Header / Body / Trailer

每条 FIX 消息固定由三部分组成(以 FIX 4.x 为例):

段标签作用
Header(消息头)8=BeginString、35=MsgType、49=SenderCompID、56=TargetCompID、34=MsgSeqNum、52=SendingTime标识版本、消息类型、收发双方、序号、时间
Body(消息体)各消息类型专属字段(如 55=Symbol、54=Side、44=Price、38=OrderQty)业务内容
Trailer(消息尾)10=CheckSum(校验和)完整性校验,必须放在最后一位

约定:Header 里 8、35 之外,49/56/34/52 也是 Session 层必带字段;10=CheckSum 必须是整条消息的最后一个字段,任何正文后追加字段都会让校验失败。

3.2 Tag=Value 格式与最小可读示例

FIX 的编码规则简单到可以用一句话讲完:每对字段用 = 表示,字段间以 SOH(0x01,ASCII 1)分隔。人工阅读时 SOH 常写成 |,解码时按 | 切分即可。

一条最小可读的新订单(NewOrderSingle)示例:

text
8=FIX.4.4|35=D|49=SENDER01|56=TARGET01|34=7|52=20260816-10:00:00.000|11=ORD10001|55=ESU6|54=1|60=20260816-10:00:00.000|38=2|40=2|44=4100.50|10=092
标签含义取值
8BeginString 协议版本FIX.4.4
35MsgType 消息类型D(NewOrderSingle)
49 / 56SenderCompID / TargetCompID双方 CompID(登录认证的「用户名」)
34MsgSeqNum 消息序号7(本方 Session 内递增)
52SendingTime 发送时间UTC 时间
11ClOrdID 客户端订单号ORD10001(幂等的关键)
55Symbol 合约ESU6
54Side 方向1=买
60TransactTime 交易时间UTC
38OrderQty 数量2
40OrdType 订单类型2=限价单
44Price 价格4100.50
10CheckSum 校验和092

一个非常实际的工程点:| 只是展示用的记号,线上字节流里是 \x01(SOH)。字符串里绝不能出现裸 SOH;文本值里也不能塞 =(用别的分隔符)。新手最容易踩的就是「把一个带 | 的文本塞进 Value」。

3.3 校验和(CheckSum)

10=CheckSum 的算法:把整条消息(从 8= 起,到 Trailer 之前的最后一个 SOH 为止)每个字节的 ASCII 码求和,对 256 取模,格式化为 3 位十进制数字(不足补 0):

text
checksum = sum(所有字节) % 256,输出形如 "092"
  • 计算范围不含 10= 本身,但含正文里每个字段的等号与 SOH。
  • 收到消息先算校验和再解析正文——校验不过的消息必须丢弃(这通常是断包、粘包或双方字段字典不一致的信号)。

3.4 Session 层 vs 业务层

FIX 把问题拆成两层,对接时最容易理解错的就是这里:

层管什么关键字段
Session 层登录、心跳、序号、重传、断开重连8 / 34 / 35=A / 0 / 1 / 2 / 4
业务层(App 层)下单、撤改单、回报、行情请求35=D / F / G / 8 / W 等

两层必须分开实现:Session 层坏了(序号对不上、心跳断)会连业务一起毁掉——所以先让 Session 层健壮(重连、重传、序号持久化),再谈业务逻辑。

💀 Session 层坏了会连业务一起毁掉

Session 层坏了(序号对不上、心跳断)会连业务一起毁掉。 FIX 对接必须先让 Session 层健壮——重连、重传、序号持久化——再谈业务逻辑。业务层的下单撤单如果依赖一个不健壮的 Session 层,一次断线就能让订单状态彻底不可信。


4. 核心消息类型

MsgType(35=)名称方向用途
ALogon双向登录,同时协商心跳间隔
0Heartbeat双向心跳保活
1TestRequest双向探测对方是否存活
2ResendRequest双向请求重传错过的消息
4SequenceReset双向序号重置(Gap Fill)
5Logout双向登出
DNewOrderSingle客户端→对手方下单
FOrderCancelRequest客户端→对手方撤单
GOrderCancelReplaceRequest客户端→对手方改单(价格/数量)
8ExecutionReport对手方→客户端订单状态/成交回报(回报的载体)
9OrderCancelReject对手方→客户端撤单被拒绝
WMarketDataSnapshot对手方→客户端行情快照
X / PMarketDataIncremental / 更新对手方→客户端行情增量

4.1 35=D NewOrderSingle(下单)

下单必备字段:

标签字段说明
11ClOrdID客户端订单号——幂等的唯一凭据,全局唯一、不能复用
55Symbol合约/代码,以对手方字典为准
54Side1=买 2=卖(做市另有 4/5 等含义)
38OrderQty数量
40OrdType1=市价 2=限价 3=**止损**等
44Price限价单必填;**市价单**不填
59TimeInForce0=当日有效 1=GTC 3=IOC 4=FOK 等
60TransactTime交易时间(UTC)

4.2 35=8 ExecutionReport(成交回报)

回报是 FIX 世界里最复杂的消息:一个订单的每一次状态变化都会推一条 35=8,且带 39=OrdStatus 与 150=ExecType 双状态。关键字段:

标签字段说明
11ClOrdID对应的客户端订单号(可能被 41=OrigClOrdID 关联)
37OrderID对手方订单号
17ExecID本次执行唯一 ID——幂等去重的依据
39OrdStatus订单状态(见第 6 节)
150ExecType执行类型(见第 6 节)
151LeavesQty剩余未成交数量
14CumQty累计成交数量
31LastPx / 32=LastQty本笔成交价格/数量(部分成交时每笔一条)
103OrdRejReason拒单原因码

工程铁律:回报以 17=ExecID 去重,状态以 39=OrdStatus 为准。重连重传后同一条回报可能收到两次,ExecID 相同就必须丢弃重复处理。

⚠️ 在真实市场里你以为是撤掉了比明确知道没撤掉危险得多

ExecType=8(Rejected)与 ExecType=4(Canceled)不可混同——Rejected 意味着「从未成为订单」,Canceled 意味着「成为过订单后被撤销」。撤单请求发出后没有跟踪 150=6→4 的确认链,以为撤掉其实没撤,在真实市场里比明确知道没撤掉危险得多。

4.3 35=F OrderCancelRequest(撤单)与 35=G 改单

消息关键字段语义
F 撤单11=ClOrdID(新生成)、41=OrigClOrdID(原订单号)、55/54/38请求撤销原订单;结果看 35=8(成功)或 35=9(失败,如已成交)
G 改单11=新订单号、41=原订单号、新 44/38交易所按「先撤旧、再挂新」原子处理;部分市场改价 = 撤+重挂,可能丢失队列位置

4.4 35=A Logon(登录)

Session 开始的唯一入口,几个必带项:

标签字段说明
49 / 56SenderCompID / TargetCompID双方 CompID,等同「账号」
98EncryptMethod加密方式,多数为 0=无加密(靠链路层加密)
108HeartBtInt心跳间隔(秒),登录时协商
141ResetSeqNumFlagY=重置双方序号(首次连接/每日重置用)

5. Session 生命周期

text
       客户端                                  对手方
         │                                      │
         │──────── 35=A Logon(108=30)────────▶│
         │◀─────── 35=A Logon(含对方序号)───────│
         │                                      │
   ┌─────▼─────┐  正常时段:消息本身即保活      ┌─▼─────┐
   │  已登录    │◀────────────────────────────▶│ 已登录 │
   │           │  空闲超过 N 秒 → 发 35=0 心跳   │       │
   └─────┬─────┘  对方 35=0 内无响应 →          └─┬─────┘
         │        发 35=1 TestRequest 探测        │
         │        仍无响应 → 断连 + 重连          │
         │                                      │
         │──────── 35=5 Logout(收尾)──────────▶│
         │◀─────── 35=5 Logout ──────────────────│
         ▼                                      ▼

三个核心机制:

  1. 34=MsgSeqNum(消息序号):Session 内每条消息递增,双方各维护「自己发出的序号」与「对方应有的序号」。收到 34 比预期大的消息 → 发 35=2 ResendRequest 请求重传;收到比预期小的 → 重复消息直接丢弃或按 Gap Fill 处理。
  2. 112 心跳间隔:登录时用 108 协商(常见 10s/30s/60s,以对手方要求为准)。空闲超过该间隔就主动发 Heartbeat;双方都必须在超时前收到对方消息(任何业务消息都算「心跳」),否则发 TestRequest 探测,再超时就判定断连。
  3. Logout:正常收盘或程序退出时先发 35=5 再断开;不辞而别的断连在对手方那里会留下一段「挂死」的 Session,重连时可能被拒或需要重置序号。

序号是 FIX Session 的生命线:序号必须持久化(写盘/写库),进程崩溃重启后要能从上次的序号继续,而不是回到 1——否则对手方按序号判定「丢消息了」,要求全量重传。

💀 序号必须持久化否则重连后丢单不可查

序号是 FIX Session 的生命线:序号必须持久化(写盘/写库),进程崩溃重启后要能从上次的序号继续,而不是回到 1。 否则对手方按序号判定「丢消息了」,要求全量重传;心跳超时判定过松会导致「连接还在、市场已变」。


6. 订单状态与 ExecType

订单的每一次变化都体现为一条 35=8,其中 39=OrdStatus 与 150=ExecType 是两个容易混淆但必须同时读的字段:

39=OrdStatus含义与 150=ExecType 的关系
0 New已受理150 同值为 0(新单确认)
1 PartiallyFilled部分成交150=1
2 Filled全部成交150=2
4 Canceled已撤销150=4(或 150=6/9 的取消子类型)
5 Replaced已改单150=5
6 PendingCancel撤单已提交未确认150=6
8 Rejected被拒单,订单不存在150=8(带 103=RejReason)
A PendingNew订单已提交未确认150=A
E PendingReplace改单已提交未确认150=E

解读方法(一句话):39 是「订单现在长什么样」,150 是「这条消息在叙述哪一次变化」。例如撤单发出后先收到 150=6 PendingCancel,随后收到 39=4 Canceled 的回报才说明撤单成功;若收到 150=6 后来了 35=9 OrderCancelReject,则撤单失败、订单还在。

  • ExecType=8(Rejected)与 ExecType=4(Canceled)不可混同:Rejected 意味着「从未成为订单」,Canceled 意味着「成为过订单后被撤销」。
  • 部分成交时 32/31(LastQty/LastPx)逐笔更新、14/151(CumQty/LeavesQty)随之变化——用 14 与 151 判断剩余量,不要自己累加 32(重传会造成重复累加)。

7. FIX 的优缺点

7.1 优点

优点说明
标准化字段字典全球统一,跨市场/跨对手方迁移成本低,「会 FIX 就全会」
成熟可靠三十年行业验证,Session 层(序号、重传、心跳)设计极其健壮
双向全功能下单、撤改、回报、行情、做市报价全在一套协议里
生态完善开源引擎(QuickFIX/QuickFIXJ、OnixS 商业版等)、测试工具、字典齐全

7.2 缺点

缺点说明
复杂度文本协议 + 序号 + 重传 + 心跳,Session 层实现远比 REST 麻烦;字段字典版本管理是持续负担
无内置安全明文文本、无认证加密,安全靠链路层(专线/TLS)解决
低效文本体积大、解析慢,高吞吐场景必须上 FAST 压缩(见第 8 节)
细节地狱各家对可选字段、子类型、错误码的使用不一致,同一协议不同对手方仍需逐家联调

7.3 与交易所专有 API 的对比

维度FIX交易所专有 API(加密 REST/WS、CTP 二进制)
通用性跨市场、跨对手方每家有各自的格式与认证
上手成本高(Session 层 + 字典)低(SDK/文档齐全)
延迟文本协议相对高,FAST 可压缩二进制/JSON 按场景设计,普遍更快
状态语义高度标准化(39/150)各家枚举不同,需映射
适用场景海外机构直连、跨市场统一出口单市场深度接入、加密高频

7.4 什么时候需要 FIX 直连

  • 对手方只提供 FIX 接口(CME 等交易所、多数海外经纪商、银行间)。
  • 需要一套代码接多个市场:OMS 侧统一 FIX 出口,市场差异收在配置里。
  • 需要机构级的可靠性语义(序号重传、对账、审计):这是 REST 轮询给不了的。
  • 不需要:仅接国内期货柜台(走 CTP)、仅接加密交易所(官方 REST/WS 更简单)——FIX 不是「更高级」,而是「另一种市场的要求」。

8. 衍生规范:FAST 与加密交易所现状

8.1 FAST(FIX Adapted for STreaming)

  • 是什么:FIX Protocol 组织针对行情/高吞吐场景推出的压缩编码规范(FIX Adapted for STreaming),用模板(XML 描述字段的编码方式)+ 数据位图大幅压缩体积,行情的体积可压缩到文本 FIX 的十分之一甚至更低。
  • 用在哪:CME 等交易所的实时行情直连普遍用 FAST;下单回执仍多用普通 FIX。
  • 工程代价:模板管理、增量编码(前后字段变化才带值)、乱序恢复都是新复杂度——FAST 不是「能读就行」,解码器要与对方模板严格对应。
  • 概念辨析:FAST 是同一协议家族里的编码层,不是新协议;对接时先确认对方要的是「FIX Session + FAST 行情」还是「纯 FIX」。

8.2 加密交易所对 FIX 的支持现状

交易所FIX 支持说明(以官方文档为准)
币安有提供机构级 FIX 接口(含测试环境),面向做市/机构客户
OKX有提供 FIX 接口,机构客户可用
Bybit有提供 FIX 接口
其他中小所多为 REST/WSFIX 主要在一线大所出现

加密 FIX 的几个特点:

  • 认证通常是「API Key + 预共享密钥/签名」的变体,而不是传统 CompID 密码对——对接前读清对方文档。
  • 报价精度、最小步进、订单类型枚举与国内完全不同,字段映射要逐项做。
  • 对大多数个人/中小团队,官方 REST/WebSocket 仍是更优选择;FIX 只是「机构通道」选项之一。

风险提示

⚠️ 风险提示

FIX 对接的事故集中在 Session 层:序号没有持久化导致重连后丢单不可查;心跳超时判定过松导致「连接还在、市场已变」;撤单请求发出后没有跟踪 150=6→4 的确认链,以为撤掉其实没撤。在真实市场里,「你以为是撤掉了」比「明确知道没撤掉」危险得多。 请务必:序号与订单状态持久化;断开后先重连、再重传、再恢复下单;所有字段按对手方字典校验;上线前在对手方测试环境完成断线注入(拔网线、序号回退、重复回报)演练。本文协议细节以 FIX 官方文档与对手方接入规范为准。

📝 系统对接篇 · 随堂测

3 道概念题 · 即时判分

📖 学完这篇,去看真盘

在真实行情图表里找找这篇内容提到的概念,看懂了再继续。

打开实时行情 →
🤖问 AI: 09 · FIX 协议详解:全球机构交易的通用语言→

相关课程

  • →01 · 对接全景与角色分工:先画地图,再写代码
  • →02 · 交易所与柜台:你的系统到底接在哪一层
  • →03 · 行情系统:交易软件的「眼睛」
  • →04 · 交易接口与订单生命周期:系统的心脏
  • →05 · 风控与资金管理:最后一道防线必须是你自己

下一篇

10 · CTP 对接实战:从零到能下单

→