Problema para pegar o deal_profit de ordens específicas

 

Boa tarde pessoal,

Eu estou com um problema há cerca de um mês, que consiste em pegar apenas o lucro de algumas ordens específicas do meu bot.

Eu envio como comentário a string "C" no envio das ordens, mas, na hora de filtrar pela função abaixo:

double saldo()
{
   datetime agora = TimeCurrent();
   datetime hoje = (agora/86400)*86400;

   HistorySelect(hoje,agora);
   int total=HistoryDealsTotal();
   
   double saldototal=0.0;
   
   for(int i=0;i<total;i++)
     {
      ulong ticket = HistoryDealGetTicket(i);
      string comentario = HistoryDealGetString(ticket,DEAL_COMMENT);
      if(comentario=="C"){     
         saldototal+=HistoryDealGetDouble(ticket,DEAL_PROFIT);}
     }
   return NormalizeDouble(saldototal,2);
}

estou tendo problemas.

Pela minha verificação, quando da saída da operação o comentário não é o mesmo da entrada. O comentário de saída fica da forma "tp 10.90", ou seja, tp e o preço executado.

Já filtrei só pelos deals de saída, mas assim fica impossível filtrar só os lucros da estratégia específica com comentário "C".

Alguém poderia me dar um caminho para prosseguir? Realmente esgotei minhas possibilidades. Qualquer ideia é bem-vinda. Obrigado.

 
Lucas Jose Munoz Dentello:

Boa tarde pessoal,

Eu estou com um problema há cerca de um mês, que consiste em pegar apenas o lucro de algumas ordens específicas do meu bot.

Eu envio como comentário a string "C" no envio das ordens, mas, na hora de filtrar pela função abaixo:

estou tendo problemas.

Pela minha verificação, quando da saída da operação o comentário não é o mesmo da entrada. O comentário de saída fica da forma "tp 10.90", ou seja, tp e o preço executado.

Já filtrei só pelos deals de saída, mas assim fica impossível filtrar só os lucros da estratégia específica com comentário "C".

Alguém poderia me dar um caminho para prosseguir? Realmente esgotei minhas possibilidades. Qualquer ideia é bem-vinda. Obrigado.

Por Magic Number?


É pra isso que ele serve...

 
Flavio Jarabeck #:

Por Magic Number?


É pra isso que ele serve...

Boa tarde Sr. Flávio Jarabeck.

O magic number é o mesmo para todas as ordens desse bot. O objetivo é apenas armazenar o lucro de algumas operações específicas, diferenciadas pelo comentário.

Caso eu selecione apenas o magic number, armazenaria o lucro de todas as negociações do bot, e não é esse o objetivo.

Você teria alguma sugestão?

Obrigado.

 
Lucas Jose Munoz Dentello #:

Boa tarde Sr. Flávio Jarabeck.

O magic number é o mesmo para todas as ordens desse bot. O objetivo é apenas armazenar o lucro de algumas operações específicas, diferenciadas pelo comentário.

Caso eu selecione apenas o magic number, armazenaria o lucro de todas as negociações do bot, e não é esse o objetivo.

Você teria alguma sugestão?

Obrigado.

Eu separo cada estratégia por Bot, do contrário nao consigo medir performance... É por isso que o Magic Number é a ferramenta para tal filtro...
 
Flavio Jarabeck #:
Eu separo cada estratégia por Bot, do contrário nao consigo medir performance... É por isso que o Magic Number é a ferramenta para tal filtro...

Eu tive bastante trabalho para conseguir integrar algumas estratégias distintas em um mesmo bot, e esse está sendo o último passo.

Estou tentando uma gambiarra e se der certo deixo aqui para ajudar quem estiver na mesma situação.

 
Flavio Jarabeck #:
Eu separo cada estratégia por Bot, do contrário nao consigo medir performance... É por isso que o Magic Number é a ferramenta para tal filtro...

O Sr. teria alguma ideia de como posso encontrar o par de um deal passado? Eu uso o modo hedge

Por exemplo: Com o ticket do deal de abertura, que contém o comentário "C" (que eu consigo acessar), acessar o ticket correspondente ao fechamento dessa posição.

Obrigado.

 
Lucas Jose Munoz Dentello:

Boa tarde pessoal,

Eu estou com um problema há cerca de um mês, que consiste em pegar apenas o lucro de algumas ordens específicas do meu bot.

