
WebSocket 行情推送如何同时订阅多个股票和货币对?
通过 AllTick WebSocket API 同时订阅多只股票和外汇货币对,了解不同市场的连接地址、批量订阅方式、订阅列表覆盖规则及多路行情统一处理方法。
开发实时行情页面时,经常需要同时展示多只股票和多个外汇货币对。例如,一个交易监控面板可能需要追踪腾讯(700.HK)、苹果(AAPL.US),同时监控 EUR/USD 和 USD/JPY。
如果每增加一个品种就建立一条 WebSocket 连接,不仅会增加连接管理的复杂度,还可能很快触及套餐的连接限制。
更合理的方式是:同一市场类型的多个品种放在一个订阅请求中,不同市场类型则使用各自对应的 WebSocket 连接。 这样既能减少不必要的连接,也方便统一处理实时行情数据。
股票和外汇不能混用同一个 WebSocket 地址
使用 AllTick WebSocket API 时,首先要区分股票和外汇的数据连接地址。
两类数据使用不同的 WebSocket 路径:
| 数据类型 | WebSocket 地址路径 | 产品代码示例 |
|---|---|---|
| 股票与大盘 | /quote-stock-b-ws-api | 700.HK、AAPL.US |
| 外汇及其他品种 | /quote-b-ws-api | EURUSD、USDJPY |
连接地址需要附加 API Token。股票与外汇不能简单地放进同一条连接,而是需要分别建立连接。
另外,产品代码必须与 AllTick 产品列表中的格式和大小写保持一致。比如,美股使用 AAPL.US,港股使用 700.HK,外汇货币对使用 EURUSD。订阅前应先确认对应品种是否在产品列表中。
一次订阅多个股票和货币对
连接建立成功后,可以通过 symbol_list 数组一次提交多个品种,不需要为每只股票或每个货币对单独发送订阅请求。
例如,先在股票连接中订阅港股和美股:
{
"cmd_id": 22004,
"seq_id": 101,
"trace": "stock-tick-sub",
"data": {
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"}
]
}
}然后,在外汇连接中订阅多个货币对:
{
"cmd_id": 22004,
"seq_id": 102,
"trace": "forex-tick-sub",
"data": {
"symbol_list": [
{"code": "EURUSD"},
{"code": "USDJPY"}
]
}
}这里使用的 cmd_id: 22004 对应最新成交价订阅请求。收到成功响应后,服务器通过 cmd_id: 22998 推送相应的实时数据。
每条推送数据都包含对应的产品 code,开发者可以据此识别行情属于哪只股票或哪个货币对。
新增订阅品种时要注意覆盖规则
实际开发中,品种列表通常不是固定的。比如,行情页面原本订阅了两只股票,用户又添加了第三只。
这里有一个容易忽略的细节:AllTick 的 WebSocket 订阅采用覆盖规则。再次发送订阅请求时,新请求会替换之前的订阅列表,而不是自动追加品种。
假设原来订阅的是:
{
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"}
]
}现在需要增加 600416.SH,就应该重新提交完整列表:
{
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"},
{"code": "600416.SH"}
]
}如果只发送新增加的股票代码,原来的订阅可能就不再保留。因此,建议在应用服务端维护一份当前订阅列表,每次增删品种时先更新列表,再发送完整订阅请求。
两路行情推送如何统一处理
虽然股票和外汇使用不同的 WebSocket 连接,但应用端可以将两路数据统一接入行情处理模块。
例如,股票连接负责接收 700.HK 和 AAPL.US 的数据,外汇连接负责接收 EURUSD 和 USDJPY 的数据。收到推送后,根据消息中的 code 更新对应品种的最新行情。
function handleMarketMessage(message) {
const data = JSON.parse(message);
if (data.cmd_id === 22998) {
const { code, price, volume } = data.data;
// 按产品代码更新对应行情
latestQuotes[code] = {
price,
volume
};
}
}这样,前端只需要读取统一的行情数据对象,不必关心某个品种具体来自哪一条连接。
实际部署时,还需要分别管理两条连接的状态和心跳。AllTick 要求每 10 秒发送一次心跳,超过 30 秒未收到心跳请求会断开连接。网络中断后,应重新建立连接并重新发送完整订阅列表。
另外,同一 WebSocket 连接内的请求间隔至少为 1 秒,不同 WebSocket 连接之间的请求间隔至少为 3 秒。
订阅数量和数据类型也需要区分
同时订阅多个品种,并不意味着可以无限增加代码数量。AllTick 对每条连接的订阅产品数量设有套餐限制,超过限制时,超出部分的代码可能不会得到处理。应根据实际账户权限规划股票和外汇的订阅规模。官方限制说明还指出,股票与外汇使用不同地址,但两类数据同时连接按一个 WebSocket 连接计算。
还需要注意,22004 用于订阅最新成交价。如果应用需要买卖盘口深度,应使用 22002 订阅盘口数据,由服务器通过 22999 推送。若需要历史或实时更新的 K 线,则应使用对应的 HTTP 接口,不能将 K 线订阅混入 WebSocket 成交价推送中。
对于需要同时监控股票和外汇的开发者,关键不是不断增加连接,而是按市场类型划分订阅、维护完整的品种列表,再通过统一的数据处理层整合行情。
接入前可以查看 AllTick WebSocket API 文档 和 WebSocket 接口限制说明,确认订阅格式、产品数量限制及连接要求。也可以访问 AllTick 官网 了解实时行情接口及账户方案。