Home Trading Sistematico Post

Rilevazione Nuove Barre in MetaTrader 4: Guida Pratica per Trader

Allegato
10370.zip (734 bytes, Scarica 0 volte)

Ciao a tutti, trader! Oggi parliamo di una funzione molto richiesta: come rilevare la presenza di una nuova barra nel vostro Expert Advisor su MetaTrader 4. È più semplice di quanto si possa pensare, soprattutto se volete monitorare la nuova barra nel timeframe attuale.

Ecco un semplice codice per iniziare:

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // inserisci qui il tuo codice
  }
}

Ma cosa succede con gli eventi in altri timeframe? Non è troppo complicato, ma ha alcune limitazioni. MT4 non supporta l'evento onBar, ma potete memorizzare i tempi in un array e controllarlo ad ogni tick. Se raggiungete il tempo giusto, potete eseguire l'evento della nuova barra.

Ad esempio, se state eseguendo un backtest sul timeframe M5, potete rilevare gli eventi M6, M7, fino a D1. Ma perché potete rilevare solo tendenze ascendenti? La risposta è legata a come MetaTrader genera i dati tick. Per saperne di più, consultate i seguenti link: A1, A2, A3.

Fino al timeframe D1 diventa più complicato, perché la settimana può iniziare, ad esempio, di domenica alle 20:45 (specifico per il broker), e l'inizio del mese può scattare nel mezzo della settimana... In effetti, queste informazioni potrebbero non essere così rilevanti, quindi ho deciso di non approfondirle qui.

Per chi volesse approfondire, c'è un topic dedicato a questa questione, ma so che molti non leggono articoli e forum, quindi ho deciso di condividere questo codice.

Un po' di spiegazione:

Nella funzione init, dovete riempire l'array dei tempi con gli orari di partenza:

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

Poi, nella funzione start, verificate se è trascorso abbastanza tempo, e se sì, eseguite l'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);
      }
    }
  }

Infine, scrivete il vostro codice in:

void onTick() { 
}

e

void onBar(int period) {
}

Questo è tutto, trader! Spero che queste informazioni vi siano utili nel vostro trading.

Aggiornamento 1.1: Grazie a WHRoeder per il codice chiaro!

Post correlati

Commento (0)