跳到正文
AllTick
问题排查

WebSocket 已连接但没有数据怎么办

WebSocket 连接成功却收不到行情时,按订阅消息、代码格式、交易时段、心跳和权限五个方面逐项排查。

更新时间:
维护方:AllTick 官方技术团队
适用对象:已建立 WebSocket 连接但收不到推送的开发者

核心结论 · 30秒开发速览

连接成功只说明网络与 Token 基本可用。收不到数据最常见的原因依次是:没有发送订阅或订阅格式错误、代码写法不对、标的处于休市时段、心跳缺失导致连接被服务端关闭,以及订阅的市场不在权限范围内。

01

五步排查

1确认订阅消息已发送:在 send 前后打印日志,并检查是否收到订阅应答。
2确认代码格式:例如港股为 700.HK、美股为 AAPL.US,外汇为 EURUSD。
3确认地址匹配:股票代码订阅 quote-stock-b-ws-api,外汇与贵金属订阅 quote-b-ws-api。
4确认交易时段:休市、午间休市和节假日没有新成交推送。
5确认心跳:没有按要求发送心跳时,连接可能在一段时间后被关闭。

02

快速自检:用活跃品种验证

如果不确定是代码问题还是市场时段问题,可以临时订阅一个交易时间长、成交活跃的品种(例如外汇的 EURUSD,在工作日几乎全天有报价)。能收到数据,说明连接与订阅流程正常,问题集中在原标的的代码或时段上。

pythonpython
import asyncio, json, os, uuid
import websockets
async def probe():
token = os.getenv("ALLTICK_API_TOKEN", "YOUR_API_TOKEN")
url = f"wss://quote.alltick.co/quote-b-ws-api?token={token}"
async with websockets.connect(url) as ws:
await ws.send(json.dumps({
"cmd_id": 22004,
"seq_id": 1,
"trace": str(uuid.uuid4()),
"data": {"symbol_list": [{"code": "EURUSD"}]},
}))
for _ in range(5):
print(await asyncio.wait_for(ws.recv(), timeout=30))
if __name__ == "__main__":
asyncio.run(probe())

03

重连后没有数据

服务端不会记住旧连接的订阅。断线重连后必须重新发送订阅消息。如果你的代码只在程序启动时订阅一次,重连后就会出现“已连接但没有数据”。可参考 WebSocket 自动重连教程,把订阅放在每次建立连接之后执行。

04

仍未解决时准备的信息

  • 连接地址(隐去 Token)与订阅消息原文。
  • 订阅后收到的全部原始消息。
  • 发生时间(含时区)与持续时长。
  • 使用的语言、库及版本。

规范来源与验证记录 · 2026-10-13

已根据下方一手资料核对相关端点、字段与交易所规则。

Python 示例已在 Python 3.14.0 上通过 ast.parse 语法解析;此检查不验证依赖安装、运行兼容性或网络响应。

本轮未使用真实 Token 执行 AllTick 请求,也未完成生产端到端测试。复现时请记录套餐、依赖版本、交易时段、ret/trace 与实际结果。

上线前建议复现

  • 分开监控握手、订阅确认、心跳及最后行情时间;休市心跳正常不代表应收到新成交。
  • 测试不支持代码和超额订阅,先比较请求及接受数量,再判断网络故障。