Identificando um Stop Loss - página 2

 
Kl_ Urt:

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....


Kl_ Urt,

Sou novo na programação e gostaria de saber como vc chama essa função no codigo? simplesmente dentro da chave OnTick() vc inclue a linha OnTradeTransaction() ??


Abs.

 
Alberto Lira:

Kl_ Urt,

Sou novo na programação e gostaria de saber como vc chama essa função no codigo? simplesmente dentro da chave OnTick() vc inclue a linha OnTradeTransaction() ??


Abs.

o OnTradeTransaction() é um outro evento e equipara-se com o OnTick(), portanto deve ser colocado FORA dele.

OnTick(){

// instruções do OnTick

}

OnTradeTransaction(){

// instruções do OnTradeTransaction

}

Pode ser tanto antes quanto depois, não faz diferença na execução.

 
 Kl_ Urt Valeu... esse código resolveu tudo para todos.
Kl_ Urt
Kl_ Urt
  • www.mql5.com
Perfil do Trader
 
Kl_ Urt:

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....


Muito bom, me ajudou aqui. Estava procurando isso. 


Fiz uma pequena alteração para tratar quando tiver usando traling stop. No meu caso aqui, se deu loss e o resultado da operação foi lucro(isso acontece usando traling stop) então eu não considero como loss.

double ResultadoUltimoTrade()
{
  HistorySelect(0,TimeCurrent());
  ulong _ticket = HistoryDealGetTicket(HistoryDealsTotal()-1);
  return(HistoryDealGetDouble(_ticket,DEAL_PROFIT));
}


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");
        buyLoss  = false;
        sellLoss = false;
      }
      else if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
      {
        Alert("Sell");
        buyLoss  = false;
        sellLoss = false;
      }
    }
    else if(EnumToString(deal_entry) == "DEAL_ENTRY_OUT")
    {
      if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
      {
        if(ResultadoUltimoTrade() < 0)
        {
          Alert("Sell SL");
          buyLoss  = false;
          sellLoss = true;
        }
      }
      else if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
      {
        if(ResultadoUltimoTrade() < 0)
        {
          Alert("Buy SL");
          buyLoss  = true;
          sellLoss = false;
        }
      }
      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");
      }
    }
  }
}
 
Cristiano Santos #:

Muito bom, me ajudou aqui. Estava procurando isso. 


Fiz uma pequena alteração para tratar quando tiver usando traling stop. No meu caso aqui, se deu loss e o resultado da operação foi lucro(isso acontece usando traling stop) então eu não considero como loss.

Cristiano, dar alerta por ai tudo bem mas notei que associar variaveis por esse evento pode dar uma dessincronizacao com ontick, onde la ele pode tomar uma acao antes mesmo de mudar a variavel ali. Sincronizar isso ainda nao encontrei, voce ja?

 
Rodrigo 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

Essa solucao proposta parece uma das melhores, pois pelo evento nao tem sincronizmo e ai se eu gostaria de nao operar mais porque acionou um loss, eu validar isso no onTrade vai chegar la depois de ja ter acontecido um evento no onTick. Tenho tentado sincronizar esses eventos em casos assim, até pensei em aplicar um Sleep dentro do tick quando ocorrer uma entrada no metodo onTradeTransaction mas acredito que nao vá adiantar pois ainda corre o risco de entrar no onTick antes do onTrade.

 
Cristiano Santos #:

Muito bom, me ajudou aqui. Estava procurando isso. 


Fiz uma pequena alteração para tratar quando tiver usando traling stop. No meu caso aqui, se deu loss e o resultado da operação foi lucro(isso acontece usando traling stop) então eu não considero como loss.

Tenho uma agonia enorme vendo esses EnumToString e uma string sendo testada.... Voces sabem que seria correto tambem tirar as aspas e a chamada ao EnumToString e teriam o mesmo resultado? Deixando assim....

double ResultadoUltimoTrade()
{
  HistorySelect(0,TimeCurrent());
  ulong _ticket = HistoryDealGetTicket(HistoryDealsTotal()-1);
  return(HistoryDealGetDouble(_ticket,DEAL_PROFIT));
}


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(deal_entry == DEAL_ENTRY_IN)
    {
      if(deal_reason == DEAL_REASON_EXPERT && trans.deal_type == DEAL_TYPE_BUY)
      {
        Alert("Buy");
        buyLoss  = false;
        sellLoss = false;
      }
      else if(deal_reason == DEAL_REASON_EXPERT && trans.deal_type == DEAL_TYPE_SELL)
      {
        Alert("Sell");
        buyLoss  = false;
        sellLoss = false;
      }
    }
    else if(deal_entry == DEAL_ENTRY_OUT)
    {
      if(deal_reason == DEAL_REASON_SL && trans.deal_type == DEAL_TYPE_BUY)
      {
        if(ResultadoUltimoTrade() < 0)
        {
          Alert("Sell SL");
          buyLoss  = false;
          sellLoss = true;
        }
      }
      else if(deal_reason == DEAL_REASON_SL && trans.deal_type == DEAL_TYPE_SELL)
      {
        if(ResultadoUltimoTrade() < 0)
        {
          Alert("Buy SL");
          buyLoss  = true;
          sellLoss = false;
        }
      }
      else if(deal_reason == DEAL_REASON_TP && trans.deal_type == DEAL_TYPE_BUY)
      {
        Alert("Sell TP");
      }
      else if(deal_reason == DEAL_REASON_TP && trans.deal_type == DEAL_TYPE_SELL)
      {
        Alert("Buy TP");
      }
    }
  }
}
Razão: