Resumen
El StreamL4Book El flujo proporciona el libro de órdenes completo con un nivel de detalle por orden individual: cada orden pendiente incluye la dirección del usuario, el ID de la orden, el volumen, la información de activación y las marcas de tiempo. Al suscribirse, el flujo envía una instantánea completa de todas las órdenes pendientes y, a continuación, diferencias incrementales por bloque.
gRPC : OrderBookStreaming
gRPC : StreamL4Book
Disponibilidad de la API: Solo API gRPC
Modelo de actualización: Instantánea completa al suscribirse y, a continuación, diferencias incrementales por bloque, con la posibilidad de realizar instantáneas de sustitución definitivas en cualquier momento.
Cómo funciona
- Al suscribirse: El flujo envía un
L4BookSnapshotque contiene todas las ofertas de compra y venta en espera, con todos los detalles de las órdenes - A partir de ahí, por bloque: El arroyo lleva
L4BookDiffmensajes codificados en JSONdatoscadena que contieneestados_de_pedido(todos los objetos de estado de pedido que coincidan con el flujo «Orders») ydiferencias_entre_libros(cambios incrementales medianteraw_book_diff(formato compatible con el flujo «Book Updates») - Aplica los cambios a tu copia local de la instantánea para mantener el estado actual
- Instantáneas de sustitución: El flujo puede enviar otro
L4BookSnapshottras la inicial, por ejemplo, cuando la inserción de una tarifa prioritaria ALO modifica el orden de la cola o cuando se reconstruye el estado del flujo. Considera cada instantánea como definitiva: descarta ambos lados del libro local y reconstruye a partir deofertasypreguntaen el orden en que se han generado, y seguir aplicando las diferencias posteriores a partir de esa instantáneaaltura
Esta es una forma mucho más sencilla de crear y mantener una vista local del libro de órdenes de L4, ya que la instantánea inicial está integrada de serie: no se necesita ninguna configuración inicial REST ni la resolución de condiciones de carrera. Al volver a conectarse, se envía automáticamente una nueva instantánea.
Estructura de datos
Instantánea (primer mensaje y sustituciones)
La inicial L4BookSnapshot contiene el libro de órdenes completo. Las instantáneas posteriores utilizan la misma estructura y sustituyen por completo al libro de órdenes local:
{
"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"
}
]
}
}
Diferencia (mensajes posteriores)
Tras la instantánea, cada bloque genera un L4BookDiff con cambios incrementales codificados en JSON:
{
"diff": {
"time": 1764867601000,
"height": 817863404,
"data": "{\"order_statuses\": [...], \"book_diffs\": [...]}"
}
}
Parámetros de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| moneda | cadena | Sí | Símbolo para suscribirse: en los contratos perpetuos se utilizan nombres (p. ej., «BTC», «ETH»), mientras que en el mercado al contado se utiliza el formato @índice (p. ej., «@142») |
Denominación de las monedas
El moneda El parámetro sigue la convención de nomenclatura Hyperliquid, que distingue sin ambigüedades entre los contratos perpetuos y los al contado:
- Perpetuos: Nombres legibles para las personas —
«BTC»,«ETH»,«HYPE»,«SOL» - Fichas al contado:
@{índice}formato —"@1",«@107»,«@142»,«@166» - Mercados de resultados (HIP-4):
#Nformato. Cada resultado tiene dos#Nmonedas: una por cada opción (Sí y No). Los mercados de preguntas con precios múltiples se componen de varios resultados agrupados (rangos de precios más una opción de reserva), cada uno con su propio par de monedas «Sí/No». Utiliza eloutcomeMetaendpoint asignar los índices de las monedas a los nombres y lados del mercado. - Excepción:
«PURR/USDC»es la única moneda de la serie «Spot» cuyo nombre se puede leer
No hay solapamiento entre los formatos. «BTC» siempre se refiere al contrato perpetuo de BTC; el BTC al contado es «@142». Para descubrir @índice asignaciones para tokens puntuales, consultar el meta o spotMeta puntos de información.
Campos de respuesta
L4BookUpdate
Cada mensaje es un L4BookUpdate que contenga una instantánea o un archivo de diferencias:
| Campo | Tipo | Descripción |
|---|---|---|
| instantánea | L4BookSnapshot | Resumen completo de la cartera de pedidos (enviado al suscribirse, al volver a conectarse y como restablecimiento de sustitución a mitad de proceso) |
| diff | L4BookDiff | Diferencias incrementales (enviadas por bloque entre instantáneas) |
L4BookSnapshot
| Campo | Tipo | Descripción |
|---|---|---|
| moneda | cadena | Símbolo (p. ej., «BTC», «ETH») |
| tiempo | uint64 | Marca de tiempo del bloque en milisegundos |
| altura | uint64 | Altura del bloque |
| ofertas | L4Order[] | Todas las órdenes de compra en espera |
| pregunta | L4Order[] | Todas las órdenes pendientes |
L4BookDiff
| Campo | Tipo | Descripción |
|---|---|---|
| tiempo | uint64 | Marca de tiempo del bloque en milisegundos |
| altura | uint64 | Altura del bloque |
| datos | cadena | Objeto codificado en JSON que contiene «order_statuses» y «book_diffs», y que se ajusta al formato de datos de los nodos existentes |
L4Order
| Campo | Tipo | Descripción |
|---|---|---|
| usuario | cadena | Ethereum de Ethereum del titular del pedido |
| moneda | cadena | Identificador del par de negociación (p. ej., «ETH», «BTC») |
| lado | cadena | «A» (precio de venta/oferta) o «B» (precio de compra/demanda) |
| limit_px | cadena | Precio límite como cadena decimal |
| sz | cadena | Tamaño del pedido como cadena decimal |
| oide | uint64 | N.º de pedido único |
| marca de tiempo | uint64 | Momento en que se registró la orden (en milisegundos) |
| condición_de_activación | cadena | Estado de la condición de activación: «N/A», «Activada», etc. |
| is_trigger | bool | Si la orden es una orden de activación o de stop |
| trigger_px | cadena | Precio de activación como cadena decimal |
| is_position_tpsl | bool | Tanto si la orden es una orden de toma de beneficios o de corte de pérdidas |
| reduce_only | bool | Si el orden es «solo reducir» |
| tipo_de_pedido | cadena | Tipo de orden: «Límite», «Mercado», etc. |
| tif | cadena (opcional) | Vigencia: «Gtc» (Válida hasta su cancelación), «Ioc» (Inmediata o cancelada), «Alo» (Solo añadir liquidez) |
| cloide | cadena (opcional) | ID del pedido del cliente (identificador personalizado establecido por el usuario) |
Definición de «Proto»
StreamL4Book se define en 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;
}
Ejemplos de actualizaciones
Instantánea L4 (estado completo inicial)
{
"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 (actualización incremental por bloques)
{
"diff": {
"time": 1764867601000,
"height": 817863404,
"data": "{\"order_statuses\":[...],\"book_diffs\":[...]}"
}
}
El datos El campo es una cadena codificada en JSON. Una vez analizada, contiene:
estados_de_pedido — Eventos completos sobre el estado de los pedidos, uno por cada pedido modificado en este bloque. Cada elemento se corresponde con el Flujo de pedidos forma del evento:
{
"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"
}
diferencias_entre_libros — Cambios incrementales en la cartera de pedidos. Cada partida utiliza el mismo raw_book_diff formato como el Novedades sobre el libro transmisión:
// 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"
}
Orden de activación/stop-loss
{
"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"
}
Uso de la API
gRPC
// Perp order book
const request = {
coin: 'ETH'
};
// Spot order book (@ index format)
const spotRequest = {
coin: '@142'
};
StreamL4Book solo está disponible a través de la API gRPC (OrderBookStreaming servicio). No está disponible a través de JSON-RPC ni de WebSocket.
Comparación: libro L4 frente a libro L2 frente al conjunto de datos de actualizaciones de libros
| Característica | StreamL4Book | StreamL2Book | NOVEDADES_LIBROS |
|---|---|---|---|
| Granularidad | Pedidos individuales | Agrupados por nivel de precios | Diferencias a nivel de pedido individual |
| Incluye el estado actual | Sí — instantánea inicial | Sí, todos los mensajes | No — solo hacia adelante |
| Requiere el arranque de REST | No | No | Sí |
| Gestión del estado del cliente | Aplicar diferencias a la instantánea | Ninguno | Crear desde cero |
| Detalles por pedido | Usuario, oid, disparadores, marcas de tiempo, tif | Solo el tamaño total y el número total | Usuario, oid, tamaño |
| Ancho de banda | Más arriba (detalles completos del pedido) | Medio (limitado por n_levels) | Bajo (solo diferencias) |
| Ideal para | HFT, equipos cuantitativos, MEV | La mayoría de los clientes | Clientes que solo necesitan actualizaciones de libros |
Notas importantes
- Considera cada instantánea como definitiva: las instantáneas se reciben al suscribirse y al volver a conectarse, y también puede recibirse una instantánea de sustitución tras las actualizaciones incrementales normales (por ejemplo, cuando la inserción de una tarifa prioritaria ALO modifica el orden de la cola). En mercados activos, las instantáneas de sustitución pueden recibirse varias veces por minuto. Cada vez que se reciba una instantánea, descarta el libro de órdenes local y reconstrúyelo a partir de la instantánea.
- La prioridad de la cola se establece mediante instantáneas, no
insertBefore: El crudo Novedades sobre el libro El flujo expone uninsertBeforecampo en las inserciones prioritarias; las diferencias L4 no lo incluyen. streams , los streams L4 transmiten los cambios en el orden de la cola mediante instantáneas de sustitución cuyasofertasypreguntase emiten siguiendo el orden canónico de la cola. - Permitir mensajes de gran tamaño: las instantáneas de sustitución contienen toda la profundidad L4 y pueden ser mucho más grandes que una diferencia incremental, especialmente en el caso de BTC. Asigna al menos 100 MB para gRPC entrantes y aplica cada instantánea de forma atómica antes de procesar las actualizaciones posteriores.
PÉRDIDA DE DATOSreconexión: El flujo puede emitir gRPCPÉRDIDA DE DATOSerrores de estado durante problemas transitorios. Implementar la lógica de reconexión automática enPÉRDIDA DE DATOS— En cada nueva conexión se envía una instantánea actualizada, por lo que no es necesario recuperar el estado manualmente.- Aplicar diferencias al estado local: Entre una instantánea y otra, aplica cada una
L4BookDiffpara mantener el libro actual. Cadadiferencias_entre_librosusos del artículoraw_book_diff: {"new": {"sz": "..."}}para añadir o modificar un pedido, oraw_book_diff: «eliminar»para eliminar uno, con el mismo formato que el Novedades sobre el libro transmisión. - Hay una versión mecanografiada disponible: Si solo necesitas realizar operaciones de añadir, actualizar o eliminar por pedido sin analizar el formato JSON,
datoscadena, StreamL4BookUpdates ofrece los mismos cambios a nivel de orden que las diferencias de Protobuf escritas. - Se recomienda encarecidamente la compresión zstd: los mensajes L4 pueden ser de gran tamaño debido a los detalles completos del pedido. Activa la compresión zstd en tu gRPC para reducir significativamente el ancho de banda.
Streams relacionados
- StreamL2Book - Niveles de precios agregados: más sencillos, menor ancho de banda y sin gestión del estado por parte del cliente
- StreamL4BookUpdates - Diferencias de adición, actualización y eliminación por pedido, sin necesidad de analizar JSON
- Actualizaciones del libro - Comparaciones incrementales solo hacia adelante a través de StreamData (método tradicional)
- Órdenes - Eventos del ciclo de vida de los pedidos (pendientes, completados, cancelados, etc.)
- Operaciones - Datos de operaciones ejecutadas con información sobre «maker» y «taker»