Discussão do artigo "Guia Prático do MQL5: Processamento do Evento TradeTransaction"

 

Novo artigo Guia Prático do MQL5: Processamento do Evento TradeTransaction foi publicado:

Neste artigo eu gostaria de apresentar uma das maneiras de controlar os eventos de negociação utilizando os meios que a linguagem MQL5 nos proporciona. Devo mencionar que alguns artigos já foram dedicados a este tema. "Processamento de eventos trade no Expert Advisor usando a função OnTrade()" é um deles. Mas, ao contrário do material mencionado acima, usarei outro manipulador - OnTradeTransaction().

Eu gostaria de chamar a atenção dos leitores para o seguinte ponto. A versão atual da linguagem MQL5 conta formalmente com 14 manipuladores de eventos no Terminal Cliente. Além disso, o programador tem a possibilidade de criar eventos personalizados com o EventChartCustom() e processá-los com a OnChartEvent(). No entanto, o termo "programação orientada a eventos" ou "EDP" em inglês, não é mencionado na documentação. Isso é estranho devido ao fato de que qualquer programa em MQL5 é criado com base nos princípios da EDP. Por exemplo, quando o usuário necessita fazer uma escolha no passo do "manipulador de eventos para do Expert" em um template de qualquer Expert Advisor.

É óbvio que o mecanismo da programação orientada a eventos é usado em MQL5, de uma forma ou de outra. A linguagem pode conter blocos de programa que consiste em duas partes: na seleção e no processamento de um evento. Além disso, se estamos falando dos eventos do Terminal Cliente, o programador tem controle apenas sobre a segunda parte, ou seja, o manipulador de eventos. Para ser justo, há exceções para alguns eventos. O temporizador e o evento personalizado estão entre eles. O controle desses eventos é deixado inteiramente para o programador.

Fig.6. O primeiro esquema do processo de transação

Autor: Dennis Kirichenko

 

Com base em minha experiência, posso dizer que a necessidade real de usar a TradeTransaction surge quando se programa no modo assíncrono. É uma pena que o artigo não diga uma palavra sobre esse modo.

s.s. Eu também pensei que "What MQL recipes". - era um título de marca registrada dos artigos de Anatoly. Mas agora parece que não é bem assim(

 

C-4, obrigado por sua opinião.

C-4:

Pela minha experiência, posso dizer que a necessidade real de usar a TradeTransaction surge quando se programa no modo assíncrono. É uma pena que o artigo não fale nada sobre esse modo...

Existem diferentes necessidades e requisitos que podem ser o motivo para usar o manipulador TradeTransaction. Esse é um tópico interessante, espero que colegas experientes também comentem sobre essa questão...

s.s. Eu também pensei que "MQL recipes". - era o nome da marca dos artigos de Anatoly. E agora parece que não é(

Sim, admito que Anatoly é o inventor dessa série de artigos. Eu gostei, então me juntei modestamente ao ciclo :-))))

Espero que Anatoly não se importe....

 
Ainda não tive tempo de abordar a questão da execução parcial de ordens(ORDER_STATE_PARTIAL) neste artigo. Pergunta para você: quantas vezes o manipulador TradeTransaction será chamado?
 
denkir:
Ainda não tive tempo de abordar a questão da execução parcial de ordens(ORDER_STATE_PARTIAL) neste artigo. Pergunta para você: quantas vezes o manipulador TradeTransaction será chamado?

Não sei. Logicamente, o manipulador deve ser acionado tantas vezes quanto em uma execução completa. Porque a execução da ordem não é um evento discreto, e o MT não sabe se a ordem será executada parcial ou totalmente.

Infelizmente, a entrega de eventos não é garantida, e os próprios eventos funcionam apenas em tempo real, o que torna sua aplicação limitada. Mas eles são extremamente úteis para sistemas baseados em rastreamento de estado, como sistemas assíncronos ou copiadoras de negociação. Graças aos eventos, é possível criar um algoritmo sem looping e freios adicionais associados à espera pelo evento OnTimer.

 
denkir:

...

