Ajuda Limite de Loss

 

Bom dia pessoal,


Poderiam me ajudar nesse meu método de limite de loss?

Ele funciona no backtest, mas na demo não.

Não recebo nenhum erro na plataforma, ele simplesmente não emite a mensagem e continua a abrir ordens.

Alguma ideia doque pode estar errado?


Muito obrigado desde já.


//+------------------------------------------------------------------+
//|       Verifica se o limite de Loss foi atingido                  |
//+------------------------------------------------------------------+
bool lossLimit()
  {
   if(limiteDeLoss > 0) //Verifique apenas se eu tiver uma meta de loss e se eu ja tiver uma negociação efetuada
     {

      string CurrDate = TimeToString(TimeCurrent(), TIME_DATE);
      HistorySelect(StringToTime(CurrDate), TimeCurrent());
      int dealsTotal = HistoryDealsTotal()-1;
      int totalDeLoss = 0;

      if(dealsTotal > 0) //Verifique o total de Losses somente se ja houver negociações encerradas no histórico
        {
         ulong  ticket;

         for(int i=dealsTotal; i>=0; i--)
           {
            ticket = HistoryDealGetTicket(i);
            if(ticket > 0)
              {
               string comment = HistoryDealGetString(ticket, DEAL_COMMENT);

               if(StringFind(comment, "sl ") == 0) //Verificar se a ultima negociação foi Loss
                  totalDeLoss++;
              }
           }

         if(totalDeLoss == limiteDeLoss)
           {
            Print("Limite de Loss Diário atingido.");
            return true;
           }
        }
     }
   return false;
  }
 
João Bernardes:


Bom dia,

uma observação importante, o DEAL só é equivalente a fechar posição se você está operando por volume mínimo... caso contrário pode ocorrer derrapagem ou seja vai receber  vários deals até fechar a posição.

Dito isto a outra recomendação é evitar operações com strings por que são demoradas, um teste if(HistoryGetDouble(ticket,DEAL_PROFIT)<0) é centenas de vezes mais rápido.

Por fim, veja se isso corrige a rotina.

StringToUpper(comment);
if(StringFind(comment, "SL ",0) > -1)
 
Rogerio Giannetti Torres:

Bom dia,

uma observação importante, o DEAL só é equivalente a fechar posição se você está operando por volume mínimo... caso contrário pode ocorrer derrapagem ou seja vai receber  vários deals até fechar a posição.

Dito isto a outra recomendação é evitar operações com strings por que são demoradas, um teste if(HistoryGetDouble(ticket,DEAL_PROFIT)<0) é centenas de vezes mais rápido.

Por fim, veja se isso corrige a rotina.

Vc conhece alguma outra forma de verificar se a ultima deal foi loss sem ser por string?

 
João Bernardes:

Vc conhece alguma outra forma de verificar se a ultima deal foi loss sem ser por string?

Sim

 
Rogerio Giannetti Torres:

Sim

Pode me passar uma ideia melhor?

Pode mandar PM se quiser.

 
João Bernardes:


if(HistoryDealGetInteger(ticket,DEAL_REASON) == DEAL_REASON_SL ) totalDealsSL++;


Obs: Se o EA tem algum tipo de trailing stop o SL não significa necessariamente prejuízo !!!

 
Rogerio Giannetti Torres:


Obs: Se o EA tem algum tipo de trailing stop o SL não significa necessariamente prejuízo !!!

Sim

Então a melhor forma pata EA que tem TS ainda seria da forma anterior com:


if(HistoryDealGetDouble(ticket,DEAL_PROFIT)<0)

Certo?