Automatizar Meta de Ganho e Meta de Perda, em ponto ou em valor Financeiro - página 2

 

Meus prezados boa tarde!

Penso que esse codigo e o que eu estou precisando para me auxiliar no controle de perdas do meu EA. Porem sou novo nesse mundo da programacao. Sera que alguem pode me auxiliar me ajudando a colar o codigo de forma correta no codigo que eu ja tenho

 

Boa noite achei muito interessante essa função mas eu não estou conseguindo implantar no meu EA 

vc colocou toda a função no escopo global ou no ontick mesmo 

me desculpe é que sou iniciante e gostaria muito de colocar um limite de ganho e perca no meu EA

 
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.Ola a

Ola amigo,


Tentei utilizar seu modelo para criar um Stop Financeiro, mas não está funcionando.

Sou bem leigo de programação e estou tentando fazer meu primeiro robô.


Poderia me passar algumas dicas?

 
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.

Muito bom o código, estava com o mesmo problema e me ajudou muito este código. parabéns e obrigado.

 
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.

Muito bom o código, única alteração que fiz para otimizar o funcionamento do robô é verificar a função a cada barra, e coloquei uma chave liga/desliga via enum pra poder escolher se quer usar ou nã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 




tmpValorMaximoPerda

Teria que ter um valor negativo no input?

 
Roger TheBad #:



Teria que ter um valor negativo no input?

Se não consegue responder isso sozinho, não deveria estar se arriscando a fazer seu robô.
 
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 

Daniel meu amigo, quando compilo a função, aparece a seguinte mensagem "event handling function not found", apenas 1 erros. Como Consigo resolver isso? Outra questão, vi que vc tem bastante sabedoria em mql, esse código abaixo que vou postar, da entradas com alguns parametros, queria saber como adicionar o código acima de atingimento de ganho e perca diaria no que vou postar abaixo: Segue o primeiro código

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

//|                                       ForexMiniindice.mq5 |

//|                                  Copyright 2022, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

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

#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

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

//| Include                                                          |

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

#include <Expert\Expert.mqh>

//--- available signals

#include <Expert\Signal\SignalAC.mqh>

//--- available trailing

#include <Expert\Trailing\TrailingNone.mqh>

//--- available money management

#include <Expert\Money\MoneyFixedLot.mqh>

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

//| Inputs                                                           |

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

//--- inputs for expert

input string Expert_Title         ="MINIINDICEEXPERTSROBO"; // Document name

ulong        Expert_MagicNumber   =6841;                    //

bool         Expert_EveryTick     =false;                   //

//--- inputs for main signal

input int    Signal_ThresholdOpen =10;                      // Signal threshold value to open [0...100]

input int    Signal_ThresholdClose=10;                      // Signal threshold value to close [0...100]

input double Signal_PriceLevel    =0.0;                     // Price level to execute a deal

input double Signal_StopLevel     =50.0;                    // Stop Loss level (in points)

input double Signal_TakeLevel     =50.0;                    // Take Profit level (in points)

input int    Signal_Expiration    =4;                       // Expiration of pending orders (inq aí bars)

input double Signal_AC_Weight     =1.0;                     // Accelerator Oscillator Weight [0...1.0]

//--- inputs for money

input double Money_FixLot_Percent =10.0;                    // Percent

input double Money_FixLot_Lots    =0.1;                     // Fixed volume

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

//| Global expert object                                             |

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

CExpert ExtExpert;

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

//| Initialization function of the expert                            |

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

int OnInit()

  {

//--- Initializing expert

   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))

     {

      //--- failed

      printf(__FUNCTION__+": error initializing expert");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- Creating signal

   CExpertSignal *signal=new CExpertSignal;

   if(signal==NULL)

     {

      //--- failed

      printf(__FUNCTION__+": error creating signal");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//---

   ExtExpert.InitSignal(signal);

   signal.ThresholdOpen(Signal_ThresholdOpen);

   signal.ThresholdClose(Signal_ThresholdClose);

   signal.PriceLevel(Signal_PriceLevel);

   signal.StopLevel(Signal_StopLevel);

   signal.TakeLevel(Signal_TakeLevel);

   signal.Expiration(Signal_Expiration);

//--- Creating filter CSignalAC

   CSignalAC *filter0=new CSignalAC;

   if(filter0==NULL)

     {

      //--- failed

      printf(__FUNCTION__+": error creating filter0");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

   signal.AddFilter(filter0);

//--- Set filter parameters

   filter0.Weight(Signal_AC_Weight);

//--- Creation of trailing object

   CTrailingNone *trailing=new CTrailingNone;

   if(trailing==NULL)

     {

      //--- failed

      printf(__FUNCTION__+": error creating trailing");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- Add trailing to expert (will be deleted automatically))

   if(!ExtExpert.InitTrailing(trailing))

     {

      //--- failed

      printf(__FUNCTION__+": error initializing trailing");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- Set trailing parameters

//--- Creation of money object

   CMoneyFixedLot *money=new CMoneyFixedLot;

   if(money==NULL)

     {

      //--- failed

      printf(__FUNCTION__+": error creating money");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- Add money to expert (will be deleted automatically))

   if(!ExtExpert.InitMoney(money))

     {

      //--- failed

      printf(__FUNCTION__+": error initializing money");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- Set money parameters

   money.Percent(Money_FixLot_Percent);

   money.Lots(Money_FixLot_Lots);

//--- Check all trading objects parameters

   if(!ExtExpert.ValidationSettings())

     {

      //--- failed

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- Tuning of all necessary indicators

   if(!ExtExpert.InitIndicators())

     {

      //--- failed

      printf(__FUNCTION__+": error initializing indicators");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

//--- ok

   return(INIT_SUCCEEDED);

  }

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

//| Deinitialization function of the expert                          |

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

void OnDeinit(const int reason)

  {

   ExtExpert.Deinit();

  }

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

//| "Tick" event handler function                                    |

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

void OnTick()

  {

   ExtExpert.OnTick();

  }

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

//| "Trade" event handler function                                   |

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

void OnTrade()

  {

   ExtExpert.OnTrade();

  }

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

//| "Timer" event handler function                                   |

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

void OnTimer()

  {

   ExtExpert.OnTimer();

  }

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


--- SEGUNDO CÓDIGO DESCRITO ACIMA AQUI NO FÓRUM 


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);

}

;


---------TEM ESSE SEGUNDO CÓDIGO TAMBEM CASO SEJA MAIS FACIL:



bool atingiuGanhoMax(double lucro, double ganho)

   {

      bool resp = false;

      

      if(lucro >= ganho)

        {

         resp = true;

        }

       return resp;

   

   

   

   }



void OnStart()

  {

//---


      double ganhoMax = 2000; // Diario

      double perdaMax = 1500; // Diario

      

      double lucro = -3800; /// PositionGetDouble(POSITION_PROFIT)    

      

      if(atingiuGanhoMax(lucro,ganhoMax))

        {

         Print(":: Atingimos a meta do dia!");

        }

     

         

     

     

    

       

       

    }


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


PUDEREM ME AJUDAR, FAZEMOS ESSA TROCA.

Razão: