Documentation Index
Fetch the complete documentation index at: https://docs.arbitragem-crypto.cloud/llms.txt
Use this file to discover all available pages before exploring further.
Arbitragem em Tempo Real via WebSocket
O fluxo WebSocket é completamente independente do fluxo REST existente. Ambos rodam em paralelo — o WebSocket adiciona latência ultrabaixa sem afetar a estabilidade do processamento REST de 19 segundos.
🎯 Visão Geral
O sistema possui dois fluxos de integração complementares:| Característica | Fluxo REST (existente) | Fluxo WebSocket (novo) |
|---|---|---|
| Frequência | A cada 19 segundos | Contínuo (event-driven) |
| Latência | ~10–19 s | < 200 ms |
| Exchanges | 17 (polling) | 12 (fase 1–3) + 5 (REST-only) |
| Entrega ao frontend | HTTP polling | Server-Sent Events (SSE) |
| Persistência | MongoDB (operacoes) | MongoDB (operations_realtime) |
| Ativação | Sempre ativo | ENABLED_WEBSOCKET=1 |
🏗️ Arquitetura dos Componentes
Componentes Principais
WebSocketExchangeHandler
Interface contratual para cada exchange. Implementa
Connect(), Name() e HealthCheck(). Cada exchange tem sua própria implementação.RealtimePriceCache
Cache thread-safe em memória. Preserva volume REST quando o tick WebSocket não o fornece. Fornece
GetAll() no mesmo formato do fluxo REST.RealtimeArbitrageEngine
Motor de detecção. Debounce de 200ms por símbolo evita processamento excessivo. Reutiliza
CompareBaseQuotePrices() do fluxo REST sem duplicação de código.SSEBroadcaster
Fan-out de Server-Sent Events para todos os browsers conectados. Cada cliente recebe um canal dedicado com backpressure automático.
WebSocketManager
Singleton orquestrador. Gerencia reconexão automática com backoff exponencial (1s → 2s → 4s → 8s → 16s máx).
🔄 Fluxo de Dados Detalhado
1. Conexão e Seed de Volume
Ao conectar, o handler WebSocket da Binance:- Chama a REST API pública para buscar snapshot de volume (24h) de todos os pares
- Alimenta o
RealtimePriceCachecom os dados iniciais - Abre conexão WebSocket:
wss://stream.binance.com:9443/ws - Subscreve o stream
!bookTicker(todos os pares, bid/ask em tempo real) - Inicia timer de 60s para refresh periódico do volume via REST
2. Processamento de Ticks
3. Reconexão Automática
⚡ Ativação
O fluxo WebSocket é controlado por variável de ambiente para garantir zero impacto em produção enquanto não estiver pronto:Se
ENABLED_WEBSOCKET não estiver definido ou for qualquer outro valor, o fluxo WebSocket não é iniciado e nenhum recurso adicional é consumido.📡 Endpoints SSE
Cinco endpoints HTTP expõem os dados do fluxo WebSocket:| Endpoint | Tipo | Descrição |
|---|---|---|
GET /v1/realtime/status | JSON | Status de cada handler WebSocket |
GET /v1/realtime/arbitrage | SSE stream | Oportunidades de arbitragem em tempo real |
GET /v1/realtime/prices | SSE stream | Snapshot completo de preços a cada 1s |
GET /v1/lookers/{id}/stream | SSE stream | Preços filtrados das cryptos de um Looker específico |
GET /v1/calculators/stream | SSE stream | PNL em tempo real de uma posição de arbitragem aberta |
Streams por Caso de Uso
/v1/realtime/prices
Dashboard global — todos os pares de todas as exchanges. Volume alto (~900 KB/s em 6 exchanges). Use com moderação.
/v1/realtime/arbitrage
Oportunidades — somente pares com spread positivo detectado. Payload compacto, ideal para alertas.
/v1/lookers/{id}/stream
Monitoramento pessoal — preços ask/bid apenas das cryptos configuradas no Looker do usuário (máx. 6 pares). Com campo
stale para detectar dados desatualizados./v1/calculators/stream
PNL da posição — PNL calculado a cada 1s para uma posição spot-futuro aberta. Usa dados de mercado do MongoDB com cache de 5s.
Consumo no Frontend (EventSource)
A API
EventSource do browser reconecta automaticamente ao servidor em caso de desconexão, sem necessidade de lógica adicional no frontend.🗄️ Persistência
Oportunidades detectadas pelo motor WebSocket são salvas na coleçãooperations_realtime do MongoDB:
A coleção
operations_realtime é projetada para ter TTL curto — os dados são efêmeros por natureza, servindo principalmente como auditoria e buffer para clientes que se reconectam.🔌 Exchanges Suportadas
Fase 1 e 2 — Concluídas ✅
| Exchange | Stream | Status |
|---|---|---|
| Binance | wss://stream.binance.com:9443/ws — !bookTicker | ✅ Implementado |
| OKX | wss://ws.okx.com:8443/ws/v5/public — tickers | ✅ Implementado |
| Bybit | wss://stream.bybit.com/v5/public/spot — tickers | ✅ Implementado |
| KuCoin | wss://ws-api.kucoin.com — market/ticker:all | ✅ Implementado |
| Gate.io | wss://api.gateio.ws/ws/v4/ — spot.tickers | ✅ Implementado |
| HTX | wss://api.huobi.pro/ws — market.$symbol.bbo | ✅ Implementado |
Fase 3 — Planejada 🔄
| Exchange | Stream |
|---|---|
| Bitget | wss://ws.bitget.com/v2/ws/public — tickers |
| Kraken | wss://ws.kraken.com — ticker |
| Bitfinex | wss://api-pub.bitfinex.com/ws/2 — ticker |
| BingX | wss://open-api-ws.bingx.com/market — tickers |
| MEXC | wss://wbs.mexc.com/ws — spot@public.bookTicker.v3.api |
| Crypto.com | wss://stream.crypto.com/exchange/v1/market — ticker |
Fase 4 — REST-only (sem WebSocket público)
| Exchange | Motivo |
|---|---|
| Mercado Bitcoin | Sem WebSocket público documentado |
| Foxbit | API privada apenas |
| Novadax | REST polling suficiente |
| Bitso | WebSocket requer autenticação |
🧪 Interface do Handler
Para adicionar suporte a uma nova exchange, implemente a interfaceWebSocketExchangeHandler:
WebSocketManager:
📊 Monitoramento
Use o endpoint/v1/realtime/status para verificar a saúde de cada handler:
- ✅ Fase 1 + 2 concluídas: 6 exchanges com WebSocket ativo (Binance, OKX, Bybit, KuCoin, Gate.io, HTX)
- ✅ Looker Stream:
GET /v1/lookers/{id}/stream— preços filtrados por Looker - ✅ Calculator Stream:
GET /v1/calculators/stream— PNL em tempo real da posição - 🔄 Fase 3: Bitget, Kraken, Bitfinex, BingX, MEXC, Crypto.com
- 🔄 Fase 4: Avaliar alternativas para exchanges REST-only