Hyperliquid Orderbook per WebSocket in Echtzeit abonnieren

6. Mai 2026
  • hyperliquid orderbook websocket

  • real time hyperliquid api

  • hyperliquid Echtzeit-Orderbook

  • hyperliquid websocket subscription

  • hyperliquid l2 book

Das Orderbook ist eine der zentralen Datenstrukturen jeder Exchange. Es zeigt in Echtzeit, zu welchen Preisen und in welchen Größen aktuell offene Kauf- und Verkaufsorders im Markt liegen. Für Quant-Bots, Arbitrage-Systeme und Marktanalyse-Tools kann der Zugriff auf ein aktuelles Orderbook mit möglichst geringer Latenz entscheidend sein.

Hyperliquid stellt dafür eine vollständige WebSocket-Schnittstelle bereit. Darüber kannst du L2-Orderbook-Snapshots und fortlaufende Updates abonnieren. In diesem Artikel schauen wir uns an, wie die Subscription funktioniert, wie die Nachrichten aufgebaut sind, wie du ein lokales Orderbook pflegst und welche Punkte bei Reconnects und produktionsnahen Setups wichtig sind.

Wenn du keine eigene Infrastruktur bauen möchtest und primär Perpetuals traden willst, ist OneKey Perps der praktischere Weg: Echtzeit-Marktdaten und Trading sind bereits integriert und direkt nutzbar.

WebSocket vs. REST-Polling

Bevor wir in die Implementierung gehen, lohnt sich der Unterschied zwischen WebSocket und REST-Polling.

Für ein Orderbook, das in Echtzeit aktualisiert werden soll, ist REST-Polling in der Regel keine gute Alternative. Polling erzeugt mehr Overhead, ist langsamer und kann zwischen zwei Abfragen wichtige Änderungen verpassen. WebSockets liefern Updates dauerhaft über eine offene Verbindung und sind deshalb für Orderbook-Daten deutlich besser geeignet.

Für die vollständige Spezifikation solltest du zusätzlich die offizielle Hyperliquid-Dokumentation zur WebSocket API prüfen.

WebSocket-Verbindung aufbauen

Endpoint

Der Hyperliquid-WebSocket-Endpoint lautet nach aktuellem Stand gemäß offizieller Dokumentation:

wss://api.hyperliquid.xyz/ws

Einfaches Verbindungsbeispiel

import asyncio
import json
import websockets

WS_URL = "wss://api.hyperliquid.xyz/ws"

async def connect_and_subscribe():
    async with websockets.connect(WS_URL) as ws:
        # Subscription-Nachricht senden
        subscribe_msg = {
            "method": "subscribe",
            "subscription": {
                "type": "l2Book",
                "coin": "BTC"
            }
        }

        await ws.send(json.dumps(subscribe_msg))

        # Nachrichten fortlaufend empfangen
        async for raw_msg in ws:
            msg = json.loads(raw_msg)
            handle_message(msg)

asyncio.run(connect_and_subscribe())

Format der Subscription-Nachricht

L2-Orderbook abonnieren

So abonnierst du das L2-Orderbook für BTC:

{
  "method": "subscribe",
  "subscription": {
    "type": "l2Book",
    "coin": "BTC"
  }
}

Hyperliquid unterstützt mehrere Märkte über dieselbe Verbindung. Dafür sendest du einfach mehrere Subscription-Nachrichten, jeweils mit dem gewünschten Coin. Updates werden pro Markt separat übertragen.

Subscription beenden

{
  "method": "unsubscribe",
  "subscription": {
    "type": "l2Book",
    "coin": "BTC"
  }
}

Nachrichtentypen: Snapshot und Delta

Initialer Snapshot

Nach der Subscription sendet der Server zunächst einen vollständigen Snapshot des aktuellen Orderbooks. Dieser enthält die vorhandenen Preislevel und deren Volumen:

{
  "channel": "l2Book",
  "data": {
    "coin": "BTC",
    "time": 1714500000000,
    "levels": [
      [
        [{"px": "64000.0", "sz": "0.5", "n": 3}],
        [{"px": "64010.0", "sz": "0.3", "n": 2}]
      ]
    ]
  }
}

Die beiden Seiten stehen dabei für:

  • bids: Kauforders, üblicherweise von hohem zu niedrigem Preis sortiert
  • asks: Verkaufsorders, üblicherweise von niedrigem zu hohem Preis sortiert

Die wichtigsten Felder:

  • px: Preis
  • sz: aggregiertes Volumen auf diesem Preislevel; 0 bedeutet, dass das Level leer ist
  • n: Anzahl der Orders auf diesem Preislevel

Delta-Updates

Nach dem Snapshot schickt der Server nur noch Preislevel, die sich geändert haben:

{
  "channel": "l2Book",
  "data": {
    "coin": "BTC",
    "time": 1714500000100,
    "levels": [
      [
        [{"px": "63990.0", "sz": "0.0", "n": 0}],
        [{"px": "64010.0", "sz": "0.8", "n": 4}]
      ]
    ]
  }
}

Wenn sz den Wert "0", "0.0" oder numerisch 0 hat, ist dieses Preislevel vollständig gefüllt oder gecancelt worden. In deinem lokalen Orderbook musst du das Level dann löschen.

Lokales Orderbook pflegen

Das korrekte Pflegen eines lokalen Orderbooks ist der wichtigste Teil beim Arbeiten mit WebSocket-Daten. Du startest mit dem Snapshot und wendest danach jedes Delta in der richtigen Reihenfolge an.

from sortedcontainers import SortedDict

class LocalOrderBook:
    def __init__(self, coin):
        self.coin      = coin
        self.bids      = SortedDict(lambda x: -float(x))  # Bids: hoher Preis zuerst
        self.asks      = SortedDict(lambda x:  float(x))  # Asks: niedriger Preis zuerst
        self.last_time = None

    def apply_snapshot(self, data):
        self.bids.clear()
        self.asks.clear()

        levels = data["levels"][0]

        for bid in levels[0]:
            if float(bid["sz"]) > 0:
                self.bids[bid["px"]] = float(bid["sz"])

        for ask in levels[1]:
            if float(ask["sz"]) > 0:
                self.asks[ask["px"]] = float(ask["sz"])

        self.last_time = data["time"]

    def apply_delta(self, data):
        levels = data["levels"][0]

        for bid in levels[0]:
            px, sz = bid["px"], float(bid["sz"])
            if sz == 0:
                self.bids.pop(px, None)
            else:
                self.bids[px] = sz

        for ask in levels[1]:
            px, sz = ask["px"], float(ask["sz"])
            if sz == 0:
                self.asks.pop(px, None)
            else:
                self.asks[px] = sz

        self.last_time = data["time"]

    @property
    def best_bid(self):
        return next(iter(self.bids.items()), None)

    @property
    def best_ask(self):
        return next(iter(self.asks.items()), None)

    @property
    def mid_price(self):
        bid = self.best_bid
        ask = self.best_ask
        if bid and ask:
            return (float(bid[0]) + float(ask[0])) / 2
        return None

    @property
    def spread(self):
        bid = self.best_bid
        ask = self.best_ask
        if bid and ask:
            return float(ask[0]) - float(bid[0])
        return None

Nachrichten verarbeiten

Du musst unterscheiden, ob du gerade den initialen Snapshot oder ein Delta verarbeitest:

order_book = LocalOrderBook("BTC")
is_initialized = False

def handle_message(msg):
    global is_initialized

    if msg.get("channel") != "l2Book":
        return

    data = msg["data"]

    if not is_initialized:
        order_book.apply_snapshot(data)
        is_initialized = True
        print(
            f"Orderbook initialisiert: "
            f"{len(order_book.bids)} Bid-Level, "
            f"{len(order_book.asks)} Ask-Level"
        )
    else:
        order_book.apply_delta(data)

    # Aktuellen Top-of-Book-Zustand ausgeben
    print(
        f"Best Bid: {order_book.best_bid}, "
        f"Best Ask: {order_book.best_ask}, "
        f"Spread: {order_book.spread}"
    )

Reconnects sauber behandeln

WebSocket-Verbindungen können durch Netzwerkprobleme, Timeouts oder serverseitige Disconnects abbrechen. Ein produktionsnahes System sollte deshalb automatisch reconnecten.

import asyncio
import json
import websockets

async def subscribe_with_reconnect(coin, handle_fn, max_retries=None):
    retries = 0

    while max_retries is None or retries < max_retries:
        try:
            async with websockets.connect(
                WS_URL,
                ping_interval=20,
                ping_timeout=10
            ) as ws:
                retries = 0  # Erfolgreiche Verbindung: Retry-Zähler zurücksetzen
                is_initialized = False

                await ws.send(json.dumps({
                    "method": "subscribe",
                    "subscription": {"type": "l2Book", "coin": coin}
                }))

                async for raw_msg in ws:
                    handle_fn(json.loads(raw_msg))

        except (websockets.ConnectionClosed, ConnectionError, OSError) as e:
            retries += 1
            wait = min(2 ** retries, 60)  # Exponential Backoff, maximal 60 Sekunden
            print(f"Verbindung getrennt ({e}), neuer Versuch in {wait}s, Retry #{retries}")

            is_initialized = False  # Beim Reconnect neuen Snapshot erwarten
            await asyncio.sleep(wait)

