Primeiro candle do dia

 

Fala pessoal, tudo bem?


Sou iniciantíssimo na linguagem MQL5 e até cheguei a achar algumas respostas no fórum só que não consegui encaixar na minha programação.


O que procuro é uma forma de marcar o primeiro candle de 6 minutos do dia. Li muitos artigos mas confesso estar sendo bem complexo pra mim.


Se alguém conseguir destrinchar bem a respeito eu agradeço muito.

 
angelohomen:

Fala pessoal, tudo bem?


Sou iniciantíssimo na linguagem MQL5 e até cheguei a achar algumas respostas no fórum só que não consegui encaixar na minha programação.


O que procuro é uma forma de marcar o primeiro candle de 6 minutos do dia. Li muitos artigos mas confesso estar sendo bem complexo pra mim.


Se alguém conseguir destrinchar bem a respeito eu agradeço muito.

Se você não sabe programar, te aconselho o Marketplace...
 
Flavio Jarabeck:
Se você não sabe programar, te aconselho o Marketplace...
Opa! Sei programar sim, amigo. Mas dúvidas sempre surgem, não? Obrigadão pela ajuda no comentário!
 
angelohomen:

Fala pessoal, tudo bem?


Sou iniciantíssimo na linguagem MQL5 e até cheguei a achar algumas respostas no fórum só que não consegui encaixar na minha programação.


O que procuro é uma forma de marcar o primeiro candle de 6 minutos do dia. Li muitos artigos mas confesso estar sendo bem complexo pra mim.


Se alguém conseguir destrinchar bem a respeito eu agradeço muito.

Angelo,

Sua busca no fórum precisa ser dividido em duas partes dai você vai conseguir alcançar o que deseja:

1o parte:  Procure como pegar o primeiro candle do dia, independente do timeframe dele, mas ignore os exemplos que pegam com timeframe D1 pois esse não precisa de lógica alguma, se só tem 1 candle então só pode ser ele. Dica: Você achará vários exemplos usando datetime start = (datetime) (86400*(((ulong)TimeCurrent())/86400));. Veja os exemplos, teste e coloque em prática para o seu gráfico de timeline de M6.

2o. parte: é então usar o MQLRates ou iClose, iOpen, etc para pegar a informação do candle inicial.

Esse foi um dos exemplos, mas ainda teria outras formas, tem vários e vários exemplos no fórum precisa só pesquisar mais, abrir o MetaEditor e começar a testá-los.



 


 

O que fiz, porém não retornou bem o que eu queria:

void OnTick(){
   
   datetime start1 = StringToTime("10:00");
   datetime stop1 = start1 + PeriodSeconds(PERIOD_M6);
   
   CopyRates(Symbol(), PERIOD_M6, stop1, 3, rates1);
   
   // Fixar primeiro candle de M6
   
   datetime start = StringToTime("09:00");
   datetime stop = start + PeriodSeconds(PERIOD_M6);
      
   CopyRates(Symbol(), PERIOD_M6, start, stop, rates);
   
   static double maxima = rates[0].high;
   static double fechamento = rates[0].close;
   static double abertura = rates[0].open;
   static double minima = rates[0].low;
   static double media          = (MathAbs(fechamento + abertura)/2) * _Point;
   static double amplitudecorpo = MathAbs(abertura - fechamento);
   static double amplitudetotal = MathAbs(minima - maxima);
 
estou mexendo em algo similar agora, revisando seu codigo notei que a data stop1 esta no final do primeiro candle e deveria ser o inicio do segundo nao?
 
angelohomen #:

O que fiz, porém não retornou bem o que eu queria:

Notei tambem que as tres primeras linhas com rates1 nao esta usando, chegou a  achar uma solucao? compartilha pra nos.

 
notei tbm que foi uma pergunta de dois anos atrás hahahaha
 
angelohomen:

Fala pessoal, tudo bem?


Sou iniciantíssimo na linguagem MQL5 e até cheguei a achar algumas respostas no fórum só que não consegui encaixar na minha programação.


O que procuro é uma forma de marcar o primeiro candle de 6 minutos do dia. Li muitos artigos mas confesso estar sendo bem complexo pra mim.


Se alguém conseguir destrinchar bem a respeito eu agradeço muito.

Tenho um código aqui que faz o que você está caçando. Esse método verifica o primeiro candle do dia não importa o time frame.

Se o dia anterior for menor que agora, então hoje é um novo dia.


// VERIFICA SE HOJE É UM NOVO DIA.
bool EhHojeUmNovoDia()
  {
   static datetime DiaAnterior;

   if(DiaAnterior < iTime(NULL, PERIOD_D1, 0))
     {
      DiaAnterior = iTime(NULL, PERIOD_D1, 0);
      return(true);
     }
   else
     {
      return(false);
     }
  }


 

 
Eduardo Oliveira #:
notei tbm que foi uma pergunta de dois anos atrás hahahaha

pois eh, depois que respondi que notei tambem kkkkk

 

Mas seguindo a linha do gerar conteudo util aos futuros usuarios, segue alguma coisa que fiz que funcionou aqui. Esse modelo rapido que fiz ai, achei que ainda tem algo pra melhorar, primeiro no backtest ele pega certinho o horario inicio do dia, pois o candle do dia comeca as 9 da manha, mas o REAL ele retorna horario 00:00. Lembrando que esse modelo que fiz tem o objetivo de pegar o GAP de virada, e o horario inicio do dia pois se houver algum feriado de meio periodo como o Carnaval, o inicio do dia sera 13 horas e com isso quero ver se pego esse horario corretamente para fazer um delay de abertura para o sistema baseado no GAP de abertura. Quanto maior o GAP maior o delay para previnir ruidos nos indicadores. Segundo problema eh que se eu abrir sistema no meio do dia, ele pega essa data inicio tambem errada apesar que o candle do dia seria do inicio ao fim (data atual). Alguma ideia por ai pessoal? Tava pensando mais como poderiamos resolver onde o codigo nao seja um FOR navegando pelos candles ou qualquer coisa similar. 

//+------------------------------------------------------------------+
//| RETORNA O TAMANHO DO GAP DE ABERTURA DO DIA CORRENTE             |
//+------------------------------------------------------------------+
double getGAPAberturaEmPips() {

  // SE AINDA NAO CALCULOU O GAP DE ABERTURA - DATA DO CALCULO DE GAP DIFERENTE DA DATA DO DIA ATUAL
  if (TimeToString(dataCalculoGAPAbertura, TIME_DATE) != TimeToString(TimeCurrent(), TIME_DATE)) {
    // LOCAL PARA ARMAZENAR OS DADOS PARA LEITURA POSTERIOR
    MqlRates rates[];
    
    // COPIA DADOS DOS CANDLES DE 1 DIA, O ATUAL E ANTERIOR
    CopyRates(Symbol(), PERIOD_D1, 0, 2, rates);

    // VALIDA DIFERENCA DE VALORES PARA SEMPRE RETORNAR POSITIVO
    if (rates[1].open > rates[0].close)
      gapAbertura = rates[1].open - rates[0].close;
    else 
      gapAbertura = rates[0].close - rates[1].open;
      
    dataCalculoGAPAbertura = TimeCurrent();
    horaInicioDia = rates[1].time;
  } 

  return gapAbertura;
}

	          
Razão: