Web Socket 行情接口(2023-12-04)
基本信息
- 本篇所列出的所有wss接口的baseurl为: wss://stream.binance.com:9443 或者 wss://stream.binance.com:443
- 所有stream均可以直接访问,或者作为组合streams的一部分。
- 直接访问时URL格式为 /ws/\<streamName>
- 组合streams的URL格式为 /stream?streams=\<streamName1>/\<streamName2>/\<streamName3>
- 订阅组合streams时,事件payload会以这样的格式封装 {"stream":"\<streamName>","data":\<rawPayload>}
- stream名称中所有交易对均为小写
- 每个到stream.binance.com的链接有效期不超过24小时,请妥善处理断线重连。
- Websocket 服务器每3分钟发送Ping消息。
- 如果Websocket服务器在10分钟之内没有收到Pong消息应答,连接会被断开。
- 当客户收到ping消息,必需尽快回复pong消息,同时payload需要和ping消息一致。
- 未经请求的pong消息是被允许的,但是不会保证连接不断开。对于这些pong消息,建议payload为空
- wss://data-stream.binance.vision 可以用来订阅仅有市场信息的数据流。账户信息无法从此URL获得。
#
WebSocket 连接限制- WebSocket服务器每秒最多接受5个消息。消息包括:
- PING帧
- PONG帧
- JSON格式的消息, 比如订阅, 断开订阅.
- 如果用户发送的消息超过限制,连接会被断开连接。反复被断开连接的IP有可能被服务器屏蔽。
- 单个连接最多可以订阅1024个Streams。
- 每IP地址、每5分钟最多可以发送300次连接请求。
#
实时订阅/取消数据流- 以下数据可以通过websocket发送以实现订阅或取消订阅数据流。示例如下.
- 请求中的
id
被用作唯一标识来区分来回传递的消息。以下格式被接受:- 64位有符号整数
- 字母数字字符串;最大长度36
null
- 如果相应内容中的
result
为null
,表示请求发送成功。
#
订阅一个信息流请求
响应
#
取消订阅一个信息流请求
响应
#
已订阅信息流请求
响应
#
设定属性当前,唯一可以设置的属性是设置是否启用combined
("组合")信息流。
当使用/ws/
("原始信息流")进行连接时,combined属性设置为false
,而使用 /stream/
进行连接时则将属性设置为true
。
请求
响应
#
检索属性请求
响应
#
错误信息错误信息 | 描述 |
---|---|
{"code": 0, "msg": "Unknown property","id": %s} | SET_PROPERTY 或 GET_PROPERTY 中应用的参数无效 |
{"code": 1, "msg": "Invalid value type: expected Boolean"} | 仅接受true 或false |
{"code": 2, "msg": "Invalid request: property name must be a string"} | 提供的属性名无效 |
{"code": 2, "msg": "Invalid request: request ID must be an unsigned integer"} | 参数id 未提供或id 值是无效类型 |
{"code": 2, "msg": "Invalid request: unknown variant %s, expected one of SUBSCRIBE , UNSUBSCRIBE , LIST_SUBSCRIPTIONS , SET_PROPERTY , GET_PROPERTY at line 1 column 28"} | 错字提醒,或提供的值不是预期类型 |
{"code": 2, "msg": "Invalid request: too many parameters"} | 数据中提供了不必要参数 |
{"code": 2, "msg": "Invalid request: property name must be a string"} | 未提供属性名 |
{"code": 2, "msg": "Invalid request: missing field method at line 1 column 73"} | 数据未提供method |
{"code":3,"msg":"Invalid JSON: expected value at line %s column %s"} | JSON 语法有误. |
Stream 详细定义
#
归集交易归集交易与逐笔交易的区别在于,同一个taker在同一价格与多个maker成交时,会被归集为一笔成交。
Stream 名称: \<symbol>@aggTrade
更新速度: 实时
Payload:
#
逐笔交易逐笔交易推送每一笔成交的信息。成交,或者说交易的定义是仅有一个吃单者与一个挂单者相互交易。
Stream 名称: \<symbol>@trade
更新速度: 实时
Payload:
#
K线K线stream逐秒推送所请求的K线种类(最新一根K线)的更新
订阅Kline需要提供间隔参数,最短为分钟线,最长为月线。支持以下间隔:
m -> 分钟; h -> 小时; d -> 天; w -> 周; M -> 月
- 1m
- 3m
- 5m
- 15m
- 30m
- 1h
- 2h
- 4h
- 6h
- 8h
- 12h
- 1d
- 3d
- 1w
- 1M
Stream 名称: \<symbol>@kline_\<interval>
更新速度: 1s
1000ms,其它间隔 2000ms
Payload:
#
按Symbol的精简Ticker按Symbol逐秒刷新的24小时精简ticker信息
Stream 名称: \<symbol>@miniTicker
更新速度: 1000ms
Payload:
#
全市场所有Symbol的精简Ticker同上,只是推送所有交易对
Stream名称: !miniTicker@arr
更新速度: 1000ms
Payload:
#
按Symbol的完整Ticker按Symbol逐秒刷新的24小时完整ticker信息
Stream 名称: \<symbol>@ticker
更新速度: 1000ms
Payload:
#
全市场所有交易对的完整Ticker同上,只是推送所有交易对
Stream 名称: !ticker@arr
更新速度: 1000ms
Payload:
#
按Symbol的最优挂单信息实时推送指定交易对最优挂单信息
多个 <symbol>@bookTicker
可以订阅在一个WebSocket连接上
Stream 名称: \<symbol>@bookTicker
更新速度: 实时
Payload:
#
平均价格平均价格流推送在固定时间间隔内的平均价格变动。
Stream 名称: \<symbol>@avgPrice
更新速度: 1000ms
Payload:
#
有限档深度信息每秒推送有限档深度信息。levels 表示几档买卖单信息, 可选 5/10/20档
Stream 名称: \<symbol>@depth\<levels> 或者 \<symbol>@depth\<levels>@100ms
更新速度: 1000ms 或者 100ms
Payload:
#
增量深度信息stream每秒推送orderbook的变化部分(如果有)
Stream 名称: \<symbol>@depth 或者 \<symbol>@depth@100ms
更新速度: 1000ms 或者 100ms
Payload:
#
按Symbol的滚动窗口统计单个symbol的滚动窗口统计, 支持多个时间窗口。
Stream 名称: \<symbol>@ticker_\<window_size>
Window Sizes: 1h, 4h, 1d
更新速度: 1000ms
注意:
- 该数据流和 \<symbol>@ticker 不一样。
O
(open time
) 会在每分钟整点开始, 而C
(closing time
)是当前更新时间。- 实际统计的时间范围会比\<window_size>多不超过59999ms。
Payload:
#
全市场滚动窗口统计全市场symbols的滚动窗口ticker统计,计算于多个窗口。
注意:有变动的ticker才会推送。
Stream 名称: !ticker_\<window-size>@arr
Window Size: 1h, 4h, 1d
更新速度: 1000ms
Payload:
#
如何正确在本地维护一个orderbook副本- 订阅 wss://stream.binance.com:9443/ws/bnbbtc@depth
- 开始缓存收到的更新。同一个价位,后收到的更新覆盖前面的。
- 访问Rest接口 https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000 获得一个1000档的深度快照
- 将目前缓存到的信息中
u
小于步骤3中获取到的快照中的lastUpdateId
的部分丢弃(丢弃更早的信息,已经过期)。 - 将深度快照中的内容更新到本地orderbook副本中,并从websocket接收到的第一个
U
<=lastUpdateId
+1 且u
>=lastUpdateId
+1 的event开始继续更新本地副本。 - 每一个新event的
U
应该恰好等于上一个event的u
+1,否则可能出现了丢包,请从step3重新进行初始化。 - 每一个event中的挂单量代表这个价格目前的挂单量绝对值,而不是相对变化。
- 如果某个价格对应的挂单量为0,表示该价位的挂单已经撤单或者被吃,应该移除这个价位。
注意: 因为深度快照对价格档位数量有限制,初始快照之外的价格档位并且没有数量变化的价格档位不会出现在增量深度的更新信息内。因此,即使应用来自增量深度的所有更新,这些价格档位也不会在本地 order book 中可见,所以本地的 order book 与真实的 order book 可能会有一些差异。 不过对于大多数用例,5000 的深度限制足以有效地了解市场和交易。