Considerações iniciais
O produto DataFeed está estruturado no formato de uma DLL (Dynamic Link Library), que é um conjunto de funções expostas que podem ser compartilhadas com outros softwares, para estes consumi-las.
Uma boa prática ao trabalhar neste formato e efetuar troca de dados é trabalhar diretamente com ponteiros de memória, sendo assim é intrínseco possuir uma documentação consistente para mapeamento de tipo na ponta consumidora ou ainda exemplos de uso. A extensão .dll é Windows-exclusive.
Modo de uso
A ProfitDLL possuí dois modos de uso: Market Data ou Roteamento + Market Data
Com Roteamento ativo você pode enviar e gerenciar ordens e posições da sua conta vinculada, além do Market Data para acompanhar cotações, negociação e etc.
Usabilidade
Para iniciar o uso do produto é necessário inicializarmos a conexão com nossos serviços de backend. Para isso usamos as funções DLLInitializeLogin (Roteamento + Market Data) ou DLLInitializeMarketLogin (Market Data).
Nesta função é esperado uma série de parâmetros, sendo os três primeiros, respectivamente, o código de ativação (ou licença) fornecido, usuário e senha de acesso à Nelogica.
Demais parâmetros são funções de callback, que serão invocadas nos respectivos eventos pela própria ProfitDLL e executará este evento no seu próprio código. Para isso, elas são referenciadas em determinado momento (neste caso na inicialização) para a ProfitDLL.
Abaixo um exemplo de chamada das funções de inicialização conforme nosso sample code em Python.
Detalhes sobre quando uma callback (ou evento) é disparado ou qual sua finalidade, poderá ser validado na documentação.
Adentrando um pouco no conceito de callbacks para a ProfitDLL, é usado o padrão de Delegate para definir referências a métodos com parâmetros e retornos específicos.
Portanto, vamos possuir um delegation para cada tipo de callback e a implementação de uma função que possua a assinatura deste delegation. Neste artigo vamos focar na TNewTradeCallback. Abaixo está a definição para o sample code em Python.
Delegate:
Ou seja, o bloco de código definido dentro da função "newTradeCallback" será executado à cada evento de novo negócio.
Output:
Lembrando que para receber estes dados (trade a trade) é necessário usar a função SubscribeTicker antes, para se "inscrever" no recebimento de dados de determinado instrumento.
Essa dinâmica funciona para a execução de todas callbacks: evento > triggers > callback
Definição manual de callbacks
Algumas callbacks precisam ser manualmente definidas após a inicialização da ProfitDLL, pois nem todas são referenciadas na inicialização. Um exemplo seria a TChangeCotationCallback, na qual vamos ter um mesmo delegate assim como vimos acima, mas precisamos referenciá-la para a ProfitDLL pela função SetChangeCotationCallback.
Delegate:
Definindo referência para a ProfitDLL:
Output:
Considerações finais
Devido as peculiaridades do Python, as funções expostas da DLL não precisam ser mapeadas, mas em linguagens como C# ou Delphi, precisamos mapear os métodos externos (DLLInitializeLogin, Subscribeticker, etc) previamente para utilização.
Ao trabalhar com altos volumes de dados (seja de trade a trade, livros, etc) faz-se necessário o uso de processamento paralelo para consumir todo o throughput das callbacks. Um uso comum é enfileirar os dados em uma fila de uma thread separada para processá-los paralelamente, pois processar tudo na main thread pode causar problemas de performance, quando trabalhando com altos volumes de dados.
Comentários
0 comentário
Artigo fechado para comentários.