FIXML全称为Financial Information eXchange Markup Language,是金融信息交换标记语言,属于FIX协议体系下的标准化报文格式,专门用于金融交易场景下的数据交互。它采用XML语法规范定义交易消息的结构,让不同机构、不同系统之间可以高效传递订单、成交、行情等各类交易相关数据,避免自定义格式带来的兼容性问题。

FIXML的核心定位
FIXML是FIX协议的XML实现版本,FIX协议本身定义了金融交易的消息类型和字段规范,而FIXML将这些规范用XML的标签结构进行落地。它的核心目标是统一金融交易数据的表达形式,降低跨系统对接的成本,目前已经被全球多数证券交易所、券商、资管机构纳入标准对接规范。
FIXML的基础结构特点
- 所有消息都遵循XML的语法规则,标签嵌套清晰,可读性强
- 消息字段与FIX协议的字段定义完全对应,字段含义有统一的标准说明
- 支持扩展自定义字段,满足不同机构的个性化业务需求
- 自带数据校验规则,可通过XML Schema对消息格式进行合法性校验
FIXML与FIX协议的关系
FIX协议有两种常见的编码实现方式,一种是传统的Tag=Value格式,另一种是FIXML的XML格式。两者的核心消息定义完全一致,只是编码形式不同:
| 对比维度 | 传统FIX格式 | FIXML格式 |
|---|---|---|
| 编码形式 | 键值对拼接,如35=D|55=AAPL| | XML标签嵌套,如<Order Symbol="AAPL"/> |
| 可读性 | 较低,需要对照协议文档解析 | 较高,标签名直接体现字段含义 |
| 解析成本 | 需要自定义解析逻辑 | 可直接使用通用XML解析库 |
| 传输体积 | 更小,适合低带宽场景 | 更大,标签冗余较多 |
FIXML的典型应用场景
FIXML主要应用在需要标准化数据交互的金融交易环节:
- 券商与交易所之间的订单申报、成交回报传递
- 资管机构与经纪商之间的交易指令下发
- 不同金融机构之间的行情数据同步
- 交易后处理环节的结算、对账数据交互
FIXML消息示例
下面是一个新订单消息的FIXML示例,该消息表示申报一只苹果公司的股票买入订单:
<?xml version="1.0" encoding="UTF-8"?>
<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">
<Order OrderID="123456" Side="1" TransactTime="2024-05-20T10:30:00">
<Instrument Symbol="AAPL" SecurityType="CS"/>
<OrderQtyData OrderQty="100"/>
<PriceData Price="180.50"/>
<Party PartyID="BROKER001" PartyRole="1"/>
</Order>
</FIXML>
上述示例中,Order标签代表订单消息,Side="1"表示买入方向,Symbol="AAPL"表示交易标的为苹果股票,OrderQty="100"表示订单数量为100股,Price="180.50"表示申报价格为180.5美元。
FIXML的解析与生成
在实际开发中,可以使用对应编程语言的XML解析库处理FIXML消息,以下是Python生成上述新订单FIXML的示例代码:
import xml.etree.ElementTree as ET
# 定义FIXML命名空间
ns = {"fix": "http://www.fixprotocol.org/FIXML-5-0-SP2"}
ET.register_namespace("fix", "http://www.fixprotocol.org/FIXML-5-0-SP2")
# 创建根节点
root = ET.Element("{http://www.fixprotocol.org/FIXML-5-0-SP2}FIXML")
# 创建Order节点并设置属性
order = ET.SubElement(root, "{http://www.fixprotocol.org/FIXML-5-0-SP2}Order")
order.set("OrderID", "123456")
order.set("Side", "1")
order.set("TransactTime", "2024-05-20T10:30:00")
# 创建Instrument子节点
instrument = ET.SubElement(order, "{http://www.fixprotocol.org/FIXML-5-0-SP2}Instrument")
instrument.set("Symbol", "AAPL")
instrument.set("SecurityType", "CS")
# 创建OrderQtyData子节点
qty_data = ET.SubElement(order, "{http://www.fixprotocol.org/FIXML-5-0-SP2}OrderQtyData")
qty_data.set("OrderQty", "100")
# 创建PriceData子节点
price_data = ET.SubElement(order, "{http://www.fixprotocol.org/FIXML-5-0-SP2}PriceData")
price_data.set("Price", "180.50")
# 创建Party子节点
party = ET.SubElement(order, "{http://www.fixprotocol.org/FIXML-5-0-SP2}Party")
party.set("PartyID", "BROKER001")
party.set("PartyRole", "1")
# 生成XML字符串
tree = ET.ElementTree(root)
ET.indent(tree, space=" ")
xml_str = ET.tostring(root, encoding="UTF-8", xml_declaration=True).decode("UTF-8")
print(xml_str)
运行上述代码即可生成符合规范的FIXML新订单消息,实际对接时只需要根据合作机构的要求调整对应的字段值即可。
使用FIXML的注意事项
- 需要提前确认对接方使用的FIXML版本,不同版本的字段定义可能存在差异
- 数值类型的字段需要严格按照协议要求传递,比如价格字段需要保留对应的小数位
- 时间字段需要遵循ISO 8601的格式规范,避免时区解析错误
- 自定义扩展字段需要提前和对接方确认命名规则,避免字段冲突