WebSocket 行情数据推送
Websocket 行情推送¶
- 本篇所列出的所有wss接口的baseurl为: wss://sstream.asterdex.com
- Streams有单一原始 stream 或组合 stream
- 单一原始 streams 格式为 /ws/\<streamName>
- 组合streams的URL格式为 /stream?streams=\<streamName1>/\<streamName2>/\<streamName3>
- 订阅组合streams时,事件payload会以这样的格式封装: {"stream":"\<streamName>","data":\<rawPayload>}
- stream名称中所有交易对均为 小写
- 每个到 sstream.asterdex.com 的链接有效期不超过24小时,请妥善处理断线重连。
- 每3分钟,服务端会发送ping帧,客户端应当在10分钟内回复pong帧,否则服务端会主动断开链接。允许客户端发送不成对的pong帧(即客户端可以以高于10分钟每次的频率发送pong帧保持链接)。
实时订阅/取消数据流¶
- 以下数据可以通过websocket发送以实现订阅或取消订阅数据流。示例如下。
- 响应内容中的
id是无符号整数,作为往来信息的唯一标识。 - 如果相应内容中的
result为null,表示请求发送成功。
订阅一个信息流¶
响应
* 请求 {{ "result": null, "id": 1 }
"method": "SUBSCRIBE",
"params":
[
"btcusdt@aggTrade",
"btcusdt@depth"
],
"id": 1
}
取消订阅一个信息流¶
响应
{
"result": null,
"id": 312
}
- 请求
{
"method": "UNSUBSCRIBE",
"params":
[
"btcusdt@depth"
],
"id": 312
}
已订阅信息流¶
响应
{
"result": [
"btcusdt@aggTrade"
],
"id": 3
}
- 请求
{
"method": "LIST_SUBSCRIPTIONS",
"id": 3
}
设定属性¶
当前,唯一可以设置的属性是设置是否启用combined("组合")信息流。
当使用/ws/("原始信息流")进行连接时,combined属性设置为false,而使用 /stream/进行连接时则将属性设置为true。
响应
javascript
{
"result": null,
"id": 5
}
- 请求
{
"method": "SET_PROPERTY",
"params":
[
"combined",
true
],
"id": 5
}
检索属性¶
响应
{ "result": true, // Indicates that combined is set to true. "id": 2 }
- 请求
{
"method": "GET_PROPERTY",
"params":
[
"combined"
],
"id": 2
}
错误信息¶
| 错误信息 | 描述 |
|---|---|
| {"code": 0, "msg": "Unknown property"} | SET_PROPERTY 或 GET_PROPERTY中应用的参数无效 |
| {"code": 1, "msg": "Invalid value type: expected Boolean", "id": '%s'} | 仅接受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 语法有误. |
归集交易流¶
Payload:
{ "e": "aggTrade", // 事件类型 "E": 123456789, // 事件时间 "s": "BNBBTC", // 交易对 "a": 12345, // 归集交易ID "p": "0.001", // 成交价格 "q": "100", // 成交数量 "f": 100, // 被归集的首个交易ID "l": 105, // 被归集的末次交易ID "T": 123456785, // 成交时间 "m": true, // 买方是否是做市方。如true,则此次成交是一个主动卖出单,否则是一个主动买入单。 }
归集交易 stream 推送交易信息,是对单一订单的集合。
Stream 名称: <symbol>@aggTrade
Update Speed: 实时
逐笔交易¶
Payload:
{ "e": "trade", // 事件类型 "E": 123456789, // 事件时间 "s": "BNBBTC", // 交易对 "t": 12345, // 交易ID "p": "0.001", // 成交价格 "q": "100", // 成交数量 "T": 123456785, // 成交时间 "m": true, // 买方是否是做市方。如true,则此次成交是一个主动卖出单,否则是一个主动买入单。 }
Stream Name: <symbol>@trade
逐笔交易推送每一笔成交的信息。成交,或者说交易的定义是仅有一个吃单者与一个挂单者相互交易
K线 Streams¶
Payload:
{ "e": "kline", // 事件类型 "E": 123456789, // 事件时间 "s": "BNBBTC", // 交易对 "k": { "t": 123400000, // 这根K线的起始时间 "T": 123460000, // 这根K线的结束时间 "s": "BNBBTC", // 交易对 "i": "1m", // K线间隔 "f": 100, // 这根K线期间第一笔成交ID "L": 200, // 这根K线期间末一笔成交ID "o": "0.0010", // 这根K线期间第一笔成交价 "c": "0.0020", // 这根K线期间末一笔成交价 "h": "0.0025", // 这根K线期间最高成交价 "l": "0.0015", // 这根K线期间最低成交价 "v": "1000", // 这根K线期间成交量 "n": 100, // 这根K线期间成交笔数 "x": false, // 这根K线是否完结(是否已经开始下一根K线) "q": "1.0000", // 这根K线期间成交额 "V": "500", // 主动买入的成交量 "Q": "0.500", // 主动买入的成交额 "B": "123456" // 忽略此参数 } }
K线stream逐秒推送所请求的K线种类(最新一根K线)的更新。
Stream Name: <symbol>@kline_<interval>
Update Speed: 2000ms
K线图间隔参数:
m -> 分钟; h -> 小时; d -> 天; w -> 周; M -> 月
- 1m
- 3m
- 5m
- 15m
- 30m
- 1h
- 2h
- 4h
- 6h
- 8h
- 12h
- 1d
- 3d
- 1w
- 1M
按 Symbol 的精简Ticker¶
Payload:
{ "e": "24hrMiniTicker", // 事件类型 "E": 123456789, // 事件时间 "s": "BNBBTC", // 交易对 "c": "0.0025", // 最新成交价格 "o": "0.0010", // 24小时前开始第一笔成交价格 "h": "0.0025", // 24小时内最高成交价 "l": "0.0010", // 24小时内最低成交价 "v": "10000", // 成交量 "q": "18" // 成交额 }
按Symbol刷新的最近24小时精简ticker信息
Stream 名称: <symbol>@miniTicker
Update Speed: 1000ms
全市场所有Symbol的精简Ticker¶
Payload:
[ { // 数组每一个元素对应一个交易对,内容与 \<symbol\>@miniTicker相同 } ]
同上,只是推送所有交易对.需要注意的是,只有更新的ticker才会被推送.
Stream名称: !miniTicker@arr
Update Speed: 1000ms
按Symbol的完整Ticker¶
Payload:
{ "e": "24hrTicker", // 事件类型 "E": 123456789, // 事件时间 "s": "BNBBTC", // 交易对 "p": "0.0015", // 24小时价格变化 "P": "250.00", // 24小时价格变化(百分比) "w": "0.0018", // 平均价格 "c": "0.0025", // 最新成交价格 "Q": "10", // 最新成交交易的成交量 "o": "0.0010", // 整整24小时前,向后数的第一次成交价格 "h": "0.0025", // 24小时内最高成交价 "l": "0.0010", // 24小时内最低成交价 "v": "10000", // 24小时内成交量 "q": "18", // 24小时内成交额 "O": 0, // 统计开始时间 "C": 86400000, // 统计结束时间 "F": 0, // 24小时内第一笔成交交易ID "L": 18150, // 24小时内最后一笔成交交易ID "n": 18151 // 24小时内成交数 }
每秒推送单个交易对的过去24小时滚动窗口标签统计信息。
Stream 名称: <symbol>@ticker
Update Speed: 1000ms
全市场所有交易对的完整Ticker¶
Payload:
[ { // Same as <symbol>@ticker payload } ]
推送全市场所有交易对刷新的24小时完整ticker信息。需要注意的是,没有更新的ticker不会被推送。
Stream Name: !ticker@arr
Update Speed: 1000ms
按Symbol的最优挂单信息¶
Payload:
{ "u":400900217, // order book updateId "s":"BNBUSDT", // 交易对 "b":"25.35190000", // 买单最优挂单价格 "B":"31.21000000", // 买单最优挂单数量 "a":"25.36520000", // 卖单最优挂单价格 "A":"40.66000000" // 卖单最优挂单数量 }
实时推送指定交易对最优挂单信息
Stream Name: <symbol>@bookTicker
Update Speed: 实时
全市场最优挂单信息¶
Payload:
{ // 同 <symbol>@bookTicker payload }
实时推送所有交易对最优挂单信息
Stream Name: !bookTicker
Update Speed: 实时
有限档深度信息¶
Payload:
{ "e": "depthUpdate", // Event type "E": 123456789, // Event time "T": 123456788, // Transaction time "s": "BTCUSDT", // Symbol "U": 100, // First update ID in event "u": 120, // Final update ID in event "pu": 99, // Final update Id in last stream(ie `u` in last stream) "bids": [ // Bids to be updated [ "0.0024", // Price level to be updated "10" // Quantity ] ], "asks": [ // Asks to be updated [ "0.0026", // Price level to be updated "100" // Quantity ] ] }
每秒或每100毫秒推送有限档深度信息。levels表示几档买卖单信息, 可选 5/10/20档
Stream Names: <symbol>@depth<levels> 或 <symbol>@depth<levels>@100ms.
Update Speed: 1000ms 或 100ms
增量深度信息¶
Payload:
{ "e": "depthUpdate", // Event type "E": 123456789, // Event time "T": 123456788, // Transaction time "s": "BTCUSDT", // Symbol "U": 100, // First update ID in event "u": 120, // Final update ID in event "pu": 99, // Final update Id in last stream(ie `u` in last stream) "b": [ // Bids to be updated [ "5.4", // Price level to be updated "10" // Quantity ] ], "a": [ // Asks to be updated [ "5.6", // Price level to be updated "100" // Quantity ] ] }
每秒或每100毫秒推送orderbook的变化部分(如果有)
Stream Name: <symbol>@depth 或 <symbol>@depth@100ms
Update Speed: 1000ms 或 100ms
如何正确在本地维护一个orderbook副本¶
- 订阅 wss://sstream.asterdex.com/ws/bnbbtc@depth
- 开始缓存收到的更新。同一个价位,后收到的更新覆盖前面的。
- 访问Rest接口 https://sapi.asterdex.com/api/v1/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,表示该价位的挂单已经撤单或者被吃,应该移除这个价位。