Sequência em que as ordens são processadas

 

Estou desenvolvendo um EA cuja estratégia envolve o seguinte tipo de lógica operacional:

  • São mantidas ordens limitadas de compra e de venda simultaneamente para um conjunto de ativos.
  • Os preços de compra e de venda ofertados para cada ativo são continuamente ajustados, conforme as condições de mercado. 
  • Quando alguma dessas ordens é executada, o EA dispara ordens a mercado para comprar ou vender outros ativos dentro desse conjunto (a ideia é montar uma estrutura composta por vários ativos comprados e vendidos nas devidas proporções, para posteriormente lucrar ao desmontar essa estrutura).

Os resultados em conta demo foram bons, mas, quando comecei a operar em conta real, recebi da corretora duas notificações de OMC (Operação de Mesmo Comitente, ou seja, operação em que o mesmo CPF é simultaneamente comprador e vendedor). A notificação alertava que essa prática é proibida e que meu CPF poderia ser bloqueado na B3 caso eu insistisse em repeti-la.

Examinei o histórico do meu EA e constatei que, nessas 2 ocasiões, no momento em que o EA emitiu a ordem a mercado, a melhor oferta na ponta oposta era a oferta do próprio EA, daí a operação de mesmo comitente.

Implementei a seguinte solução:

  • Sempre que o EA vai disparar uma ordem a mercado, ele antes cancela a ordem limitada que estiver pendurada na ponta oposta e a restaura depois da execução a ordem a mercado, para evitar a OMC.

A minha dúvida é a seguinte:

  • Se eu enviar o cancelamento da ordem da ponta oposta e logo em seguida enviar uma ordem a mercado, é garantido que a primeira ordem já terá sido cancelada quando a segunda ordem for executada? 
  • Ou mesmo assim haverá risco de a ordem a mercado ser executada antes do cancelamento da ordem anterior, podendo produzir novamente uma OMC?

Pensei em aguardar a confirmação do cancelamento antes de enviar a ordem a mercado, mas isto seria ruim, pois a estratégia do EA busca oportunidades raras de montagem e desmontagem da estrutura a preços vantajosos e, quando uma oportunidade dessas é encontrada, as operações precisam ser executadas rapidamente, antes que o cenário favorável se desfaça. Porém, se não houver garantia de que o cancelamento da ordem limitada seja feito antes do envio da ordem a mercado, precisarei aguardar essa confirmação para evitar as OMC's.

Agradeço antecipadamente qualquer ajuda ou dica.

 
Trader_Patinhas:

Estou desenvolvendo um EA cuja estratégia envolve o seguinte tipo de lógica operacional:

  • São mantidas ordens limitadas de compra e de venda simultaneamente para um conjunto de ativos.
  • Os preços de compra e de venda ofertados para cada ativo são continuamente ajustados, conforme as condições de mercado. 
  • Quando alguma dessas ordens é executada, o EA dispara ordens a mercado para comprar ou vender outros ativos dentro desse conjunto (a ideia é montar uma estrutura composta por vários ativos comprados e vendidos nas devidas proporções, para posteriormente lucrar ao desmontar essa estrutura).

Os resultados em conta demo foram bons, mas, quando comecei a operar em conta real, recebi da corretora duas notificações de OMC (Operação de Mesmo Comitente, ou seja, operação em que o mesmo CPF é simultaneamente comprador e vendedor). A notificação alertava que essa prática é proibida e que meu CPF poderia ser bloqueado na B3 caso eu insistisse em repeti-la.

Examinei o histórico do meu EA e constatei que, nessas 2 ocasiões, no momento em que o EA emitiu a ordem a mercado, a melhor oferta na ponta oposta era a oferta do próprio EA, daí a operação de mesmo comitente.

Implementei a seguinte solução:

  • Sempre que o EA vai disparar uma ordem a mercado, ele antes cancela a ordem limitada que estiver pendurada na ponta oposta e a restaura depois da execução a ordem a mercado, para evitar a OMC.

