CCXT: como os métodos WebSocket de order book realmente funcionam
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
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
- Métodos watch* — criam uma conexão persistente, recebem atualizações em streaming em tempo real
- 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 lotewatchOrderBookForSymbols— 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 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
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 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
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
fetchOrderBookWsou a API REST comum - Para snapshots ou inicialização
Otimização de desempenho
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
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
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
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.}
}
Authors
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.