Hyperliquid WebSocket API リアルタイムデータストリーミング図

Hyperliquid取引にWebSocketが必要な理由

REST APIは時折の注文や残高確認には十分です。しかし、アルゴリズム取引戦略 — マーケットメイキング、スキャルピング、アービトラージ、あるいは単なるポジション監視でさえ — を運用するなら、リアルタイムデータが必要です。REST APIの呼び出しごとに遅延が加わり、ポーリングはあなたのシステムとHyperliquidのサーバーの両方に不要な負荷をかけます。

HyperliquidのWebSocket APIは、データが変化した瞬間にあなたのアプリケーションにプッシュする永続的な双方向接続を提供します。オーダーブックスナップショット、取引ストリーム、ポジション更新、注文ステータス変更を、秒単位ではなく数十ミリ秒単位の遅延で受信できます。

WebSocketエンドポイントと認証

Hyperliquidには2つのWebSocketエンドポイントがあります:

  • 公開WebSocket: wss://api.hyperliquid.xyz/ws — マーケットデータ、オーダーブック、取引ストリーム用。認証不要。
  • プライベートWebSocket: 同じエンドポイントですが、注文更新、ポジション変更、約定通知などのユーザー固有データには認証が必要です。

認証にはHyperliquidアカウントのAPIキーとシークレットを使用します。秘密鍵でペイロードに署名し、接続後の最初のメッセージとして送信します。WebSocket接続は切断するまで認証状態を維持します — メッセージごとに再認証する必要はありません。

WebSocket接続のセットアップ

Hyperliquidの公開WebSocketに接続し、オーダーブックデータを購読する方法です。パターンは:接続 → 購読メッセージを送信 → イベントループでデータを処理。

Pythonのwebsocketsライブラリを使用した基本的な接続:

import asyncio
import websockets
import json

async def stream_orderbook():
    uri = "wss://api.hyperliquid.xyz/ws"
    async with websockets.connect(uri) as ws:
        # BTC-PERPオーダーブックを購読(L2更新)
        subscribe_msg = json.dumps(dict(
            method="subscribe",
            subscription=dict(
                type="l2Book",
                coin="BTC"
            )
        ))
        await ws.send(subscribe_msg)
        
        # 受信メッセージを処理
        async for message in ws:
            data = json.loads(message)
            channel = data.get("channel")
            if channel == "l2Book":
                levels = data.get("data", dict()).get("levels")
                print(f"BTC オーダーブック: レベル受信")
                
asyncio.run(stream_orderbook())

これでBTCパーペチュアルのリアルタイムLevel 2オーダーブック更新を取得できます。各更新には現在のビッド・アスクレベルとサイズが含まれ、オーダーブックの変化に応じてプッシュされます — ポーリング不要です。

利用可能な購読チャンネル

HyperliquidのWebSocketは以下の購読タイプをサポートしています:

  • l2Book: Level 2オーダーブックのスナップショットと差分更新。coin(例:"BTC"、"ETH"、"SOL")を指定。オーダーブックが変化するたびに更新が到着します — アクティブな市場では通常毎秒数百回。
  • trades: リアルタイム取引ストリーム。指定したコインのすべての執行済み取引が、価格・サイズ・サイド(買い/売り)・タイムスタンプと共にプッシュされます。ボリューム分析や取引シグナル生成に不可欠。
  • ticker: 24時間ローリング統計 — 最終価格・24時間変動・高値・安値・取引高。数秒ごとに更新。フルオーダーブックデータより軽量。
  • userFills(認証必須): あなたの取引約定をリアルタイムで。各メッセージには注文ID・約定価格・約定サイズ・手数料・メイカー/テイカー区分が含まれます。
  • userFundings(認証必須): あなたのアカウントに貸方・借方記入されるファンディングレート支払いを、発生時にストリーミング。
  • webData2(認証必須): 包括的なポジションおよび注文ステータス。アカウント状態全体のローカルミラーを維持し、すべての変更時に更新されます。

リアルタイムポジションモニターの構築

プライベートWebSocketの最も実用的な用途の一つがポジションモニターです。清算価格や未実現損益を確認するためにREST APIを数秒ごとにポーリングする代わりに、webData2を購読してポジションが変化した瞬間に更新を受け取ります。

認証付き購読のパターンでは署名ステップが追加されます:

import asyncio
import websockets
import json
import hmac
import hashlib
import time

API_KEY = "your_api_key_here"
API_SECRET = "your_api_secret_here"

async def stream_positions():
    uri = "wss://api.hyperliquid.xyz/ws"
    async with websockets.connect(uri) as ws:
        # 認証ペイロード
        timestamp = int(time.time() * 1000)
        sign_payload = "websocket-auth" + str(timestamp)
        signature = hmac.new(
            API_SECRET.encode(),
            sign_payload.encode(),
            hashlib.sha256
        ).hexdigest()
        
        auth_msg = json.dumps(dict(
            method="auth",
            apiKey=API_KEY,
            signature=signature,
            timestamp=timestamp
        ))
        await ws.send(auth_msg)
        
        # ポジション・注文データを購読
        sub_msg = json.dumps(dict(
            method="subscribe",
            subscription=dict(type="webData2")
        ))
        await ws.send(sub_msg)
        
        async for message in ws:
            data = json.loads(message)
            if data.get("channel") == "webData2":
                positions = data.get("data", dict()).get("assetPositions", [])
                for pos in positions:
                    coin = pos.get("position", dict()).get("coin")
                    size = float(pos.get("position", dict()).get("szi", 0))
                    if abs(size) > 0:
                        print(f"ポジション: コイン=値 サイズ=値")

asyncio.run(stream_positions())

本番環境のWebSocketベストプラクティス

  • 自動再接続を実装する。 WebSocket接続は切断されることがあります。指数バックオフ(1秒、2秒、4秒、最大60秒まで)のリトライループで接続ロジックをラップしてください。再接続時はすべてのチャンネルを再購読し、再認証します。
  • ローカルオーダーブックを維持する。 l2Bookは差分更新を提供し、スナップショットではありません。初回接続時にREST経由でフルスナップショットを要求し、その後WebSocketの差分を適用してローカルブックを同期させます。
  • 下流処理をスロットリングする。 BTC-PERPのようなアクティブな市場では、毎秒数百のl2Book更新を受信する可能性があります。処理ロジックが更新レートより遅い場合、リングバッファを使用するかN回ごとの更新をサンプリングしてバックログを回避します。
  • マーケットデータと注文で別々の接続を使用する。 マーケットデータ接続が大量のオーダーブックトラフィックでスロットリングされた場合に、注文送信接続が遅くなるのを防ぎます。2つのWebSocket接続 — データ用と認証操作用を分けてください。
  • 接続ヘルスを監視する。 30秒ごとにpingメッセージを送信し、pong応答を期待します。10秒以内に応答がない場合、接続が切断されたと見なし再接続します。

Hyperliquidでアルゴリズム取引を始める

紹介コード HOLYGRAIL でHyperliquidのWebSocket APIを利用開始 — 暗号資産最速のDEXデータフィード

Hyperliquidに参加 →

関連記事