← Voltar aos artigos
June 3, 2025
5 min read

CCXT: como os métodos WebSocket de order book realmente funcionam

CCXT: como os métodos WebSocket de order book realmente funcionam
#CCXT
#WebSocket
#orderbook
#exchanges
#API
#trading
#cryptocurrency
📖
Part 1 of 6 · Collection
Order Book & Market Microstructure

Olá! Hoje vamos nos aprofundar em um dos temas mais importantes para desenvolvedores de sistemas de trading: como funcionam os métodos WebSocket para obter order books na CCXT. Se você já se perguntou "por que esse método está na documentação mas não funciona na prática?" ou "qual método escolher para monitorar mais de 100 pares de negociação?", este artigo é para você.

Introdução: por que isso importa

Ao trabalhar com CCXT para coleta de dados de mercado, muitos se deparam com questões críticas:

  • Quais métodos WebSocket para order books são realmente suportados nas diferentes exchanges?
  • Como os métodos diferem em volume de tráfego e estrutura de dados?
  • Por que testes automatizados podem mostrar "✓" enquanto o método não funciona na prática?

Neste artigo, uma análise detalhada dos métodos mais populares, suas características e a situação real com mais de 75 exchanges.

Visão geral dos métodos principais

Visão geral dos métodos WebSocket de order book Quatro métodos WebSocket principais para dados de order book: assinatura individual, assinatura em lote, monitoramento do top of book e snapshot único

As APIs modernas das exchanges oferecem várias formas de obter dados de order book via WebSocket. Vamos examinar cada uma delas:

1. watchOrderBook - Abordagem clássica

Este é o método principal para assinar atualizações do order book de um único par de negociação.

Características principais:

  • Propósito: assinar atualizações do order book de um par
  • Tipo de conexão: conexão WebSocket persistente
  • Dados: order book completo (geralmente 100–1000 níveis por lado)
  • Tráfego: médio a alto, dependendo da frequência de atualização e da profundidade

Exemplo de uso:

const exchange = new ccxt.pro.binance();
const orderbook = await exchange.watchOrderBook('BTC/USDT');
console.log(orderbook);

2. watchOrderBookForSymbols - Assinatura em lote

Este método permite assinar vários pares de negociação simultaneamente, se a exchange suportar.

Características principais:

  • Propósito: assinar vários pares de uma vez
  • Tipo de conexão: WebSocket persistente, geralmente uma conexão para vários pares
  • Dados: para cada par — order book completo
  • Tráfego: muito alto com um grande número de pares (100–1000 níveis × 2 lados × número de pares)

Exemplo de resposta:

{
  "BTC/USDT": {
    "bids": [[50000.1, 1.5], [50000.0, 2.1]],
    "asks": [[50001.0, 1.2], [50001.1, 0.8]],
    "timestamp": 1717398000000,
    "datetime": "2025-06-03T12:00:00Z"
  },
  "ETH/USDT": {
    "bids": [[3000.5, 10.2], [3000.4, 5.7]],
    "asks": [[3001.0, 8.3], [3001.1, 12.1]],
    "timestamp": 1717398000000,
    "datetime": "2025-06-03T12:00:00Z"
  }
}

Aviso importante: na realidade, não é suportado em todas as exchanges. Às vezes o método existe na API, mas não está implementado.

3. watchBidsAsks - Monitoramento otimizado

A forma mais econômica de acompanhar os melhores preços em vários pares de negociação.

Características principais:

  • Propósito: assinar apenas os melhores preços (top of book) para vários pares
  • Tipo de conexão: WebSocket persistente, geralmente uma conexão para todos os pares
  • Dados: apenas um preço por lado (bid/ask)
  • Tráfego: mínimo, adequado para monitorar um grande número de pares

Exemplo de resposta:

{
  "BTC/USDT": {
    "bids": [[50000.1, 1.5]],
    "asks": [[50001.0, 1.2]],
    "timestamp": 1717398000000,
    "datetime": "2025-06-03T12:00:00Z"
  },
  "ETH/USDT": {
    "bids": [[3000.5, 10.2]],
    "asks": [[3001.0, 8.3]],
    "timestamp": 1717398000000,
    "datetime": "2025-06-03T12:00:00Z"
  }
}

Particularidade: geralmente implementado via endpoint de ticker — economiza recursos tanto para o cliente quanto para a exchange.

4. fetchOrderBookWs - Solicitações pontuais

Alternativa à API REST para obter snapshots de order book.

Características principais:

  • Propósito: solicitação pontual de order book via WebSocket (semelhante a REST)
  • Tipo de conexão: WebSocket temporário, a conexão fecha após receber os dados
  • Dados: snapshot do order book
  • Tráfego: mínimo

Diferenças importantes e comparação de métodos

Entender as diferenças entre os métodos é fundamental para escolher a abordagem certa:

Conexões persistentes vs. temporárias

  1. Métodos watch* — criam uma conexão persistente, recebem atualizações em streaming em tempo real
  2. Métodos fetch* — usam WebSocket apenas para uma solicitação pontual, semelhante à API REST

Comparação de tráfego

watchBidsAsks vs. watchOrderBookForSymbols:

  • watchBidsAsks — de 100 a 1000 vezes menos tráfego, ideal para monitoramento em lote
  • watchOrderBookForSymbols — poderoso, mas muito pesado em tráfego e não suportado por todas as exchanges

Exemplo de cálculo de tráfego:

  • watchBidsAsks para 100 pares: ~100 registros (1 bid/ask por par)
  • watchOrderBookForSymbols para 100 pares: ~100.000-1.000.000 registros (100-1000 níveis × 2 lados × 100 pares)

Comparação de tráfego dos métodos de order book Comparação visual da intensidade de dados entre o order book completo e os métodos top of book (bids/asks)

Caso prático: Gate.io e a realidade versus a documentação

Documentação vs. realidade A lacuna entre uma documentação de API limpa e o comportamento real da exchange

Vamos analisar um exemplo real de como a documentação pode não corresponder à prática.

Teste: watchOrderBookForSymbols na Gate.io

Tentativa de assinar 10 pares de negociação populares:

const symbols = [
  '1CAT/USDT:USDT',
  '1INCH/USDT:USDT',
  'A8/USDT:USDT',
  'AAVE/USDT:USDT',
  'ACE/USDT:USDT',
  'ACH/USDT:USDT',
  'ACT/USDT:USDT',
  'ACX/USDT:USDT',
  'ADA/USDT:USDT',
  'ADX/USDT:USDT'
];

const exchange = new ccxt.pro.gateio();
try {
  const orderbooks = await exchange.watchOrderBookForSymbols(symbols);
  console.log('Success!', orderbooks);
} catch (error) {
  console.error('Error:', error.message);
}

Resultado real:

NotSupported: gateio watchOrderBookForSymbols() is not supported yet

Lição importante: mesmo que um método esteja declarado na documentação da API, isso não garante que funcione em uma exchange específica. Sempre teste na prática!

Auditoria automatizada: o que é realmente suportado

Matriz de auditoria de compatibilidade de exchanges Matriz de compatibilidade mostrando o suporte real dos métodos em mais de 75 exchanges de criptomoedas

Para obter um retrato real do suporte dos métodos, foi escrito um script para verificar todas as exchanges da CCXT:

const ccxt = require('ccxt');

async function checkAllExchangeMethods() {
    const results = [];
    
    // Get list of all supported exchanges
    const exchangeIds = ccxt.pro.exchanges;
    
    for (const exchangeId of exchangeIds) {
        try {
            const exchange = new ccxt.pro[exchangeId]();
            
            // Check for method presence
            const hasWatchOrderBook = typeof exchange.watchOrderBook === 'function';
            const hasWatchBidsAsks = typeof exchange.watchBidsAsks === 'function';
            const hasWatchOrderBookForSymbols = typeof exchange.watchOrderBookForSymbols === 'function';
            
            // Check spot and futures support
            const hasSpot = exchange.has['spot'];
            const hasFutures = exchange.has['future'] || exchange.has['swap'];
            
            results.push({
                exchange: exchangeId,
                spot: hasSpot,
                futures: hasFutures,
                watchOrderBook: hasWatchOrderBook,
                watchBidsAsks: hasWatchBidsAsks,
                watchOrderBookForSymbols: hasWatchOrderBookForSymbols
            });
            
        } catch (error) {
            console.error(`Error checking ${exchangeId}:`, error.message);
        }
    }
    
    return results;
}

