Cómo Detectar Nuevas Velas en MetaTrader 4: Guía para Traders

Mike 2011.07.01 23:45 19 0 0
Archivos adjuntos

¡Hola, traders! Hoy vamos a hablar sobre algo que muchos de ustedes han preguntado: cómo detectar nuevas velas en MetaTrader 4. Es más sencillo de lo que parece, especialmente si lo que buscas es identificar nuevas velas en el marco de tiempo actual.

Detectando Nuevas Velas

Para comenzar, aquí tienes un fragmento de código que te ayudará a detectar la nueva vela:

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // Aquí va tu código
  }
}

Pero, ¿qué pasa con eventos en otros marcos de tiempo? No es muy complicado, aunque hay algunas restricciones. MetaTrader 4 no soporta el evento onBar, pero puedes almacenar los tiempos de las velas en un arreglo y verificar esos tiempos en cada tick. Si el tiempo coincide, ejecutas el evento de nueva vela.

Esto significa que si haces una prueba de retroceso en el marco M5, podrás captar eventos de M6, M7, hasta D1. ¿Te preguntas por qué solo puedes detectar tendencias ascendentes? La respuesta se relaciona con cómo genera datos de tick MetaTrader. Para más información, puedes consultar estos enlaces: A1, A2, A3.

Hasta el marco D1, se vuelve más complicado porque la semana puede comenzar, por ejemplo, un domingo a las 20:45 (dependiendo del bróker) y el inicio del mes puede caer a mitad de semana. Por esta razón, no considero que esta información sea tan relevante, así que no la publicaré aquí.

Hay un tema en el foro sobre esta cuestión, pero creo que muchos no leen los artículos y foros, así que he decidido compartir este código con ustedes.

Explicación del Código

En la función init, llenas el arreglo de tiempos con los tiempos iniciales:

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

Y en la función start, verificas si ha pasado suficiente tiempo, y si es así, ejecutas el evento:

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

Finalmente, escribe tu código en:

void onTick() { 
}

y

void onBar(int period) {
}

¡Y eso es todo, amigos!

Actualización 1.1: Gracias a WHRoeder por el código claro.

Lista
Comentarios 0