Bovespa, parser pra FIX, Boost.Asio e assíncronia.

513 views
Skip to first unread message

Marcelo Zimbres

unread,
Sep 10, 2017, 2:21:22 PM9/10/17
to ccppb...@googlegroups.com
Olá pessoal,

Há um tempo atrás eu fiz um programa para análise das séries históricas dos
preços de ações na Bovespa. Esses dias eu estava pensando em como
seria caso eu quisesse a série em tempo real. Como não tenho
experiência nenhuma no mercado financeiro, queria saber se vocês podem
ajudar.

Minha concepção atual do problema é a seguinte

1) Abrir uma conta em alguma corretora que me provenha acesso FIX a Bovespa [1].
2) Conectar meu cliente (TCP/IP) com o servidor da corretora.
3) Parsear of pacotes FIX e fazer a analise que quiser.

Pelo menos essa é a impressão que eu tive do funcionamento dos clientes tipo
Metatrader.

Finalmente a parte C++.
==============================

A) O que se recomenda como parser pra FIX? Eu encontrei apenas essas
duas libs [1, 2] e não simpatizei muito já que parecem misturar a
parte de I/O e threads com o parser. Uma delas é inclusive uma API C.

Minha ideia original é de usar um cliente Boost.Asio TCP/IP, SSL com um parser
pra FIX e pronto.

B) A segunda pergunta não pertence necessariamente a essa thread. Eu
uso Asio com frequência no trabalho e estou bem acostumado com o
modelo de programação com callbacks, mas o que outras libs e
linguagens (C#, Java) oferecem como opção ao modelo da Asio?

O C++11 oferece por exemplo std::futures que até hoje pra mim não serviram pra
nada. As corotinas dão uma cara melhor ao código mas ainda não tive a
impressão que vou abandonar o loop de eventos e callbacks como feito na Asio
tão cedo [4].

Se trata inicialmente de um projeto de horas vagas, mas quem sabe eu
encontro um jeito de ficar rico :)

Marcelo

[1] http://www.bmfbovespa.com.br/pt_br/servicos/negociacao/acesso-direto-ao-mercado-dma/sobre-dma/
[2] http://www.quickfixengine.org/
[3] https://github.com/libtrading
[4] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3896.pdf

Virgilio Fornazin

unread,
Sep 10, 2017, 2:37:57 PM9/10/17
to ccppb...@googlegroups.com
1) Abrir uma conta em alguma corretora que me provenha acesso FIX a Bovespa [1].
Nenhuma corretora vai te prover acesso direto ao mercado (DMA) a B3. Eles são responsáveis primários por qualquer coisa errada que ocorrer.
Você vai precisar passar por um sistema de backoffice intermediario deles para enviar ordens e negociar, passando por todos os critérios (riscos, 
margens, etc). A não ser que você tenha muita (milhoes) grana.

2) Conectar meu cliente (TCP/IP) com o servidor da corretora.
Depende muito.

3) Parsear of pacotes FIX e fazer a analise que quiser.
Cada corretora tem um sistema proprio para disponibilizar as cotacoes pra voce: FIX, 'homemade protocols', FAST (Fix Adapter for STreaming) nativo da bolsa, mas
geralmente não abrem seus sistemas assim. Não quer dizer que seja impossível.

A) quickfix 90% do mercado usa ele. funciona. cada um tem sua versão com suas otimizações.

B) C# tem BeginRead/EndRead com callbacks no framework, fora outros frameworks existentes, Java idem.

[4] http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp. Da pra programar sequencial sem se preocupar com os callbacks 
e da pra fazer algo enquanto a operação assincrona se completa. Mas não é o mesmo molde dos callbacks mesmo. Se quiser algo de futures legal, procure o Seastar/OSv

>>Se trata inicialmente de um projeto de horas vagas, mas quem sabe eu encontro um jeito de ficar rico :)
BTC é algo a se considerar ;-) a bolsa é bem mais complicado



--
Antes de enviar um e-mail para o grupo leia:
                     http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------------------------
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-unsubscribe@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~------------

André Tupinambá

unread,
Sep 10, 2017, 4:16:35 PM9/10/17
to C/C++ Brasil
Tem várias maneiras de investir na bolsa. A maioria envolve olhar os preços, tentar identificar um padrão e "prever" (ou "calcular a probabilidade" se você preferir) o que vai acontecer depois. Todas essas dessa maioria estão fadadas a fazer você girar muito dinheiro e perder tudo no final.

Se fosse fácil fazer um algoritmo e ganhar um monte de dinheiro na bolsa, nenhum analista de sistemas trabalhava. Nem banco precisava emprestar dinheiro para ninguém, correndo o risco de não receber de volta. Melhor ainda, pra que criar uma empresa e ter toda a dor de cabeça de administrar ela? Era só colocar um algoritmo na bolsa!

