Assinatura do livro de ofertas em tempo real da Hyperliquid

6 de mai. de 2026
  • hyperliquid orderbook websocket

  • real time hyperliquid api

  • hyperliquid livro de ofertas em tempo real

  • hyperliquid websocket subscribe

  • hyperliquid l2 book

O livro de ofertas é uma das estruturas de dados mais importantes de uma exchange. Ele mostra, em tempo real, a distribuição de preços e quantidades das ordens de compra e venda ainda não executadas. Para bots de trading quantitativo, sistemas de arbitragem e painéis de análise de mercado, receber o estado mais recente do livro com latência de milissegundos pode ser decisivo para a qualidade da estratégia.

A Hyperliquid oferece uma interface WebSocket completa para receber snapshots e atualizações incrementais do livro L2 em tempo real. Neste artigo, vamos abordar o formato de assinatura, a estrutura das mensagens, a manutenção de um livro de ofertas local e cuidados de engenharia para produção, como reconexão após queda. Para quem não quer construir essa infraestrutura do zero, o OneKey Perps já integra visualização de mercado em tempo real e um fluxo de trading pronto para uso.

WebSocket vs. polling via REST

Antes dos detalhes técnicos, vale entender por que usar WebSocket em vez de consultar uma API REST repetidamente.

Para casos que exigem livro de ofertas em tempo real, polling via REST quase nunca substitui bem uma conexão WebSocket. Consulte a documentação oficial da Hyperliquid para ver a especificação completa da interface WebSocket.

Estabelecendo a conexão WebSocket

Endpoint

O endpoint WebSocket da Hyperliquid, conforme a documentação oficial no momento deste artigo, é:

wss://api.hyperliquid.xyz/ws

Código básico de conexão

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:
        # Envia a mensagem de assinatura
        subscribe_msg = {
            "method": "subscribe",
            "subscription": {
                "type": "l2Book",
                "coin": "BTC"
            }
        }

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

        # Recebe mensagens continuamente
        async for raw_msg in ws:
            msg = json.loads(raw_msg)
            handle_message(msg)

asyncio.run(connect_and_subscribe())

Formato da mensagem de assinatura

Assinatura do livro L2

Para assinar o livro L2 de BTC:

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

A Hyperliquid permite assinar vários pares ao mesmo tempo. Basta enviar mensagens de assinatura separadas; cada mercado receberá suas próprias atualizações.

Cancelamento da assinatura

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

Tipos de mensagem: snapshot e atualizações incrementais

Snapshot inicial

Após a assinatura, o servidor envia primeiro um snapshot completo do livro, com a liquidez disponível em todos os níveis de preço:

{
  "channel": "l2Book",
  "data": {
    "coin": "BTC",
    "time": 1714500000000,
    "levels": [
      [
        [{"px": "64000.0", "sz": "0.5", "n": 3}],
        [{"px": "64010.0", "sz": "0.3", "n": 2}]
      ]
    ]
  }
}
  • px: preço
  • sz: quantidade total naquele nível de preço; quando for 0, indica que o nível foi esvaziado
  • n: número de ordens naquele nível de preço

No exemplo, os bids, ou ordens de compra, vêm do maior para o menor preço. Os asks, ou ordens de venda, vêm do menor para o maior preço.

Atualização incremental, ou delta

Depois do snapshot, o servidor passa a enviar apenas os níveis de preço que mudaram:

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

Quando sz for "0", "0.0" ou 0, significa que todas as ordens daquele nível foram executadas ou canceladas. Nesse caso, o nível deve ser removido do livro local.

Mantendo o estado local do livro de ofertas

Manter corretamente o livro local é o principal desafio ao consumir dados via WebSocket:

from sortedcontainers import SortedDict

class LocalOrderBook:
    def __init__(self, coin):
        self.coin      = coin
        self.bids      = SortedDict(lambda x: -float(x))  # compras: maior preço primeiro
        self.asks      = SortedDict(lambda x:  float(x))  # vendas: menor preço primeiro
        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

Lógica de processamento das mensagens

A lógica básica é identificar se a mensagem inicial deve ser tratada como snapshot e, depois disso, aplicar os deltas ao estado local:

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"Livro inicializado: {len(order_book.bids)} níveis de compra, "
            f"{len(order_book.asks)} níveis de venda"
        )
    else:
        order_book.apply_delta(data)

    # Exibe informações do book
    print(
        f"Melhor compra: {order_book.best_bid}, "
        f"melhor venda: {order_book.best_ask}, "
        f"spread: {order_book.spread}"
    )

Tratamento de quedas e reconexão

Conexões WebSocket podem cair por instabilidade de rede ou por encerramento do lado do servidor. Um sistema de produção precisa implementar reconexão automática:

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  # conexão bem-sucedida; reseta contador
                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)  # backoff exponencial, máximo de 60s
            print(f"Conexão caiu ({e}); tentando de novo em {wait}s, tentativa {retries}")
            is_initialized = False  # na próxima conexão, aguarde novo snapshot
            await asyncio.sleep(wait)

Ao reconectar, é importante resetar a flag is_initialized, porque o servidor deve enviar novamente um snapshot completo após a nova assinatura, não uma continuação dos deltas anteriores.

Sequência e ordem das mensagens

As mensagens WebSocket da Hyperliquid incluem um campo de timestamp, que pode ser usado para detectar mensagens fora de ordem. Em sistemas de produção, recomenda-se:

  • Registrar o timestamp da última mensagem processada; se uma nova mensagem tiver timestamp anterior, trate-a como antiga e descarte.
  • Se não houver mensagens por um período incomum, envie ping ou reconecte ativamente.
  • Em estratégias de alta frequência, considerar infraestrutura com menor latência, como nós geograficamente mais próximos ou conectividade dedicada.

Assinando vários mercados ao mesmo tempo

Uma única conexão WebSocket pode assinar vários pares. Para isso, uma arquitetura assíncrona costuma ser mais simples de manter:

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"])

Aplicações práticas

Dados de livro de ofertas em tempo real são usados em diversos cenários:

  • Bots de trading: ajustar dinamicamente preços de ordens com base no spread e na profundidade do book.
  • Sistemas de arbitragem: monitorar diferenças de preço entre Hyperliquid e outras plataformas, como dYdX e GMX.
  • Dashboards de mercado: visualizar profundidade do livro, histórico de spread e distribuição de liquidez.
  • Sistemas de risco: disparar alertas quando o spread aumenta de forma anormal ou a liquidez cai rapidamente.

OneKey Perps: sem precisar construir infraestrutura própria

Criar e manter um sistema próprio de livro de ofertas via WebSocket exige esforço de engenharia: reconexão, consistência do estado local, monitoramento, latência e tratamento de falhas.

Se o seu objetivo é operar contratos perpétuos, e não desenvolver uma infraestrutura quantitativa completa, o OneKey Perps oferece uma experiência prática com dados de mercado em tempo real e execução de trades em um fluxo integrado. Combinado à assinatura segura via carteira hardware OneKey, ele permite que você foque na tomada de decisão, mantendo uma separação mais clara entre custódia, assinatura e operação.

Para usuários que querem se conectar a aplicações descentralizadas via WalletConnect, a documentação do WalletConnect traz orientações de integração. A OneKey oferece suporte ao protocolo WalletConnect padrão, permitindo interagir com aplicações Web3 como a Hyperliquid de forma mais segura.

Se você busca um caminho direto para acompanhar o mercado e operar perps sem montar todo o backend de book, baixe ou experimente a OneKey e acesse o OneKey Perps pelo fluxo do aplicativo. Avalie o produto com calma, entenda os riscos e use apenas se ele fizer sentido para o seu perfil operacional.

Perguntas frequentes

Q1: A conexão WebSocket tem limite de concorrência?

Consulte a documentação oficial da Hyperliquid para ver limites de conexão. Em geral, evite abrir muitas conexões simultâneas a partir do mesmo IP. Para múltiplos mercados, prefira reutilizar uma única conexão sempre que possível.

Q2: Se eu perder uma mensagem incremental, o livro local fica incorreto?

Sim. Se um delta for perdido por problema de rede, o estado local pode divergir do estado real do servidor. A prática recomendada é fechar a conexão e assinar novamente quando houver suspeita de inconsistência, como spread anormal ou salto inesperado no melhor preço, para receber um novo snapshot.

Q3: Dados de livro de ofertas em tempo real servem para backtest?

Diretamente, não é o ideal. Backtest exige dados históricos, não apenas um fluxo em tempo real. Uma abordagem é armazenar os dados recebidos como tick data ao longo do tempo e, depois de acumular histórico suficiente, usá-los em pesquisas. Também é possível combinar com APIs de candles históricos da Hyperliquid para estudos iniciais.

Q4: Como saber se a conexão WebSocket está saudável?

Monitore indicadores simples: se a última mensagem recebida está dentro de um limite aceitável, como 5 segundos, e se a latência ping/pong está em uma faixa razoável. Caso algum indicador fique fora do esperado, acione reconexão ativa.

Q5: A carteira OneKey afeta a latência das ordens?

A assinatura com a carteira hardware OneKey normalmente leva centenas de milissegundos, o que é aceitável para a maioria das estratégias de trading. Para estratégias de frequência muito alta, como dezenas de ordens por segundo, pode ser mais adequado usar uma subconta API Agent com hot wallet para assinaturas frequentes, enquanto a conta principal e a gestão de fundos permanecem protegidas pela OneKey, separando responsabilidades.

Conclusão

A assinatura do livro de ofertas em tempo real é uma fonte de dados essencial para sistemas quantitativos de qualidade. A API WebSocket da Hyperliquid tem um desenho claro e, com uma boa estrutura de snapshot, delta, reconexão e validação de mensagens, desenvolvedores conseguem montar um book local confiável para bots de market making, arbitragem ou painéis de análise.

Para quem quer operar perps on-chain sem lidar com a camada de engenharia, o OneKey Perps é uma alternativa prática: combina visualização de mercado, fluxo de trading e assinatura segura com carteira hardware OneKey. Ainda assim, use com cautela, teste o fluxo antes e mantenha uma gestão de risco adequada.

Aviso de risco: dados de livro de ofertas em tempo real refletem apenas o estado do mercado em um momento específico e não devem ser usados como único critério de decisão. Estratégias automatizadas baseadas em book podem gerar perdas relevantes por volatilidade extrema, falhas técnicas ou erros de desenho da estratégia. Trading de contratos perpétuos envolve alto risco e pode resultar na perda total do capital. Este conteúdo é apenas uma referência técnica e não constitui recomendação de investimento, aconselhamento financeiro ou orientação legal. Opere somente depois de compreender os riscos.

Proteja sua jornada criptográfica com o OneKey

View details for Comprar OneKeyComprar OneKey

Comprar OneKey

A carteira de hardware mais avançada do mundo.

View details for Baixar aplicativoBaixar aplicativo

Baixar aplicativo

Alertas de golpe. Todas as moedas suportadas.

View details for OneKey SifuOneKey Sifu

OneKey Sifu

Clareza Cripto—A uma chamada de distância.