EA - Tempo de Operação

 

Boa Tarde Pessoal, Tudo bem ?


Me chamo Michelli, sou estudante de TI e comecei a programar meu primeiro EA.


Estou com um problema no tempo limite do EA, fiz o código a baixo:


if(TimeToString(TimeCurrent(),TIME_MINUTES) == hora_limite_fecha_op && PositionSelect(_Symbol)==true)
        {
            Print("-----> Fim do Tempo Operacional: encerrar posições abertas!");
             
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
               {
                  FechaCompra();
               }
            else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
               {
                  FechaVenda();
               }
        }


A variável hora_limite_fecha_op é "17:40" e realmente, se tiver uma posição de compra, o EA vende a mesma e se tiver uma operação de venda o EA compra e finaliza.


O problema é que se a MME cruzar novamente as 17:43 por exemplo, ele faz uma nova ordem de compra/vende, precisava que apos as 17:40 não faça mais nenhuma ordem, mesmo se o indicador der o sinal.


Muito obrigada, estou a disposição.


Atenciosamente

Micheli Barcello

 

Use este codigo

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

Deu certo, muito obrigada!!!


Poderia me tirar outra duvida, no programa utilizo 2 medias moveis exponenciais.

int mm_lenta_Handle;              // Handle controlador da média móvel lenta
double mm_lenta_Buffer[];         // Buffer para armazenamento dos dados das médias

int mm_rapida_Handle;             // Handle controlador da média móvel rápida
double mm_rapida_Buffer[];        // Buffer para armazenamento dos dados das médias

mm_lenta_Handle  = iMA(_Symbol,mm_tempo_grafico,mm_lenta_periodo,0,mm_metodo,mm_preco);
mm_rapida_Handle = iMA(_Symbol,mm_tempo_grafico,mm_rapida_periodo,0,mm_metodo,mm_preco);

ChartIndicatorAdd(0,0,mm_rapida_Handle);
ChartIndicatorAdd(0,0,mm_lenta_Handle);

Quando utiliza a função ChartIndicatorAdd para colocar no gráfico as duas vão com a cor vermelha, é possível deixar uma azul e outra amarela ?


Muito obrigada, estou a disposição.

Atenciosamente


Micheli Barcello

 
MicheliBarcello:

Deu certo, muito obrigada!!!


Poderia me tirar outra duvida, no programa utilizo 2 medias moveis exponenciais.

Quando utiliza a função ChartIndicatorAdd para colocar no gráfico as duas vão com a cor vermelha, é possível deixar uma azul e outra amarela ?


Muito obrigada, estou a disposição.

Atenciosamente


Micheli Barcello

Leia esta thread e depois a documentação.

 
Joscelino Celso de Oliveira:

Leia esta thread e depois a documentação.

Não consegui, pois são funções diferente pelo que entendi:

bool  ChartIndicatorAdd(
   long  chart_id,                 // ID Gráfico
   int   sub_window                // número da sub-janela
   int   indicator_handle          // manipulador do indicador
   );

O primeiro parametro é o grafico, no caso 0, o segundo 0 para colocar na mesma janela dos candles e o terceiro o handle.


A função ObjectSetInteger não tem a parte de identificar o grafico, janela e hando, logo acredito que tem que usar em conjunto, porem não sei como

bool  ObjectSetInteger(
   long                             chart_id,          // identificador Gráfico
   string                           name,              // nome objeto
   ENUM_OBJECT_PROPERTY_INTEGER     prop_id,           // propriedade
   long                             prop_value         // valor
   );

Poderia me explicar ? Por exemplo

ObjectSetInteger(0,mm_rapida_Handle, OBJPROP_COLOR, clrWhite) ( id do grafico, handle para mudar a cor, cor escolhida )

ChartIndicatorAdd(0,0,mm_rapida_Handle); ( Id do grafico = atual / mesma janela dos candle / handle para desenhar )


Porem não funcionou ://

 
MicheliBarcello:

Não consegui, pois são funções diferente pelo que entendi:

