Filtro para gerenciar os resultados de cada EA separadamente

 

Olá pessoal! 

Estou utilizando o código abaixo para checar os resultados de meus EA, porém gostaria de saber se é possível filtrar esses resultados através do comentário que é inserido quando cada EA faz operação, pois do modo como está o código mostra o resultado geral da conta e não adiantaria colocar o mesmo código em cada EA separadamente já que todas mostrariam o mesmo resultado. Gostaria que fosse por comentário pois não utilizo magic number.


Desde já agradeço a atenção!


double CurrentDayResults()
  {
   datetime time_start = iTime(_Symbol, PERIOD_D1, 0);
   double   result = 0.0;
   ulong    ticket;
   int      cnt;

   if(HistorySelect(time_start, TimeCurrent()))
     {
      for(cnt = HistoryDealsTotal() - 1; cnt >= 0; cnt--)
        {
         ticket = HistoryDealGetTicket(cnt);
         if(ticket != 0)
           {
            if(HistoryDealGetInteger(ticket, DEAL_MAGIC) == EA_MAGIC)
              {
               result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
              }
           }
         else
           {
            Print("Error getting deal ticket in history ...");
            result = EMPTY_VALUE;
            break;
           }
        }
     }
   else
     {
      Print("Error getting operations history ...");
      result = EMPTY_VALUE;
     }

   return(result);
  }
 
Marcel CardosoOlá pessoal! Estou utilizando o código abaixo para checar os resultados de meus EA, porém gostaria de saber se é possível filtrar esses resultados através do comentário que é inserido quando cada EA faz operação, pois do modo como está o código mostra o resultado geral da conta e não adiantaria colocar o mesmo código em cada EA separadamente já que todas mostrariam o mesmo resultado. Gostaria que fosse por comentário pois não utilizo magic number. Desde já agradeço a atenção!

Olá, Marcel, já vi essa função por aí... 😊 Teste o seguinte: inclua um parâmetro do tipo string e onde é feita a verificação do Magic Number, você substitui...

//+------------------------------------------------------------------+
//| Calcula o lucro / prejuízo do dia atual                          |
//+------------------------------------------------------------------+
double CurrentDayResults(string comment)
  {
// - - -
   if(StringFind(HistoryDealGetString(ticket, DEAL_COMMENT), comment) >= 0)
     {
      // - - -
     }
// - - -
   return(result);
  }
//+------------------------------------------------------------------+

Agora, como você vai trabalhar com comparação de strings, teste também a questão do desempenho, se vai ficar muito prejudicado...

 
Vinicius de Oliveira #:

Olá, Marcel, já vi essa função por aí... 😊 Teste o seguinte: inclua um parâmetro do tipo string e onde é feita a verificação do Magic Number, você substitui...

Agora, como você vai trabalhar com comparação de strings, teste também a questão do desempenho, se vai ficar muito prejudicado...

Eu tentei fazer o que vc falou mas não consegui. Só retorna -1 (que não encontrou nenhum comentário), mas como a varredura é no mes inteiro então está errado pois já fiz a troca do comentário e continuou resultando na mesma.
 
Marcel Cardoso #Eu tentei fazer o que vc falou mas não consegui. Só retorna -1 (que não encontrou nenhum comentário), mas como a varredura é no mes inteiro então está errado pois já fiz a troca do comentário e continuou resultando na mesma.

Você está considerando a questão de letras maiúsculas e minúsculas (case-sensitive)? Dê um Print() em HistoryDealGetString(ticket, DEAL_COMMENT) e na variável comment...

 
Vinicius de Oliveira #:

Você está considerando a questão de letras maiúsculas e minúsculas (case-sensitive)? Dê um Print() em HistoryDealGetString(ticket, DEAL_COMMENT) e na variável comment...

Sim, estou considerando essa questão, mas continua mesma coisa.

 
Marcel Cardoso #:

Sim, estou considerando essa questão, mas continua mesma coisa.

Tem certeza que teve trade no dia? Talvez tu tenha que arrumar a variavel time_start passando o zero no iTime para um valor que pegue mais dias e, com isso, mais operações e tu consiga ver o que quer certinho.

Outro ponto, assumindo que o codigo colado aqui seja diferente do executado. Confere se não teria uma chamada por acidente a HistoryDealSelect que essa função "zera" a lista de trades que a HistorySelect cria.

 

Sim, ele até printa as strings corretamente, mas na hora de fazer a somatória fica zerado. Vou postar o código novamente conforme testei.

double Results(datetime time_start)
  {
   double result = 0.0;
   ulong  ticket;
   int    cnt;
   string comment = "kamikaze-win";
   
   datetime time_start2 = iTime(_Symbol, PERIOD_MN1, 0);
   
   if(HistorySelect(time_start2, TimeCurrent()))
     {
      for(cnt = HistoryDealsTotal() - 1; cnt >= 0; cnt--)
        {
         ticket = HistoryDealGetTicket(cnt);
         if(ticket != 0)
           {
            if((HistoryDealGetInteger(ticket, DEAL_TYPE) == DEAL_TYPE_BUY || HistoryDealGetInteger(ticket, DEAL_TYPE) == DEAL_TYPE_SELL))
              {
               if(HistoryDealGetString(ticket,DEAL_COMMENT) == comment)
                  {
                     result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
                  }
              }
           }
         else
           {
            Print("Error getting deal ticket in history ...");
            result = EMPTY_VALUE;
            break;
           }
        }
     }
   else
     {
      Print("Error getting operations history ...");
      result = EMPTY_VALUE;
     }

   return(result);
  }
 
Ricardo Rodrigues Lucca #:

Tem certeza que teve trade no dia? Talvez tu tenha que arrumar a variavel time_start passando o zero no iTime para um valor que pegue mais dias e, com isso, mais operações e tu consiga ver o que quer certinho.

Outro ponto, assumindo que o codigo colado aqui seja diferente do executado. Confere se não teria uma chamada por acidente a HistoryDealSelect que essa função "zera" a lista de trades que a HistorySelect cria.

a variável time_start que eu estou usando está sendo configurada para mensal já para poder fazer a contabilidade do mês, mas continua zerada.

 
Marcel Cardoso #Sim, ele até printa as strings corretamente, mas na hora de fazer a somatória fica zerado. Vou postar o código novamente conforme testei.

É verdade, testei aqui e realmente quando o histórico é filtrado pelo comentário informado, o DEAL_PROFIT é sempre zerado... Acho que a solução mais prática (e considero também a mais correta) é utilizar MNs exclusivos para cada estratégia... Antes de abrir posição, define o MN referente àquela estratégia:

      //--- Set Magic Number
      m_trade.SetExpertMagicNumber(EA_MAGIC1);
 
Marcel Cardoso #:

a variável time_start que eu estou usando está sendo configurada para mensal já para poder fazer a contabilidade do mês, mas continua zerada.

Da uma olhada nesse artigo abaixo pode lhe ajudar a ver a relação mais correta. O que acontece no fechamento por TP / SL so tem no comentario isso e se for chamado no robo PositionClose não tem comentário tambem.

https://www.mql5.com/pt/articles/7463

SQLite: Native handling of SQL databases in MQL5
SQLite: Native handling of SQL databases in MQL5
  • www.mql5.com
The development of trading strategies is associated with handling large amounts of data. Now, you are able to work with databases using SQL queries based on SQLite directly in MQL5. An important feature of this engine is that the entire database is placed in a single file located on a user's PC.