A minha dúvida é a seguinte:

  • Se eu enviar o cancelamento da ordem da ponta oposta e logo em seguida enviar uma ordem a mercado, é garantido que a primeira ordem já terá sido cancelada quando a segunda ordem for executada? 
  • Ou mesmo assim haverá risco de a ordem a mercado ser executada antes do cancelamento da ordem anterior, podendo produzir novamente uma OMC?

Pensei em aguardar a confirmação do cancelamento antes de enviar a ordem a mercado, mas isto seria ruim, pois a estratégia do EA busca oportunidades raras de montagem e desmontagem da estrutura a preços vantajosos e, quando uma oportunidade dessas é encontrada, as operações precisam ser executadas rapidamente, antes que o cenário favorável se desfaça. Porém, se não houver garantia de que o cancelamento da ordem limitada seja feito antes do envio da ordem a mercado, precisarei aguardar essa confirmação para evitar as OMC's.

Agradeço antecipadamente qualquer ajuda ou dica.

Aconselho traduzir a questão e postar no forum russo. Pessoal super gente fina, são os desenvolvedores da plataforma e respondem tudo.

 
Márcio Andrade:

Aconselho traduzir a questão e postar no forum russo. Pessoal super gente fina, são os desenvolvedores da plataforma e respondem tudo.

Olá Márcio Andrade,

Aconselho continuar postando no fórum em português, justamente para fomentarmos discussões em nosso próprio idioma.

Inúmeras perguntas são respondidas aqui todo dia.

Mas obviamente é sempre possível levar discussões para o fórum em inglês ou russo.

Apenas para constar: o fórum em inglês é quase duas vezes mais ativo que o fórum em russo.

Abraços,
Malacarne

 
Rodrigo Malacarne:

Olá Márcio Andrade,

Aconselho continuar postando no fórum em português, justamente para fomentarmos discussões em nosso próprio idioma.

Inúmeras perguntas são respondidas aqui todo dia.

Mas obviamente é sempre possível levar discussões para o fórum em inglês ou russo.

Apenas para constar: o fórum em inglês é quase duas vezes mais ativo que o fórum em russo.

Abraços,
Malacarne

A questão dele me pareceu mais técnica e bem aprofundada, como ninguém aqui conseguiu responder sugeri uma via a qual conheço.

 
Rodrigo Malacarne:

Olá Márcio Andrade,

Aconselho continuar postando no fórum em português, justamente para fomentarmos discussões em nosso próprio idioma.

Inúmeras perguntas são respondidas aqui todo dia.

Mas obviamente é sempre possível levar discussões para o fórum em inglês ou russo.

Apenas para constar: o fórum em inglês é quase duas vezes mais ativo que o fórum em russo.

Abraços,
Malacarne

Obrigado, @Márcio Andrade . Vou traduzir pro inglês e pro russo e postar nos respectivos fóruns (no caso do russo vou ter que usar o google tradutor, espero que fique inteligível pra eles).

@Rodrigo Malacarne , acredito que dá pra conciliar as duas coisas: podemos postar sempre aqui primeiramente, para fomentar nosso fórum local, e repetir a questão nos fóruns estrangeiros caso ela demore a ser respondida aqui.

Obrigado! Abraços!

Em tempo: nos testes que eu fiz, tenho observado que as ordens têm sido sempre processadas na mesma ordem em que são enviadas pelo comando OrderSend(). Mas eu queria ter uma segurança maior sobre isso, pois seria muito ruim ter meu CPF bloqueado na B3 por "tentativa de manipular o mercado operando nas duas pontas". Sem falar que vender para si mesmo significa pagar corretagem e emolumentos à toa, o que pode sair caro pra quem opera com frequência alta e margem de lucro apertada. Eu poderia verificar o book antes de enviar a ordem a mercado pra ver se a ordem que vai ser consumida na outra ponta é minha, é praticamente impossível garantir que não vou pegar minha própria ordem, pois as ordens que estão na frente da minha podem ser consumidas ou canceladas 1 milésimo de segundo após eu ter verificado. Pra ter segurança total eu teria que cancelar a ordem oposta e aguardar a confirmação do cancelamento, para só então enviar a ordem a mercado, aguardar a confirmação da execução da ordem a mercado e então colocar de volta a ordem limitada que estava lá ... a menos que nossos amigos russos garantam que a ordem de processamento é sempre preservada ... nesse caso eu poderia mandar três OrderSendAsync de uma vez só sem medo de ser feliz (cancelamento da outra ponta, ordem a mercado e recolocação da ordem na outra ponta) ... como estou conseguindo 8 ms ida-e-volta de latência entre meu servidor Amazon e a B3, já dá pra implementar um "HFT de pobre" usando OrderSendAsync !

 
Márcio Andrade:

