Übersicht
Die StreamL4Book Der Stream liefert das vollständige Orderbuch auf der Ebene einzelner Orders – jede ausstehende Order mit Benutzeradresse, Order-ID, Volumen, Auslöseinformationen und Zeitstempeln. Bei der Anmeldung sendet der Stream zunächst eine vollständige Momentaufnahme aller ausstehenden Orders und anschließend inkrementelle Differenzen pro Block.
gRPC : OrderBookStreaming
gRPC : StreamL4Book
Verfügbarkeit der API: Nur gRPC -API
Modell aktualisieren: Vollständiger Snapshot beim Abonnieren, anschließend inkrementelle Diffs pro Block, wobei jederzeit verbindliche Ersatz-Snapshots möglich sind
So funktioniert es
- Beim Abonnieren: Der Stream sendet einen vollständigen
L4BookSnapshotmit allen aktuellen Geld- und Briefkursen sowie vollständigen Auftragsdetails - Danach pro Block: Der Stream sendet
L4BookDiffNachrichten mit einer JSON-kodiertenDatenZeichenkette, die Folgendes enthältBestellstatus(alle Objekte zum Bestellstatus, die dem „Orders“-Stream entsprechen) undbook_diffs(schrittweise Änderungen mithilfe vonraw_book_diff(Format, das dem „Book Updates“-Stream entspricht) - Wenden Sie die Diffs auf Ihre lokale Kopie des Snapshots an, um den aktuellen Zustand beizubehalten
- Ersatz-Snapshots: Der Stream kann einen weiteren senden
L4BookSnapshotnach dem ersten Snapshot, beispielsweise wenn eine ALO-Prioritätsgebühreneinfügung die Warteschlangenreihenfolge ändert oder wenn der Stream-Status neu aufgebaut wird. Behandle jeden Snapshot als maßgeblich: Verwerfe beide Seiten des lokalen Buches und baue es neu auf abGeboteundfragtin der ausgegebenen Reihenfolge und wenden Sie die späteren Diffs aus diesem Snapshot weiterhin anHöhe
Dies ist eine deutlich einfachere Methode, um eine lokale L4-Order-Book-Ansicht zu erstellen und zu pflegen, da der anfängliche Snapshot bereits integriert ist – ein REST-Bootstrap oder das Zusammenführen bei Race-Conditions ist nicht erforderlich. Bei einer erneuten Verbindung wird automatisch ein aktueller Snapshot bereitgestellt.
Datenstruktur
Momentaufnahme (erste Nachricht und Ersetzungen)
Die anfängliche L4BookSnapshot enthält das vollständige Orderbuch. Spätere Snapshots verwenden dieselbe Struktur und ersetzen das lokale Orderbuch vollständig:
{
"snapshot": {
"coin": "ETH",
"time": 1764867600518,
"height": 817863403,
"bids": [
{
"user": "0x1c1c270b573d55b68b3d14722b5d5d401511bed0",
"coin": "ETH",
"side": "B",
"limit_px": "3167.4",
"sz": "1.5785",
"oid": 258166296856,
"timestamp": 1764867590000,
"trigger_condition": "N/A",
"is_trigger": false,
"trigger_px": "0",
"is_position_tpsl": false,
"reduce_only": false,
"order_type": "Limit",
"tif": "Gtc"
}
],
"asks": [
{
"user": "0xe9acfdc9322f6f924f007016c082e6891a3c653c",
"coin": "ETH",
"side": "A",
"limit_px": "3168.0",
"sz": "2.0000",
"oid": 258166160909,
"timestamp": 1764867580000,
"trigger_condition": "N/A",
"is_trigger": false,
"trigger_px": "0",
"is_position_tpsl": false,
"reduce_only": false,
"order_type": "Limit",
"tif": "Gtc"
}
]
}
}
Unterschied (folgende Nachrichten)
Nach dem Snapshot erzeugt jeder Block einen L4BookDiff mit JSON-kodierten inkrementellen Änderungen:
{
"diff": {
"time": 1764867601000,
"height": 817863404,
"data": "{\"order_statuses\": [...], \"book_diffs\": [...]}"
}
}
Anfrageparameter
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| Münze | Zeichenkette | Ja | Symbol für das Abonnement – bei Perpetual-Kontrakten werden Namen verwendet (z. B. „BTC“, „ETH“), beim Spot-Handel das @index-Format (z. B. „@142“) |
Benennung von Münzen
Die Münze Der Parameter folgt der Namenskonvention Hyperliquid, die Perpetuals eindeutig vom Spot unterscheidet:
- Unbefristete Verträge: Für Menschen lesbare Namen —
„BTC“,„ETH“,„HYPE“,„SOL“ - Spot-Token:
@{index}Format —"@1",„@107“,"@142","@166" - Ergebnismärkte (HIP-4):
#NFormat. Jedes Ergebnis hat zwei#NMünzen – je eine pro Seite (Ja und Nein). Märkte mit Mehrpreis-Fragen bestehen aus mehreren gruppierten Ergebnissen (Preiskategorien plus einer Ausweichoption), wobei jede Gruppe über ein eigenes Ja/Nein-Münzpaar verfügt. Verwenden Sie dieoutcomeMetaendpoint Zuordnung von Münzindizes zu Marktbezeichnungen und Seiten. - Ausnahme:
„PURR/USDC“ist die einzige Spot-Münze, auf der ein Name zu lesen ist
Es gibt keine Überschneidungen zwischen den Formaten. „BTC“ bezieht sich immer auf den BTC-Perpetual-Kontrakt; der Spot-BTC ist "@142". Um zu entdecken @index Zuordnungen für Spot-Token, Abfrage der Meta oder spotMeta Info-Endpunkte.
Antwortfelder
L4BookUpdate
Jede Nachricht ist eine L4BookUpdate die entweder einen Snapshot oder einen Diff enthält:
| Feld | Typ | Beschreibung |
|---|---|---|
| Momentaufnahme | L4BookSnapshot | Vollständige Momentaufnahme des Auftragsbuchs (wird bei Anmeldung, bei Wiederverbindung und als Reset bei einem Wechsel während des laufenden Betriebs gesendet) |
| diff | L4BookDiff | Inkrementelle Differenz (pro Block zwischen den Snapshots gesendet) |
L4BookSnapshot
| Feld | Typ | Beschreibung |
|---|---|---|
| Münze | Zeichenkette | Symbol (z. B. „BTC“, „ETH“) |
| Zeit | uint64 | Block-Zeitstempel in Millisekunden |
| Höhe | uint64 | Blockhöhe |
| Gebote | L4Order[] | Alle ausstehenden Kaufaufträge |
| fragt | L4Order[] | Alle ausstehenden Kaufaufträge |
L4BookDiff
| Feld | Typ | Beschreibung |
|---|---|---|
| Zeit | uint64 | Block-Zeitstempel in Millisekunden |
| Höhe | uint64 | Blockhöhe |
| Daten | Zeichenkette | JSON-kodiertes Objekt, das „order_statuses“ und „book_diffs“ enthält und dem bestehenden Datenformat des Knotens entspricht |
L4Order
| Feld | Typ | Beschreibung |
|---|---|---|
| Benutzer | Zeichenkette | Ethereum des Auftraggebers |
| Münze | Zeichenkette | Bezeichnung des Handelspaares (z. B. „ETH“, „BTC“) |
| Seite | Zeichenkette | „A“ (Ask/Verkaufen) oder „B“ (Bid/Kaufen) |
| limit_px | Zeichenkette | Limitpreis als Dezimalzeichenfolge |
| sz | Zeichenkette | Auftragsgröße als Dezimalzeichenfolge |
| oid | uint64 | Eindeutige Bestell-ID |
| Zeitstempel | uint64 | Zeitpunkt der Erfassung des Auftrags im Buch (Millisekunden) |
| Auslösebedingung | Zeichenkette | Status der Auslösebedingung: „N/A“, „Ausgelöst“ usw. |
| is_trigger | bool | Ob es sich bei der Order um eine Trigger-/Stop-Order handelt |
| trigger_px | Zeichenkette | Auslösepreis als Dezimalzeichenfolge |
| is_position_tpsl | bool | Ob es sich bei der Order um eine Take-Profit-/Stop-Loss-Order handelt |
| nur_reduzieren | bool | Ob es sich um einen reinen Reduktionsbefehl handelt |
| Auftragstyp | Zeichenkette | Auftragsart: „Limit“, „Markt“ usw. |
| tif | Zeichenkette (optional) | Gültigkeitsdauer: „Gtc“ (Good til Cancelled), „Ioc“ (Immediate or Cancel), „Alo“ (Add Liquidity Only) |
| Kloid | Zeichenkette (optional) | Auftrags-ID des Kunden (vom Benutzer festgelegte individuelle Kennung) |
Proto-Definition
StreamL4Book ist definiert in orderbook.proto:
service OrderBookStreaming {
rpc StreamL4Book (L4BookRequest) returns (stream L4BookUpdate);
}
message L4BookRequest {
string coin = 1;
}
message L4BookUpdate {
oneof update {
L4BookSnapshot snapshot = 1;
L4BookDiff diff = 2;
}
}
message L4BookSnapshot {
string coin = 1;
uint64 time = 2;
uint64 height = 3;
repeated L4Order bids = 4;
repeated L4Order asks = 5;
}
message L4BookDiff {
uint64 time = 1;
uint64 height = 2;
string data = 3;
}
message L4Order {
string user = 1;
string coin = 2;
string side = 3;
string limit_px = 4;
string sz = 5;
uint64 oid = 6;
uint64 timestamp = 7;
string trigger_condition = 8;
bool is_trigger = 9;
string trigger_px = 10;
bool is_position_tpsl = 11;
bool reduce_only = 12;
string order_type = 13;
optional string tif = 14;
optional string cloid = 15;
}
Beispiele für Aktualisierungen
L4-Snapshot (anfänglicher vollständiger Zustand)
{
"snapshot": {
"coin": "ETH",
"time": 1764867600518,
"height": 817863403,
"bids": [
{
"user": "0x1c1c270b573d55b68b3d14722b5d5d401511bed0",
"coin": "ETH",
"side": "B",
"limit_px": "3167.4",
"sz": "1.5785",
"oid": 258166296856,
"timestamp": 1764867590000,
"trigger_condition": "N/A",
"is_trigger": false,
"trigger_px": "0",
"is_position_tpsl": false,
"reduce_only": false,
"order_type": "Limit",
"tif": "Gtc"
},
{
"user": "0x999a4b5f268a8fbf33736feff360d462ad248dbf",
"coin": "ETH",
"side": "B",
"limit_px": "3167.0",
"sz": "5.0000",
"oid": 258166123456,
"timestamp": 1764867585000,
"trigger_condition": "N/A",
"is_trigger": false,
"trigger_px": "0",
"is_position_tpsl": false,
"reduce_only": false,
"order_type": "Limit",
"tif": "Gtc",
"cloid": "0x20251204000000000000000000381433"
}
],
"asks": [
{
"user": "0xe9acfdc9322f6f924f007016c082e6891a3c653c",
"coin": "ETH",
"side": "A",
"limit_px": "3168.0",
"sz": "2.0000",
"oid": 258166160909,
"timestamp": 1764867580000,
"trigger_condition": "N/A",
"is_trigger": false,
"trigger_px": "0",
"is_position_tpsl": false,
"reduce_only": false,
"order_type": "Limit",
"tif": "Alo"
}
]
}
}
L4-Diff (inkrementelle Aktualisierung pro Block)
{
"diff": {
"time": 1764867601000,
"height": 817863404,
"data": "{\"order_statuses\":[...],\"book_diffs\":[...]}"
}
}
Die Daten Das Feld ist eine JSON-kodierte Zeichenfolge. Nach der Analyse enthält es:
Bestellstatus — Alle Ereignisse zum Bestellstatus, jeweils eines pro Bestellung, die in diesem Block geändert wurde. Jeder Eintrag entspricht dem Auftragsstrom Ereignisform:
{
"order": {
"coin": "ETH",
"side": "B",
"limitPx": "3167.4",
"sz": "1.5785",
"oid": 258166296856,
"timestamp": 1764867590000,
"triggerCondition": "N/A",
"isTrigger": false,
"triggerPx": "0.0",
"isPositionTpsl": false,
"reduceOnly": false,
"orderType": "Limit",
"tif": "Gtc",
"cloid": "0x...",
"user": null
},
"status": "filled",
"time": "2025-12-04T17:00:00.518000000",
"user": "0x1c1c270b573d55b68b3d14722b5d5d401511bed0"
}
book_diffs — Inkrementelle Änderungen am Auftragsbuch. Jeder Eintrag verwendet dasselbe raw_book_diff Format als das Neuigkeiten zu Büchern Stream:
// New order or size update
{
"coin": "ETH",
"oid": 258166296857,
"px": "3168.0",
"raw_book_diff": { "new": { "sz": "2.0000" } },
"side": "A",
"user": "0xe9acfdc9322f6f924f007016c082e6891a3c653c"
}
// Order removed (cancelled or filled)
{
"coin": "ETH",
"oid": 258166296856,
"px": "3167.4",
"raw_book_diff": "remove",
"side": "B",
"user": "0x1c1c270b573d55b68b3d14722b5d5d401511bed0"
}
Trigger-/Stop-Loss-Order
{
"user": "0x7a475736bf02d67bf51b00414ab766ef4da9214d",
"coin": "BTC",
"side": "A",
"limit_px": "90000.0",
"sz": "0.5000",
"oid": 258166400000,
"timestamp": 1764867595000,
"trigger_condition": "Triggered",
"is_trigger": true,
"trigger_px": "91000.0",
"is_position_tpsl": true,
"reduce_only": true,
"order_type": "Limit",
"tif": "Gtc"
}
API-Nutzung
gRPC
// Perp order book
const request = {
coin: 'ETH'
};
// Spot order book (@ index format)
const spotRequest = {
coin: '@142'
};
StreamL4Book ist nur über die gRPC -API verfügbar (OrderBookStreaming Dienst). Er ist nicht über JSON-RPC oder WebSocket verfügbar.
Vergleich: L4-Buch vs. L2-Buch vs. Datensatz „Book Updates“
| Funktion | StreamL4Book | StreamL2Book | BUCH_AKTUELLES |
|---|---|---|---|
| Granularität | Einzelbestellungen | Nach Preisniveau zusammengefasst | Einzelne Abweichungen auf Auftragsebene |
| Beinhaltet den aktuellen Stand | Ja – erster Momentaufnahme | Ja – jede Nachricht | Nein – nur vorwärts |
| Erfordert REST-Bootstrap | Nein | Nein | Ja |
| Verwaltung des Client-Status | Diffs auf Snapshot anwenden | Keine | Von Grund auf neu erstellen |
| Details pro Bestellung | Benutzer, OID, Trigger, Zeitstempel, TIF | Nur Gesamtgröße und Gesamtanzahl | Benutzer, OID, Größe |
| Bandbreite | Weiter (vollständige Bestelldetails) | Mittel (begrenzt durch n_levels) | Niedrig (nur Differenzwerte) |
| Am besten geeignet für | HFT, Quant-Desks, MEV | Die meisten Kunden | Kunden, die lediglich Buchaktualisierungen benötigen |
Wichtige Hinweise
- Behandeln Sie jeden Snapshot als verbindlich: Snapshots gehen bei der Anmeldung und bei der Wiederverbindung ein, und ein Ersatz-Snapshot kann auch nach normalen inkrementellen Aktualisierungen eintreffen (beispielsweise wenn eine ALO-Prioritätsgebühr die Reihenfolge in der Warteschlange verändert). Auf aktiven Märkten können Ersatz-Snapshots mehrmals pro Minute eintreffen. Wann immer ein Snapshot eintrifft, verwerfen Sie das lokale Orderbuch und erstellen Sie es anhand des Snapshots neu.
- Die Warteschlangenpriorität wird über Snapshots übermittelt, nicht
insertBefore: Das Rohmaterial Neuigkeiten zu Büchern Der Stream stellt eineninsertBeforeFeld bei vorrangigen Einfügungen; L4-Diffs enthalten es nicht. Die streams liefern streams Änderungen in Warteschlangenreihenfolge über Ersatz-Snapshots, derenGeboteundfragtwerden in der kanonischen Warteschlangenreihenfolge ausgegeben. - Große Nachrichten zulassen: Ersatz-Snapshots enthalten die volle L4-Tiefe und können deutlich größer sein als ein inkrementeller Diff, insbesondere bei BTC. Sehen Sie mindestens 100 MB für eingehende gRPC vor und wenden Sie jeden Snapshot atomar an, bevor Sie spätere Aktualisierungen verarbeiten.
DATENVERLUSTWiederanschluss: Der Stream kann gRPC ausgebenDATENVERLUSTStatusfehler bei vorübergehenden Störungen. Implementierung einer Logik zur automatischen Wiederherstellung der Verbindung beiDATENVERLUST— Bei jeder neuen Verbindung wird ein aktueller Snapshot bereitgestellt, sodass keine manuelle Wiederherstellung des Zustands erforderlich ist.- Änderungen auf den lokalen Zustand anwenden: Wenden Sie zwischen den Snapshots jeweils
L4BookDiffum das aktuelle Buch zu pflegen. Jedesbook_diffsVerwendungszwecke des Artikelsraw_book_diff: {"new": {"sz": "..."}}um eine Bestellung hinzuzufügen/zu aktualisieren, oderraw_book_diff: „entfernen“um eines zu entfernen, im gleichen Format wie das Neuigkeiten zu Büchern Stream. - Alternative in gedruckter Form verfügbar: Wenn Sie lediglich pro Bestellung Bewegungen hinzufügen, aktualisieren oder entfernen möchten, ohne die JSON-kodierten Daten zu analysieren,
DatenZeichenkette, StreamL4BookUpdates liefert dieselben Änderungen auf Order-Ebene wie typisierte Protobuf-Diffs. - zstd-Komprimierung wird dringend empfohlen: L4-Nachrichten können aufgrund umfangreicher Bestelldetails sehr groß sein. Aktivieren Sie die zstd-Komprimierung auf Ihrem gRPC , um den Bandbreitenbedarf deutlich zu reduzieren.
Verwandte Streams
- StreamL2Book - Aggregierte Preisniveaus – einfacher, geringerer Bandbreitenbedarf, keine clientseitige Zustandsverwaltung
- StreamL4BookUpdates - Typisierte Differenzdaten für das Hinzufügen, Aktualisieren und Entfernen pro Bestellung, kein JSON-Parsing erforderlich
- Buch-Updates - Nur vorwärtsgerichtete inkrementelle Diffs über StreamData (veralteter Ansatz)
- Aufträge - Ereignisse im Auftragslebenszyklus (eröffnet, ausgeführt, storniert usw.)
- Transaktionen - Daten zu ausgeführten Geschäften mit Maker-/Taker-Informationen