Espero que Anatoly não se importe...

Não, é claro que ele não se importa. ) Especialmente porque...

C-4:

...

s.s. Eu também pensei que "MQL recipes". - era um nome de marca dos artigos de Anatoly. Agora, parece que não é(

...O rótulo "MQL5 Recipes" foi sugerido pela equipe editorial da MQ, portanto, pode ser usado por qualquer pessoa. O principal é ter mais e diferentes artigos.

 
O manual de referência afirma claramente que a consistência NÃO é garantida! Se você observar os dados históricos, a consistência é bem diferente.
 
Obrigado por este artigo. Ele é muito útil.
 
como faço para o sistema funcinar ?
 
Excelente texto! Aprendi muito aqui, está de parabéns
 
VikMorroHun #:
Obrigado por este artigo. Ele é muito útil.

Hi,

Minha situação parece ser bem simples: Coloco uma ordem pendente (Sell_Stop) e quero poder reagir no caso de a) a ordem pendente ser preenchida e, finalmente, b) a posição aberta ser fechada por um stop loss ou meta de lucro.

Entendi corretamente que:

  1. quando a ordem pendente foi preenchida, posso obter o número mágico apenas solicitando-o na lista de posições, apesar de o parâmetro "request" de OnTradeTransaction() possuir o campo "magic" como:
             if(!PositionSelectByTicket(trans.position)) {Print(__LINE__," PositionSelectByTicket FAILED ",err());}
             else {      
                OpnPos[sz].mag  = PositionGetInteger(POSITION_MAGIC);
             }   
    

  2. os vários tipos de transação de forma que não posso saber se a posição de venda foi aberta ou fechada:
    void OnTradeTransaction(const MqlTradeTransaction& trans,
                            const MqlTradeRequest& request,
                            const MqlTradeResult& result)
      {
    //---
    
    //--- 
       static int counter=0;   // contador de chamadas OnTradeTransaction() 
       static uint lasttime=0; // hora da última chamada de OnTradeTransaction() 
    //--- 
       uint time=GetTickCount(); 
    //--- se a última transação foi realizada há mais de 1 segundo, 
       if(time-lasttime>1000) 
         { 
          counter=0; // então essa é uma nova operação comercial e o contador pode ser reiniciado 
          if(IS_DEBUG_MODE) 
             Print(__LINE__," "," New trade operation dTime",time-lasttime); 
         } 
       Print(__LINE__," ",counter," ",DoubleToString((double(lasttime=time)/1000.0,2)
                ," Tr.Type: ",EnumToString(trans.type)," DL.Type: ",EnumToString(trans.deal_type)
                ," RQ.Type: ",EnumToString(request.type)," RQ.Fill: ",EnumToString(request.type_filling)
             ); 
    Essa impressão é produzida no caso da abertura de uma posição às 01:00:40 e do fechamento dessa posição às 10:04:40:
    01:00:40   322 0 81952.76 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_SELL RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position
    10:04:40   322 0 81970.73 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_BUY  RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position
    
    01:00:40   322 0 81955.30 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position
    10:04:40   322 0 81980.91 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position
    
    01:00:40   322 0 81965.14 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position
    10:04:40   322 0 81982.69 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY DL.Type: ORDER_FILLING_FOK // close sell position
    
    01:00:59   322 0 81968.50 Tr.Type: TRADE_TRANSACTION_REQUEST     DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_SELL RQ.Fill: ORDER_FILLING_FOK // open sell position
    
    As chamadas parecem praticamente as mesmas - como assim? Às 13:00, uma venda foi aberta - por que há 12 ..TYPE_BUY e apenas 2 TYPE_SELL?
    Por que e qual é o significado de request.type = ORDER_TYPE_BUY no caso de um stop de venda ser acionado e se tornar uma venda (posição)? De onde vem o _BUY?
Você conhece uma maneira elegante de determinar que uma posição foi fechada por stop loss ou meta de lucro com os meios (parâmetros) de OnTradeTransaction() sem saber se foi fechada uma posição de venda ou de compra?