Wichtig: Beim Reconnect solltest du den Initialisierungsstatus zurücksetzen. Nach einer neuen Verbindung sendet der Server wieder einen vollständigen Snapshot. Du solltest nicht versuchen, Deltas über eine unterbrochene Verbindung hinweg fortzuschreiben.

Sequenz, Zeitstempel und Nachrichtenreihenfolge

Hyperliquid-WebSocket-Nachrichten enthalten ein Zeitfeld, das du zur Plausibilitätsprüfung nutzen kannst. Für produktionsnahe Systeme ist empfehlenswert:

  • Speichere den Zeitstempel der zuletzt verarbeiteten Nachricht.
  • Wenn eine neue Nachricht älter ist als die zuletzt verarbeitete, behandle sie als veraltet und verwerfe sie.
  • Wenn über längere Zeit keine Nachricht kommt, sende aktiv einen Ping oder baue die Verbindung neu auf.
  • Für latenzkritische Strategien können Netzwerkstandort, Infrastruktur und Routing entscheidend sein.

Ein Zeitstempel ersetzt keine vollständige Sequenznummer-Logik, hilft aber dabei, offensichtliche Ausreißer und veraltete Nachrichten zu erkennen.

Mehrere Märkte gleichzeitig abonnieren

Du kannst über eine einzelne WebSocket-Verbindung mehrere Märkte abonnieren. Für mehrere Coins bietet sich eine asynchrone Architektur an:

coins = ["BTC", "ETH", "SOL"]
order_books = {coin: LocalOrderBook(coin) for coin in coins}

async def multi_subscribe():
    async with websockets.connect(WS_URL) as ws:
        for coin in coins:
            await ws.send(json.dumps({
                "method": "subscribe",
                "subscription": {"type": "l2Book", "coin": coin}
            }))

        async for raw_msg in ws:
            msg = json.loads(raw_msg)

            if msg.get("channel") == "l2Book":
                coin = msg["data"]["coin"]

                if coin in order_books:
                    order_books[coin].apply_delta(msg["data"])

In einer produktiven Variante solltest du pro Coin ebenfalls den Initialisierungsstatus verwalten. Der Snapshot jedes Marktes muss korrekt verarbeitet werden, bevor du Deltas zuverlässig anwenden kannst.

Typische Anwendungsfälle

Echtzeit-Orderbook-Daten werden häufig für folgende Zwecke genutzt:

  • Trading-Bots: dynamische Anpassung von Limit Orders anhand von Spread und Tiefe
  • Arbitrage-Systeme: Überwachung von Preisunterschieden zwischen Hyperliquid und anderen Exchanges wie dYdX oder GMX
  • Marktanalyse-Dashboards: Visualisierung von Orderbook-Tiefe, Spread-Historie und Liquiditätsverteilung
  • Risk-Systeme: Alerts bei ungewöhnlich weitem Spread oder plötzlich sinkender Liquidität

OneKey Perps: ohne eigene Infrastruktur traden

Ein eigenes WebSocket-Orderbook-System aufzubauen erfordert Engineering-Aufwand: Verbindungsmanagement, lokale State-Pflege, Monitoring, Reconnects, Datenvalidierung und im Zweifel eigene Speicherlogik für Tick-Daten.

Wenn dein Ziel nicht der Bau eines Quant-Systems ist, sondern du Perpetuals handeln möchtest, ist OneKey Perps der einfachere Workflow. OneKey Perps bietet Echtzeit-Marktdaten und Trading-Funktionen in einer integrierten Oberfläche. In Kombination mit der sicheren Signatur über eine OneKey Hardware Wallet kannst du dich stärker auf deine Handelsentscheidung konzentrieren, statt selbst Marktinfrastruktur zu betreiben.

Wenn du dApps über WalletConnect nutzen möchtest, findest du in der WalletConnect-Dokumentation die entsprechenden Integrationshinweise. OneKey unterstützt das standardisierte WalletConnect-Protokoll und kann sicher mit Web3-Anwendungen wie Hyperliquid interagieren.

Häufige Fragen

Q1: Gibt es Limits für parallele WebSocket-Verbindungen?