// Run the check
checkAllExchangeMethods().then(results => {
    console.table(results);
});

Resultados da auditoria (fragmento das principais exchanges)

Exchange        | Spot (OB/BA/OBS) | Futures (OB/BA/OBS)
----------------------------------------------------------
binance         | ✓/✓/✓            | ✓/✓/✓
bybit           | ✓/✓/✓            | ✓/✓/✓
okx             | ✓/✓/✓            | ✓/✓/✓
gateio          | ✓/✓/✓            | ✓/✓/✓
mexc            | ✓/✓/✓            | ✓/✓/✓
kucoin          | ✓/✓/✓            | ✓/✓/✓
huobi           | ✓/✓/✓            | ✓/✓/✓
bitget          | ✓/✓/✓            | ✓/✓/✓

Observação importante:
O script verifica apenas a presença do método no objeto JavaScript, não o suporte real por parte da exchange. Portanto, um "✓" nem sempre significa funcionalidade — como vimos no exemplo da Gate.io.

Recomendações práticas para escolha do método

Árvore de decisão para escolha do método Fluxograma de decisão para escolher o método WebSocket certo com base no seu caso de uso

Para diferentes casos de uso

1. Monitoramento de um grande número de pares (100+):

  • Use watchBidsAsks
  • Tráfego mínimo
  • Obtenha apenas os melhores preços
  • Ideal para bots de arbitragem

2. Construção de um order book completo para um par:

  • Use watchOrderBook
  • Profundidade de mercado completa
  • Adequado para estratégias de market making

3. Monitoramento de vários pares com profundidade completa:

  • Primeiro tente watchOrderBookForSymbols
  • Se não for suportado — use múltiplos watchOrderBook
  • Considere os limites da exchange quanto ao número de conexões

4. Obtenção pontual de dados:

  • Use fetchOrderBookWs ou a API REST comum
  • Para snapshots ou inicialização

Otimização de desempenho

Otimização de conexões: muitas vs. multiplexadas Conexões individuais caóticas (esquerda) vs. conexão WebSocket multiplexada otimizada (direita)

Gerenciamento de conexões:

// Bad: creating multiple connections
const symbols = ['BTC/USDT', 'ETH/USDT', 'ADA/USDT'];
const orderbooks = await Promise.all(
    symbols.map(symbol => exchange.watchOrderBook(symbol))
);

// Good: one connection for all pairs (if supported)
try {
    const orderbooks = await exchange.watchOrderBookForSymbols(symbols);
} catch (error) {
    // Fallback to individual subscriptions
    const orderbooks = await Promise.all(
        symbols.map(symbol => exchange.watchOrderBook(symbol))
    );
}

Gerenciamento de profundidade:

// Limit depth to save traffic
const orderbook = await exchange.watchOrderBook('BTC/USDT', 20); // only 20 levels

Tratamento de erros e recuperação de conexão

Tratamento de erros e retry com backoff exponencial Recuperação resiliente de conexão com padrão de retry de backoff exponencial

As conexões WebSocket podem cair, por isso um tratamento de erros adequado é importante:

async function robustWatchOrderBook(exchange, symbol, maxRetries = 3) {
    let retries = 0;
    
    while (retries < maxRetries) {
        try {
            const orderbook = await exchange.watchOrderBook(symbol);
            retries = 0; // reset counter on success
            return orderbook;
        } catch (error) {
            retries++;
            console.error(`Subscription error (attempt ${retries}):`, error.message);
            
            if (retries >= maxRetries) {
                throw new Error(`Failed to subscribe after ${maxRetries} attempts`);
            }
            
            // Exponential backoff
            await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, retries)));
        }
    }
}

