
WebSocketのリアルタイム配信で複数の株式銘柄と通貨ペアを同時に購読するには?
AllTick WebSocket APIを使用して、複数の株式銘柄とFX通貨ペアを同時に購読する方法を解説します。接続先、複数銘柄の一括購読、購読リストの上書きルール、複数の行情データを統一して処理する方法を紹介します。
リアルタイム相場画面を開発する際、複数の株式銘柄と複数の外国為替通貨ペアを同時に表示する必要がよくあります。例えば、ある取引モニタリング画面では、テンセント(700.HK)やApple(AAPL.US)を追跡しながら、EUR/USDやUSD/JPYも同時に監視する場合があります。
銘柄を1つ追加するたびにWebSocket接続を新しく確立すると、接続管理が複雑になるだけでなく、プランごとの接続数制限にも早く達する可能性があります。
より合理的な方法は、同じ市場タイプの複数銘柄を1つの購読リクエストにまとめ、異なる市場タイプにはそれぞれ対応するWebSocket接続を使用することです。 これにより、不要な接続を減らし、2つの接続から受信したリアルタイムデータをアプリケーション側で一元的に処理できます。
株式と外国為替では同じWebSocketアドレスを使用できない
AllTick WebSocket APIを利用する場合、まず株式と外国為替のデータ接続アドレスを区別する必要があります。
この2種類のデータは、それぞれ異なる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を使用します。購読する前に、対象銘柄が商品リストに掲載されていることを確認してください。
1回のリクエストで複数の株式と通貨ペアを購読する
接続が確立された後は、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が含まれているため、開発者はこのコードを使って、どの株式または通貨ペアの相場データなのかを識別できます。
新しい銘柄を追加するときは購読リストの上書きに注意する
実際の開発では、購読する銘柄リストが固定されているとは限りません。例えば、最初は2銘柄の株式を購読していて、ユーザーが後から3つ目の銘柄を追加する場合があります。
ここで注意したいのが、AllTickのWebSocket購読には上書きルールがあることです。同じ接続で新しい購読リクエストを送信すると、新しいリクエストが以前の購読リストを置き換えます。既存の銘柄に自動的に追加されるわけではありません。
例えば、最初に次の銘柄を購読していたとします。
{
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"}
]
}ここに600416.SHを追加する場合は、完全な銘柄リストを再送信する必要があります。
{
"symbol_list": [
{"code": "700.HK"},
{"code": "AAPL.US"},
{"code": "600416.SH"}
]
}追加した銘柄コードだけを送信すると、以前の購読が維持されなくなる可能性があります。そのため、アプリケーションのサーバー側で現在の購読リストを管理し、銘柄を追加・削除するたびにリストを更新してから、完全な購読リクエストを送信することを推奨します。
2つの相場データ配信をどのように一元管理するか
株式と外国為替では異なる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
};
}
}この方法であれば、フロントエンドは統一された相場データオブジェクトを参照するだけで済み、各銘柄がどの接続から配信されたかを意識する必要がありません。
実際の環境に導入する際は、2つの接続の状態とハートビートを個別に管理する必要もあります。AllTickでは10秒ごとにハートビートを送信する必要があり、30秒間ハートビートが送信されない場合、接続が切断されます。ネットワークが切断された場合は、接続を再確立し、完全な購読リストを再送信する必要があります。
また、同じWebSocket接続内のリクエスト間隔は1秒以上、異なるWebSocket接続間のリクエスト間隔は3秒以上にする必要があります。
購読数とデータタイプの違いも確認する
複数の銘柄を同時に購読できるからといって、銘柄コードを無制限に追加できるわけではありません。AllTickでは、1接続あたりの購読商品数にプランごとの制限が設定されています。制限を超えた場合、超過した銘柄コードが処理されない可能性があります。実際のアカウント権限に応じて、株式と外国為替の購読規模を計画する必要があります。
公式の制限説明では、株式と外国為替には異なる接続アドレスを使用しますが、両方のデータを同時に接続した場合、WebSocket接続数は合計1接続としてカウントされることも説明されています。
さらに、22004は最新約定価格の購読に使用される点にも注意してください。売買板の深度情報が必要な場合は、22002を使用して板情報を購読し、サーバーから22999で配信されるデータを受信します。過去またはリアルタイム更新のKラインが必要な場合は、対応するHTTP APIを使用する必要があります。KラインをWebSocketの約定価格配信に混在させることはできません。
株式と外国為替を同時に監視する必要がある開発者にとって、重要なのは接続数を増やし続けることではありません。市場タイプごとに購読を分け、完全な銘柄リストを管理し、その後、共通のデータ処理レイヤーを通じて相場情報を統合することです。
接続前に、AllTick WebSocket APIドキュメントとWebSocketインターフェース制限の説明を確認し、購読形式、商品数の制限、接続要件を把握してください。また、AllTick公式サイトでリアルタイム相場インターフェースとアカウントプランを確認できます。