Ja, mit Limits solltest du immer rechnen. Die konkreten Werte solltest du in der offiziellen Hyperliquid-Dokumentation prüfen. Generell ist es sinnvoll, pro IP nicht unnötig viele parallele Verbindungen aufzubauen. Für mehrere Märkte solltest du möglichst eine gemeinsame WebSocket-Verbindung wiederverwenden.

Q2: Wird mein lokales Orderbook falsch, wenn ein Delta verloren geht?

Ja. Wenn ein Delta-Update wegen Netzwerkproblemen verloren geht, kann dein lokaler Zustand vom tatsächlichen Serverzustand abweichen. Wenn du Inkonsistenzen vermutest, etwa durch ungewöhnliche Spreads oder sprunghafte Top-of-Book-Änderungen, solltest du die Verbindung schließen und neu abonnieren, um einen frischen Snapshot zu erhalten.

Q3: Kann ich Echtzeit-Orderbook-Daten direkt für Backtests nutzen?

Nicht direkt. Backtests brauchen historische Daten, nicht nur einen Live-Stream. Wenn du Orderbook-basierte Strategien testen möchtest, solltest du die empfangenen Daten zeitlich geordnet speichern, zum Beispiel als Tick-Daten. Für erste Analysen können zusätzlich historische Candlestick-Daten hilfreich sein, falls die jeweilige API diese bereitstellt.

Q4: Wie erkenne ich, ob die WebSocket-Verbindung gesund ist?

Überwache mindestens diese Punkte:

  • Zeit seit der letzten empfangenen Nachricht, zum Beispiel nicht länger als 5 Sekunden
  • Ping/Pong-Roundtrip-Latenz
  • Anzahl der Reconnects
  • auffällige Sprünge oder inkonsistente Orderbook-Zustände

Wenn die Verbindung auffällig wird, sollte dein System automatisch reconnecten.

Q5: Beeinflusst eine OneKey Wallet die Trading-Latenz?

Die Signatur mit einer OneKey Hardware Wallet dauert typischerweise nur wenige hundert Millisekunden und ist für die meisten Trading-Setups vernachlässigbar. Für sehr hochfrequente Strategien, etwa viele Orders pro Sekunde, kann ein API-Agent-Subaccount oder eine Hot-Wallet-Struktur für Signaturen sinnvoll sein, während die Hauptmittel weiterhin durch OneKey geschützt werden. So trennst du aktive Ausführung und sichere Kapitalverwaltung.

Fazit

Eine Echtzeit-Orderbook-Subscription ist eine wichtige Datenquelle für anspruchsvolle Trading- und Analyse-Systeme. Hyperliquids WebSocket API ist klar strukturiert und ermöglicht Entwicklern, lokale L2-Orderbooks aus Snapshots und Delta-Updates aufzubauen.

Für Market-Making-Bots, Arbitrage-Systeme oder Analyse-Dashboards ist diese technische Basis wertvoll. Wenn du dagegen keine eigene Infrastruktur entwickeln möchtest und direkt On-Chain-Perpetuals handeln willst, ist OneKey Perps der praktischere Einstieg: Echtzeit-Marktdaten, Trading-Workflow und sichere Signatur mit OneKey in einem Setup.

Lade OneKey herunter oder öffne deine OneKey App, prüfe OneKey Perps in Ruhe und nutze es nur, wenn es zu deinem Risikoprofil und deinem Trading-Workflow passt.

Risikohinweis

Echtzeit-Orderbook-Daten zeigen nur den Marktzustand zu einem bestimmten Zeitpunkt und sollten niemals die einzige Grundlage für Trading-Entscheidungen sein. Automatisierte Strategien auf Basis von Orderbook-Daten können durch starke Volatilität, technische Störungen, Latenz oder Fehler im Strategiedesign erhebliche Verluste verursachen. Perpetuals sind hochriskant und können zum vollständigen Verlust des eingesetzten Kapitals führen. Dieser Artikel dient ausschließlich technischen Informationszwecken und ist keine Finanz-, Anlage- oder Rechtsberatung. Handle nur, wenn du die Risiken verstehst.

Schützen Sie Ihre Kryptojourney mit OneKey

View details for OneKeyOneKey

OneKey

Die fortschrittlichste Hardware-Wallet der Welt.

View details for App herunterladenApp herunterladen

App herunterladen

Betrugsalarme. Alle Coins unterstützt.

View details for OneKey SifuOneKey Sifu

OneKey Sifu

Krypto-Klarheit – Eine Anruf entfernt.