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に参加 →