博客/Developer

Reddit 上关于黄金价格 WebSocket 的问题:实时行情流,一一解答

Reddit 上关于实时黄金行情流的问题,直接解答:是否存在黄金 WebSocket、goldprice.dev 的 XAU 和 XAG 逐笔行情流如何端到端工作,以及哪些其他 API 真正提供 WebSocket(大多数贵金属 API 只能轮询)。

Developer

每隔几周,就会有人在 r/algotrading 或 r/options 上问同一个问题的不同版本:黄金价格有没有 WebSocket,还是我只能每秒去轮询一个 REST 端点?提问的人通常在构建一个需要在价格变动瞬间拿到报价的机器人,或者一个带实时 XAU 行情条的看板,而以每秒一次的循环去猛敲 REST API,他们觉得不对劲。确实不对。轮询会消耗你的请求配额,平均还会增加半个轮询间隔的延迟,而且它仍然会漏掉落在两次请求之间的行情。

简短的答案:是的,goldprice.dev 会在黄金和白银逐笔成交时通过 WebSocket 推送出来。更完整的答案是,到底有哪些 API 真正提供流式推送,因为大多数专注黄金的 API 并不提供。两者都在下面。

这个流是什么

wss://api.goldprice.dev/v1/stream 是 Realtime 套餐上的一个 WebSocket。你连接、用密钥鉴权、订阅你想要的符号,服务器就会在价格每次更新时发来一个帧。黄金(XAU-USD-SPOT)和白银(XAG-USD-SPOT)是目前的两个实时符号,单个连接最多可订阅八个。

一条行情长这样:

{"type":"tick","symbol":"XAU-USD-SPOT","price":"3976.379","conf":"0.829","computed_at":"2026-07-01T02:13:25Z"}

price 是十进制字符串,所以你解析它时不会继承浮点数的舍入误差。conf 是该价格的置信带,底层数据源一致时更窄、分歧时更宽。computed_at 是该值在服务端计算出来的时间,你用它来衡量自己的端到端延迟。

握手过程

三条消息你就开始接收流了:连接、鉴权、订阅。

import WebSocket from "ws";

const ws = new WebSocket("wss://api.goldprice.dev/v1/stream");

ws.on("open", () => {
  ws.send(JSON.stringify({ action: "auth", api_key: process.env.GOLDPRICE_API_KEY }));
});

ws.on("message", (raw) => {
  const msg = JSON.parse(raw);
  if (msg.type === "welcome") {
    // 已鉴权。现在告诉它你想要什么。
    ws.send(JSON.stringify({ action: "subscribe", symbols: ["XAU-USD-SPOT", "XAG-USD-SPOT"] }));
  } else if (msg.type === "tick") {
    console.log(`${msg.computed_at}  ${msg.symbol}  ${msg.price}`);
  }
});

ws.on("close", (code) => {
  // 4401 密钥错误/缺失,4403 套餐低于 Realtime,4429 连接数超限。
  console.error("stream closed", code);
});

连接时,服务器会发来一个带有你的套餐等级和符号上限的 welcome 帧。订阅之后,它会返回一个 subscribed 确认,外加每个符号最近已知价格的即时快照,这样在下一条行情到来之前你就有东西可以渲染,而不是一个空字段。如果大约二十秒内没有任何推送(行情清淡或周末),你会收到一个 {"type":"heartbeat"},让你知道连接还活着,而不是卡死了。

重连要靠你自己。如果 socket 断开,就新开一个并重新发送 auth 和 subscribe。这是大家最容易漏掉的一步:重连了,却忘了重新订阅,然后纳闷为什么没有行情进来。

哪些其他 API 真正提供 WebSocket

这一点值得讲清楚,因为“实时黄金价格 API”这个说法用得很随意,而大多数结果其实是刷新很快的轮询,而不是流。我在 2026 年年中翻了一遍常见几家的公开文档。分成两类。

专注贵金属的 API 几乎都只有 REST。GoldAPI.io、MetalpriceAPI 和 Metals.dev 在任何套餐上都没有 WebSocket;你只能按间隔轮询。Metals-API 提到了一个,但只在定制的 Enterprise 合约里,起价约每年 $25,000,且没有公开的流式文档,所以对普通项目来说算不上真正的选项。Alpha Vantage 覆盖的远不止贵金属,但即便在最高套餐上也仍然只有 REST。

真正推送黄金的 API 是那些广谱市场数据平台,在那里黄金只是数万个符号之一,而且流式推送要在更高的套餐里才有:

APIWebSocketWebSocket 上是否有黄金流式推送的入门门槛
goldprice.dev有(XAU 和 XAG)Realtime,$80/月
Twelve Data有(XAU/USD 是他们自己的文档示例)约 $191/月(年付 Pro)才有真正的流式额度
TraderMade有(XAU/USD)付费套餐从约 £599/月起
Finage有(XAU/USD,通过 forex/CFD 数据流)付费 WebSocket 从约 $299/月起
Polygon.io(现已更名为 Massive)forex 货币对;文档中 XAU 覆盖情况不明付费的 currencies 套餐
Finnhub有(免费套餐即含)券商 forex;XAU 未明确记录免费,最多 50 个符号
GoldAPI.io仅 REST 轮询
MetalpriceAPI仅 REST 轮询
Metals.dev仅 REST 轮询
Metals-API仅 Enterprise未记录约 $25,000/年定制
Alpha Vantage仅 REST 轮询

(公开文档,2026 年年中。竞品的价格和覆盖范围会变动,所以在选定之前请核对它们的最新页面。)

这张表显示的是一个空档。如果你想通过 WebSocket 拿到黄金,你的选择基本上要么是一个大型多资产平台——在那里黄金只是 forex 里的附带项,而且流式推送起步接近每月 $200——要么是一个逼你轮询的贵金属 API。goldprice.dev 以贵金属为先,并以 $80 推送黄金和白银。

什么时候你不需要这个流

当你保持一个连接常开、且在意亚秒级的价格变动时,WebSocket 才真正物有所值:一个实时行情条、一个交易执行界面、一个盯着某个阈值的机器人。而对于每隔几分钟查一次价格的任务,/v1/spot/XAU-USD-SPOT 这个普通的 REST 端点更简单,也不用维持任何 socket。如果你想要推送但又不想上 Realtime 套餐,Pro 套餐提供了一个位于 /v1/prices/stream 的 Server-Sent Events 流;Stream live gold prices with Server-Sent Events 讲解了那一个,它完全不需要 WebSocket 客户端。

还在权衡一个 API 值不值得拿来构建?Gold price API on Reddit: the developer questions, answered 讲了免费套餐、限额以及这个数字从何而来。上手的话,申请一个免费密钥只需一分钟;WebSocket 本身在 Realtime 套餐上。

// 相关指南

// goldprice.dev

实时黄金价格、历史 OHLC 数据与多源聚合 — 通过 REST 和 SSE 接口提供。