bool  ChartIndicatorAdd(
   long  chart_id,                 // ID Gráfico
   int   sub_window                // número da sub-janela
   int   indicator_handle          // manipulador do indicador
   );

O primeiro parametro é o grafico, no caso 0, o segundo 0 para colocar na mesma janela dos candles e o terceiro o handle.


A função ObjectSetInteger não tem a parte de identificar o grafico, janela e hando, logo acredito que tem que usar em conjunto, porem não sei como

Poderia me explicar ? Por exemplo

ObjectSetInteger(0,mm_rapida_Handle, OBJPROP_COLOR, clrWhite) ( id do grafico, handle para mudar a cor, cor escolhida )

ChartIndicatorAdd(0,0,mm_rapida_Handle); ( Id do grafico = atual / mesma janela dos candle / handle para desenhar )


Porem não funcionou ://

Poderia me ajudar a programar ?
 
?
 
MicheliBarcello:
Poderia me ajudar a programar ?

Toda programação tem como principio a logica.

- Primeiramente, responda: Qual seu objetivo do robo plotar o indicador no gráfico? Acadêmico? Estético?

- A solução proposta não funcionou. Você pesquisou outra?

- O robô não precisa do indicador plotado ao gráfico. Precisa apenas ter garantido o recebimento dos dados do Buffer. Dito isso, ainda eh essencial para você plotar o mesmo no gráfico? Eu pensaria duas vezes.

- Por fim, quando nada funciona, utiliza-se uma solução de contorno logica. Ja pensou nisso?

- A solução logica passa por ler a documentação do iMA. Você fez isso? 

- O procedimento de contorno passara por repetir o procedimento (Crtl+ C e Crtl+V) por duas vezes, fazendo alteracoes manuais distintas em cada uma delas e depois usando iCustom. Captou?

Nao irei ajudar mais do que isso.

Boa sorte!

 

- Primeiramente, responda: Qual seu objetivo do robo plotar o indicador no gráfico? Acadêmico? Estético?

R: Estético para facilitar a visualização e explicações.

- A solução proposta não funcionou. Você pesquisou outra?

R: Sim, verifiquei que varias pessoas tentaram fazer isso, muitas dizem é um impossível pois não tem logica o robo ver cores, porem tem uma solução criando pelo icustom.

- O robô não precisa do indicador plotado ao gráfico. Precisa apenas ter garantido o recebimento dos dados do Buffer. Dito isso, ainda eh essencial para você plotar o mesmo no gráfico? Eu pensaria duas vezes.

R: Para o trade não, para questão acadêmica/didática sim, facilita muito a visualização.

- Por fim, quando nada funciona, utiliza-se uma solução de contorno logica. Ja pensou nisso?

- A solução logica passa por ler a documentação do iMA. Você fez isso? 

- O procedimento de contorno passara por repetir o procedimento (Crtl+ C e Crtl+V) por duas vezes, fazendo alteracoes manuais distintas em cada uma delas e depois usando iCustom. Captou?

R: Sim, porem acreditei que exite algo mais simples, logo para demonstração vou utilizar o tradindview


Você pode me tirar outra duvida ? ( Não tem nada a ver com cores no gráfico, é sobre programação )

 
É possível por exemplo o programa ler os dados das Medias no WINFUT porem fazer a compra e venda no WINZ19 ? ( Índice do mês/período )
 
MicheliBarcello:
É possível por exemplo o programa ler os dados das Medias no WINFUT porem fazer a compra e venda no WINZ19 ? ( Índice do mês/período )

Sim, veja só: você pode especificar o SYMBOL que deseja manipular nas funções  de indicador.

Exemplo abaixo, no manipulador de média iMA basta colocar WINFUT em symbol.


int  iMA(
   string               symbol,            // símbolo nome
   ENUM_TIMEFRAMES      period,            // período
   int                  ma_period,         // período médio
   int                  ma_shift,          // deslocamento horizontal
   ENUM_MA_METHOD       ma_method,         // tipo suavizado
   ENUM_APPLIED_PRICE   applied_price      // tipo de preço ou de manipulador
   );
Razão: