机构级 FIX API (4.2 / 4.4 / 5.0 / 5.2)
机构级 FIX 4.2、4.4、5.0 及 5.2 连接规范:报单接口 (:9878)、实时 Drop Copy (797=Y / 9406=Y)、行情接口 (:9879) 与 QuickFIX XML 架构定义。
SKILL.md开箱即用的 Claude Code 技能,包含 HMAC-SHA256 签名、/fapi/v1 与 /fapi/v2 数据架构以及密钥信息脱敏防护机制。
AGENTS.md适用于 OpenAI Codex CLI 的开箱即用代码仓 AGENTS.md — 包含最小价格变动规则、速率限制配额和自托管边界。
AGY.mdGoogle Antigravity (agy) 与 Gemini 智能体规范,附带经过验证的异步 Python WebSocket + REST 执行模板。
llms.txt包含所有 GaiaEx 文档页面、OpenAPI 3.0 规范和 Postman 集合的单 URL 机器可读索引。
1. 架构与多版本概述
GaiaEx 原生 C++26 机构级 FIX 网关通过持久化 TCP/TLS 会话提供确定性、超低延迟的订单录入、实时 Drop Copy、持仓与订单查询以及 L1/L2 行情数据流服务。
下载 QuickFIX / OnixS XML Schema: /fix-dictionary.xml — 兼容 QuickFIX (C++/Python/Go)、QuickFIX/J、OnixS、OneZero 及各类机构级 OMS 平台。请在客户端引擎中配置 ValidateUserDefinedFields=N 和 ValidateFieldsOutOfOrder=N 以确保向前兼容性。
| 网关会话类型 | 端口 | 支持的版本 | 功能特性 | 访问策略 |
|---|---|---|---|---|
| 订单管理 (OE) | 9878 | FIX.4.2、FIX.4.4、FIX.5.0、FIX.5.2 | 订单录入 (35=D)、撤单 (35=F)、改单 (35=G)、批量撤单 (35=q)、订单状态 (35=H)、持仓 (35=AN)、速率限制 (35=XLQ)、交易对信息 (35=x) | 读取 + 交易 API Key |
| Drop Copy (DC) | 9878 | FIX.4.2、FIX.4.4、FIX.5.0、FIX.5.2 | 涵盖所有 FIX 及 REST/HTTP 订单的实时统一 ExecutionReport (35=8) 流,带有 797=Y 和 9406=Y 标记 | 强制只读 (35=j 将拒绝订单) |
| 市场数据 (MD) | 9879 | FIX.4.2、FIX.4.4、FIX.5.0、FIX.5.2 | 实时 L1/L2 Snapshot (35=W)、IncrementalRefresh (35=X) 和 MarketDataRequestReject (35=Y) | 强制只读 (35=j 将拒绝订单) |
版本协商与传输规则
| FIX 版本 | BeginString (8) | 登录标签 (35=A) | 应用头标签 | 成交 ExecType (150) | ExecTransType (20) 规则 |
|---|---|---|---|---|---|
| FIX 4.2 | 8=FIX.4.2 | 无 | 无 | 150=1 (部分成交)、150=2 (全部成交) | 强制要求 (20=0 新建订单、20=3 状态) |
| FIX 4.4 | 8=FIX.4.4 | 无 | 无 | 150=F (成交),带有 39=1/2 | 禁止使用 (通过 35=3, 371=20, 373=2 拒绝) |
| FIX 5.0 | 8=FIXT.1.1 | 1137=7 | 1128=7 | 150=F (成交),带有 39=1/2 | 禁止使用 (通过 35=3, 371=20, 373=2 拒绝) |
| FIX 5.2 (5.0 SP2) | 8=FIXT.1.1 | 1137=9 | 1128=9 | 150=F (成交),带有 39=1/2 | 禁止使用 (通过 35=3, 371=20, 373=2 拒绝) |
2. 会话管理与 HMAC-SHA256 登录 (35=A)
每个 FIX 会话都始于一个 Logon (35=A) 帧,该帧通过您的 GaiaEx API Key (Tag 553)、API Secret (Tag 554) 以及位于 RawData (Tag 96) 中的小写十六进制 HMAC-SHA256 签名进行身份验证。
import hmac, hashlib
def sign_fix_logon(api_secret: str, sending_time: str, seq_num: int, sender_comp_id: str, target_comp_id: str) -> str:
# Canonical prehash string: SendingTime(52) | MsgType(35) | MsgSeqNum(34) | SenderCompID(49) | TargetCompID(56)
payload = f"{sending_time}|A|{seq_num}|{sender_comp_id}|{target_comp_id}"
return hmac.new(api_secret.encode("utf-8"), payload.encode("utf-8"), hashlib.sha256).hexdigest()| 标签 | 字段名称 | 必填 | 描述 |
|---|---|---|---|
98 | EncryptMethod | Y | 0 = 无 / TLS 传输加密 |
108 | HeartBtInt | Y | 心跳间隔(秒)(推荐值:30) |
141 | ResetSeqNumFlag | N | Y = 重置序列号为 1;N = 恢复日内序列状态 |
553 | Username | Y | GaiaEx API Key |
554 | Password | Y | GaiaEx API Secret |
96 | RawData | Y | 对 52|A|34|49|56 进行 HMAC-SHA256 计算所得的 64 字符十六进制签名 |
797 / 9406 | CopyMsgIndicator / DropCopyFlag | N | 设置 797=Y、9406=Y 或 50=DROPCOPY 以注册只读 Drop Copy 会话 |
1409 | SessionStatus | 出参 | 在 35=A / 35=5 中返回:0=活跃,4=登出完成,5=鉴权失败,6=序列号过低,101=达到 1 亿序列号上限 |
空缺恢复 (35=2 & 35=4) 与断开连接自动撤单 (CoD)
- 入站空缺检测:如果收到的消息带有
MsgSeqNum (34) > ExpectedSeqNum,网关会立即发送ResendRequest (35=2, 7=ExpectedSeqNum, 16=0)。如果MsgSeqNum (34) < ExpectedSeqNum且没有PossDupFlag (43=Y),网关将发送Logout (35=5, 1409=6)并关闭套接字。 - 出站重放:当客户端发送
ResendRequest (35=2)时,网关会重放所有应用层消息(包括 Drop Copy35=8报告),并附带43=Y和122=OrigSendingTime,同时将管理层帧合并为SequenceReset-GapFill (35=4, 123=Y)。 - 断开连接自动撤单 (CoD):当订单管理会话断开时,在该会话上挂起的所有未结订单 (
OrdStatus 39=0) 将自动被撤销 (150=4, 39=4, 103=3020),并实时广播至所有活动的 Drop Copy 会话。
3. 订单录入、修改、撤单与查询 (35=D, G, F, q, H, AN, XLQ)
单个新订单 (35=D)
| 标签 | 字段名称 | 必填 | 支持的值及说明 |
|---|---|---|---|
11 | ClOrdID | Y | 客户端分配的唯一订单标识符(最多 31 个字符) |
1 | Account | N | 自托管金库地址 (0x...) 或子账户标识符 |
50 | SenderSubID | N | 交易员或策略 ID;在 35=8 中的 TargetSubID (57) 回显 |
55 | Symbol | Y | USDC 永续合约 (BTCUSDC、ETHUSDC、SOLUSDC)、USDT 永续合约 (BTCUSDT、ETHUSDT)、RWA 永续合约 (xyz:GOLD / GOLDUSDC、xyz:NVDA、xyz:TSLA) |
54 | Side | Y | 1 = 买入,2 = 卖出 |
38 | OrderQty | Y | 以基础资产计量的订单数量(支持 4 位小数精度,例如 0.0050) |
40 | OrdType | Y | 1 = 市价单,2 = 限价单,4 = 止损限价单(需要 99=StopPx),p = 只做 Maker(或 18=6) |
44 | Price | 条件必填 | 限价价格(40=2、40=4、40=p 必需) |
59 | TimeInForce | N | 1 = GTC(默认),3 = IOC,4 = FOK,5 = GTX |
544 | CashMargin | N | 1 = 现货(默认),2 = 保证金开仓,3 = 保证金平仓 |
改单 (35=G)、撤单 (35=F)、批量撤单 (35=q)、状态查询 (35=H)、持仓 (35=AN) 与限制查询 (35=XLQ)
| MsgType | 消息名称 | 关键请求标签 | 网关响应 |
|---|---|---|---|
35=G | OrderCancelReplaceRequest | 11=ClOrdID、41=OrigClOrdID、55=Symbol、54=Side、38=OrderQty、44=Price | 带有 150=5, 39=5 (已替换) 的 35=8 或 35=9 (434=2) |
35=F | OrderCancelRequest | 11=ClOrdID、41=OrigClOrdID、55=Symbol、54=Side | 两步 35=8:150=6, 39=6 (待撤单) → 150=4, 39=4 (已撤销),或 35=9 (434=1) |
35=q | OrderMassCancelRequest | 11=ClOrdID、530=7 (撤销所有订单) | 35=r (1369=MassActionReportID, 531=7) + 每个已撤销订单各一条 35=8 (150=4, 39=4) |
35=H | OrderStatusRequest | 11=ClOrdID(或 37=OrderID)、790=OrdStatusReqID | 带有 150=I (订单状态) 的 35=8 或 150=8, 103=5 (未知订单) |
35=AN | RequestForPositions | 710=PosReqID、724=0 (持仓)、1=Account、55=Symbol | 带有 721=PosMaintRptID、728=0、704=LongQty、705=ShortQty、730=SettlePrice 的 PositionReport (35=AP) |
35=XLQ | LimitQuery | 25003=ReqID | 带有 25005=ORDERS (500/秒) 和 25005=CONNECTIONS (20/账户) 的 LimitResponse (35=XLR) |
4. 实时 Drop Copy 与对账 (797=Y / 9406=Y)
Drop Copy 为主经纪商、风险控制引擎和后台对账系统提供实时、只读的流服务,涵盖 FIX 订单录入会话和 REST/HTTP API 订单中的所有 ExecutionReport (35=8) 事件。
- 通用订阅标识:连接至端口
9878并发送带有797=Y(CopyMsgIndicator)、9406=Y(DropCopyFlag) 或50=DROPCOPY(SenderSubID) 的Logon (35=A)。 - 出站双标签标记:每个 Drop Copy
35=8帧都携带57=DROPCOPY、797=Y和9406=Y,以及完整的手续费/返佣明细 (381=GrossTradeAmt、1057=AggressorIndicator、136=1|137=MiscFeeAmt|138=MiscFeeCurr|139=4、20000=TradeFeeRebateAmt)。 - 严格只读保护:在 Drop Copy 会话上提交
35=D、35=F、35=G或35=q的任何尝试都将被BusinessMessageReject (35=j, 380=4)立即拒绝。 - 序列空缺恢复:出站 Drop Copy 报告会持久化在会话序列存储中,并可通过带有
PossDupFlag (43=Y)的ResendRequest (35=2)进行重放。
5. 行情数据 (35=V, W, X, Y) 与参考数据 (35=x, y, h)
连接至端口 9879 获取专用行情数据流,或通过 SecurityListRequest (35=x) 查询合约规格。
- MarketDataRequest (
35=V):发送262=MDReqID、263=1(快照 + 增量更新)或0(快照)、264=1(最优买卖价)或20(全深度),以及55=Symbol。返回MarketDataSnapshotFullRefresh (35=W),后跟MarketDataIncrementalRefresh (35=X)。未知的交易对代码将返回MarketDataRequestReject (35=Y, 281=0)。 - SecurityListRequest (
35=x):发送320=SecurityReqID以及559=0(55中的单个交易对代码)或559=4(所有交易对)。返回包含最小变动价位 (969=MinPriceIncrement)、最小/最大订单数量 (8000/8001) 和小数精度 (8002/8003) 的SecurityList (35=y)。 - TradingSessionStatus (
35=h):返回340=2(7x24x365 全天候开放)或340=1(已停牌)。
QuickFIX 客户端配置模板 (gaiaex_fix.cfg)
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=5
FileStorePath=./store
FileLogPath=./log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=./fix-dictionary.xml
ValidateUserDefinedFields=N
ValidateFieldsOutOfOrder=N
HeartBtInt=30
[SESSION]
BeginString=FIX.4.4
SenderCompID=INST_CLIENT_OE
TargetCompID=GAIAEX_PROD
SocketConnectHost=10.10.0.51
SocketConnectPort=9878
ResetOnLogon=N
[SESSION]
BeginString=FIX.4.4
SenderCompID=INST_CLIENT_DC
TargetCompID=GAIAEX_PROD
SenderSubID=DROPCOPY
SocketConnectHost=10.10.0.51
SocketConnectPort=9878
ResetOnLogon=N