FIX API
[!NOTE] 此 API 只能用于现货 (
SPOT
) 交易所。
基本信息
FIX 连接需要 TLS 加密。请使用本地 TCP+TLS 连接或设置本地代理如 stunnel 来处理 TLS 加密。
FIX 会话仅支持 Ed25519 密钥。
关于如何设置 Ed25519 密钥对,请参考 本教程。
FIX API 订单接入会话
- 端点为:
tcp+tls://fix-oe.binance.com:9000
- 支持下单,取消订单和查询当前限制使用情况。
- 支持接收账户的所有 ExecutionReport
<8>
和 List Status<N>
。 - 仅允许带有
FIX_API
的 API Key 连接。 - 关于 QuickFIX 模式文件, 请点击 这里。
FIX API Drop Copy 会话
- 端点为:
tcp+tls://fix-dc.binance.com:9000
- 支持接收账户的所有 ExecutionReport
<8>
和 List Status<N>
。 - 仅允许连接带有
FIX_API
或FIX_API_READ_ONLY
的 API Key。 - 关于 QuickFIX 模式文件, 请点击 这里。
FIX API Market Data 会话
- 端点为:
tcp+tls://fix-md.binance.com:9000
- 支持市场数据流和活动工具查询。
- 不支持下订单或取消订单。
- 仅允许连接带有“FIX_API”或“FIX_API_READ_ONLY”的 API 密钥。
关于 QuickFIX 模式 (Schema) 文件, 请点击 这里。
FIX 连接需要 TLS 加密。请使用本地 TCP+TLS 连接或设置本地代理如 stunnel 来处理 TLS 加密。
FIX Market Data 的 QuickFIX Schema 可以在 这里
FIX 连接生命周期
- 所有 FIX API 会话将尽最大努力,尽可能长时间地保持开放状态。
- 没有最短连接时间 保证,服务器可能随时进入维护状态。
- 当服务器进入维护状态时,News
<B>
消息将会被发送,以提示客户端重新连接。收到此消息后,客户端应建立新会话并在 10 秒内 关闭旧会话。如果客户端未在规定的时间范围内关闭旧连接,那么服务器会将其注销并关闭会话。
- 当服务器进入维护状态时,News
- 连接后,客户端必须发送 Logon
<A>
请求。有关详情,请参阅 如何签署登录请求。 - 客户端应在断开连接之前发送 Logout
<5>
消息来关闭会话。未能发送注销消息将导致在 2xHeartInt (108)
定义的时间间隔内无法将会话的SenderCompID (49)
用于新会话的建立。 - 系统允许在登录过程中协商
HeartInt (108)
值。可接受值的范围为 5 到 60 秒。- 如果服务器在
HeartInt (108)
间隔内没有发送任何消息,将发送 HeartBeat<0>
。 - 如果服务器在
HeartInt (108)
间隔内没有收到任何消息,将发送 TestRequest<1>
。如果服务器在HeartInt (108)
秒内没有收到来自客户端的包含预期TestReqID (112)
的 HeartBeat<0>
消息,服务器将发送 Logout<5>
消息并关闭连接。 - 如果客户端在
HeartInt (108)
间隔内未收到任何消息,那么客户端应负责发送 TestRequest<1>
消息以确保连接正常。收到这样的 TestRequest<1>
后,服务器会发送包含预期TestReqID (112)
的 HeartBeat<0>
消息来进行响应。如果客户端在HeartInt (108)
间隔内没有收到服务器的响应,那么客户端应关闭现有的会话和连接,并且建立新的会话和连接。
- 如果服务器在
API Key 权限
如果您需要使用 FIX API 的订单接入会话,您的 API key 必须配置 FIX_API
权限。
如果您需要使用 FIX API 的 Drop Copy 会话,您的 API key 必须配置 FIX_API_READ_ONLY
或 FIX_API
权限。
要访问 FIX Market Data 会话,您的 API 密钥必须配置为 FIX_API
或 FIX_API_READ_ONLY
权限
FIX 会话仅支持 Ed25519 密钥。
关于如何设置 Ed25519 密钥对,请参考 本教程。
关于消息处理顺序
初始消息 Logon<A>
中必需的 MessageHandling (25035)
字段被用于控制:是否在消息被撮合引擎处理前,需要重新排序消息。
UNORDERED(1)
允许不按顺序将来自客户端的消息发送到撮合引擎。SEQUENTIAL(2)
来自客户端的消息始终以MsgSeqNum(34)
中定义的顺序发送到撮合引擎。
[!TIP] 在有多个消息需要从客户端传输到服务器的情况时,
UNORDERED(1)
应该会提供更好的性能。
响应模式
默认情况下,所有并发订单录入会话都会接收到账户所有
成功的 ExecutionReport <8>
和 ListStatus <N>
消息,
包括从其他 FIX 会话和通过非 FIX API 下达的订单。
用户可以在初始消息 Logon<A>
中使用 ResponseMode (25036)
字段来改变这种行为。
EVERYTHING(1)
: 默认模式。ONLY_ACKS(2)
: 无论操作成功还是失败,都只接收 ACK 消息。禁用ExecutionReport
推送。
如何签署 Logon<A>
请求
Logon<A>
消息用于验证您与 FIX API 的连接。
这条消息必须是客户端发送的第一条消息。
Username (553)
字段必须包含 API key。RawData (96)
字段必须包含使用 API key 生成的有效签名。
签名 payload 是一个文本字符串。该字符串通过按以下所列顺序去连接下列字段来构成, 并且以 SOH 字符作为分隔符:
MsgType (35)
SenderCompId (49)
TargetCompId (56)
MsgSeqNum (34)
SendingTime (52)
请使用您的密钥签署 payload。请使用 base64 对签名进行编码。
生成的文本字符串是 RawData (96)
字段的值。
以下是实现签名算法的 Python 代码示例:
import base64
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives.serialization import load_pem_private_key
def logon_raw_data(private_key: Ed25519PrivateKey,
sender_comp_id: str,
target_comp_id: str,
msg_seq_num: str,
sending_time: str):
"""
Computes the value of RawData (96) field in Logon<A> message.
"""
payload = chr(1).join([
'A',
sender_comp_id,
target_comp_id,
msg_seq_num,
sending_time,
])
signature = private_key.sign(payload.encode('ASCII'))
return base64.b64encode(signature).decode('ASCII')
with open('private_key.pem', 'rb') as f:
private_key = load_pem_private_key(data=f.read(),
password=None)
raw_data = logon_raw_data(private_key,
sender_comp_id='5JQmUOsm',
target_comp_id='SPOT',
msg_seq_num='1',
sending_time='20240612-08:52:21.613')
以下值可用于验证签名计算实现的正确性:
字段 | 取值 |
---|---|
MsgType (35) | A |
SenderCompID (49) | EXAMPLE |
TargetCompID (56) | SPOT |
MsgSeqNum (34) | 1 |
SendingTime (52) | 20240627-11:17:25.223 |
示例计算中使用的 Ed25519 密钥如下所示:
[!CAUTION] 以下密钥仅用于示范说明目的。请务必不要在任何实际应用中使用该密钥,因为它不安全,可能会危及您的加密实现。请在实际使用中生成属于您自己的唯一且安全的密钥。
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIIJEYWtGBrhACmb9Dvy+qa8WEf0lQOl1s4CLIAB9m89u
-----END PRIVATE KEY-----
经过计算生成的签名:
4MHXelVVcpkdwuLbl6n73HQUXUf1dse2PCgT1DYqW9w8AVZ1RACFGM+5UdlGPrQHrgtS3CvsRURC1oj73j8gCA==
生成的 Logon <A>
消息:
8=FIX.4.4|9=247|35=A|34=1|49=EXAMPLE|52=20240627-11:17:25.223|56=SPOT|95=88|96=4MHXelVVcpkdwuLbl6n73HQUXUf1dse2PCgT1DYqW9w8AVZ1RACFGM+5UdlGPrQHrgtS3CvsRURC1oj73j8gCA==|98=0|108=30|141=Y|553=sBRXrJx2DsOraMXOaUovEhgVRcjOvCtQwnWj8VxkOh1xqboS02SPGfKi2h8spZJb|25035=2|10=227|