Discussão do artigo "Expert Advisor multiplataforma: Ordens"

 

Novo artigo Expert Advisor multiplataforma: Ordens foi publicado:

MetaTrader 4 e MetaTrader 5 usam regras diferentes para o processamento de pedidos de negociação. Este artigo discute a possibilidade de utilizar o objeto de classe que representa a transação para processamento pelo servidor, graças a isso o Expert Advisor poderá trabalhar com elas independentemente da versão da plataforma de negociação e o modo usado.

Ao contrário da MetaTrader 4, as mensagens de log são encontradas na guia "diário" da janela "Terminal" e não na guia "Experts".


O Expert Advisor também imprime uma mensagem ma guia "Experts". No entanto, isto não é uma mensagem sobre a execução de uma transação: ela apenas informa que a chamada da função ExpertRemove foi realizada.

Autor: Enrico Lambino

 

Enrico, é possível verificar se a ordem (ou posição) foi parcialmente fechada.

No MT4, tenho um novo ticket em caso de fechamento parcial. De fato, não se trata de uma nova entrada, mas de uma entrada anterior. Portanto, preciso separar essas ordens. As que indicam uma verdadeira entrada no mercado e as que aparecem após o fechamento parcial (não uma nova entrada). É possível usar suas classes?

 
mbjen:

Enrico, é possível verificar se a ordem (ou posição) foi parcialmente fechada.

No MT4, tenho um novo ticket em caso de fechamento parcial. De fato, não se trata de uma nova entrada, mas de uma entrada anterior. Portanto, preciso separar essas ordens. As que indicam uma verdadeira entrada no mercado e as que aparecem após o fechamento parcial (não uma nova entrada). É possível usar suas classes?


Ou seria um objeto COrder até que a ordem fosse totalmente fechada? Quero dizer, após o fechamento parcial, não há novo objeto COrder?

Em caso afirmativo, como obtenho o lucro total da ordem?

Além disso, como obtenho o ticket inicial da ordem ou o tipo inicial da ordem?

 

Suponha que eu tenha uma ordem de venda de 5,00 #1 a 1,09246. No próximo fechamento parcial, comprar 2,00 #2 a 1,08896. E o fechamento final restante compra 3,00 #3 a 1,09161 (devido ao trailing stop, na verdade).

Este é o meu código:

   COrders *orders=order_manager.OrdersHistory();
   for(int i=order_manager.OrdersHistoryTotal()-1;i>=0;i--)
     {
      COrder *order=orders.At(i);
      if(!CheckPointer(order))
         continue;
      order.OnTick();
      if(!order.IsClosed())
         continue;
      if(order.OrderType()!=0 && order.OrderType()!=1)   
         continue;

Para simplificar, vamos chamar todas essas três ordens de posição.

O método IsClosed() retorna true quando a posição é fechada (na última ordem #3). Mas como posso obter o tipo de posição, o ticket da primeira ordem da posição, o preço de abertura da posição? Parece que o volume inicial da posição pode ser calculado com o método InitVolume(). E quanto ao resto?

 
mbjen:

Suponha que eu tenha uma ordem de venda de 5,00 #1 a 1,09246. No próximo fechamento parcial, comprar 2,00 #2 a 1,08896. E o fechamento final restante compra 3,00 #3 a 1,09161 (devido ao trailing stop, na verdade).

Este é o meu código:

Para simplificar, vamos chamar todas essas três ordens de posição.

O método IsClosed() retorna true quando a posição é fechada (na última ordem #3). Mas como posso obter o tipo de posição, o ticket da primeira ordem da posição, o preço de abertura da posição? Parece que o volume inicial da posição pode ser calculado com o método InitVolume(). E quanto ao restante?

Não tenho certeza absoluta do que você está tentando fazer, mas para obter o lucro/perda não realizado em MQL5 em uma instância COrder, uma maneira é obter o volume restante e, em seguida, multiplicá-lo pela diferença entre o preço de mercado atual (compra ou venda) e o preço de entrada COrder e, em seguida, multiplicá-lo pelo valor do tick. A parte mais complicada é quando o ponto do símbolo não é igual ao tamanho do tick (você precisará dividir a diferença pelo tamanho do tick). O ouro costumava ser assim, mas, pelo que sei, não é mais. É simplesmente melhor encontrar uma corretora que ofereça maior liquidez. A mesma instância do COrder é usada até o final. Na MQL4, você só precisa selecionar o tíquete da ordem e chamar a função OrderProfit().

 
2017/10/30 09:04:38 Concluído #169758 keltrem
 

When one sends a trade request, there are only two outcomes: processed or not processed. If the trade was not processed, it means that there was no deal, as the trade server was not able to process it for some reason (usually due to errors). Now, if the trade is processed, in MQL5, the client and the server have a deal. In this case, the order can be fully executed or partially executed.

Isso não é totalmente exato, você também pode ter um tempo limite. Isso significa que você não sabe se a ordem foi processada ou não. É claro que, no final, uma ordem é processada ou não, mas é importante saber e processar o tempo limite em uma conta ativa.

O MetaTrader 4 não tem essa opção, pois a ordem só é executada integralmente ou não (fill or kill).

...

Na MQL4, o cálculo do volume é simples. Sempre que um consultor especialista envia uma solicitação de negociação, o volume da solicitação também é incluído, e ela seria negada ou aceita.

Isso não é exato. O MT4 também pode ter ordens parcialmente preenchidas. É claro que isso deve ser raro no Forex, que é negociado principalmente pelo MT4, mas pode acontecer tecnicamente.


Em geral, não vejo a utilidade das classes que você forneceu neste artigo, pois você ainda precisa de MT4/MT5 específicos no código principal e nas diretivas do compilador. (Talvez isso seja abordado em outros artigos, ainda não os li).