O robô deve voltar a operar somente no dia seguinte

 
Boa tarde, pessoal.

Sou novo aqui e peço desculpas por quaisquer erros. Estou desenvolvendo um robô, mas emperrei em uma parte do código. Sou novo nessa área, mas estou me esforçando aqui. Essa é a única coisa que falta para eu terminar, mas não consigo desenvolver, apesar de parecer ser algo bastante simples. É o seguinte: o robô calcula a meta diária de lucro ou prejuízo em dinheiro pré-definidos pelo operador. Quando bater a meta diária, o robô deve parar de operar naquele dia e voltar a operar normalmente apenas no dia seguinte. Essa parte de "parar de operar no dia e voltar a operar normalmente apenas no dia seguinte" que não estou conseguindo desenvolver. Estou mandando a função que desenvolvi, mas, caso seja necessário, posso enviar o código todo. Está tudo funcionando, só falta isso.


Eu devo desenvolver esse código dentro dos seguintes fragmentos: 

if(equity >= ((saldoCapital-profit-loss)+meta_diaria_lucro))
     {   
       zerar();     
       //Aqui eu devo desenvolver o código que para de operar hoje e volte a operar normalmente só no dia seguinte
       return(true);
     } 
     
     
     if(equity <= ((saldoCapital-profit-loss) meta_diaria_prejuizo))
     {       
       zerar();
       //Aqui eu devo desenvolver o código que para de operar hoje e volte a operar normalmente só no dia seguinte
       return(true);  
     }


Função completa:

bool funcao_verifica_meta_ou_perda_atingida()  
{

   double capital_liquido = AccountInfoDouble(ACCOUNT_EQUITY);
   double equity = DoubleToString(NormalizeDouble(capital_liquido, 2),2);
   
   double saldo = AccountInfoDouble(ACCOUNT_BALANCE);
   double saldoCapital = DoubleToString(NormalizeDouble(saldo, 2),2);
   
  
// --- determine the time intervals of the required trading history
   datetime end=TimeCurrent();                 // current server time
   datetime start=end-PeriodSeconds(PERIOD_D1);// set the beginning time to 24 hours ago

//--- request in the cache of the program the needed interval of the trading history
   HistorySelect(start,end);
//--- obtain the number of deals in the history
   int deals=HistoryDealsTotal();

   int returns=0;
   double profit=0;
   double loss=0;
   
//--- scan through all of the deals in the history
   for(int i=0;i<deals;i++)
     {
      //--- obtain the ticket of the deals by its index in the list
      ulong deal_ticket=HistoryDealGetTicket(i);
      if(deal_ticket>0) // obtain into the cache the deal, and work with it
        {
         string symbol             =HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
         datetime time             =HistoryDealGetInteger(deal_ticket,DEAL_TIME);
         ulong order               =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
         long order_magic          =HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
         long pos_ID               =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
         ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);

         //--- process the deals with the indicated DEAL_MAGIC
         if(order_magic==m_magic)
           {
            //... necessary actions
           }

         //--- calculate the losses and profits with a fixed results
         if(entry_type==DEAL_ENTRY_OUT)
          {
            //--- increase the number of deals 
            returns++;
            //--- result of fixation
            double result=HistoryDealGetDouble(deal_ticket, DEAL_PROFIT);
             
            //--- input the positive results into the summarized profit
            if(result>0) profit+=result;
            
            //--- input the negative results into the summarized losses
            if(result<0) loss+=result;
           
           }
           
        }
      else // unsuccessful attempt to obtain a deal
        {
         PrintFormat("We couldn't select a deal, with the index %d. Error %d",
                     i,GetLastError());
        }
            
     }
   
     if(equity >= ((saldoCapital-profit-loss)+meta_diaria_lucro))
     {   
       zerar();     
       //Aqui eu devo desenvolver o código que para de operar hoje e volte a operar normalmente só no dia seguinte
       return(true);
     } 
     
     
     if(equity <= ((saldoCapital-profit-loss)-meta_diaria_prejuizo))
     {
       
       zerar();
       //Aqui eu devo desenvolver o código que para de operar hoje e volte a operar normalmente só no dia seguinte
       return(true);  
     }
     
    return (false); 
 
 }
 
evandrofg:
Boa tarde, pessoal.

Sou novo aqui e peço desculpas por quaisquer erros. Estou desenvolvendo um robô, mas emperrei em uma parte do código. Sou novo nessa área, mas estou me esforçando aqui. Essa é a única coisa que falta para eu terminar, mas não consigo desenvolver, apesar de parecer ser algo bastante simples. É o seguinte: o robô calcula a meta diária de lucro ou prejuízo em dinheiro pré-definidos pelo operador. Quando bater a meta diária, o robô deve parar de operar naquele dia e voltar a operar normalmente apenas no dia seguinte. Essa parte de "parar de operar no dia e voltar a operar normalmente apenas no dia seguinte" que não estou conseguindo desenvolver. Estou mandando a função que desenvolvi, mas, caso seja necessário, posso enviar o código todo. Está tudo funcionando, só falta isso.


Eu devo desenvolver esse código dentro dos seguintes fragmentos: 


Função completa:

@evandrofg,


Em seu lugar eu utilizaria a função OnTradeTransaction() para capturar o lucro/prejuízo e, feito isso, com uma regra simples, excluiria o EA do gráfico utilizando a função ExpertRemove(). (A exclusão eh por medida de segurança, você pode utilizar outra abordagem).

Documentação sobre MQL5: Manipulação de eventos / OnTradeTransaction
Documentação sobre MQL5: Manipulação de eventos / OnTradeTransaction
  • www.mql5.com
É chamada em EAs quando ocorre o evento TradeTransaction. A função é projetada para processar os resultados de execução da solicitação de negociação. [in]  Variável do tipo MqlTradeTransaction com descrição da transação feita na conta de negociação. [in]  Variável do tipo MqlTradeRequest com descrição da solicitação que gerou a transação...
 

Obrigado pela resposta, amigo. Eu já tentei colocar a função ExpertRemove() na área informada, conforme código abaixo.

if(equity >= ((saldoCapital-profit-loss)+meta_diaria_lucro))
     {   
       zerar();     
       ExpertRemove();
       return(true);
     } 
     
     
     if(equity <= ((saldoCapital-profit-loss) meta_diaria_prejuizo))
     {       
       zerar();
       ExpertRemove();
       return(true);  
     }

Só que, neste caso, o robô para de operar e não continua a operação no dia seguinte. O que estou tentando rodar é um backtest de seis meses, mas ele nem passa do primeiro dia, porque, quando a meta é batida, ele para de operar e o backtest já é encerrado no mesmo dia. Essa função OnTradeTransaction é capaz de resolver esse problema?

 
evandrofg:

Obrigado pela resposta, amigo. Eu já tentei colocar a função ExpertRemove() na área informada, conforme código abaixo.

Só que, neste caso, o robô para de operar e não continua a operação no dia seguinte. O que estou tentando rodar é um backtest de seis meses, mas ele nem passa do primeiro dia, porque, quando a meta é batida, ele para de operar e o backtest já é encerrado no mesmo dia. Essa função OnTradeTransaction é capaz de resolver esse problema?

Bom dia Evandro,

pelo visto você não entendeu para que serve o comando ExpertRemove(), leia a guia de referencia do MQL5.  No Editor de Textos do MQL5, com o cursor sobre a instrução ExpertRemove(), tecle <F1>.

 
evandrofg:

Obrigado pela resposta, amigo. Eu já tentei colocar a função ExpertRemove() na área informada, conforme código abaixo.

Só que, neste caso, o robô para de operar e não continua a operação no dia seguinte. O que estou tentando rodar é um backtest de seis meses, mas ele nem passa do primeiro dia, porque, quando a meta é batida, ele para de operar e o backtest já é encerrado no mesmo dia. Essa função OnTradeTransaction é capaz de resolver esse problema?

@evandrofg,

ExpertRemove() é uma abordagem sugerida. Você pode utilizar outra. O fato é que você além de não compreender bem o funcionamento dela, a inseriu em local errado no seu código. Além disso, a mesma tem grande valor para conta prod ou mesmo demo. Em backtest sugiro a exclusão da mesma. 

A ExpertRemove() não é o problema a ser corrigido, e sim o código. Cuidado com tais avaliações simplistas.

Outra observação é que a OnTradeTransaction() não tem relação nenhuma com a ExpertRemove(). Leia as documentações.

 
evandrofg:
Boa tarde, pessoal.

Sou novo aqui e peço desculpas por quaisquer erros. Estou desenvolvendo um robô, mas emperrei em uma parte do código. Sou novo nessa área, mas estou me esforçando aqui. Essa é a única coisa que falta para eu terminar, mas não consigo desenvolver, apesar de parecer ser algo bastante simples. É o seguinte: o robô calcula a meta diária de lucro ou prejuízo em dinheiro pré-definidos pelo operador. Quando bater a meta diária, o robô deve parar de operar naquele dia e voltar a operar normalmente apenas no dia seguinte. Essa parte de "parar de operar no dia e voltar a operar normalmente apenas no dia seguinte" que não estou conseguindo desenvolver. Estou mandando a função que desenvolvi, mas, caso seja necessário, posso enviar o código todo. Está tudo funcionando, só falta isso.


Eu devo desenvolver esse código dentro dos seguintes fragmentos: 


Função completa:

@evandrofg,

Veja esta abordagem por horario.

Razão: