AllTick
-
实时市场数据股票api外汇 API 行情数据订阅

WebSocket 行情推送如何同时订阅多个股票和货币对?

通过 AllTick WebSocket API 同时订阅多只股票和外汇货币对,了解不同市场的连接地址、批量订阅方式、订阅列表覆盖规则及多路行情统一处理方法。

AllTick阅读 5 分钟

开发实时行情页面时,经常需要同时展示多只股票和多个外汇货币对。例如,一个交易监控面板可能需要追踪腾讯(700.HK)、苹果(AAPL.US),同时监控 EUR/USD 和 USD/JPY。

如果每增加一个品种就建立一条 WebSocket 连接,不仅会增加连接管理的复杂度,还可能很快触及套餐的连接限制。

更合理的方式是:同一市场类型的多个品种放在一个订阅请求中,不同市场类型则使用各自对应的 WebSocket 连接。 这样既能减少不必要的连接,也方便统一处理实时行情数据。

股票和外汇不能混用同一个 WebSocket 地址

使用 AllTick WebSocket API 时,首先要区分股票和外汇的数据连接地址。

两类数据使用不同的 WebSocket 路径:

数据类型WebSocket 地址路径产品代码示例
股票与大盘/quote-stock-b-ws-api700.HK、AAPL.US
外汇及其他品种/quote-b-ws-apiEURUSD、USDJPY

连接地址需要附加 API Token。股票与外汇不能简单地放进同一条连接,而是需要分别建立连接。

另外,产品代码必须与 AllTick 产品列表中的格式和大小写保持一致。比如,美股使用 AAPL.US,港股使用 700.HK,外汇货币对使用 EURUSD。订阅前应先确认对应品种是否在产品列表中。

一次订阅多个股票和货币对

连接建立成功后,可以通过 symbol_list 数组一次提交多个品种,不需要为每只股票或每个货币对单独发送订阅请求。

例如,先在股票连接中订阅港股和美股:

text
{
  "cmd_id": 22004,
  "seq_id": 101,
  "trace": "stock-tick-sub",
  "data": {
    "symbol_list": [
      {"code": "700.HK"},
      {"code": "AAPL.US"}
    ]
  }
}

然后,在外汇连接中订阅多个货币对:

text
{
  "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 订阅采用覆盖规则。再次发送订阅请求时,新请求会替换之前的订阅列表,而不是自动追加品种。

假设原来订阅的是:

text
{
  "symbol_list": [
    {"code": "700.HK"},
    {"code": "AAPL.US"}
  ]
}

现在需要增加 600416.SH,就应该重新提交完整列表:

text
{
  "symbol_list": [
    {"code": "700.HK"},
    {"code": "AAPL.US"},
    {"code": "600416.SH"}
  ]
}

如果只发送新增加的股票代码,原来的订阅可能就不再保留。因此,建议在应用服务端维护一份当前订阅列表,每次增删品种时先更新列表,再发送完整订阅请求。

两路行情推送如何统一处理

虽然股票和外汇使用不同的 WebSocket 连接,但应用端可以将两路数据统一接入行情处理模块。

例如,股票连接负责接收 700.HK 和 AAPL.US 的数据,外汇连接负责接收 EURUSD 和 USDJPY 的数据。收到推送后,根据消息中的 code 更新对应品种的最新行情。

text
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 官网 了解实时行情接口及账户方案。

立即开始接入市场数据

几秒内生成免费 API 密钥,通过一个端点连接所有市场。