A questão dele me pareceu mais técnica e bem aprofundada, como ninguém aqui conseguiu responder sugeri uma via a qual conheço.

Dificilmente alguém no fórum em russo ou em inglês irão responder à uma questão aparentemente relacionada ao mercado brasileiro ...

Lembrando que no fórum em inglês a maior parte dos usuários trabalha com Forex, onde não há chance de ocorrer o problema relatado pelo usuário.

No fórum em russo eventualmente teremos vários usuários que operam em um mercado onde é permitido comprar e vender para o mesmo comitente.

Portanto, acredito que o fórum ideal de discussões seja mesmo o fórum em Português.

Abraços,
Malacarne

 
Rodrigo Malacarne:

Dificilmente alguém no fórum em russo ou em inglês irão responder à uma questão aparentemente relacionada ao mercado brasileiro ...

Lembrando que no fórum em inglês a maior parte dos usuários trabalha com Forex, onde não há chance de ocorrer o problema relatado pelo usuário.

No fórum em russo eventualmente teremos vários usuários que operam em um mercado onde é permitido comprar e vender para o mesmo comitente.

Portanto, acredito que o fórum ideal de discussões seja mesmo o fórum em Português.

Abraços,
Malacarne

Malacarne

@Rodrigo Malacarne , num forum estrangeiro eu simplificaria a questão, omitindo os detalhes do nosso mercado local e fazendo apenas duas perguntas bem mais objetivas e focadas na questão técnica:

1) Suponha que eu tenha uma ordem limitada de venda pendente para um ativo. Se eu enviar um comando OrderSendAsync() para cancelar esta ordem e logo em seguida enviar um segundo comando OrderSendAsync() para comprar a mercado esse mesmo ativo, é garantido que a minha ordem limitada de venda já estará cancelada no momento em que a minha ordem de compra a mercado for executada? Ou há alguma chance de a minha ordem de compra a mercado executar a minha própria ordem de venda pendente antes de ela ser cancelada?

2) E se eu usar OrderSend() em vez de OrderSendAsync() ?

Talvez eu devesse ter perguntado desta forma mais objetiva aqui no forum em Português também. Se alguém souber responder as perguntas acima, agradeço muito!

 

Postei a dúvida em inglês ( https://www.mql5.com/en/forum/261538 ) e em russo ( https://www.mql5.com/ru/forum/261534 ), especificando que se trata de um "Stock Exchange Market" e não de Forex.

No caso do russo, não entendo absolutamente nada do idioma e confiei cegamente no Google Tradutor. Espero que tenha ficado inteligível para eles (e que eu também consiga entender o que eles respondem com ajuda do tradutor).

 
Trader_Patinhas:

@Rodrigo Malacarne , num forum estrangeiro eu simplificaria a questão, omitindo os detalhes do nosso mercado local e fazendo apenas duas perguntas bem mais objetivas e focadas na questão técnica:

1) Suponha que eu tenha uma ordem limitada de venda pendente para um ativo. Se eu enviar um comando OrderSendAsync() para cancelar esta ordem e logo em seguida enviar um segundo comando OrderSendAsync() para comprar a mercado esse mesmo ativo, é garantido que a minha ordem limitada de venda já estará cancelada no momento em que a minha ordem de compra a mercado for executada? Ou há alguma chance de a minha ordem de compra a mercado executar a minha própria ordem de venda pendente antes de ela ser cancelada?

