FIX API
FIX(Financial Information eXchange)是一种用于下单、接收订单更新和取消订单的标准电子消息协议。BTSE 的 FIX API 基于 FIX 4.2 规范。
连接
| 环境 | 主机 | 端口 |
|---|---|---|
| 生产环境 | tcp+ssl://fix.btse.com | 9876 |
| 测试网 | tcp+ssl://fix.btse.io | 9876 |
现货和合约的会话通过 SenderSubID 分开:
| SenderSubID | 市场 |
|---|---|
SPOT | 现货交易 |
FUTURES | 合约交易 |
频率限制
| 组 | 消息类型 | 限制 |
|---|---|---|
| 认证 | Logon (A), Logout (5) | 每秒 2 次 |
| 通用 | 所有其他消息 | 每秒 30 次 |
超出频率限制时,会返回 Business Message Reject (j),其中 BusinessRejectReason: 4(应用程序不可用)。
通用请求属性
所有客户端消息必须包含以下字段:
| 标签 | 名称 | 描述 |
|---|---|---|
| 8 | BeginString | 必须为 FIX.4.2 |
| 9 | BodyLength | 消息体长度(字节) |
| 34 | MsgSeqNum | 序列号 — 从 1 开始,每条消息递增。重复或乱序将被拒绝。新连接时重置。 |
| 35 | MsgType | 消息类型 |
| 49 | SenderCompID | 客户端 API key |
| 50 | SenderSubID | SPOT 或 FUTURES |
| 52 | SendingTime | 消息发送时间(例如 20220916-07:29:07) |
| 56 | TargetCompID | 必须为 BTSE |
| 10 | CheckSum | 消息校验和 |
消息
Logon (A)
发起 FIX 会话。必须是发送的第一条消息。每个连接仅允许一个会话。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | A | |
| 95 | RawDataLength | 96 | RawData 字段的长度 |
| 96 | RawData | (hex) | HMAC-SHA384 签名。使用 FIX 字段分隔符(0x01)拼接:SendingTime + MsgType + MsgSeqNum + SenderCompID + TargetCompID,然后使用 API secret 进行 HMAC-SHA384 签名 |
| 98 | EncryptMethod | 0 | 必须为 0(无加密) |
| 108 | HeartBtInt | 30 | 心跳间隔(秒)。每 N-5 秒发送一次心跳 |
| 141 | ResetSeqNumFlag | Y | 必须为 Y |
| 5001 | ApplyNewSymbolName | Y | 仅限合约。启用新交易对名称(例如 BTC-PERP)。没有此字段时,仅接受旧名称(例如 BTCPFC) |
签名计算
// 使用 FIX 分隔符 (0x01) 拼接字段:
// SendingTime + 0x01 + MsgType + 0x01 + MsgSeqNum
// + 0x01 + SenderCompID + 0x01 + TargetCompID
//
// 然后:HMAC-SHA384(apiSecret, dataRaw)
// 将结果进行十六进制编码 → RawData (tag 96)
Heartbeat (0)
保持会话活跃。每 N-5 秒发送一次 ,其中 N 是 Logon 中设置的心跳间隔。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | 0 | |
| 112 | TestReqID | 123 | 如果是对 TestRequest 的响应,从 TestRequest 中复制 |
Test Request (1)
请求心跳响应。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | 1 | |
| 112 | TestReqID | 123 | 任意字符串 — 在 Heartbeat 中回传 |
Logout (5)
终止会话。对方以另一条 Logout 消息响应;之后关闭连接。
| 标签 | 名称 | 值 |
|---|---|---|
| 35 | MsgType | 5 |
New Order Single (D)
提交新订单。支持 Market 和 Limit 订单。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | D | |
| 21 | HandlInst | 1 | 必须为 1(AutomatedExecutionNoIntervention) |
| 11 | ClOrdID | order123 | 客户端选择的唯一订单标识符 |
| 55 | Symbol | BTC-USD | 交易对名称 |
| 40 | OrdType | 2 | 1:Market · 2:Limit |
| 38 | OrderQty | 1.1 | 以基础货币为单位的订单数量(Limit 和 Market 卖单必填) |
| 44 | Price | 18000 | Limit 或 Market 买单价格(Limit 和 Market 买单必填) |
| 54 | Side | 1 | 1:买入 · 2:卖出 |
| 59 | TimeInForce | 1 | 1:GTC · 3:IOC · 4:FOK · a:30秒 · b:5分钟 · c:1小时 · d:12小时 · e:1周 · f:1个月 |
| 18 | ExecInst | 6 | 可选:E:只减仓 · 6:仅做 maker |
| 5002 | PositionId | BTC-PERP-USDT | 可选。要减少的仓位(合约) |
| 5003 | PositionMode | ONEWAY | 可选。ONEWAY(默认) · HEDGE · ISOLATED |
接受后,返回 Execution Report (8)。
Order Cancel Request (F)
请求取消未完成的订单。仅提供 OrderID 或 OrigClOrdID 之一。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | F | |
| 37 | OrderID | order123 | 系统分配的订单 ID |
| 41 | OrigClOrdID | order123 | 客户端分配的订单 ID |
| 55 | Symbol | BTC-USD | 交易对名称 |
成功时返回 Execution Report (8),失败时返回 Order Cancel Reject (9)。
Order Cancel Reject (9)
当 Order Cancel Request 失败时由服务器发送。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | 9 | |
| 37 | OrderID | order123 | 从取消请求中复制(如果提供) |
| 41 | OrigClOrdID | order123 | 从取消请求中复制(如果提供) |
| 39 | OrdStatus | 4 | 4:已取消 · 8:拒绝 |
| 102 | CxlRejReason | 1 | 1:未知订单 · 99:其他 |
| 434 | CxlRejResponseTo | 1 | 始终为 1 |
Order Status Request (H)
查询订单状态。仅提供 OrderID 或 OrigClOrdID 之一。使用 OrderID = * 请求所有待处理订单。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | H | |
| 37 | OrderID | order123 | 要查询的订单,或 * 查询所有未完成订单 |
| 41 | OrigClOrdID | order123 | 客户端订单 ID |
| 54 | Side | 1 | 1:买入 · 2:卖出 |
| 55 | Symbol | BTC-USD | 交易对名称 |
返回 ExecType=I 的 Execution Report (8)。当没有未完成订单时,Text (58) 返回 "No open orders"。
Execution Report (8)
在以下情况由服务器发送:订单成交、订单状态变更,或响应 New Order Single、Order Cancel Request 或 Order Status Request。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 11 | ClOrdID | order123 | 客户端订单 ID |
| 12 | Commission | 0.002 | 交易手续费(仅成交时) |
| 13 | CommType | 3 | 始终为 3 |
| 14 | CumQty | 0.4 | 累计成交数量 |
| 17 | ExecID | d840c8... | 执行 ID |
| 31 | LastPx | 7999.25 | 成交价格(仅成交时) |
| 32 | LastShares | 0.4 | 成交数量(仅成交时) |
| 35 | MsgType | 8 | |
| 37 | OrderID | d840c8... | 系统订单 ID |
| 38 | OrderQty | 1.2 | 原始订单数量 |
| 39 | OrdStatus | 0 | 当前订单状态(见下表) |
| 44 | Price | 8000 | 原始订单价格 |
| 54 | Side | 1 | 1:买入 · 2:卖出 |
| 55 | Symbol | BTC-USD | 交易对名称 |
| 58 | Text | text | 拒绝原因描述 |
| 59 | TimeInForce | 6 | 1:GTC · 3:IOC · 4:FOK · 6:GTD · a-f:自定义时长 |
| 60 | TransactTime | 20190525-08:26:38.989 | 订单更新时间戳 |
| 103 | OrdRejReason | 11 | 11:UNSUPPORTED_ORDER_CHARACTERISTIC — 详见 Text(58) |
| 126 | ExpireTime | 20190525-08:26:38.989 | TimeInForce=GTD 且未设置 ExpireDate 时必填 |
| 150 | ExecType | 1 | 此消息的原因(见下表) |
| 151 | LeavesQty | 0.8 | 剩余未成交数量 |
| 1057 | AggressorIndicator | Y | Y:taker · N:maker(仅成交时) |
| 5000 | Liquidation | Y | Y:市场强平订单 |
ExecType 值:
| ExecType | 描述 |
|---|---|
| 0 | 新订单 |
| 1 | 部分成交 |
| 3 | 完全成交 |
| 4 | 订单已取消 |
| 5 | 订单已修改 |
| 7 | 订单退款(自成交) |
| 8 | 已拒绝(响应 New Order Single) |
| I | 订单状态(响应 Order Status Request) |
OrdStatus 值:
| OrdStatus | 描述 |
|---|---|
| 0 | 新订单 |
| 1 | 部分成交 |
| 3 | 完全成交 |
| 4 | 已取消 |
| 5 | 已修改 |
| 7 | 已退款 |
| 8 | 已拒绝 |
Reject (3)
在收到无效消息时由服务器发送。
| 标签 | 名称 | 值 | 描述 |
|---|---|---|---|
| 35 | MsgType | 3 | |
| 45 | RefSeqNum | 2 | 被拒绝消息的序列号 |
| 371 | RefTagID | 38 | 被拒绝字段的标签号 |
| 372 | RefMsgType | D | 被拒绝消息的消息类型 |
| 58 | Text | Missing quantity | 人类可读的拒绝原因 |
| 373 | SessionRejectReason | 1 | 标识拒绝原因的代码 |
Business Message Reject (j)
当超出频率限制时发送。
| 标签 | 名称 | 示例 | 描述 |
|---|---|---|---|
| 35 | MsgType | j | |
| 45 | RefSeqNum | 11 | 被拒绝消息的序列号 |
| 49 | SenderCompID | BTSE | 始终为 BTSE |
| 56 | TargetCompID | c123...05a | 客户端 API key |
| 57 | TargetSubID | SPOT | SPOT 或 FUTURES |
| 58 | Text | exceeding rate limit | 详细信息 |
| 372 | RefMsgType | F | 被拒绝消息的消息类型 |
| 380 | BusinessRejectReason | 4 | 始终为 4:应用程序不可用 |