Monitoramento da qualidade dos dados

Pipeline de validação de qualidade de dados Dados de order book fluindo por pontos de verificação de validação: estrutura, atualidade e lógica de spread

É importante acompanhar a qualidade dos dados recebidos:

function validateOrderBook(orderbook) {
    // Check basic structure
    if (!orderbook.bids || !orderbook.asks) {
        throw new Error('Invalid orderbook structure');
    }
    
    // Check data freshness
    const now = Date.now();
    const dataAge = now - orderbook.timestamp;
    if (dataAge > 10000) { // older than 10 seconds
        console.warn('Stale orderbook data:', dataAge, 'ms');
    }
    
    // Check price logic
    const bestBid = orderbook.bids[0] ? orderbook.bids[0][0] : 0;
    const bestAsk = orderbook.asks[0] ? orderbook.asks[0][0] : 0;
    
    if (bestBid >= bestAsk && bestBid > 0 && bestAsk > 0) {
        console.warn('Crossed spread:', { bestBid, bestAsk });
    }
}

Conclusões e boas práticas

Com base na experiência prática com a CCXT, aqui estão as principais recomendações:

1. Não confie apenas na documentação

Sempre teste os métodos com dados reais antes de implementá-los em produção. A presença de um método na API não garante sua funcionalidade.

2. Escolha o método adequado para a tarefa

  • Monitoramento em lote: watchBidsAsks
  • Análise detalhada: watchOrderBook
  • Solicitações pontuais: fetchOrderBookWs

3. Otimize o tráfego

Para monitorar um grande número de pares, watchBidsAsks pode ser até 1000 vezes mais eficiente que watchOrderBookForSymbols.

4. Prepare-se para falhas

Implemente uma lógica de retry robusta e monitoramento de qualidade de dados.

5. Teste sob cargas de produção

O comportamento da API pode diferir drasticamente sob carga em comparação com solicitações de teste.

O futuro das APIs WebSocket para order books

Evolução das APIs WebSocket De conexões fragmentadas entre exchanges para protocolos de API unificados e padronizados

O setor está caminhando para abordagens mais padronizadas:

  • Unificação de métodos entre exchanges
  • Documentação aprimorada com exemplos reais
  • Protocolos de compressão de dados mais eficientes
  • Melhores ferramentas de depuração e monitoramento

Conclusão

APIs WebSocket para order books são ferramentas poderosas, mas exigem um entendimento profundo das particularidades de cada exchange. A CCXT simplifica significativamente o trabalho ao unificar interfaces, mas a realidade ainda é mais complexa do que a documentação.

A chave para o sucesso é testar, monitorar e escolher os métodos certos para tarefas específicas. Lembre-se: o que funciona em uma exchange pode não funcionar em outra, mesmo que as APIs pareçam idênticas.

Um sistema de trading bem-sucedido não é composto apenas de algoritmos corretos, mas também de uma infraestrutura de dados confiável. E os métodos WebSocket da CCXT são uma parte importante dessa infraestrutura.

Qual é a sua experiência com as APIs WebSocket das exchanges? Você já enfrentou problemas inesperados? Compartilhe nos comentários!

Links úteis

Citação

@software{soloviov2025ccxtprowebsocketorderbook,
  author = {Soloviov, Eugen},
  title = {CCXT: How WebSocket Orderbook Methods Really Work},
  year = {2025},
  url = {https://marketmaker.cc/en/blog/post/ccxt-pro-websocket-orderbook-methods},
  version = {0.1.0},
  description = {Detailed breakdown of CCXT WebSocket methods for orderbooks: watchOrderBook, watchBidsAsks, watchOrderBookForSymbols. Real tests on 75+ exchanges.}
}
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Fique à frente do mercado

Assine nossa newsletter para insights exclusivos sobre trading com IA, análises de mercado e atualizações da plataforma.

Respeitamos sua privacidade. Cancele a inscrição a qualquer momento.