Não to dizendo que não tem gente que investe assim e ganha. Mas com certeza não é de uma hora pra outra que se chega lá.

Como eu sou meio burro, fico só Buy and Hold, que é mais fácil.

Marcelo Zimbres

unread,
Sep 10, 2017, 4:40:55 PM9/10/17
to ccppb...@googlegroups.com
A minha ideia é um acesso read-only só como coisa pra brincar, ver como o sistema funciona e as coisas acontecendo em tempo real. Um algoritimo de compra e venda seria pretensão demais.

Não me pareceu inicialmente um bicho de sete cabecas, estabelecer um conexão tcp com um servidor, parsear o pacote e pronto. O próprio protocolo Fix parece bem simples também.

Ver apenas gráficos no browser me dá a sensacão de que tem muitas camadas embaixo de mim.

Valeu,
Marcelo

Felipe Lavratti

unread,
Sep 11, 2017, 9:56:08 AM9/11/17
to ccppbrasil
A BolsaFinanceira tinha uma API para vc fazer query em tempo real nos ativos, vc pagava alguns centavos por query. N sei se eles ainda tem o produto, entra em contato com eles para verificar. Eu usava essa api nas minhas análises automatizadas.

Várias corretoras tem uma API de Excel para atualizar planilhas com os valores em tempo real dos tickets (Clear, Xp, Rico, etc.), dá uma pesquisada se vc consegue usar essa API em C++.

Depois eu tenho um protótipo de app para automatização do pgto de imposto de renda em portfólios de renda variável que eu estava desenvolvendo para empreender, se quiser tocar o projeto entra em contato.

Abraços!

Rodrigo Strauss

unread,
Sep 13, 2017, 10:59:24 AM9/13/17
to ccppbrasil
Série em tempo real você quer dizer os preços em tempo real? O mercado chama isso de "feed de cotação". Várias empresas prestam esse serviço: Agência Estado, Cedro, CMA, ValeMobi. Praticamente todos os concorrentes da minha empresa, a Intelitrader :-)

Essa API Excel que o Felipe falou é DDE ou RTD. Dá pra receber em C++ sem problemas.

Geralmente cotações são enviadas pelos Vendors (provedores de dados de mercado) em protocolos propri-otários. É pegar o manual espartano (quando existe) e sofrer no debugger. Talvez tenha vendor que entregue em FIX, mas eu não conheço. Para isso o QuickFix resolve muito bem. Não é a melhor coisa do mundo mas o código do QuickFix é simples, objetivo e fácil de debugar.

Para mandar ordens você precisa de uma corretora que aceite ordens FIX. Ligue na sua corretora e pergunte. Dá pra usar MetaTrader também, algumas corretoras oferecem.

Pra ficar rico na bolsa você precisa ter capital inicial e dedicar muitas horas por dia. Só considere se gastar essas horas com programação não é mais vantajoso financeiramente. Entre procurar ouro e vender pá eu escolhi a segunda opção e estou bem feliz com ela. YMMV.

Rodrigo Strauss
http://www.1bit.com.br
@rodrigostrauss

--

Marcelo Zimbres

unread,
Sep 13, 2017, 2:48:53 PM9/13/17
to ccppb...@googlegroups.com
Em 10 de setembro de 2017 15:37, Virgilio Fornazin
<virgilio...@gmail.com> escreveu:
> [4]
> http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp.
> Da pra programar sequencial sem se preocupar com os callbacks
> e da pra fazer algo enquanto a operação assincrona se completa. Mas não é o
> mesmo molde dos callbacks mesmo. Se quiser algo de futures legal, procure o
> Seastar/OSv

Tinha dado uma olhada nesse exemplo uns dias antes de iniciar essa
thread, foi inclusive um dos motivos por ter tocado no assunto
callback, futures, coroutinas. Achei extremamente desajeitado, parece
que está lá só por completude dos exemplos mesmo, não consigo imaginar
alguém usando na prática.

Marcelo

Marcelo Zimbres

unread,
Sep 13, 2017, 3:20:25 PM9/13/17
to ccppb...@googlegroups.com
Em 13 de setembro de 2017 11:58, Rodrigo Strauss <rod...@1bit.com.br> escreveu:
> Série em tempo real você quer dizer os preços em tempo real?

Sim é o que eu tinha em mente.

> Essa API Excel que o Felipe falou é DDE ou RTD. Dá pra receber em C++ sem
> problemas.

Bom saber. Value Felipe.

> Geralmente cotações são enviadas pelos Vendors (provedores de dados de
> mercado) em protocolos propri-otários. É pegar o manual espartano (quando
> existe) e sofrer no debugger. Talvez tenha vendor que entregue em FIX, mas
> eu não conheço. Para isso o QuickFix resolve muito bem. Não é a melhor coisa
> do mundo mas o código do QuickFix é simples, objetivo e fácil de debugar.

Qual a vantagem pra corretora em alterar o formato em que ela comunica
com a Bovespa (B3)
e oferecer uma coisa bugada pro cliente que ela ainda tem que dar
manutenção? Só consigo
pensar em impedir que o cliente troque de corretora, mas dado que
(acho) a maioria dos clientes
usam ferramentas que abstraem o protocolo parece estranho.

Bom saber que o quickfix é difundido. Como eu disse antes, pegar um
exemplo da ASIO, e ligar
um parser FIX é bem simples. Parece mais uma questão de ter acesso aos dados.

Outro coisa que me motivou a saber mais do assunto foi essa thread no
SG14 onde o pessoal
está discutindo se ASIO é low-latency ou não. Até o autor da ASIO
pulou na discussão.

https://groups.google.com/a/isocpp.org/forum/#!search/vinnie/sg14/FoLFHXqZSck/i4rdO-O3BQAJ

Interessante que segundo uma das respostas

"Specialists with deep experience with ASIO round London can pull in
$1500-$2000 per day"

Saber um pouco mais do assunto não vai fazer mal pra ninguém:)

Marcelo

Virgilio Fornazin

unread,
Sep 13, 2017, 3:44:30 PM9/13/17
to ccppb...@googlegroups.com
>> Qual a vantagem pra corretora em alterar o formato em que ela comunica com a Bovespa (B3)
>> e oferecer uma coisa bugada pro cliente que ela ainda tem que dar manutenção

O protocolo da B3 tem bugs (kkkk) e ainda assim é ineficiente em seu formato nativo.
As corretoras e vendors complementam com outras informações / campos , dados estatisticos,
ou otimizam, etc, antes de entregar aos 'terminais' (app / web). Não se costumam clientes 
terceiros conectarem a esses protocolos.


Rodrigo Strauss

unread,
Sep 14, 2017, 7:53:48 PM9/14/17
to ccppbrasil
> Qual a vantagem pra corretora em alterar o formato em que ela comunica com a Bovespa (B3) e oferecer uma coisa bugada pro cliente que ela ainda tem que dar manutenção?


Esse protocolo é binário e bem eficiente, usa vários conceitos de compactação, bem parecidos com os utilizados no Protocol Buffers e outros.

Somente algumas corretoras fazem seu próprio tratamento de cotações. A maioria compra isso de terceiros que fornecem esse tipo de solução. Muitas dessas soluções são antigas e surgiram antes do padrão FIX ser utilizado. Elas mantém o protocolo original por motivos históricos ou falta de investimento mesmo. 

Sobre o QuickFix: ele já trata a camada socket, você não precisa fazer o seu.

Quem precisa de low latency geralmente evita camadas de abstração. O Boost.Asio é uma camada de abstração. Pequena mas é. O sujeito vai correr atrás de um tcp offload bom, vai usar a api direto e usar FPGA quando possível.

Rodrigo Strauss
http://www.1bit.com.br
@rodrigostrauss

Felipe Magno de Almeida

unread,
Sep 14, 2017, 8:01:34 PM9/14/17
to CcppBrasil
2017-09-14 20:53 GMT-03:00 Rodrigo Strauss <rod...@1bit.com.br>:
>> Qual a vantagem pra corretora em alterar o formato em que ela comunica com
>> a Bovespa (B3) e oferecer uma coisa bugada pro cliente que ela ainda tem que
>> dar manutenção?
>
> A bolsa difunde cotações em FIX/FAST, que no sabor jabuticaba chama-se UMDF:
> http://www.bmfbovespa.com.br/en_us/services/trading/bm-fbovespapuma-trading-system/for-developers-and-vendors/umdf-unified-market-data-feed/
>
> Esse protocolo é binário e bem eficiente, usa vários conceitos de
> compactação, bem parecidos com os utilizados no Protocol Buffers e outros.
>
> Somente algumas corretoras fazem seu próprio tratamento de cotações. A
> maioria compra isso de terceiros que fornecem esse tipo de solução. Muitas
> dessas soluções são antigas e surgiram antes do padrão FIX ser utilizado.
> Elas mantém o protocolo original por motivos históricos ou falta de
> investimento mesmo.
>
> Sobre o QuickFix: ele já trata a camada socket, você não precisa fazer o
> seu.
>
> Quem precisa de low latency geralmente evita camadas de abstração. O
> Boost.Asio é uma camada de abstração. Pequena mas é. O sujeito vai correr
> atrás de um tcp offload bom, vai usar a api direto e usar FPGA quando
> possível.

Cacilda! FPGA? Por essa eu nao esperava. Mas faz sentido.
>> ccppbrasil-...@googlegroups.com
>> Para mais opções, visite http://groups.google.com/group/ccppbrasil
>> --~--~---------~--~----~--~-~--~---~----~------------
>
>
> --
> Antes de enviar um e-mail para o grupo leia:
> http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~------------------------------
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~------------



--
Felipe Magno de Almeida

Rodrigo Strauss

unread,
Sep 14, 2017, 11:04:57 PM9/14/17
to ccppbrasil
Empresa de Porto Alegre que vende esse tipo de serviço: http://mbochip.com/ (versão alternativa do site em https://youtu.be/SQ0lrRJyjrA?t=20)



Rodrigo Strauss
http://www.1bit.com.br
@rodrigostrauss


>> Para mais opções, visite http://groups.google.com/group/ccppbrasil
>> --~--~---------~--~----~--~-~--~---~----~------------
>
>
> --
> Antes de enviar um e-mail para o grupo leia:
> http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~------------------------------
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para

> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~------------



--
Felipe Magno de Almeida
--
Antes de enviar um e-mail para o grupo leia:
                     http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------------------------
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-unsubscribe@googlegroups.com

André Tupinambá

unread,
Sep 15, 2017, 5:30:14 AM9/15/17
to C/C++ Brasil
Felipe, a empresa que eu trabalho vendia um switch de rede que a porta ethernet ia conectada direto num FPGA para esse mercado [1]. Não sei pq não vende mais, mas de qualquer maneira HFT é brincadeira de gente grande.

[1] https://www.arista.com/assets/data/pdf/7124FX/7124FX_Data_Sheet.pdf




>> Para mais opções, visite http://groups.google.com/group/ccppbrasil
>> --~--~---------~--~----~--~-~--~---~----~------------
>
>
> --
> Antes de enviar um e-mail para o grupo leia:
> http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~------------------------------
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para

> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~------------



--
Felipe Magno de Almeida
--
Antes de enviar um e-mail para o grupo leia:
                     http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------------------------
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-unsubscribe@googlegroups.com

Adriano dos Santos Fernandes

unread,
Sep 15, 2017, 6:37:14 AM9/15/17
to ccppb...@googlegroups.com
On 10/09/2017 15:21, Marcelo Zimbres wrote:
> Olá pessoal,
>
> Há um tempo atrás eu fiz um programa para análise das séries históricas dos
> preços de ações na Bovespa. Esses dias eu estava pensando em como
> seria caso eu quisesse a série em tempo real. Como não tenho
> experiência nenhuma no mercado financeiro, queria saber se vocês podem
> ajudar.
>
> Minha concepção atual do problema é a seguinte
>
> 1) Abrir uma conta em alguma corretora que me provenha acesso FIX a Bovespa [1].
> 2) Conectar meu cliente (TCP/IP) com o servidor da corretora.
> 3) Parsear of pacotes FIX e fazer a analise que quiser.
>
> Pelo menos essa é a impressão que eu tive do funcionamento dos clientes tipo
> Metatrader.

A Rico disponibiliza um aplicativo (RTD) e uma planilha Excel.

O aplicativo deles é .NET, eu consegui facilmente fazer um aplicativo C#
que se conecta no RTD deles e obtenho as cotações por callback.

Muitas abstrações. Essa abordagem não te serviria se quiser algo
realmente real time.

>
> B) A segunda pergunta não pertence necessariamente a essa thread. Eu
> uso Asio com frequência no trabalho e estou bem acostumado com o
> modelo de programação com callbacks, mas o que outras libs e
> linguagens (C#, Java) oferecem como opção ao modelo da Asio?

Eu não sou experiente em .NET/C# mas a plataforma e linguagem tem
async/await e métodos que trabalham (pelo menos no Windows) com
completion ports, então é bem interessante de se usar métodos assíncronos.


> O C++11 oferece por exemplo std::futures que até hoje pra mim não serviram pra
> nada. As corotinas dão uma cara melhor ao código mas ainda não tive a
> impressão que vou abandonar o loop de eventos e callbacks como feito na Asio
> tão cedo [4].
>
>
Java não tem nada matador como async/await. Tem futures também e outras
maneiras de se trabalhar com thread pools.


Adriano

Virgilio Fornazin

unread,
Sep 15, 2017, 8:35:57 AM9/15/17
to ccppb...@googlegroups.com
oh man!! kkkkkk

Rodrigo Strauss

unread,
Sep 15, 2017, 9:26:53 AM9/15/17
to ccppbrasil
Da ultima vez que eu vi o RTD da Rico era um polling em um servidor web. Isso deve dar uma latência de alguns segundos, dependendo da configuração deles. Serve para backtesting dependendo do algoritmo, mas definitivamente não é low latency.

Rodrigo Strauss
http://www.1bit.com.br
@rodrigostrauss

Reply all
Reply to author
Forward
0 new messages