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
- Dematus: Il Sistema di Trading per MetaTrader 5
- MQL5 Wizard: Creare Trading Signals con Morning/Evening Stars e MFI per MetaTrader 5
- MQL5 Wizard: Strategia di Trading con Dark Cloud Cover/Piercing Line e RSI
- MQL5 Wizard: Crea Expert Advisor per segnali di trading basati su Dark Cloud Cover e Piercing Line con CCI
- Utilizzare MQL5 Wizard per Trading con Dark Cloud Cover e Piercing Line