Unir mais de uma ordem de compra ou de venda em apenas uma ordem de compra ou venda

 

Olá a todos.

Pensando em uma solução para o EA que estou atualizando, me deparei com uma necessidade que é um tanto diferente do convencional. 

Vamos a um exemplo prático:

 - imagine que um trader enviou para a pedra 5 (cinco) ordens de compra com preços diversos;

 - por algum motivo, esse trader precisa juntar todas essas ordens em apenas uma única ordem, com o volume total, e um preço que pode ser definido por algum critério (média, maior valor encontrado, menor valor encontrado, ...).

Uma solução, que teria viabilidade, seria:

a) fazer uma varredura na lista total de ordens (OrdersTotal()), com os devidos critérios para selecionar as ordens de compra, para o exemplo em questão;

b) durante a varredura, somaria o volume de cada ordem de compra em uma variável;

c) também durante a varredura, coletaria o preço de cada ordem de compra para realizar algum cálculo, afim de definir o preço da ÚNICA ordem pendente de compra que será enviada; 

d) após coletar as informações necessárias da ordem, a mesma é removida (TRADE_ACTION_REMOVE), passando para a próxima ordem de compra, onde será repetido os passos acima descritos;

e) ao completar a varredura, as ordens de compra estariam removidas e os cálculos realizados. Só então, é enviada uma nova ordem de compra, com o novo preço definido, e o novo volume resultante da soma do volume de todas as ordens de compra anteriormente removidas.

A solução descrita acima, realizaria a remoção das ordens de compra, para, em seguida, enviar tudo em uma única nova ordem de compra.

OBS.: Apenas quero passar a ideia da função para entendimento de todos, sem me apegar a detalhes que não foram descritos.

O questionamento que faço é o seguinte:

 - existe alguma outra forma de desenvolver essa necessidade de união das ordens de compra em apenas uma ordem de compra?

 - o MT5 tem alguma função nativa que resolva essa necessidade de foma mais eficiente do que a descrita acima?

Abraço a todos.

 
Márcio Hermes:

Olá a todos.

Pensando em uma solução para o EA que estou atualizando, me deparei com uma necessidade que é um tanto diferente do convencional. 

Vamos a um exemplo prático:

 - imagine que um trader enviou para a pedra 5 (cinco) ordens de compra com preços diversos;

 - por algum motivo, esse trader precisa juntar todas essas ordens em apenas uma única ordem, com o volume total, e um preço que pode ser definido por algum critério (média, maior valor encontrado, menor valor encontrado, ...).

Uma solução, que teria viabilidade, seria:

a) fazer uma varredura na lista total de ordens (OrdersTotal()), com os devidos critérios para selecionar as ordens de compra, para o exemplo em questão;

b) durante a varredura, somaria o volume de cada ordem de compra em uma variável;

c) também durante a varredura, coletaria o preço de cada ordem de compra para realizar algum cálculo, afim de definir o preço da ÚNICA ordem pendente de compra que será enviada; 

d) após coletar as informações necessárias da ordem, a mesma é removida (TRADE_ACTION_REMOVE), passando para a próxima ordem de compra, onde será repetido os passos acima descritos;

e) ao completar a varredura, as ordens de compra estariam removidas e os cálculos realizados. Só então, é enviada uma nova ordem de compra, com o novo preço definido, e o novo volume resultante da soma do volume de todas as ordens de compra anteriormente removidas.

A solução descrita acima, realizaria a remoção das ordens de compra, para, em seguida, enviar tudo em uma única nova ordem de compra.

OBS.: Apenas quero passar a ideia da função para entendimento de todos, sem me apegar a detalhes que não foram descritos.

O questionamento que faço é o seguinte:

 - existe alguma outra forma de desenvolver essa necessidade de união das ordens de compra em apenas uma ordem de compra?

 - o MT5 tem alguma função nativa que resolva essa necessidade de foma mais eficiente do que a descrita acima?

Abraço a todos.

    Olá, como vai?


    Eu penso que o simples sempre funciona, faz um scanner das ordens pendentes, soma os volumes e trabalha o algorítmo para obter o preço médio.

    Simples, rápido e fácil.

    Consulte a documentação, lá tem as funções de acesso as ordens e retorno com as informações.


    Um abraço.

 
Nelson Silva:

    Olá, como vai?


    Eu penso que o simples sempre funciona, faz um scanner das ordens pendentes, soma os volumes e trabalha o algorítmo para obter o preço médio.

    Simples, rápido e fácil.

    Consulte a documentação, lá tem as funções de acesso as ordens e retorno com as informações.


    Um abraço.

Obrigado pelo retorno  Nelson Silva.

Concordo com cada letra escrita, o simples é SEMPRE melhor.

A questão está na forma de unir as ordens. O que descrevi, é apenas uma forma de ser feito, porém, é possível que tenha alguma outra forma da realizar esse evento, que já esteja incorporada na linguagem MQL5, qual desconheço. 

Da mesma forma que podemos modificar uma ordem usando o trecho de código 'request.action = TRADE_ACTION_MODIFY;', pois já está implementado na linguagem, talvez, haveria uma forma semelhante para juntar todas as ordens pendentes na pedra, em uma única ordem. Seria interessante, pois deixaria o código mais "limpo" e com certeza mais eficiente do que a forma descrita anteriormente.

Grande abraço.

 

Esse processo de varrer todas as ordens pendentes para em seguida cancelar todas e substituir por 1 única ordem precisa ser implementado com bastante cuidado para cobrir todas as possíveis situações de exceção.

O motivo é que, por não se tratar de uma operação "atômica" (executada de uma vez só), pode acontecer de uma ou mais dentre as ordens pendentes serem executadas em algum momento durante o processo (por exemplo: entre a leitura das ordens e o cancelamento das mesmas, ou entre o cancelamento e o envio da nova ordem).

Você precisa, por exemplo, antes de enviar a nova ordem, verificar se todas as ordens anteriores foram realmente canceladas antes de serem executadas, ou se alguma eventualmente foi executada (no todo ou em parte) antes do pedido de cancelamento ser processado no servidor MT5 da corretora e na bolsa. Caso alguma execução de ordem seja detectada, vc vai precisar recalcular o volume da nova ordem antes de enviá-la.

Vale lembrar que não adianta otimizar o código pra fazer as coisas rápido, pois existe a latência da rede, que geralmente é bem maior que o tempo de processamento: a informação que vc coletou sobre as ordens estará defasada de alguns centésimos de segundo e o envio de solicitações de cancelamento e de novas ordens também só será processado alguns centésimos de segundo depois (isso se o servidor MT5 não estiver congestionado naquele momento e se a rede estiver muito boa entre e o seu terminal e a corretora e entre a corretora e a bolsa)... e nesses centésimos de segundo, ordens pendentes podem ser executadas.

Se vc estiver usando uma corretora que não cobra corretagem (ou seja, se o seu custo operacional for apenas os custos da B3, que são proporcionais ao volume negociado e independentes da quantidade de ordens executadas), talvez vc nem devesse se preocupar em unificar as ordens. Vc pode, nesse caso, simplesmente modificar os preços de todas as ordens para o valor desejado (média, maior valor, menor valor etc.), sem cancelar nenhuma ordem nem enviar nenhuma ordem nova.

 
Trader_Patinhas:

Esse processo de varrer todas as ordens pendentes para em seguida cancelar todas e substituir por 1 única ordem precisa ser implementado com bastante cuidado para cobrir todas as possíveis situações de exceção.

O motivo é que, por não se tratar de uma operação "atômica" (executada de uma vez só), pode acontecer de uma ou mais dentre as ordens pendentes serem executadas em algum momento durante o processo (por exemplo: entre a leitura das ordens e o cancelamento das mesmas, ou entre o cancelamento e o envio da nova ordem).

Você precisa, por exemplo, antes de enviar a nova ordem, verificar se todas as ordens anteriores foram realmente canceladas antes de serem executadas, ou se alguma eventualmente foi executada (no todo ou em parte) antes do pedido de cancelamento ser processado no servidor MT5 da corretora e na bolsa. Caso alguma execução de ordem seja detectada, vc vai precisar recalcular o volume da nova ordem antes de enviá-la.

Vale lembrar que não adianta otimizar o código pra fazer as coisas rápido, pois existe a latência da rede, que geralmente é bem maior que o tempo de processamento: a informação que vc coletou sobre as ordens estará defasada de alguns centésimos de segundo e o envio de solicitações de cancelamento e de novas ordens também só será processado alguns centésimos de segundo depois (isso se o servidor MT5 não estiver congestionado naquele momento e se a rede estiver muito boa entre e o seu terminal e a corretora e entre a corretora e a bolsa)... e nesses centésimos de segundo, ordens pendentes podem ser executadas.

Se vc estiver usando uma corretora que não cobra corretagem (ou seja, se o seu custo operacional for apenas os custos da B3, que são proporcionais ao volume negociado e independentes da quantidade de ordens executadas), talvez vc nem devesse se preocupar em unificar as ordens. Vc pode, nesse caso, simplesmente modificar os preços de todas as ordens para o valor desejado (média, maior valor, menor valor etc.), sem cancelar nenhuma ordem nem enviar nenhuma ordem nova.

Obrigado pelo retorno.

Durante a codificação da função, me ocorreu justamente o que você explanou.

Percebi que há "buracos" na função da forma como pensei em desenvolver. 

"E volta o cão arrependido!"

1 - Com relação a corretora:

- utilizo a Modal: não cobra corretagem, porém, vou migrar para a XP (que também não cobra corretagem) pelo fato do MT5 ser mais estável.

Um aparte rápido: na Modal, o MT5, vez ou outra,  trava o preço ASK (não atualiza). Na primeira vez que ocorreu, achei que era um erro do EA. Fechei o MT5 e abri novamente; removi o EA e recoloquei; continuava com o preço ASK travado no gráfico, e o EA estava lendo este preço também. Para deixar claro que estava operando um FII, que não tem a mesma liquidez do mini índice!!

Outra coisa que me fez mudar de corretora, é o fato de, seguidamente, a Modal realiza manutenções no MT5.

Agora só tem a opção do MT5 DMA4. OK!! DMA4 é bom, porém, MT5 estável é ainda melhor!!

Não tem nada haver com o assunto em questão. Apenas um parenteses para relatar um problema que encontrei na Modal, que outros possam ter passado.

2 - Com relação ao EA:

- o mesmo possui uma opção de envio de ordens automaticamente (de compra ou de venda), em um preço pré-determinado pelo trader;

- como funciona:

 - - vamos supor que há um ordem de venda com 100 (cem) cotas de determinado FII na pedra;

 - - um player agride 10 (dez) cotas desta ordem de venda;

 - - se o trader deixou configurado o envio automático de ordens de compra, será enviado uma ordem de compra com as 10 cotas.

- agora imagine uma situação que é possível de ocorrer:

- - as 90 (noventa) cotas restantes são agredidas uma cota de cada vez, ou seja, será enviado 90 (noventa) ordens de compra para a pedra. No caso de trade com FII, não é tão difícil de ocorrer.

- - já deve ter imaginado a bagunça de ordens!!

2.1 - O EA tem opções para mudar o preço de todas as ordens:

 - todas as ordens de compra ao preço BID, (BID + R$0,01), (BID - R$0,01) ("brigar" com os players). Também é possível deslocar todas as ordens, somando ou subtraindo um valor em centavos, definido pelo trader, do preço de cada ordem de compra;

 - todas as ordens de venda ao preço ASK, (ASK+ R$0,01), (ASK- R$0,01) ("brigar" com os players). Também é possível deslocar todas as ordens, somando ou subtraindo um valor em centavos, definido pelo trader, do preço de cada ordem de venda; 

2.2 - O EA não opera baseado no financeiro, e sim, no volume de cotas que o trader deseja operar. Optei por desenvolver desta forma para dar flexibilidade e controle ao trader.  

E a solução pode ser essa: Como o EA opera baseado no volume de cotas, solicito o cancelamento todas as ordens de compra ou venda. No EA, há campos de texto (CEdit) que mostram a situação atual das cotas: quantas estão em posição comprada, quantas estão em ordens de compra e venda, quantas estão disponíveis para comprar e vender (ver arquivo de imagem em anexo). 

Após o cancelamento das ordens (de compra ou venda), pego o volume de cotas que foram disponibilizadas (compra ou venda) e envio uma nova ordem com o volume total. O preço é o mais simples de resolver.

já que o MT5 não tem uma solução pronta para esse tipo de manipulação de ordens, vou desenvolver por outros meios.

Mais uma vez, agradeço pela explanação. Expandiu um pouco mais a mente.

Grande abraço.

Arquivos anexados:
frame.jpg  110 kb
Razão: