Limitar robô por horário e/ou numero de operções.

 

Boa tarde pessoal. Estou iniciando os estudos em MQL5, ou seja, não sei nada. Alguma coisa já aprendi. Já consegui criar um indicador simples. Estou baixando robôs gratuitos e fazendo testes, abrindo os códigos para tentar entender. A minha questão é, o que preciso inserir no código de um robô para que acrescente parâmetros de entrada nele para restringir a operação do mesmo por quantidades de ordens no dia? E para restringir por horário? Ou ainda restringir a uma perda por dia?

Obrigado!

 
an.hernandez79:

Boa tarde pessoal. Estou iniciando os estudos em MQL5, ou seja, não sei nada. Alguma coisa já aprendi. Já consegui criar um indicador simples. Estou baixando robôs gratuitos e fazendo testes, abrindo os códigos para tentar entender. A minha questão é, o que preciso inserir no código de um robô para que acrescente parâmetros de entrada nele para restringir a operação do mesmo por quantidades de ordens no dia? E para restringir por horário? Ou ainda restringir a uma perda por dia?

Obrigado!

Para limitar trades por horario inseri uma logica utilizando o "SE" e estipulando o horario atraves do datetime. Ao atingir o horario o EA fecha as posicoes e exclui ordens pendentes.

Quanto a quantidades de ordens por dia, ainda estou trabalhando nisso.

[]'s

 
eu tambem estou querendo colocar essa regra, eu "criei" um robo utilizando o assistente do metaeditor,o robo ta funcionando,conegui configurar os parametros, tudo beleza, mas eu queria limitar o horario de funcionamento entre as 9 da manhã e as 15 da tarde.
 

até achei uma indicação de um colega aqui no forum em ingles (veja abaixo),mas eu já tentei adicionar o .mq5 e não deu certo, já tentei colocar a regra no arquivo do signal .mqh e tambem não obedece, no MT4 fica "facil", pois o codigo inteiro fica em um unico arquivo, mas no mt5 tem esse lance do indicador ser um arquivo separado,estou confuso

MqlDateTime dateTimeNowUtc;
TimeGMT(dateTimeNowUtc);
if (dateTimeNowUtc.hour>=9 && dateTimeNowUtc.hour<=15) {
    // do trade operations
}
else {
    // close any open positions but no other trade operations
}
 
André Pires:

até achei uma indicação de um colega aqui no forum em ingles (veja abaixo),mas eu já tentei adicionar o .mq5 e não deu certo, já tentei colocar a regra no arquivo do signal .mqh e tambem não obedece, no MT4 fica "facil", pois o codigo inteiro fica em um unico arquivo, mas no mt5 tem esse lance do indicador ser um arquivo separado,estou confuso

Cara, eu fiz assim:

Primeiro declarei as variaveis:

   datetime hora = TimeCurrent(Time);           //-- Capturando hora atual

   TimeToString(hora,TIME_SECONDS);             //-- Normalizacao da Hora Atual

   datetime close_time=D'17:15:00';             //-- Hora limite encerrar posicoes

   TimeToString(close_time,TIME_SECONDS);       //-- Normalizacao da Hora oara encerrar Trades

   datetime hora_limite=D'16:00:00';            //-- Hora limite para operar

   TimeToString(hora_limite,TIME_SECONDS);      //-- Noramlizacao da Hora limite para operar

Depois criei uma logica simples:

if(hora>=close_time && PositionSelect(_Symbol)>=1) 

        {

       //-- Fecha a posicao pelo limite de horario

         trade.PositionClose(ticket,-1);

Esta funcionando corretamente.

[]'s


  

 

Se te ajudar eu uso esse padrao nos meus EA.


input string inicio="10:30"; //Horario de inicio(entradas);
input string termino="17:30"; //Horario de termino(entradas);
input string fechamento="17:45"; //Horario de fechamento(entradas);

MqlDateTime horario_inicio,horario_termino,horario_fechamento,horario_atual; 

int OnInit()
  {
//---
   TimeToStruct(StringToTime(inicio),horario_inicio);         //+-------------------------------------+
   TimeToStruct(StringToTime(termino),horario_termino);       //| Conversão das variaveis para mql    |
   TimeToStruct(StringToTime(fechamento),horario_fechamento); //+-------------------------------------+
   
//verificação de erros nas entradas de horario
   if(horario_inicio.hour>horario_termino.hour || (horario_inicio.hour==horario_termino.hour && horario_inicio.min>horario_termino.min))
     {
      printf ( "Parametos de horarios invalidos!" );
      return INIT_FAILED;
     }
     
    if(horario_termino.hour>horario_fechamento.hour || (horario_termino.hour==horario_fechamento.hour && horario_termino.min>horario_fechamento.min))
     {
      printf("Parametos de horarios invalidos!");
      return INIT_FAILED;
      }



bool HorarioEntrada()
      {
       TimeToStruct(TimeCurrent(),horario_atual);

      if(horario_atual.hour >= horario_inicio.hour && horario_atual.hour <= horario_termino.hour)
   {
      // Hora atual igual a de início
      if(horario_atual.hour == horario_inicio.hour)
         // Se minuto atual maior ou igual ao de início => está no horário de entradas
         if(horario_atual.min >= horario_inicio.min)
            return true;
         // Do contrário não está no horário de entradas
         else
            return false;
      
      // Hora atual igual a de término
      if(horario_atual.hour == horario_termino.hour)
         // Se minuto atual menor ou igual ao de término => está no horário de entradas
         if(horario_atual.min <= horario_termino.min)
            return true;
         // Do contrário não está no horário de entradas
         else
            return false;
      
      // Hora atual maior que a de início e menor que a de término
      return true;
   }
   
   // Hora fora do horário de entradas
   return false;
}


bool HorarioFechamento()
     {
      TimeToStruct(TimeCurrent(),horario_atual);
      
     
     // Hora dentro do horário de fechamento
   if(horario_atual.hour >= horario_fechamento.hour)
   {
      // Hora atual igual a de fechamento
      if(horario_atual.hour == horario_fechamento.hour)
         // Se minuto atual maior ou igual ao de fechamento => está no horário de fechamento
         if(horario_atual.min >= horario_fechamento.min)
            return true;
         // Do contrário não está no horário de fechamento
         else
            return false;
      
      // Hora atual maior que a de fechamento
      return true;
   }
   
   // Hora fora do horário de fechamento
   return false;
}


 
Willian De Caldas Leite:

Se te ajudar eu uso esse padrao nos meus EA.


Bem legal seu código, comentado e fácil de entender.

[]'s

 
Willian De Caldas Leite:

Se te ajudar eu uso esse padrao nos meus EA.


eu to perdido nesse MT5,de verdade, MT4 era bem mais intuitivo..to apanhando bastante..

'HorarioEntrada' - function can be declared only in the global scope Estocastico.mq5 76 6

'HorarioFechamento' - function can be declared only in the global scope Estocastico.mq5 109 6

2 error(s), 0 warning(s) 3 1


 
Joscelino Celso de Oliveira:

Bem legal seu código, comentado e fácil de entender.

[]'s

eu até entendi.. mas não consigo entender como faço implementações no MT5, fico perdido com esse negocio do EA ser dividido em codigo e e arquivo de sinal/classe
 
André Pires:

eu to perdido nesse MT5,de verdade, MT4 era bem mais intuitivo..to apanhando bastante..

'HorarioEntrada' - function can be declared only in the global scope Estocastico.mq5 76 6

'HorarioFechamento' - function can be declared only in the global scope Estocastico.mq5 109 6

2 error(s), 0 warning(s) 3 1


Ao que parece você está criando uma função dentro da outra. Copie e cole as funções: 'HorarioEntrada'  e 'HorarioFechamento' fora de OnInit() e compile.

Boa sorte!

[]´s

 
André Pires:
eu até entendi.. mas não consigo entender como faço implementações no MT5, fico perdido com esse negocio do EA ser dividido em codigo e e arquivo de sinal/classe

Tranquilo man. Também sou iniciante!

Razão: