Como limitar o número de trades perdedores consecutivos no dia?

Daniel D.  

Caros colegas,

Como que eu faço uma conexão com OnTradeTransaction pra saber que a primeira e a segunda operação foram consecutivamente perdedoras? Eu chamo a função abaixo em OnTick() e ela impede o robô de operar uma eventual terceira vez no dia, que é basicamente o que eu quero, porém dessa forma fica indefinido se estes deals são de gain ou se são de loss. Eu preciso que o meu EA pare de operar após o segundo deal do dia, sendo que tanto o primeiro quanto o segundo devem ser necessariamente perdedores. Tem algum jeito de inserir o DEAL_PROFIT nessa função? Alguma sugestão? Muito obrigado.

int firstAndSecondTradeStopped()
  {
   int deals=1;
   HistorySelect(StringToTime(TimeToString(TimeTradeServer(), TIME_DATE)), INT_MAX);
   for(int i = HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_IN
        )
        {
         deals++;
        }
     }
   return(deals<=2);
  }

Em OnTick() eu estou fazendo a chamada da seguinte forma:

(...)

if(firstAndSecondTradeStopped())

{

Compra/Venda

}

Vinicius Pereira De Oliveira  
Daniel D.:

Caros colegas,

Como que eu faço uma conexão com OnTradeTransaction pra saber que a primeira e a segunda operação foram consecutivamente perdedoras? Eu chamo a função abaixo em OnTick() e ela impede o robô de operar uma eventual terceira vez no dia, que é basicamente o que eu quero, porém dessa forma fica indefinido se estes deals são de gain ou se são de loss. Eu preciso que o meu EA pare de operar após o segundo deal do dia, sendo que tanto o primeiro quanto o segundo devem ser necessariamente perdedores. Tem algum jeito de inserir o DEAL_PROFIT nessa função? Alguma sugestão? Muito obrigado.

. . .

Bom dia!


Veja se essa função ajuda:

//+------------------------------------------------------------------+
//| Limitar o número de trades perdedores consecutivos no dia        |
//+------------------------------------------------------------------+
bool LimitLossTrade(const int limit)
  {
   int consec_loss = 0;
   datetime time_start = iTime(_Symbol, PERIOD_D1, 0);

   if(HistorySelect(time_start, TimeCurrent()))
     {
      for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
        {
         const ulong ticket = HistoryDealGetTicket(i);

         if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == MAGICNUM)
           {
            if(HistoryDealGetDouble(ticket, DEAL_PROFIT) < 0.0) {consec_loss++;}
            else
            if(HistoryDealGetDouble(ticket, DEAL_PROFIT) > 0.0) {consec_loss=0;}
           }
         if(consec_loss >= limit) {return(true);}           
        }
     }
   else
     {
      Print("Erro ao recuperar o histórico de operações ...");
     }

   return(false);
  }
Daniel D.  
Vinicius de Oliveira:

Bom dia!


Veja se essa função ajuda:

Olá, Vinicius. Testei sua função e me parece que o DEAL_PROFIT não funciona fora do escopo de OnTradeTransaction. Será que eu estou errado? Na dúvida pedi para imprimir várias vezes e o DEAL_PROFIT sempre me retornando o número 9, que não sei de onde saiu esse valor. Vou continuar tentando e se eu progredir eu volto a postar aqui. Obrigado pela atenção. Abraço.

Daniel D.  
Felipe Lisboa:
Crie um contador de candles com o timeframe diário 
Para cada novo dia você vai zerar o contador de operações de loss
E para cada loss que der vai incrementar ele

Aí só vai precisar checar antes de cada operação se o limite foi atingido 

Olá, Felipe. Pode me dar um exemplo com algum pedaço de código? Já estou há 2 dias empacado procurando a solução e já vasculhei todo o fórum sem sucesso. Abraço.

Rogerio Giannetti Torres  

Boa noite,

Um deal (transação) corresponde  a uma parcela da ordem que está sendo preenchida ( executada ) ... então para obter o resultado de uma posição que acabou de ser encerrada,  no OnTradeTransaction() você deve somar o DEAL_PROFIT de todos os deals referentes a essa posição ( DEAL_POSITION_ID ).

Em DEMO as ofertas qtd x preço do book não são enxergadas, ou seja a liquidez não tem limite, uma ordem é totalmente preenchida pelo preço da primeira oferta e consequentemente você tem somente um deal. Em conta REAL a ordem é preenchida (executada) obedecendo as qtds ofertadas em cada linha do book consequentemente você tem vários deals até o preenchimento completo da ordem.

      

Daniel D.  
Rogerio Giannetti Torres:

Boa noite,

Um deal (transação) corresponde  a uma parcela da ordem que está sendo preenchida ( executada ) ... então para obter o resultado de uma posição que acabou de ser encerrada,  no OnTradeTransaction() você deve somar o DEAL_PROFIT de todos os deals referentes a essa posição ( DEAL_POSITION_ID ).

Em DEMO as ofertas qtd x preço do book não são enxergadas, ou seja a liquidez não tem limite, uma ordem é totalmente preenchida pelo preço da primeira oferta e consequentemente você tem somente um deal. Em conta REAL a ordem é preenchida (executada) obedecendo as qtds ofertadas em cada linha do book consequentemente você tem vários deals até o preenchimento completo da ordem.

      

Então dentro dessa única ação de comprei/vendi ou vice-versa posso ter vários deals dependendo do consumo de liquidez do book, tendo que somar tudo para ver se o resultado foi positivo ou negativo. Obrigado, Rogério. Vou tentar desenvolver essa ideia e aplicar no meu caso.

Vinicius Pereira De Oliveira  
Daniel D.:

Olá, Vinicius. Testei sua função e me parece que o DEAL_PROFIT não funciona fora do escopo de OnTradeTransaction. Será que eu estou errado? Na dúvida pedi para imprimir várias vezes e o DEAL_PROFIT sempre me retornando o número 9, que não sei de onde saiu esse valor. Vou continuar tentando e se eu progredir eu volto a postar aqui. Obrigado pela atenção. Abraço.

Olá, Daniel! Você testou a função a partir de OnTick() ? Eu testei aqui em corretora Forex e funcionou normalmente. Você só precisa adicionar a função como uma condição a mais antes de abrir nova posição:


if(!LimitLossTrade(2) && ... )
Daniel D.  
Vinicius de Oliveira:

Olá, Daniel! Você testou a função a partir de OnTick() ? Eu testei aqui em corretora Forex e funcionou normalmente. Você só precisa adicionar a função como uma condição a mais antes de abrir nova posição:


Boa tarde, Vinicius. Agora funcionou! Eu estava esquecendo de usar a negação (!) na chamada dentro de OnTick(). E como já suspeitava o robô melhorou a performance no backtest ao limitar a essas duas operações perdedoras. Só fiquei sem entender porque ele imprime o DEAL_PROFIT como 9, independente se o resultado é negativou ou positivo, mas isso pra mim é irrelevante, só mera questão de curiosidade mesmo, pois funcionalmente está perfeito. Muito obrigado! Abraço.

Vinicius Pereira De Oliveira  
Daniel D.:

Boa tarde, Vinicius. Agora funcionou! Eu estava esquecendo de usar a negação (!) na chamada dentro de OnTick(). E como já suspeitava o robô melhorou a performance no backtest ao limitar a essas duas operações perdedoras. Só fiquei sem entender porque ele imprime o DEAL_PROFIT como 9, independente se o resultado é negativou ou positivo, mas isso pra mim é irrelevante, só mera questão de curiosidade mesmo, pois funcionalmente está perfeito. Muito obrigado! Abraço.

Beleza Daniel! Abraço!

Razão: