数据格式
WebSocket 行情推送使用 JSON 消息。客户端应先按顶层 type 字段区分消息类型,再根据 symbol 和 data 解析具体行情数据。
INFO
不同市场、品类和行情权限下,字段可能缺省、置 0、为空字符串,或只返回部分数组内容。客户端解析时应保持兼容:未知字段忽略,可选字段判空,不要假设所有消息都包含相同字段集合。
通用消息结构
大多数标的级行情推送使用以下结构:
{
"type": "QUOTE",
"symbol": "US.AAPL",
"data": {}
}| 字段 | 类型 | 说明 |
|---|---|---|
type | string | 推送消息类型,例如 QUOTE、ORDER_BOOK、TICKER、KLINE。 |
symbol | string | 标的代码,格式为 {market}.{code},例如 HK.00700、US.AAPL。部分市场维度消息没有该字段。 |
data | object | 推送数据主体。不同 type 的结构不同。 |
客户端建议按如下方式分发:
收到 WebSocket message
-> JSON decode
-> switch message.type
-> QUOTE: 解析基础报价
-> ORDER_BOOK: 解析买卖盘
-> TICKER: 解析逐笔成交
-> KLINE: 解析 K 线
-> BROKER_QUEUE: 解析经纪队列
-> MARKET_STATE: 解析市场状态
-> default: 记录日志并忽略消息类型
| type | 说明 | 是否绑定标的 |
|---|---|---|
QUOTE | 基础报价。 | 是 |
ORDER_BOOK | 买卖盘。 | 是 |
TICKER | 逐笔成交。 | 是 |
KLINE | 当前 K 线。 | 是 |
BROKER_QUEUE | 经纪队列。 | 是 |
MARKET_STATE | 市场状态。 | 否 |
BROKER_QUEUE 和 MARKET_STATE 通常由服务端基于已订阅标的、市场和权限决定是否推送,客户端不需要单独传入对应订阅字段。
时间与数值
| 类型 | 约定 |
|---|---|
| 时间戳 | 字段名以 _ms 结尾时,通常表示 Unix 毫秒时间戳。 |
| 价格 | 使用十进制数值。展示时请结合市场价格精度处理。 |
| 成交量 | 使用数值类型。不同市场的单位可能不同,请按市场规则展示。 |
| 金额 | 成交额、成交金额等字段使用数值类型。 |
| 布尔值 | 例如 suspension 表示是否停牌。 |
| 枚举 | 例如 direction、type、status 等字段使用字符串枚举。 |
QUOTE 基础报价
基础报价推送标的的实时报价和状态信息。
示例
{
"type": "QUOTE",
"symbol": "US.AAPL",
"data": {
"data_time_ms": 1710000000000,
"last_price": 180.12,
"open_price": 178.5,
"high_price": 181.2,
"low_price": 177.9,
"prev_close_price": 179.66,
"volume": 12345678,
"turnover": 2223456789.12,
"suspension": false,
"sec_status": "NORMAL"
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data.data_time_ms | integer | 行情数据时间,Unix 毫秒时间戳。 |
data.last_price | number | 最新价。 |
data.open_price | number | 开盘价。 |
data.high_price | number | 最高价。 |
data.low_price | number | 最低价。 |
data.prev_close_price | number | 昨收价。 |
data.volume | number | 成交量。 |
data.turnover | number | 成交额。 |
data.suspension | boolean | 是否停牌。 |
data.sec_status | string | 证券状态。 |
data.option_data | object | 期权相关字段。仅适用于期权品类。 |
data.pre_market | object | 盘前行情字段。仅在适用市场和时段返回。 |
data.after_market | object | 盘后行情字段。仅在适用市场和时段返回。 |
data.overnight | object | 夜盘行情字段。仅在适用市场和时段返回。 |
data.future_data | object | 期货相关字段。仅适用于期货品类。 |
TIP
QUOTE 字段与 REST 实时报价 的 Quote 基础报价语义对齐。需要一次性获取当前完整状态时,可使用 REST 接口补齐。
ORDER_BOOK 买卖盘
买卖盘推送标的的实时盘口列表。返回档数由市场、品类和用户行情权限档(LV1/LV2/LV3)共同决定。
示例
{
"type": "ORDER_BOOK",
"symbol": "HK.00700",
"data": {
"data_time_ms": 1710000000000,
"ask_list": [
{
"price": 320.2,
"volume": 1000,
"order_count": 3
}
],
"bid_list": [
{
"price": 320.0,
"volume": 800,
"order_count": 2
}
]
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data.data_time_ms | integer | 买卖盘数据时间,Unix 毫秒时间戳。 |
data.ask_list | object[] | 卖盘列表,按档位排序。 |
data.bid_list | object[] | 买盘列表,按档位排序。 |
data.ask_list[].price | number | 卖盘价格。 |
data.ask_list[].volume | number | 卖盘数量。 |
data.ask_list[].order_count | number | 该档订单数量。 |
data.ask_list[].mpid | string | 做市商或券商标识。仅部分市场或深度行情返回。 |
data.bid_list[].price | number | 买盘价格。 |
data.bid_list[].volume | number | 买盘数量。 |
data.bid_list[].order_count | number | 该档订单数量。 |
data.bid_list[].mpid | string | 做市商或券商标识。仅部分市场或深度行情返回。 |
INFO
普通买卖盘和深度买卖盘都使用 ORDER_BOOK 消息类型。客户端应根据实际返回的档数、字段和用户权限判断展示方式。
TICKER 逐笔成交
逐笔成交推送标的的成交明细。服务端可能将多笔成交合并到同一条消息的 ticker_list 中。
示例
{
"type": "TICKER",
"symbol": "US.AAPL",
"data": {
"ticker_list": [
{
"time_ms": 1710000000123,
"sequence": 123456,
"direction": "BUY",
"price": 180.12,
"volume": 100,
"turnover": 18012,
"type": "NORMAL"
}
]
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data.ticker_list | object[] | 逐笔成交列表。 |
data.ticker_list[].time_ms | integer | 成交时间,Unix 毫秒时间戳。 |
data.ticker_list[].sequence | integer | 成交序号。可用于去重或排序。 |
data.ticker_list[].direction | string | 买卖方向,常见值:BUY、SELL、NEUTRAL。 |
data.ticker_list[].price | number | 成交价格。 |
data.ticker_list[].volume | number | 成交数量。 |
data.ticker_list[].turnover | number | 成交额。 |
data.ticker_list[].type | string | 成交类型,例如 NORMAL、AUTO_MATCH、ODD_LOT、AUCTION 等。 |
TIP
不要假设一条 TICKER 消息只包含一笔成交。高活跃标的可能批量推送多笔成交,客户端渲染时建议做节流和增量合并。
KLINE 当前 K 线
K 线推送当前周期的 K 线更新。订阅维度由 symbol + period + adjust 确定。
示例
{
"type": "KLINE",
"symbol": "US.AAPL",
"data": {
"period": "1m",
"adjust": "none",
"kl_list": [
{
"time_ms": 1710000000000,
"open_price": 180.0,
"high_price": 180.5,
"low_price": 179.8,
"close_price": 180.12,
"volume": 12345,
"turnover": 2223456.78
}
]
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data.period | string | K 线周期,例如 1m、5m、1D。 |
data.adjust | string | 复权方式,例如 none、forward_exclude_dividend。 |
data.kl_list | object[] | K 线列表。通常包含当前更新的 K 线。 |
data.kl_list[].time_ms | integer | K 线时间,Unix 毫秒时间戳。 |
data.kl_list[].open_price | number | 开盘价。 |
data.kl_list[].high_price | number | 最高价。 |
data.kl_list[].low_price | number | 最低价。 |
data.kl_list[].close_price | number | 收盘价或当前最新价。 |
data.kl_list[].volume | number | 成交量。 |
data.kl_list[].turnover | number | 成交额。 |
data.kl_list[].settle_price | number | 结算价。仅部分期货等品类返回。 |
常用周期
| 周期 | 说明 |
|---|---|
1m | 1 分钟 |
3m | 3 分钟 |
5m | 5 分钟 |
10m | 10 分钟 |
15m | 15 分钟 |
30m | 30 分钟 |
60m | 60 分钟 |
120m | 120 分钟 |
180m | 180 分钟 |
240m | 240 分钟 |
1D | 日 K |
1W | 周 K |
1M | 月 K |
1Q | 季 K |
1Y | 年 K |
部分市场或品类可能支持盘前盘后、暗盘、夜盘等扩展周期。是否可用以实际订阅响应和权限为准。
BROKER_QUEUE 经纪队列
经纪队列主要用于部分港股买卖盘场景,表示买卖盘对应的经纪席位队列。
示例
{
"type": "BROKER_QUEUE",
"symbol": "HK.00700",
"data": {
"data_time_ms": 1710000000000,
"ask_brokers": [
{
"rank": 1,
"broker_id": "8465",
"broker_name": "Broker A"
}
],
"bid_brokers": [
{
"rank": 1,
"broker_id": "8465",
"broker_name": "Broker A"
}
]
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data.data_time_ms | integer | 数据时间,Unix 毫秒时间戳。 |
data.ask_brokers | object[] | 卖盘经纪队列。 |
data.bid_brokers | object[] | 买盘经纪队列。 |
data.ask_brokers[].rank | integer | 排名。 |
data.ask_brokers[].broker_id | string | 经纪商 ID。 |
data.ask_brokers[].broker_name | string | 经纪商名称,可能缺省。 |
data.bid_brokers[].rank | integer | 排名。 |
data.bid_brokers[].broker_id | string | 经纪商 ID。 |
data.bid_brokers[].broker_name | string | 经纪商名称,可能缺省。 |
BROKER_QUEUE 不作为普通订阅请求字段传入,通常由服务端基于已订阅的买卖盘能力、市场和权限决定是否返回。
MARKET_STATE 市场状态
市场状态是市场维度消息,不绑定单一标的,因此通常没有 symbol 字段。
示例
{
"type": "MARKET_STATE",
"data": {
"market": "US",
"status": "OPEN",
"trade_date": "2024-03-08"
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data.market | string | 市场标识,例如 US、HK 等。 |
data.status | string | 市场交易状态。 |
data.trade_date | string | 交易日。 |
客户端收到 MARKET_STATE 后,可用于更新页面上的市场开收盘状态、交易日提示或订阅数据可用性提示。
兼容性建议
- 按
type分发:不同消息结构差异较大,不要用同一个强类型模型解析所有推送。 - 未知字段忽略:服务端可能新增字段,客户端应保持向前兼容。
- 未知
type兼容:记录日志后跳过,避免因新增消息类型导致连接处理异常。 - 可选字段判空:期权、期货、盘前盘后、夜盘、经纪队列等字段只在适用场景返回。
- 数组按空处理:
ask_list、bid_list、ticker_list、kl_list等数组可能为空。 - 断线后补齐:推送用于实时更新。断线、重连或解析失败后,可使用 REST 实时行情接口获取最新状态。