📖 Descrição
Endpoint de Server-Sent Events (SSE) que transmite o PNL (Profit and Loss) em tempo real de uma posição de arbitragem spot-futuro aberta na Calculadora. A cada segundo, o servidor busca os preços de mercado atuais (spot + futuro), recalcula o spread e o PNL com base nos valores de entrada registrados, e emite o resultado.Este endpoint substitui o mecanismo de polling manual do frontend (chamadas
POST /v1/calculators/process a cada 5 segundos). Com SSE, a atualização é server-driven e mais eficiente — sem overfetching.🛠️ Requisição
Método
GET
URL
Query Parameters
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
email | string | Sim | Email do usuário dono da posição |
ticker | string | Sim | Par de trading (ex: BTC-USDT) |
exchange | string | Sim | Exchange da posição (ex: binance) |
Headers Necessários
| Header | Valor |
|---|---|
Accept | text/event-stream |
Cache-Control | no-cache |
Exemplo de Requisição (curl)
Exemplo de Requisição (JavaScript)
📤 Resposta
Headers da Resposta
| Header | Valor |
|---|---|
Content-Type | text/event-stream |
Cache-Control | no-cache |
Connection | keep-alive |
X-Accel-Buffering | no |
Frequência de Emissão
Um evento é emitido a cada 1 segundo. Internamente, os dados de mercado (spot + futuro) são buscados do MongoDB com cache de 5 segundos para evitar sobrecarga no banco.Formato dos Eventos SSE
Estrutura Completa do Payload JSON
Campos do Payload
| Campo | Tipo | Descrição |
|---|---|---|
email | string | Email do usuário |
ticker | string | Par de trading |
exchange | string | Exchange da posição |
entrySpotValue | float | Preço spot de entrada (registrado na posição) |
entryShortValue | float | Preço futuro de entrada (registrado na posição) |
entrySpotQty | float | Quantidade spot de entrada |
entryFuturesQty | float | Quantidade futuros de entrada |
entrySpread | float | Spread no momento da abertura (futuro − spot) |
entrySpreadPercentage | float | Spread de entrada em % |
currentSpotPrice | float | Preço spot atual |
currentFuturePrice | float | Preço futuro atual |
currentSpread | float | Spread atual (futuro − spot) |
currentSpreadPercentage | float | Spread atual em % |
fundingRate | float | Taxa de funding atual |
pnl | float | Lucro/prejuízo total em USDT |
pnlPercentage | float | Lucro/prejuízo em % sobre o capital empregado |
isProfitable | boolean | true se pnl > 0 |
Como o PNL é Calculado
📝 Códigos de Resposta
200 OK +
Content-Type: text/event-stream: Stream aberto com sucesso.400 Bad Request: Parâmetros obrigatórios ausentes:
email is requiredticker is requiredexchange is required
404 Not Found:
calculator not found — Não há posição salva para o par email + ticker fornecido. Salve os dados de entrada via POST /v1/calculators primeiro.💡 Integração no Frontend (hook React)
O projeto já fornece o hookuseCalculatorStream em src/hooks/useCalculatorStream.js:
Parâmetros do Hook
| Parâmetro | Tipo | Descrição |
|---|---|---|
email | string | Email do usuário |
ticker | string | Par de trading |
exchange | string | Exchange selecionada |
active | boolean | Liga/desliga o stream. false fecha o EventSource imediatamente |
Retorno do Hook
| Propriedade | Tipo | Descrição |
|---|---|---|
result | object | null | Último payload recebido do servidor |
connected | boolean | true enquanto o EventSource estiver aberto |
⚠️ Considerações
O stream retorna 404 se não houver uma entrada no banco para
email + ticker. Sempre salve os dados de entrada via POST /v1/calculators antes de abrir o stream.Os dados de mercado (spot + futuro) são buscados do MongoDB com cache interno de 5 segundos. Isso significa que o PNL pode ter até 5s de defasagem em relação ao mercado real — aceitável para monitoramento de posições de arbitragem, que não requerem latência de milissegundos.
Diferente do stream do Looker (que usa o
RealtimePriceCache WebSocket), o stream da Calculadora usa a coleção operations_future do MongoDB para obter o par de preços spot + futuro. Essa coleção é populada continuamente pelo motor de arbitragem.