2) E se eu usar OrderSend() em vez de OrderSendAsync() ?

Talvez eu devesse ter perguntado desta forma mais objetiva aqui no forum em Português também. Se alguém souber responder as perguntas acima, agradeço muito!

Olá Trader_Patinhas,

Sua questão é absolutamente interessante !!!!

Essa é uma daquelas questões que fazem toda a diferença em sistemas de negociação de curtíssimo prazo ...

Na minha humilde opinião, isso vai depender de inúmeros fatores... uns deles sob o seu controle, outros não... Como já disseram no fórum em inglês, questões relacionadas a ping, queda de conexão, etc, podem sim afetar a execução dessa sua lógica.

Entretanto, isolando todos os problemas e supondo que você E TAMBÉM a corretora possuem conexões e dados absolutamente estáveis, eu ACREDITO (atenção... ACREDITO !!!) que um cancelamento assíncrono enviado antes de uma ordem assíncrona não causaria um "zé-com-zé"... que é o termo de mercado que utilizamos quando um comitente compra e vende pra ele mesmo.

Na minha opinião, temos duas latências aqui: uma para que a corretora CANCELE sua ordem pendente na bolsa, e outra para que a corretora EXECUTE sua ordem. Sua lógica operacional assíncrona em princípio deverá funcionar CASO o tempo necessário para a corretora cancelar sua ordem junto à bolsa seja menor ou igual ao tempo necessário para que a corretora execute sua ordem.

Nesse caso, temos aqui uma segunda latência, que é aquela entre a corretora e a própria bolsa, já que estamos falando de ordens limitadas (que, portanto, vão pro book de ofertas do ativo).

De qualquer maneira, eu faria primeiro um teste numa conta demonstração em um ativo com book "ralo", pra ver o comportamento dessa lógica dentro do SERVIDOR MT5 instalado na corretora...

Se na conta demo a lógica conseguir ser executada corretamente, é sinal de que o servidor MT5 instalado na corretora processa sequencialmente o cancelamento e depois o envio da ordem.

A partir daí, na conta real, mesmo que a sequência seja a mesma (cancelamento anterior ao envio de nova ordem), não há como saber se a latência entre corretora e bolsa permite executar esse tipo de operação ...

Só mesmo "arriscando", sendo que você corre o risco de tomar multa, receber uma ligação da mesa da corretora com alguém eventualmente soltando os cachorros pra cima de você...

Por fim, me lembro uma vez de ter conversado com um dos responsáveis pelo MT5 na XP (atenção... XP!!!! não estou falando das outras corretoras do mercado brasileiro) e ele me disse que a corretora tem um filtro interno para evitar ordens do tipo zé-com-zé...

Portanto, pelo menos na XP (grupo XP, desconfio eu) você não teria problemas de zé-com-zé...

MAS... caso queira fazer o teste, experimente por sua conta e risco!

Como disse acima, essa é uma daquelas questões interessantíssimas que aparecem de vez em quando por aqui no fórum em português!

Parabéns pela pergunta!

Espero ter ajudado!

Abraços,
Malacarne

 

Questão esclarecida no fórum em inglês: a ordem de envio dos comandos NÃO garante que o cancelamento da primeira ordem ocorra antes da execução da segunda ordem, nem com OrderSendAsync() e nem com OrderSend().

O único jeito é aguardar o evento que confirma que a primeira ordem foi cancelada, para só então enviar a segunda. 

Obrigado!

 
Trader_Patinhas:

Questão esclarecida no fórum em inglês: a ordem de envio dos comandos NÃO garante que o cancelamento da primeira ordem ocorra antes da execução da segunda ordem, nem com OrderSendAsync() e nem com OrderSend().

O único jeito é aguardar o evento que confirma que a primeira ordem foi cancelada, para só então enviar a segunda. 

Obrigado!

Acho que você entendeu errado ...

Com OrderSend isso é perfetiamente possível !!!

Apenas com OrderSendAsync isso não é garantido...

Abraços,
Malacarne