リアルタイム金価格チャートはどう動くのか?
現物価格、OHLCバー、UTCタイムスタンプ、制御されたポーリングを組み合わせる仕組みを、TypeScriptとSVGの実例で解説します。
読む →Redditで繰り返し出てくるリアルタイム金価格ストリーミングの疑問に答える。金のWebSocketは存在するのか、goldprice.devのXAUとXAGのティックストリームはどのように端から端まで動くのか、そして実際にWebSocketを提供している他のAPIはどこか(貴金属系APIの大半はポーリングしかできない)。
数週間おきに、r/algotradingやr/optionsで誰かが同じ趣旨の質問をする。金価格用のWebSocketはあるのか、それとも毎秒RESTエンドポイントをポーリングし続けるしかないのか、という質問だ。質問する人はたいてい、価格が動いた瞬間にそれを検知する必要があるボットや、リアルタイムのXAUティッカーを表示するダッシュボードを作っていて、1秒ループでREST APIを叩き続けることに違和感を覚えている。その違和感は正しい。ポーリングはリクエスト枠を消費し、平均レイテンシとしてポーリング間隔の半分を上乗せしてしまい、それでも二回のリクエストの間に発生したティックは取りこぼす。
手短に答えるなら、イエスだ。goldprice.devは金と銀のティックを、値が付いたその瞬間にWebSocket経由でプッシュしている。より長い答えは、そもそもどのAPIがストリーミングを提供しているのかという話だ。専業の金価格APIの大半はそれを提供していない。両方を以下で説明する。
wss://api.goldprice.dev/v1/streamは、Realtime Proプランで使えるWebSocketだ。接続し、キーで認証し、欲しいシンボルを購読すれば、価格が更新されるたびにサーバーがフレームを送ってくる。現時点でライブなシンボルは金(XAU-USD-SPOT)と銀(XAG-USD-SPOT)の二つで、一つの接続で最大8シンボルまで保持できる。
ティックは次のような形をしている。
{"type":"tick","symbol":"XAU-USD-SPOT","price":"3976.379","conf":"0.829","computed_at":"2026-07-01T02:13:25Z"}
priceは10進数の文字列なので、浮動小数点の丸め誤差を引き継がずにパースできる。confはその価格に対する信頼区間で、元となる各データソースの値が一致しているときは狭く、食い違っているときは広くなる。computed_atはサーバー側でその値が計算された時刻で、自分自身のエンドツーエンドのレイテンシを測る基準として使うものだ。
3つのメッセージでストリーミングが始まる:接続、認証、購読だ。
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 Pro未満、4429 接続数の上限超過。
console.error("stream closed", code);
});
接続すると、サーバーは自分のプラン階層とシンボル上限を含んだwelcomeフレームを送ってくる。購読するとsubscribedという確認応答が返り、加えて各シンボルの直近の既知価格の即時スナップショットも一緒に返ってくるので、次のティックが届くまでの間、空欄ではなく何かしら描画できるものが手元にある状態になる。市場が静かなときや週末など、およそ20秒間何も流れてこない場合は、{"type":"heartbeat"}が送られてくるので、接続がハングしているのではなく生きていることが分かる。
再接続は自分で処理する必要がある。ソケットが切断されたら、新しいソケットを開き、authとsubscribeを送り直す。ここが多くの人が見落とす一点だ。再接続はしても再購読を忘れてしまい、なぜティックが来ないのかと首をかしげることになる。
これははっきりさせておく価値がある。「リアルタイム金価格API」という言葉はかなり緩く使われていて、検索結果の多くは、ストリームではなく更新間隔が短いだけのポーリングだからだ。2026年半ば時点で、よく名前が挙がるサービスの公開ドキュメントを一通り確認した。すると二つのグループに分かれた。
貴金属専業のAPIはほぼすべてREST限定だ。GoldAPI.io、MetalpriceAPI、Metals.devは、どのプラン階層にもWebSocketがなく、一定間隔でポーリングするしかない。Metals-APIは一応WebSocketを掲載しているが、それは年額$25,000程度から始まるカスタムのEnterprise契約の中だけの話で、公開されたストリーミングのドキュメントもないため、普通のプロジェクトにとっては実質的に選択肢に入らない。Alpha Vantageは貴金属よりはるかに広い範囲をカバーしているが、最上位プランであっても依然としてREST限定だ。
実際に金をストリーミング配信しているAPIは、幅広いマーケットデータを扱う大型プラットフォームだ。そこでは金は数万あるシンボルの一つに過ぎず、ストリーミングはより上位のプランの向こう側にある。
| API | WebSocket | WebSocket上の金 | ストリーミングの入口 |
|---|---|---|---|
| goldprice.dev | あり | あり(XAUとXAG) | Realtime Pro、$80/月 |
| Twelve Data | あり | あり(XAU/USDは公式ドキュメントの例に使われている) | 実際のストリーミング枠には年払いProの約$191/月が必要 |
| 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は貴金属を主軸に据えたAPIであり、$80で金と銀をストリーミング配信する。
WebSocketが真価を発揮するのは、接続を張りっぱなしにして、秒未満単位の値動きを気にする場面だ。リアルタイムティッカー、約定執行画面、ある閾値を監視するボットなどがそれにあたる。数分おきに価格をチェックするだけのジョブであれば、/v1/spot/XAU-USD-SPOTにある普通のRESTエンドポイントのほうがシンプルで、ソケットを維持する必要もない。またRealtime Proプランなしでプッシュ配信が欲しい場合、Proプランには/v1/prices/streamにServer-Sent Eventsのストリームが用意されている。Server-Sent Eventsでリアルタイムの金価格をストリーミングするではその方法を解説しており、こちらはWebSocketクライアントを一切必要としない。
このAPIを使う価値があるかどうか、まだ検討中だろうか。Reddit上の金価格APIに関する開発者の質問、一挙回答では、無料プラン、制限、そしてこの数字がどこから来ているのかを扱っている。始めるだけなら、無料キーの取得は1分もかからない。WebSocket自体はRealtime Proプランにある。
関連ガイド
現物価格、OHLCバー、UTCタイムスタンプ、制御されたポーリングを組み合わせる仕組みを、TypeScriptとSVGの実例で解説します。
読む →確定済みのXAU/USD日次バーと過去のFX観測値を組み合わせ、当時は入手できなかったレートを誤って使うことなく、現地通貨建てのゴールド戦略をテストする方法。
読む →iframeひとつで、無料の設定可能なライブ・ゴールド価格ウィジェットをWordPressに追加できる。GutenbergとElementorの両方で動作し、APIキーもプラグインも不要。
読む →goldprice.dev
リアルタイムの金価格、ヒストリカルOHLC、マルチソース集計 — REST・SSE経由で提供。