Achar o lucro e o prejuizo total do dia na conta

 

Boa noite,

Estou tentando colocar uma função dentro do meu expert para me retornar a soma do lucro e prejuízo do dia até o momento.

Todas as formulas que utilizei até agora me retornam o lucro mas o prejuízo quando tem ele mostra zerado. Alguém saberia me dizer o porque?

double TOTAL_PROFIT_OF_OPEN_POSITIONS(/*int magicNum*/)
  {
  //   datetime time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400));
   datetime hours = StringToTime(TimeToString("10:00:00", TIME_DATE));
   datetime time_start = TimeCurrent ()- TimeCurrent ()% 86400;/*iTime(_Symbol, PERIOD_D1, 0);*/
   datetime end = TimeCurrent();   
   datetime start = end - PeriodSeconds(PERIOD_H1); //Período
   double   result = 0.0;
   ulong    ticket;
   int      cnt;

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

         if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == magicNum && HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {
            result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
           }
        }
     }
   else
     {
      Print(_Symbol, " - Erro ao recuperar o histórico de operações...");
     }

   return(result);
  }
 

Silverveins
:

Boa noite,

Estou tentando colocar uma função dentro do meu expert para me retornar a soma do lucro e prejuízo do dia até o momento.

Todas as formulas que utilizei até agora me retornam o lucro mas o prejuízo quando tem ele mostra zerado. Alguém saberia me dizer o porque?

Olá,

printa os dados do DEAL, sem filtros,  que você descobre!

         ticket = HistoryDealGetTicket(cnt);
         Print(
            HistoryDealGetString(Ticket, DEAL_SYMBOL), " ", HistoryDealGetInteger(Ticket, DEAL_MAGIC), " ",
            HistoryDealGetInteger(Ticket, DEAL_TICKET), " ", HistoryDealGetInteger(Ticket, DEAL_ORDER), " ",
            HistoryDealGetInteger(Ticket, DEAL_ENTRY), " ", HistoryDealGetDouble(Ticket, DEAL_VOLUME), " ",
            HistoryDealGetDouble(Ticket, DEAL_TYPE), " ", HistoryDealGetDouble(Ticket, DEAL_PROFIT), " ",
            HistoryDealGetInteger(Ticket, DEAL_POSITION_ID));
 
Rogerio Giannetti Torres #:

Olá,

printa os dados do DEAL, sem filtros,  que você descobre!

Rogerio, 

Primeiramente gostaria de agradecer pela resposta.

No dia do backtest teve 2 operaçoes com prejuizo de -14 e uma com 0, me parece que ele ta pegando dois magicnumbers:

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 0 3 3 1 100.0 0 -14.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 1 2 2 0 100.0 1 0.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17    0 1 0 0 0.0 2 10000.0 0

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 0 3 3 1 100.0 0 -14.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 1 2 2 0 100.0 1 0.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17    0 1 0 0 0.0 2 10000.0 0

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 0 3 3 1 100.0 0 -14.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 1 2 2 0 100.0 1 0.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17    0 1 0 0 0.0 2 10000.0 0

2022.05.02 22:00:38.019 2021.09.02 11:22:51   MGLU3 1 4 4 0 100.0 0 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 0 5 5 1 100.0 1 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 1 4 4 0 100.0 0 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 0 5 5 1 100.0 1 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 1 4 4 0 100.0 0 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:59   MGLU3 0 5 5 1 100.0 1 0.0 4


 
Silverveins #:

Rogerio, 

Primeiramente gostaria de agradecer pela resposta.

No dia do backtest teve 2 operaçoes com prejuizo de -14 e uma com 0, me parece que ele ta pegando dois magicnumbers:

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 0 3 3 1 100.0 0 -14.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 1 2 2 0 100.0 1 0.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17    0 1 0 0 0.0 2 10000.0 0

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 0 3 3 1 100.0 0 -14.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 1 2 2 0 100.0 1 0.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17    0 1 0 0 0.0 2 10000.0 0

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 0 3 3 1 100.0 0 -14.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17   MGLU3 1 2 2 0 100.0 1 0.0 2

2022.05.02 22:00:37.524 2021.09.01 16:40:17    0 1 0 0 0.0 2 10000.0 0

2022.05.02 22:00:38.019 2021.09.02 11:22:51   MGLU3 1 4 4 0 100.0 0 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 0 5 5 1 100.0 1 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 1 4 4 0 100.0 0 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 0 5 5 1 100.0 1 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:53   MGLU3 1 4 4 0 100.0 0 0.0 4

2022.05.02 22:00:38.019 2021.09.02 11:22:59   MGLU3 0 5 5 1 100.0 1 0.0 4


Pelo o que entendi ai o Expert esta com Magicnumber 1 e como ele esta apurando o resultado no MAgicnumber 0 então esta dando este erro. Agora não sei oque fazer.

 
Silverveins #:

Pelo o que entendi ai o Expert esta com Magicnumber 1 e como ele esta apurando o resultado no MAgicnumber 0 então esta dando este erro. Agora não sei oque fazer.

Gostaria também que ele pegasse o lucro ou prejuízo da posição aberta.

 

Olá,

pelo que estou lendo, parece, que precisa é aprender a programar.

 

Rapaz, você está confundindo Ordem (order), posição e negócio(deal). dá uma olhada nesse tópico aqui que vai solucionar seu problema

https://www.mql5.com/pt/forum/397209#comment_31723526

Problema para pegar o deal_profit de ordens específicas
Problema para pegar o deal_profit de ordens específicas
  • 2022.04.19
  • www.mql5.com
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...
 

Então @Silverveins

Primeiro é importante entender o conceito por detrás das ordens que são estabelecidas em cada negócio. 

As ordens serão parte de uma posição que você negociou, como você solicitou um total 

HistoryDealsTotal()

deve passar procurando o ID da sua posição

//armazente este id ao adquirir uma nova posição
PositionGetInteger(POSITION_IDENTIFIER);

//Quando percorrer as posições como fez, continue sua busca pelo ticket, contudo, cheque a ID

ulong tmp_ticket = HistoryDealGetTicket(i);
ulong tmp_id = HistoryDealGetInteger(tmp_ticket, DEAL_POSITION_ID);

que é um identificador único e então busque as ordens que esta posição gerou. 

Quanto a requisitar o saldo atual, quando estabelecer uma posição

//Selecione;
PositionSelect();
//Recupere o valor do saldo para essa posição;
double saldo_corrente = PositionGetDouble(POSITION_PROFIT);

No que diz respeito ao magic number, vi que você comentou o parâmetro na chamada da função, logo, caso ele não tenha sido especificado corretamente, qualquer valor virá dentro da sua comparação


//Ele esta comentado

double TOTAL_PROFIT_OF_OPEN_POSITIONS(/*int magicNum*/)
//Então, qualquer valor pode esta aí dentro se essa variável, até mesmo lixo de memória, se ela não estiver sendo tratada em algum outro lugar HistoryDealGetInteger
(ticket, DEAL_MAGIC) == magicNum;

Acrescento também que ao invés de fazer

datetime time_start = TimeCurrent ()- TimeCurrent ()% 86400;
//Porque não faz em OnInit()?
datetime time_start = TimeCurrent() - 86400;
//visto que terá o real início em que o EA começou a rodar e só fará essa requisição e cálculo uma única vez

Outra pergunta e sugestão é; você esta fazendo este loop no evento OnTick()? Caso sim, evite isso, deveria até mesmo evitar fazer um loop sobre o histórico e carregar somente os dados sobre a última posição que adquiriu e ir acrescentando-os em um lugar.

Caso pense sobre isso, pode fazer uma checagem entre as ID's das posições e, caso elas mudem, então você faz

//Uma seleção do histórico referente apenas a última posição
HistorySelectByPosition(ultima_posicao);

Quanto a evitar o uso dessa requisição em no evento Ontick(), pode utilizar o evento OnTrade() para isso.

Enfim, acredito que estes passos sejam suficientes para você resolver este problema aí

Razão: