Alguém me ajuda, essa função não funciona como deveria...

 

Boa tarde,

Caso tenha alguma alma boa por aí, alguém me ajude, por favor...

Já estou há dias tentando entender porque essa função funciona em um dos meus EA's e não funciona em outro...

Preciso que a função me retorne o valor do profit diário, porém só me retorna a soma dos profts negativos, tudo que é positivo ela pula.


A função desse link, dá o mesmo valor da minha função: https://www.mql5.com/pt/docs/trading/historyselect

Mas o caso é que estou com proft positivo e bem positivo, mas a função, seja qualquer função que eu coloco no EA para calcular o profit, ela só captura os profits negativos.


Segue a função:


double Hist_Operacoes(double pedido)
{  double Resp=0;
   double iPTGeral=0; //Profit total Geral
   ulong iOperacao_fechada=1;
   int oper_compra=0;
   int oper_venda=0;
   double profit_op=0;
   
   
   HistorySelect(HoraStart,TimeCurrent());
   for(int i = HistoryDealsTotal() ; i >= 0; i--)
   {        
      ulong            ticket     = HistoryDealGetTicket(i);
      ENUM_DEAL_ENTRY  dealEtry   = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY);
      long             magic      = HistoryDealGetInteger(ticket,DEAL_MAGIC);
      ENUM_DEAL_TYPE   dealType   = (ENUM_DEAL_TYPE) HistoryDealGetInteger(ticket,DEAL_TYPE);
      ENUM_DEAL_REASON dealReason = (ENUM_DEAL_REASON) HistoryDealGetInteger(ticket, DEAL_REASON);
      double           dealProfit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
      ulong            ideal_position_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
      
      if(magic==magic_number)
      {  
         if((dealType == DEAL_TYPE_BUY) && (dealEtry==DEAL_ENTRY_IN))
         {oper_compra++;
                          
         }
         if((dealType == DEAL_TYPE_SELL) && (dealEtry==DEAL_ENTRY_IN))
         { oper_venda++;
         
         }
         if(dealEtry==DEAL_ENTRY_OUT && magic==magic_number)
         {profit_op+=dealProfit; 
            
         }
      }
      
   
   }
   
   if(pedido==5){Resp=oper_compra;}
   if(pedido==7){Resp=oper_venda;}
   if(pedido==10){Resp=oper_compra+oper_venda;}
   if(pedido==16){Resp=profit_op;}
return Resp; 

}
 

Olhando rapidamente, parece não ter erro, mas se vc faz reversão não funcionará.

Onde está:

if(dealEtry==DEAL_ENTRY_OUT && magic==magic_number)

Teria que ser :

if((dealEtry==DEAL_ENTRY_OUT || dealEtry == DEAL_ENTRY_INOUT) && magic==magic_number)
 
configurou o magic number lá no OnInit?
 
PequenoMinor:

Olhando rapidamente, parece não ter erro, mas se vc faz reversão não funcionará.

Onde está:

Teria que ser :

Não faço reversão...

 
Eduardo Oliveira:
configurou o magic number lá no OnInit?

Adicionei a linha: 

m_trade.SetExpertMagicNumber(magic_number);

ao OnInit e aparentemente resolveu, obrigado...

Digo aparentemente por uma pequena diferença de 16,00 entre as operações diárias que somei 5 vezes na calculadora e o valor que a função está retornando...

 

. . .


Segue outro exemplo:


//+------------------------------------------------------------------+ 
//| Calcula o lucro / prejuízo do dia atual                          |
//+------------------------------------------------------------------+ 
double CurrentDayProfit()
  {
   datetime time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400));
   double   result = 0.0;
   ulong    ticket;
   int      cnt;

   if(HistorySelect(time_start, TimeCurrent()))
     {
      for(cnt = HistoryDealsTotal() - 1; cnt >= 0; cnt--)
        {
         ticket = HistoryDealGetTicket(cnt);

         if(HistoryDealGetInteger(ticket, DEAL_MAGIC) == magic_number)
           {
            result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
           }
        }
     }
   else
     {
      Print("Erro ao recuperar o histórico de operações...");
     }

   return(result);
  }
 
Vinicius de Oliveira:

. . .


Segue outro exemplo:


Obrigado, Vinícius, testei e funciona perfeitamente.

 
Francisco Carlos Sobral Ribeiro:

Obrigado, Vinícius, testei e funciona perfeitamente.

Beleza, Carlos!! 👍