Eu envio como comentário a string "C" no envio das ordens, mas, na hora de filtrar pela função abaixo:

estou tendo problemas.

Pela minha verificação, quando da saída da operação o comentário não é o mesmo da entrada. O comentário de saída fica da forma "tp 10.90", ou seja, tp e o preço executado.

Já filtrei só pelos deals de saída, mas assim fica impossível filtrar só os lucros da estratégia específica com comentário "C".

Alguém poderia me dar um caminho para prosseguir? Realmente esgotei minhas possibilidades. Qualquer ideia é bem-vinda. Obrigado.

Boa noite Lucas e Flávio!


Lucas, dê uma olhada se esse tópico pode ajudar:

Calcular Lucro Diário, Semanal e Mensal - Expert Advisors e Negociação Automatizada - Fórum de negociação algorítmica MQL5
Calcular Lucro Diário, Semanal e Mensal
Calcular Lucro Diário, Semanal e Mensal
  • 2021.07.16
  • www.mql5.com
Boa noite galera, Estou desenvolvendo um EA e estou com dificuldade: Gostaria de realizar a soma dos lucros/perdas diárias e dividir em lucro/perda...
 
Vinicius de Oliveira #:

Boa noite Lucas e Flávio!


Lucas, dê uma olhada se esse tópico pode ajudar:

Calcular Lucro Diário, Semanal e Mensal - Expert Advisors e Negociação Automatizada - Fórum de negociação algorítmica MQL5

Acho que você só vai precisar substituir . . .

if(HistoryDealGetInteger(ticket, DEAL_MAGIC) == EA_MAGIC)


. . . por:

if(HistoryDealGetString(ticket, DEAL_COMMENT) == "C")
 

Lucas, é isso ai que o Vinicius postou.


Uma ordem gera um ou mais negócios, você tem que achar o comentário na Ordem e dai procurar os negocios (deals) que ela gerou para descobrir o que ela resultou.

Ta ai sua rotina.

//+------------------------------------------------------------------+
//|                                     Historico por comentario.mq5 |
//|                                Copyright 2021, Cesar Oaquim Ltd. |
//|                                    https://www.toolsTOtrader.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Cesar Oaquim Ltd."
#property link      "https://www.toolsTOtrader.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   long Magic = 71234569379273;
   double saldo=0;
   
   HistorySelect(0,TimeCurrent());
   for(int i=0; i<HistoryOrdersTotal(); i++)
     {
      long ticket = HistoryOrderGetTicket(i);
      long identificador= HistoryOrderGetInteger(ticket,ORDER_POSITION_BY_ID);

      double resultado =0;
      if(HistoryOrderGetInteger(ticket,ORDER_MAGIC)==Magic && HistoryOrderGetString(ticket,ORDER_COMMENT) == "Posted by Trade for Dummies")
        {
         Print(HistoryOrderGetString(ticket,ORDER_COMMENT));
         for(int x=0; x<HistoryDealsTotal(); x++)
           {

            long dealticket = HistoryDealGetTicket(x);
            if(ticket == HistoryDealGetInteger(dealticket,DEAL_POSITION_ID))
              {


               saldo+=HistoryDealGetDouble(dealticket,DEAL_PROFIT)+HistoryDealGetDouble(dealticket,DEAL_SWAP)+HistoryDealGetDouble(dealticket,DEAL_COMMISSION);

              }

           }
        }

     }
     
     Print("Saldo ",saldo);

  }
//+------------------------------------------------------------------+
 

Boa noite Sr. Vinicius e Sr. Cesar.

Muito obrigado pela contribuição, eu estava tentando uma gambiarra explosiva;

Estou saindo para jantar e na volta vou implementar e posto o resultado aqui.

No mais, extremamente grato pelo tempo e boa vontade dos senhores.

Att

 

Só mais uma coisa, para pegar carona na resposta do Flávio lá em cima e deixar esse tópico mais completo para os programadores futuros, você pode ter mais de um magic number no seu robô, ou limitá-lo a um numero X definido pelo usuário, para separar suas ordens por magic dentro do mesmo robô.


// Exemplo, magic definido pelo usuário

input long magic;

long magic_tipoA = magic+1;
long magic_tipoB = magic+2;
long magic_tipoC = magic+3;

Logico, você teria que fazer uma verificação para ver se o sujeito não colocou o numero maximo do long ( 9 223 372 036 854 775 807) e aceitar somente o maximo subtraido do total de tipo.

Razão: