Identificando um Stop Loss

 

Galera, boa noite

Estou aprendendo MQL5 e gostaria de tirar uma dúvida: tenho uma ordem a mercado de compra com determinado TP e SL. Porém, como faço para identificar se ocorreu o TP ou  o SL? Na verdade não preciso nem saber qual foi o valor ou outros valores mas somente se bateu no TP ou SL.

Li materiais na internet sobre status do último deal mas não consegui rodar no meu código!

Não teria algo mais fácil não?

Obrigado

 

Opa, boa noite!

Uma solução é coletar o tickt da ordem quando da emissão para acompanhar, lembrando:

Vamos supor que seja o tickt X:

Primeiro é criado uma ordem (1), que se executada abre uma posição (2), que quando fechada vira um negócio(3).

1 = se usar OrderSelect(X) retorna true se ordem estiver aberta e false se estiver fechada  (supondo que a ordem inicial foi criada com sucesso)

https://www.mql5.com/pt/docs/trading/orderselect

2 = se usar PositionSelecByTicket(X)  retorna true se estiver no trade, e false se ele foi fechado

https://www.mql5.com/pt/docs/trading/positionselectbyticket

3 = veja também https://www.mql5.com/pt/docs/trading/historydealselect.

Observe que seu meta é EDGE ou NETTING que tem algumas diferenças no conjunto de comandos a utilizar.

At.

Daniel

Documentação sobre MQL5: Funções de Negociação (Trade) / OrderSelect
Documentação sobre MQL5: Funções de Negociação (Trade) / OrderSelect
  • www.mql5.com
Funções de Negociação (Trade) / OrderSelect - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Daniel Andrejczuk:

Opa, boa noite!

Uma solução é coletar o tickt da ordem quando da emissão para acompanhar, lembrando:

Vamos supor que seja o tickt X:

Primeiro é criado uma ordem (1), que se executada abre uma posição (2), que quando fechada vira um negócio(3).

1 = se usar OrderSelect(X) retorna true se ordem estiver aberta e false se estiver fechada  (supondo que a ordem inicial foi criada com sucesso)

https://www.mql5.com/pt/docs/trading/orderselect

2 = se usar PositionSelecByTicket(X)  retorna true se estiver no trade, e false se ele foi fechado

https://www.mql5.com/pt/docs/trading/positionselectbyticket

3 = veja também https://www.mql5.com/pt/docs/trading/historydealselect.

Observe que seu meta é EDGE ou NETTING que tem algumas diferenças no conjunto de comandos a utilizar.

At.

Daniel


Boa noite, Daniel. Tudo bem?

Então, vamos lá:

1) Aberta uma OrderSend para compra de um _Symbol

2) Executada essa ordem, uma posição foi aberta

3) Nessa mesma ordem foi estabelecido parâmetros de Stop Loss

Tentei o código abaixo porém não está rodando. Minha única necessidade é retornar se o último trade foi encerrado através do Stop Loss ou Take Profit:

      datetime end=TimeCurrent();              

      datetime start=end-PeriodSeconds(PERIOD_D1);


      HistorySelect(start,end);

      int deals=HistoryDealsTotal();

     

         ulong deal_ticket=HistoryDealGetTicket(deals-1); // o index 0 corresponde ao primeiro ao último trade?

              

         ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY); // isso está certo para retornar o último trade?

        

         if(entry_type == "STOPLOSS") // aqui que gostaria da ajuda!!!

{

}

Algumas dúvidas estão comentadas no próprio código!

Grande abs!

 

Bom dia!

Experimente usar HistoryDealGetDouble() para obter o DEAL_PROFIT que é o Lucro de uma operação (deal), esse se positivo o trade foi fechado com lucro e negativo prejuízo!

Se possível, quando postar código aqui na comunidade use o botão "SRC" no editar de mensagem aqui do site para inserir o código dentro e facilitar a visualização.

No OrderSend tem o result que você pode pegar o numero da ordem ou negócio, a seguir pode usar direto com a função acima para obter o profit!

bool  OrderSend( 
   MqlTradeRequest&  request,      // estrutura de consulta 
   MqlTradeResult&   result        // estrutura da resposta 
   );

struct MqlTradeResult 
  { 
   uint     retcode;          // Código de retorno da operação 
   ulong    deal;             // Bilhetagem (ticket) da operação (deal),se ela for realizada 
   ulong    order;            // Bilhetagem (ticket) da ordem, se ela for colocada 
   double   volume;           // Volume da operação (deal), confirmada pela corretora 
   double   price;            // Preço da operação (deal), se confirmada pela corretora 
   double   bid;              // Preço de Venda corrente 
   double   ask;              // Preço de Compra corrente 
   string   comment;          // Comentário da corretora para a operação (por default, ele é preenchido com a descrição código de retorno de um servidor de negociação) 
   uint     request_id;       // Identificador da solicitação definida pelo terminal durante o despacho 
   uint     retcode_external; // Código de resposta do sistema de negociação exterior 
  };

Espero que ajude!

Bom dia e boa semana!

 
Daniel Andrejczuk:

Bom dia!

Experimente usar HistoryDealGetDouble() para obter o DEAL_PROFIT que é o Lucro de uma operação (deal), esse se positivo o trade foi fechado com lucro e negativo prejuízo!

Se possível, quando postar código aqui na comunidade use o botão "SRC" no editar de mensagem aqui do site para inserir o código dentro e facilitar a visualização.

No OrderSend tem o result que você pode pegar o numero da ordem ou negócio, a seguir pode usar direto com a função acima para obter o profit!

Espero que ajude!

Bom dia e boa semana!

Olá Daniel Andrejczuk,

Essa frase sobre DEAL_PROFIT não ajuda a responder a questão original: "se positivo o trade foi fechado com lucro e negativo prejuízo!"

O usuário gostaria de saber se a operação bateu no TP ou no SL. Basta você imaginar uma situação de trailing stop, onde o SL é movido na direção do trade, para verificar que é possível fechar uma operação com lucro TANTO no take profit quanto no stop loss.

Portanto, a pergunta do usuário continua não respondida.

Abraços,
Malacarne

 

Olá Malacarne, 

Sim, o que respondi era se o trade houve ganho ou perda,  não fugi do tema do tópico e dei uma forma alternativa com um resultado similar. 

Destaco que na minha resposta escrevi "Espero que ajude!".

Vejo como positivo qualquer força para auxiliar algum membro e negativo todo comentário vazio (sem informação útil).

Também sou iniciante e estou aprendendo o MQL, sei como começar é difícil por isso tentei ajudar, lembrando que não quero e não sou remunerado por qualquer comentários que eventualmente faço aqui no grupo.

Eu não domino/conheço como fazer exatamente isso (pergunta do usuário) que é diferente de saber e não ajudar. Presumo como despendeu seu tempo comentando nesse tópico e não ajudou o usuário é porque você não deva saber a resposta também.

Atenciosamente,

Daniel

 

Felipe Dourado,

Me veio uma ideia da sua necessidade, mais é trabalhosa, o trade é pareado em 2 ordens, a de entrada que tem o cotação do profit e stop, então se consultar a ordem de saída e ver se o valor executado é igual ao do stop ou profit você pode ter sucesso.

Talvez exista uma forma mais simples, mais no momento não sei dizer.

At.

Daniel

 
Daniel Andrejczuk:

Olá Malacarne, 


Olá Daniel Andrejczuk,

"é porque você não deva saber a resposta também". Comentário interessante...

É importante dar espaço a todos aqui no fórum... Por isso não respondemos a todas as perguntas.

Com relação à pergunta original, basta varrer o histórico de operações e capturar o comentário da última ordem executada.

Você consegue obter uma substring onde consta o comentário "sl"... independente se foi no lucro ou no prejuízo, a ordem que encerrou a operação foi um stop loss. O mesmo vale para o take profit.


Abraços,
Malacarne

 

Prezados Rodrigo e Daniel,

Agradeço o apoio de ambos nessa jornada. Acabei encontrando um método que me auxiliou de uma forma fácil. Como não estou trabalhando com trailing stop, creio que o código abaixo funcione corretamente e não me trará maiores prejuízos:

      datetime end=TimeCurrent();          
      datetime start=0;
      
      HistorySelect(start,end);
      int total=HistoryOrdersTotal();
     
      ulong ticket = HistoryOrderGetTicket(total-1);     
      double second_trade=HistoryOrderGetDouble(ticket,ORDER_PRICE_OPEN);
              
      if((trade=="Compra" && first_trade>second_trade) || (trade=="Venda" && first_trade<second_trade))
        {
           ...
 
Felipe Dourado:

Prezados Rodrigo e Daniel,

Agradeço o apoio de ambos nessa jornada. Acabei encontrando um método que me auxiliou de uma forma fácil. Como não estou trabalhando com trailing stop, creio que o código abaixo funcione corretamente e não me trará maiores prejuízos:

 

Prezados,


Desenvolvi uma solução pessoal para a questão. Peço desculpas caso contenha algum erro (sou novato em programação), mas até então para mim tem funcionado perfeitamente para capturar transações de Compra, Venda, SL na Compra, SL na Venda, TP na Compra ou TP na Venda....


void OnTradeTransaction(const MqlTradeTransaction & trans,
                        const MqlTradeRequest & request,
                        const MqlTradeResult & result)
   {
      if (HistoryDealSelect(trans.deal))
      {
         ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY) HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         ENUM_DEAL_REASON deal_reason = (ENUM_DEAL_REASON) HistoryDealGetInteger(trans.deal, DEAL_REASON);
         if(EnumToString(deal_entry) == "DEAL_ENTRY_IN")
            {
               if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
                  {
                     Alert("Buy");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
                  {
                     Alert("Sell");
                  }
            }
         else if(EnumToString(deal_entry) == "DEAL_ENTRY_OUT")
            {
               if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
                  {
                     Alert("Sell SL");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
                  {
                     Alert("Buy SL");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_TP" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
                  {
                     Alert("Sell TP");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_TP" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
                  {
                     Alert("Buy TP");
                  }               
          } 
      }      
}
Razão: