Automatizar Meta de Ganho e Meta de Perda, em ponto ou em valor Financeiro

 

Caros amigos, boa noite.

Preciso de uma ajuda.

Estou desenvolvendo um robô e gostaria de colocar nele uma meta diária em pontos ou em valor financeiro

Quando o robô atingir uma quantidade de pontos ou um valor financeiro no dia ele automaticamente parasse de operar.

Alguém poderia me ajudar? É um robô para operar índice e dólar 

 

Obrigado

Leandro Vieira 

 
LeoVieira:

Caros amigos, boa noite.

Preciso de uma ajuda.

Estou desenvolvendo um robô e gostaria de colocar nele uma meta diária em pontos ou em valor financeiro

Quando o robô atingir uma quantidade de pontos ou um valor financeiro no dia ele automaticamente parasse de operar.

Alguém poderia me ajudar? É um robô para operar índice e dólar 

 

Obrigado

Leandro Vieira 


Olá Leonardo,  o que eu tenho é um robô "management", mas a função dele é só essa.

Se por exemplo ele atingir 1% de lucro,  ou 1 dólar, ou ainda 1 pips, ele fecha todas as ordens, só um exemplo,  você pode definir os ganhos e perdas. 

Se quiser,  pode adicionar meu whatsapp [REMOVIDO PELO MODERADOR]

All the best,
Juhnnyo. 
 

Bom dia!

Criei uma função que retorna se a meta/perda foi alcançada no dia, veja se pode utilizar, faça testes dela! Depois por gentileza de seu feedback principalmente se houver algum erro nela

