A ProfitDLL entrega vários tipos de dado em tempo real — ou seja, sua aplicação recebe a notificação no momento em que o evento acontece no mercado. Para isso, sua aplicação faz uma assinatura (subscribe) e a DLL passa a disparar callbacks sempre que houver atualização.
Este artigo é o mapa das funções de tempo real disponíveis: para cada tipo de dado, qual Subscribe chamar, qual callback será disparado e o que esperar de cada um. Quando o tópico tiver artigo dedicado, ele é referenciado nos próximos passos.
Atenção: Antes de assinar qualquer dado, sua aplicação precisa estar inicializada e com a conexão completa. Os detalhes estão em Ecossistema ProfitDLL e primeiros passos.
O que está disponível em tempo real
| Dado | Função para assinar | Callback ativado |
| Trades (negócios executados) | SubscribeTicker | TConnectorTradeCallback (registrado via SetTradeCallbackV2) |
| Topo do livro (best bid/best ask) | SubscribeTicker | TTinyBookCallback (registrado na inicialização) |
| Livro de profundidade | SubscribePriceDepth | TConnectorPriceDepthCallback (registrado via SetPriceDepthCallback) |
| Livro de ofertas | SubscribeOfferBook | TOfferBookCallbackV2 (registrado via SetOfferBookCallbackV2) |
E, em paralelo, um dado importante que NÃO é tempo real:
| Dado | Como recebe | Callback |
| Dados consolidados do dia (OHLC, volume agregado) | Ativo automaticamente com SubscribeTicker | TNewDailyCallback (lento — atualizado periodicamente, não a cada trade) |
SubscribeTicker
Uma única assinatura — SubscribeTicker(ticker, bolsa) — ativa três callbacks de uma vez: trades, topo do livro e dados diários agregados. É o subscribe mais usado.
from ctypes import c_wchar_p
ret = profit_dll.SubscribeTicker(c_wchar_p("WINM26"), c_wchar_p("F"))
if ret != 0: # NL_OK == 0
raise RuntimeError(f"Falha ao assinar ticker: código {ret}")
A partir desse momento, os três callbacks correspondentes começam a disparar para esse ativo. Cada um entrega um tipo de informação diferente.
Trades em tempo real
Cada negócio executado no mercado dispara o TConnectorTradeCallback. A estrutura TConnectorTrade traz preço, quantidade, agentes comprador e vendedor, horário com precisão de milissegundo, e o tipo do trade (agressão de compra, agressão de venda, leilão, etc.).
A sintaxe completa do callback, exemplo Python, parsing de data e tabela de TradeType estão no artigo de trades históricos — o mesmo callback é usado para tempo real e histórico, apenas com Set*Callback diferente: SetTradeCallbackV2 para tempo real, SetHistoryTradeCallbackV2 para histórico.
Topo do livro (TinyBook)
O TTinyBookCallback é disparado sempre que o melhor preço de compra ou o melhor preço de venda muda. Diferente do livro de profundidade, ele só entrega a primeira posição de cada lado — útil para aplicações que precisam do spread, do bid/ask atual ou de um "ticker tape" simples.
from ctypes import WINFUNCTYPE, c_int, c_double
from profitTypes import TAssetID
# Assinatura: (asset, price, qty, side)
# side -> 0 = compra (bid), 1 = venda (ask)
TTinyBookCallback = WINFUNCTYPE(
None,
TAssetID, # asset (por valor)
c_double, # price
c_int, # qty
c_int, # side (0 = bid, 1 = ask)
)
def tiny_book_callback(asset, price, qty, side):
lado = "bid" if side == 0 else "ask"
print(f"{asset.ticker} | {lado} {price} x {qty}")Esse callback é normalmente informado na inicialização da DLL (parâmetro tiny_book_callback de DLLInitializeLogin ou DLLInitializeMarketLogin). Também é possível registrá-lo ou substituí-lo depois com SetTinyBookCallback.
Dados consolidados do dia (NÃO é tempo real)
O TNewDailyCallback entrega o OHLC do dia, volume financeiro acumulado, número de negócios e outras informações agregadas. Apesar de ativado pela mesma SubscribeTicker, ele não dispara a cada negócio — é atualizado em intervalos maiores, na ordem de segundos.
Use-o quando precisar do estado agregado do dia (candle diário, total negociado, máxima/mínima). Não o use para detectar trades individuais — para isso, use o TConnectorTradeCallback.
Cancelando a assinatura
profit_dll.UnsubscribeTicker(c_wchar_p("WINM26"), c_wchar_p("F")) Cancelar para de disparar os três callbacks acima para esse ativo.
SubscribePriceDepth
Assinatura específica para o livro de profundidade (ofertas agrupadas por nível de preço). Ativa o TConnectorPriceDepthCallback, e os dados são consultados sob demanda via GetPriceGroup e GetPriceDepthSideCount.
from profitTypes import TConnectorAssetIdentifier
asset = TConnectorAssetIdentifier()
asset.Version = 0
asset.Ticker = "WINM26"
asset.Exchange = "F"
asset.FeedType = 0
profit_dll.SubscribePriceDepth(byref(asset))A sintaxe completa do callback, leitura do livro, casos especiais de leilão com preço teórico e tipos de atualização (utAdd, utEdit, utDelete, utFlush, etc.) estão no artigo dedicado: Como utilizar o Livro de Profundidade (Price Depth) via DLL Real Time.
Para cancelar: profit_dll.UnsubscribePriceDepth(byref(asset)).
SubscribeOfferBook
Assinatura para o livro de ofertas — diferente do livro de profundidade, aqui cada oferta individual chega no callback, com seu agente, quantidade e preço. É o nível mais granular de informação do livro, e o que permite reconstruir agentes posicionados em cada nível.
ret = profit_dll.SubscribeOfferBook(c_wchar_p("WINM26"), c_wchar_p("F"))
if ret != 0:
raise RuntimeError(f"Falha ao assinar livro de ofertas: código {ret}") O callback ativado é o TOfferBookCallbackV2, registrado via SetOfferBookCallbackV2. Cada chamada recebe uma oferta com seus dados completos (agente, side, posição, preço, quantidade, ação — add/edit/delete).
Para cancelar: profit_dll.UnsubscribeOfferBook(c_wchar_p("WINM26"), c_wchar_p("F")).
Bom saber: Livro de ofertas × livro de profundidade: ambos são tempo real, mas servem a propósitos diferentes. O livro de profundidade entrega níveis de preço já agregados (preço, quantidade total no nível, número de ofertas) — bom para visualizar paredes de liquidez e calcular spread. O livro de ofertas entrega ofertas individuais com agente — bom para análise de fluxo de agentes, identificação de players e reconstrução granular do livro.
Boas práticas em callbacks de tempo real
Todos os callbacks de tempo real rodam na **ConnectorThread** da DLL. Bloquear essa thread compromete o pipeline inteiro de mensagens. Os pontos críticos:
- Apenas enfileire dentro do callback; processe em outra thread. O padrão produtor-consumidor com queue.Queue está descrito em *Ecossistema ProfitDLL e primeiros passos*.
- Nunca chame funções da DLL de dentro de um callback. A única exceção é TranslateTrade, no callback de trade V2.
- Mantenha vivas as referências dos callbacks. Atribua a WINFUNCTYPE(...)(funcao) a uma variável de escopo durável (atributo de classe ou global). Se o garbage collector liberar, a DLL chamará um ponteiro inválido e o processo trava sem aviso.
- Cancele assinaturas que não estão em uso. Em aplicações que monitoram muitos ativos, manter assinaturas ativas desnecessariamente aumenta o volume de callbacks processados e degrada a performance em momentos de alta volatilidade.
- Lembre-se que TConnectorAssetIdentifier chega por valor nos callbacks modernos. Não use POINTER ao declarar a assinatura com WINFUNCTYPE — passe a struct diretamente.
Próximos passos
- Livro de profundidade (price depth) — veja Como utilizar o Livro de Profundidade (Price Depth) via DLL Real Time.
- Histórico de trades — veja Como requisitar trades históricos com a ProfitDLL.
- Roteamento de ordens — veja Como rotear ordens com a ProfitDLL.
Para mais informações, encaminhe um e-mail para corporativo@nelogica.com.br.
Achou útil este conteúdo?
Não esqueça de nos avaliar abaixo.
Desejamos bons trades!