Início Negociação Sistemática Postagem

Detectando Novas Barras no MetaTrader 4: Um Guia Prático

Anexo
10370.zip (734 bytes, Baixar 0 vezes)

Olá, traders! Hoje vamos falar sobre como detectar novas barras no MetaTrader 4. Isso é algo que muitos de vocês têm perguntado, e é mais simples do que parece!

Como Detectar uma Nova Barra

Para detectar uma nova barra no timeframe atual, o processo é bem tranquilo. Veja o código abaixo:

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // seu código aqui
  }
}

Eventos em Outros Timeframes

Mas e os eventos em outros timeframes? Não se preocupe! Embora o MT4 não suporte o evento onBar, você pode armazenar os horários em um array e verificar esses tempos a cada tick. Se chegar ao horário certo, execute o evento da nova barra.

Por exemplo, se você estiver fazendo um backtest no timeframe M5, pode capturar eventos do M6, M7, até D1. Mas por que só conseguimos detectar tendências ascendentes? A resposta é simples: como gerar dados de tick no MetaTrader?

Até o timeframe D1, a coisa complica um pouco, pois a semana pode começar, por exemplo, no domingo às 20:45 (dependendo do seu corretor) e o início do mês pode cair no meio da semana...

Acredito que essa informação não seja tão relevante, então não vou me aprofundar nisso.

Explicando o Código

Vamos dar uma olhada no código. Na função init, você preenche o array de tempos com os horários iniciais:

  curIndex = utils.periodToPeriodIndex(Period());
  times[curIndex] = Time[0];
  for(int i = curIndex + 1; i < MAX; i++)
    times[i] = times[curIndex] - MathMod(times[curIndex], utils.periodIndexToPeriod(i) * 60);

Na função start, você verifica se já passou tempo suficiente:

  if (times[curIndex] != Time[0]) {
    times[curIndex] = Time[0];
    onBar(Period());
    for(int i = curIndex + 1; i < MAX; i++) {
      int period = utils.periodIndexToPeriod(i),
          seconds = period * 60,
          time0 = times[curIndex] - MathMod(times[curIndex], seconds);
      if (times[i] != time0) {
        times[i] = time0;
        onBar(period);
      }
    }
  }

Como Escrever Seu Código

Você pode escrever seu código nas funções:

void onTick() { 
}

e

void onBar(int period) {
}

É isso aí, pessoal!

Atualização 1.1: Agradecimentos ao WHRoeder pelo código claro!

Publicações relacionadas

Comentário (0)