bool funcao_verifica_meta_ou_perda_atingida(string tmpOrigem, double tmpValorMaximoPerda, double tmpValor_Maximo_Ganho, bool tmp_placar)  
{
   //tmpOrigem = comentario de qual local EA foi chamado a função
   //tmpValorMaximoPerda = valor máximo desejado como perda máxima
   //tmpValor_Maximo_Ganho = valor estipulado de meta do  dia
   //tmp_placar = true exibe no comment o resultado das negociações do dia
   
   Print("Pesquisa funcao_verifica_meta_ou_perda_atingida (" + tmpOrigem + ")");
   string         tmp_x;
   double         tmp_resultado_financeiro_dia;
   int            tmp_contador;
   MqlDateTime    tmp_data_b;
   
   TimeCurrent(tmp_data_b);
   tmp_resultado_financeiro_dia = 0;
   tmp_x = string(tmp_data_b.year) + "." + string(tmp_data_b.mon) + "." + string(tmp_data_b.day) + " 00:00:01";
   
   HistorySelect(StringToTime(tmp_x),TimeCurrent()); 
      int      tmp_total=HistoryDealsTotal(); 
      ulong    tmp_ticket=0; 
      double   tmp_price; 
      double   tmp_profit; 
      datetime tmp_time; 
      string   tmp_symboll; 
      long     tmp_typee; 
      long     tmp_entry; 
         
   //--- para todos os negócios 
      for(tmp_contador=0;tmp_contador<tmp_total;tmp_contador++) 
        { 
         //--- tentar obter ticket negócios 
         if((tmp_ticket=HistoryDealGetTicket(tmp_contador))>0) 
           { 
            //--- obter as propriedades negócios 
            tmp_price =HistoryDealGetDouble(tmp_ticket,DEAL_PRICE); 
            tmp_time  =(datetime)HistoryDealGetInteger(tmp_ticket,DEAL_TIME); 
            tmp_symboll=HistoryDealGetString(tmp_ticket,DEAL_SYMBOL); 
            tmp_typee  =HistoryDealGetInteger(tmp_ticket,DEAL_TYPE); 
            tmp_entry =HistoryDealGetInteger(tmp_ticket,DEAL_ENTRY); 
            tmp_profit=HistoryDealGetDouble(tmp_ticket,DEAL_PROFIT); 
            //--- apenas para o símbolo atual 
            if(tmp_symboll==Symbol()) tmp_resultado_financeiro_dia = tmp_resultado_financeiro_dia + tmp_profit;

           } 
        } 
   
   if (tmp_resultado_financeiro_dia == 0)
      {
          if (tmp_placar = true) Comment("Placar  0x0");
          return(false); //sem ordens no dia
      }
   else
      {
         if ((tmp_resultado_financeiro_dia > 0) && (tmp_resultado_financeiro_dia != 0))
            {
               if (tmp_placar = true) Comment("Lucro R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2) );
            }
         else
            {
               if (tmp_placar = true) Comment("Prejuizo R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2));
            }
         
         if (tmp_resultado_financeiro_dia < tmpValorMaximoPerda)
            {
               Print("Perda máxima alcançada.");
               return(true);
            }
         else
            {
               if (tmp_resultado_financeiro_dia > tmpValor_Maximo_Ganho)
               {
                  Print("Meta Batida.");
                  return(true);
               }
            }    
        }  
   return(false);
}
;

 

Atenciosamente,

DAniel 

 
Daniel Andrejczuk:

Bom dia!

Criei uma função que retorna se a meta/perda foi alcançada no dia, veja se pode utilizar, faça testes dela! Depois por gentileza de seu feedback principalmente se houver algum erro nela

 

Atenciosamente,

DAniel 


Vou chegar em casa e testar, estava procurando exatamente isso. Valeu Daniel.

Se funcionar dou retorno a noite. abraços.

 

Deu certo amigo, muito bom.

Ainda não verifiquei todos os detalhes de funcionamento, mas funciona legal.

Tornou o robô mais lento na otimização, depois vou tentar simplificar.

Para corrigir tive que acrescentar alguns iguais antes do true e false e tirar as variáveis dos parenteses da função.

Aí só acrescentei a função no ontick para zerar uma variável que autorizava a operação e funcionou bem.

input string tmpOrigem = "EA_Keltner_WIN$D_M5_Meta_Diaria";//tmpOrigem = comentario de qual local EA foi chamado a função
input double tmpValorMaximoPerda = 0; //tmpValorMaximoPerda = valor máximo desejado como perda máxima
input double tmpValor_Maximo_Ganho =  0; //tmpValor_Maximo_Ganho = valor estipulado de meta do  dia
input bool tmp_placar = true;  //tmp_placar = true exibe no comment o resultado das negociações do dia

ontick
{
   tradenow=1;

   if(funcao_verifica_meta_ou_perda_atingida()){tradenow=0;}

   "Funções de operação do robô"
}

//+------------------------------------------------------------------+
//| Função para meta diária de Profit                                |
//+------------------------------------------------------------------+  
bool funcao_verifica_meta_ou_perda_atingida()  
{
   //tmpOrigem = comentario de qual local EA foi chamado a função
   //tmpValorMaximoPerda = valor máximo desejado como perda máxima
   //tmpValor_Maximo_Ganho = valor estipulado de meta do  dia
   //tmp_placar = true exibe no comment o resultado das negociações do dia
   
   Print("Pesquisa funcao_verifica_meta_ou_perda_atingida (" + tmpOrigem + ")");
   string         tmp_x;
   double         tmp_resultado_financeiro_dia;
   int            tmp_contador;
   MqlDateTime    tmp_data_b;
   
   TimeCurrent(tmp_data_b);
   tmp_resultado_financeiro_dia = 0;
   tmp_x = string(tmp_data_b.year) + "." + string(tmp_data_b.mon) + "." + string(tmp_data_b.day) + " 00:00:01";
   
   HistorySelect(StringToTime(tmp_x),TimeCurrent()); 
      int      tmp_total=HistoryDealsTotal(); 
      ulong    tmp_ticket=0; 
      double   tmp_price; 
      double   tmp_profit; 
      datetime tmp_time; 
      string   tmp_symboll; 
      long     tmp_typee; 
      long     tmp_entry; 
         
   //--- para todos os negócios 
      for(tmp_contador=0;tmp_contador<tmp_total;tmp_contador++) 
        { 
         //--- tentar obter ticket negócios 
         if((tmp_ticket=HistoryDealGetTicket(tmp_contador))>0) 
           { 
            //--- obter as propriedades negócios 
            tmp_price =HistoryDealGetDouble(tmp_ticket,DEAL_PRICE); 
            tmp_time  =(datetime)HistoryDealGetInteger(tmp_ticket,DEAL_TIME); 
            tmp_symboll=HistoryDealGetString(tmp_ticket,DEAL_SYMBOL); 
            tmp_typee  =HistoryDealGetInteger(tmp_ticket,DEAL_TYPE); 
            tmp_entry =HistoryDealGetInteger(tmp_ticket,DEAL_ENTRY); 
            tmp_profit=HistoryDealGetDouble(tmp_ticket,DEAL_PROFIT); 
            //--- apenas para o símbolo atual 
            if(tmp_symboll==Symbol()) tmp_resultado_financeiro_dia = tmp_resultado_financeiro_dia + tmp_profit;

           } 
        } 
   
   if (tmp_resultado_financeiro_dia == 0)
      {
          if (tmp_placar == true) Comment("Placar  0x0");
          return(false); //sem ordens no dia
      }
   else
      {
         if ((tmp_resultado_financeiro_dia > 0) && (tmp_resultado_financeiro_dia != 0))
            {
               if (tmp_placar == true) Comment("Lucro R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2) );
            }
         else
            {
               if (tmp_placar == true) Comment("Prejuizo R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2));
            }
         
         if (tmp_resultado_financeiro_dia < tmpValorMaximoPerda)
            {
               Print("Perda máxima alcançada.");
               return(true);
            }
         else
            {
               if (tmp_resultado_financeiro_dia > tmpValor_Maximo_Ganho)
               {
                  Print("Meta Batida.");
                  return(true);
               }
            }    
        }  
   return(false);
}    
 

as vezes se coloca todos os indicadores e funções trabalhando no tick, mas nem todas as rotinas precisam ficar desta forma

se seu EA trabalha com barra fechada,  ou se a função de "checagem de perda" pode ser calculada sempre a cada barra nova

você vai ganhar muito na otimização se fizer desta forma.


//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {


//--- we work only at the time of the birth of new bar

   static datetime PrevBars=0;

   datetime time_0=iTime(0);

   if(time_0==PrevBars)

      return;

   PrevBars=time_0;


   if(!RefreshRates())

     {

      PrevBars=iTime(1);

      return;

     }

     

//---

   tradenow=1;

   if(funcao_verifica_meta_ou_perda_atingida()){tradenow=0;}


   "Funções de operação do robô"

}


 

Daniel, parabéns pela iniciativa , é difícil achar coisas interessante na parte em português, você vai ver muito gente só postando coisa com outros finalidades ($$$)

 
zemo:

as vezes se coloca todos os indicadores e funções trabalhando no tick, mas nem todas as rotinas precisam ficar desta forma

se seu EA trabalha com barra fechada,  ou se a função de "checagem de perda" pode ser calculada sempre a cada barra nova

você vai ganhar muito na otimização se fizer desta forma.


//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {


//--- we work only at the time of the birth of new bar

   static datetime PrevBars=0;

   datetime time_0=iTime(0);

   if(time_0==PrevBars)

      return;

   PrevBars=time_0;


   if(!RefreshRates())

     {

      PrevBars=iTime(1);

      return;

     }

     

//---

   tradenow=1;

   if(funcao_verifica_meta_ou_perda_atingida()){tradenow=0;}


   "Funções de operação do robô"

}



Boa ideia, eu uso a classe is_newbar pra isso, tornou mais rápido meus robôs do que usar funções internas, vou acresentar um if () antes da função de de meta diária, assim ele verifica apenas uma vez a cada vela.

 

A iniciativa do Daniel foi muito boa mesmo, me ajudou muito.

Eu também, sempre que posso ajudar, posto as linhas de programação pois fica mais fácil pra quem está aprendendo, inclusive procuro postar os inputs e inicializações pra ficar mais fácil a compreensão.

 
Daniel Andrejczuk:

Bom dia!

Criei uma função que retorna se a meta/perda foi alcançada no dia, veja se pode utilizar, faça testes dela! Depois por gentileza de seu feedback principalmente se houver algum erro nela

 

Atenciosamente,

DAniel 

Olá Boa Tarde Daniel, estava tentando utilizar essa sua função para realizar metas e perdas semanais, eu tentei adicionar na (string tmp_x) a (string(tmp_data_b.day).day_of_week + " 1")  mas não deu certo ele não zera na sexta ele está zerando diariamente, teria alguma sugestão?


att. Alex Buziquia

 
Joao Luiz Sa Marchioro:

Deu certo amigo, muito bom.

Ainda não verifiquei todos os detalhes de funcionamento, mas funciona legal.

Tornou o robô mais lento na otimização, depois vou tentar simplificar.

Para corrigir tive que acrescentar alguns iguais antes do true e false e tirar as variáveis dos parenteses da função.

Aí só acrescentei a função no ontick para zerar uma variável que autorizava a operação e funcionou bem.

Olá Boa Tarde João, estava tentando utilizar essa sua função para realizar metas e perdas semanais, eu tentei adicionar na (string tmp_x) a (string(tmp_data_b.day).day_of_week + " 1")  mas não deu certo ele não zera na sexta ele está zerando diariamente, teria alguma sugestão?


att. Alex Buziquia

Razão: