
Per MT4, calcola (TimeCurrent() - TimeGMT()) / 3600 per ottenere il GMT offset del tuo broker. Per MT5, leggi direttamente SymbolInfoInteger(Symbol(), SYMBOL_GMT_SHIFT). Queste due righe risolvono il 90% dei ticket del tipo "perché il mio EA fa trading all'ora sbagliata" che invadono i forum MQL ad ogni transizione dell'ora legale.
Non usare TimeLocal() o TimeGMTOffset() per questo scopo. Entrambe fanno riferimento all'orologio della macchina su cui gira il terminal, non al server del broker, quindi un VPS a Francoforte e un laptop a Denver restituiranno due numeri diversi per lo stesso account.
Fai subito questa verifica:
- Aggiungi
Print("Broker GMT offset: ", (TimeCurrent() - TimeGMT()) / 3600);inOnInit(). - Compila, applica l'EA a un grafico e apri il log degli Experts.
- Conferma che il valore stampato corrisponda a quanto dichiarato dal tuo broker nelle FAQ o nelle specifiche contrattuali.
Punti chiave
Ottenere il GMT offset corretto in MT4 richiede il calcolo di (TimeCurrent() - TimeGMT()) / 3600, la verifica tramite il log degli Experts e un nuovo controllo a ogni transizione dell'ora legale.
| Punto | Dettagli |
|---|---|
| Usa la formula corretta | Per MT4, (TimeCurrent() - TimeGMT()) / 3600 fornisce l'offset reale del broker in ore. |
| Evita le funzioni di orario locale | TimeLocal() e TimeGMTOffset() riflettono l'orologio del tuo PC, non quello del server del broker. |
| Usa la proprietà integrata di MT5 | SymbolInfoInteger(Symbol(), SYMBOL_GMT_SHIFT) restituisce direttamente lo shift, con -1 in caso di errore. |
| Testa su tutte le settimane di ora legale | Esegui lo Strategy Tester sia sulla transizione di marzo che su quella di novembre prima di andare live. |
| Usa dati puliti e allineati | I dataset a barre di un minuto di Backtestmarket e le guide di importazione MT4/MT5 aiutano a mantenere i timestamp coerenti. |
Indice
- Calcolare il GMT offset in MT4: formula, unità di misura ed esempio pratico
- Il metodo MT5: SYMBOL_GMT_SHIFT e come gestirne i casi limite
- Ora legale e le settimane di disallineamento UE/USA che rompono i filtri di sessione
- Convertire gli orari di sessione GMT in ora server (con checklist di verifica)
- Errori comuni che rompono gli EA basati sul tempo (e soluzioni rapide)
- Perché offset precisi sono fondamentali per backtest affidabili
- Un workflow da adottare prima del prossimo deployment live
- Ottieni dati pronti per l'importazione già allineati all'orologio del tuo broker
- Documentazione e guide da salvare
- Domande frequenti
- Fonti
Calcolare il GMT offset in MT4: formula, unità di misura ed esempio pratico
La formula è offsetHours = (TimeCurrent() - TimeGMT()) / 3600. TimeCurrent() restituisce l'ora del server del broker come timestamp Unix; TimeGMT() restituisce il riferimento GMT del terminal, secondo il riferimento alle funzioni di data e ora dell'MQL4 Book. Sottraendo i due valori e dividendo per 3.600 secondi si ottengono le ore. Questo è l'offset reale del broker, non una stima basata sul fuso orario del tuo desktop.
TimeGMTOffset() sembra allettante perché il nome sembra corretto, ma restituisce la differenza tra GMT e l'orologio locale del tuo computer, secondo la documentazione MQL4. Non ha nulla a che fare con il server su cui vengono eseguiti i tuoi trade. Confondere queste due funzioni è il bug più comune negli Expert Advisor basati sul tempo.
Consiglio pratico: Fai attenzione alla divisione tra interi. In MQL4, dividere due interi tronca il risultato, quindi se il tuo broker applica un offset di mezz'ora (raro, ma capita su alcuni server esotici), la formula grezza può arrotondare in modo scorretto. Effettua un cast a double prima di dividere se sospetti uno shift non intero.

Un rapido esempio numerico: supponiamo che TimeCurrent() restituisca un timestamp equivalente alle 14:00 ora server, e che TimeGMT() restituisca le 12:00 GMT per lo stesso istante. Il calcolo dà (14:00 - 12:00) = 2 ore. In quel momento il tuo broker sta usando GMT+2.
Ecco un blocco minimo di verifica per OnInit():
- Dichiara
int offset = (int)((TimeCurrent() - TimeGMT()) / 3600); - Stampalo:
Print("Server GMT offset (hours): ", offset); - Confronta il valore registrato nel log con il fuso orario server pubblicato dal tuo broker.
- Riesegui il controllo dopo ogni cambio noto dell'ora legale per intercettare eventuali derive per tempo.
Il metodo MT5: SYMBOL_GMT_SHIFT e come gestirne i casi limite
MT5 offre una scorciatoia che MT4 non ha. Chiamando SymbolInfoInteger(Symbol(), SYMBOL_GMT_SHIFT) si ottiene lo shift GMT del server del broker in secondi, esprimibile in ore dividendo per 3.600, direttamente dal terminal stesso, secondo quanto descritto in dettaglio in questo articolo MQL5 sul rilevamento del fuso orario del broker e dell'ora legale. Nessuna sottrazione, nessun calcolo manuale, nessuna ambiguità su quale orologio si stia leggendo.
- Leggilo una sola volta in
OnInit()e memorizza il valore in cache; non c'è bisogno di richiamarlo a ogni tick. - Un valore di ritorno pari a
-1segnala un errore, solitamente perché il simbolo non è ancora completamente inizializzato o il terminal non si è sincronizzato con il trade server. - Se ottieni
-1, riprova dopo un breve ritardo oppure ricorri al calcolo manualeTimeCurrent()menoTimeGMT()usato in MT4.
Questo evita un'intera categoria di grattacapi tipici di MQL4: nessuna confusione tra funzioni di orario locale e del terminal, nessun tracciamento manuale dell'ora legale nella maggior parte dei casi, dato che il valore di shift fornito direttamente dal broker riflette già eventuali aggiustamenti stagionali.
Ora legale e le settimane di disallineamento UE/USA che rompono i filtri di sessione
La maggior parte dei broker forex applica un GMT offset che varia stagionalmente seguendo le convenzioni dell'ora legale dell'Europa orientale, non quelle del proprio paese. L'attrito si manifesta durante la finestra di una o due settimane, in primavera e in autunno, in cui l'Unione Europea e gli Stati Uniti cambiano l'ora in date diverse. L'offset assunto dal tuo EA può essere sfasato di un'ora per diverse giornate di trading, finché entrambe le regioni non si allineano al nuovo orario.
Gli offset codificati manualmente falliscono proprio in questi casi. Un EA con int brokerOffset = 2; inserito fisso nel codice sorgente manderà in tilt ogni filtro di sessione nel momento in cui il broker passa all'ora legale estiva e nessuno ricompila il codice.
- Il rilevamento dinamico (ricalcolare l'offset a runtime) supera automaticamente i cambi dell'ora legale, ma comporta un piccolo costo computazionale.
- I valori codificati manualmente sono più veloci e semplici, ma solo se si è disposti ad aggiornarli e a ridistribuire l'EA manualmente due volte l'anno, cosa che la maggior parte dei trader dimentica di fare.
- La comunità favorisce costantemente i controlli dinamici rispetto alle date statiche, poiché una progettazione dell'EA consapevole dell'ora legale evita del tutto il rischio di transizioni mancate.
Consiglio pratico: Blocca il tuo EA dall'aprire nuovi trade durante l'ora del rollover di mezzanotte del server. I timestamp delle barre e il comportamento dello spread diventano irregolari proprio in quel momento, ed è anche il momento in cui un offset non aggiornato causa i danni maggiori.
Ricontrolla l'offset con una certa periodicità, non solo all'avvio, ed esegui test unitari che coprano specificamente sia la settimana di transizione di marzo sia quella di novembre prima di affidare capitale reale a un EA.
Convertire gli orari di sessione GMT in ora server (con checklist di verifica)
Una volta ottenuto l'offset del broker, convertire l'orario di inizio sessione ancorato al GMT in ora server richiede una sola riga: serverHour = (StartHourGMT + brokerOffset) % 24. L'operatore modulo gestisce correttamente il passaggio di giorno, quindi una sessione che inizia alle 22:00 GMT su un broker che opera in GMT+3 si posiziona correttamente all'01:00 ora server invece di un'invalida 25:00.
- Esponi
StartHourGMTeEndHourGMTcome input dell'EA, ancorati al GMT in modo che la logica non cambi mai tra un broker e l'altro. - Calcola
serverHoura runtime usando l'offset corrente, mai un valore digitato una volta e poi dimenticato. - Confronta
TimeHour(TimeCurrent())con il tuoserverHourcalcolato all'interno del filtro di sessione, non con un numero codificato manualmente. - Stampa sia l'input GMT sia l'ora server calcolata nel log degli Experts a ogni cambio di sessione, così da poter verificare il comportamento a posteriori.
Il pattern più affidabile negli EA in produzione è volutamente noioso: ancora tutto al GMT, converti in ora server solo al momento del confronto, e registra ogni conversione nel log. Il codice noioso è codice verificabile, e il codice verificabile è quello che sopravvive quando un broker cambia la propria politica sull'ora legale senza preavviso.
Prima di distribuire l'EA, esegui lo Strategy Tester su un intervallo di date che includa almeno una settimana di transizione dell'ora legale sia per l'UE sia per gli USA. Confronta i valori di offset registrati nel log con quelli attesi per inverno ed estate, e conferma che il filtro di sessione scatti all'ora server corretta su entrambi i lati del cambio orario. Se lo Strategy Tester e i log live sono in disaccordo, fidati del log degli Experts live, poiché la gestione del tempo nel backtest può comportarsi diversamente rispetto a una connessione live.
Errori comuni che rompono gli EA basati sul tempo (e soluzioni rapide)
La maggior parte dei bug di temporizzazione risale sempre alle stesse poche cause.
- Usare
TimeLocal()oTimeGMTOffset()invece della formula basata sul server. Soluzione: sostituisci ogni occorrenza conTimeCurrent()eTimeGMT(), come indicato nel riferimento MQL4. - Deriva dell'orologio del VPS dovuta a una fonte NTP mal configurata. Soluzione: verifica l'orologio di sistema del tuo VPS rispetto a un server orario affidabile; un orologio host in deriva non influisce direttamente su
TimeCurrent(), ma può mascherare altri problemi di sincronizzazione nei log. - Offset codificati manualmente rimasti dai test. Soluzione: passa alla formula dinamica o a
SYMBOL_GMT_SHIFT, ed elimina completamente il numero fisso. - Non ricontrollare mai dopo una migrazione del broker o un cambio dell'ora legale. Soluzione: aggiungi una stampa periodica dell'offset in
OnTimer(), non solo inOnInit().
Dopo ogni correzione, riesegui il controllo di stampa a una riga descritto all'inizio di questo articolo e confronta il risultato con il fuso orario server dichiarato dal tuo broker.
Perché offset precisi sono fondamentali per backtest affidabili
Un errore di offset di un'ora sposta silenziosamente ogni confine di sessione in un backtest, corrompendo le statistiche di win-rate e drawdown senza generare un solo errore visibile.
- I timestamp disallineati fanno sembrare una strategia profittevole o non profittevole per ragioni completamente sbagliate.
- Backtestmarket fornisce dataset storici puliti a barre di un minuto, costruiti per l'importazione diretta in MT4 e MT5, così il problema dell'allineamento dei timestamp parte già su basi solide.
- La guida all'importazione per MetaTrader illustra come far corrispondere i dati storici all'ora server del tuo broker prima ancora di eseguire un solo test.
Un workflow da adottare prima del prossimo deployment live
Stampa l'offset in OnInit(), verificalo rispetto al fuso orario dichiarato dal tuo broker, quindi ripeti lo stesso controllo dopo ogni transizione dell'ora legale e dopo ogni migrazione del server del broker. Richiede novanta secondi e intercetta esattamente quella classe di bug che trasforma una strategia solida in una serie di ingressi mal temporizzati. La riproducibilità inizia dal fidarsi dei propri log più delle proprie supposizioni.
Ottieni dati pronti per l'importazione già allineati all'orologio del tuo broker
Ottenere l'offset corretto è solo metà del lavoro. L'altra metà consiste nel fidarsi dei dati storici su cui si sta testando, ed è qui che molte pipeline di dati fai-da-te vanno in crisi. Backtestmarket vende dataset storici puliti a barre di un minuto su forex, metalli, indici e obbligazioni, costruiti specificamente per l'importazione diretta in MT4 e MT5, così non devi riconciliare tre fonti temporali diverse prima ancora di poter eseguire un test.

Ogni dataset è accompagnato da un processo di importazione documentato per MetaTrader, e se stai testando una coppia principale come EUR/USD, il dataset storico EUR/USD è pronto per essere caricato senza dover riformattare una sola colonna. Se un connettore di terze parti si adatta meglio al tuo workflow, vale la pena dare un'occhiata agli strumenti di connessione a MetaTrader di Tickerly per sincronizzare pipeline di dati esterne. A rispondere alle richieste di supporto sono veri ingegneri, non una coda di ticket. Sfoglia il catalogo di dati storici forex e scarica un dataset allineato agli orari server effettivi del tuo broker prima del tuo prossimo backtest.
Documentazione e guide da salvare
Per i meccanismi sottostanti, il riferimento MQL4 su TimeGMTOffset, le funzioni di data e ora dell'MQL4 Book e l'articolo MQL5 sul rilevamento del fuso orario del broker coprono nel dettaglio il comportamento ufficiale delle funzioni. Per applicarlo a dataset reali, la guida all'importazione per MetaTrader di Backtestmarket e il blog illustrano i passaggi pratici di configurazione.
Domande frequenti
Qual è la formula corretta per il GMT offset in MT4 per un EA?
Usa (TimeCurrent() - TimeGMT()) / 3600. Questo fornisce l'offset del server del broker rispetto al GMT in ore, ed è il valore su cui dovrebbero basarsi filtri di sessione e timer degli ordini.
Perché TimeGMTOffset() mi restituisce un valore sbagliato?
Perché misura la differenza tra GMT e l'orologio del tuo computer locale, non quella del server del broker. Due macchine che eseguono lo stesso EA in fusi orari diversi otterranno risultati diversi da questa funzione.
MT5 gestisce il GMT offset in modo diverso rispetto a MT4?
Sì. MT5 espone SymbolInfoInteger(Symbol(), SYMBOL_GMT_SHIFT), che restituisce direttamente lo shift del broker senza sottrazioni manuali, anche se è comunque necessario gestire in modo difensivo un valore di ritorno pari a -1.
Come si tiene conto dell'ora legale in un EA?
Ricalcola l'offset dinamicamente a runtime invece di codificare un numero fisso, e testa specificamente la tua logica sia sulle settimane di transizione dell'ora legale in UE sia in USA, dato che i broker spesso passano stagionalmente tra GMT+2 e GMT+3.

Come posso verificare che il mio calcolo dell'offset sia corretto?
Stampa il valore calcolato nel log degli Experts usando Print() all'interno di OnInit(), quindi confrontalo con il fuso orario dichiarato dal tuo broker nelle sue FAQ ufficiali o nella documentazione dell'account.
Fonti
- TimeGMTOffset - Date and Time
- Date and time functions (MQL4 Book)
- Monochronic Trading (Part 1): How to Detect Broker Timezone and DST in MQL5 - MQL5 Articles
Consigliati
- Blog | BacktestMarket | BacktestMarket
- Anomalies EAs — BacktestMarket | BacktestMarket
- Main EA — BacktestMarket | BacktestMarket
Risorse correlate
Esplora i robot Expert Advisor di BacktestMarket per mettere in pratica le idee di questo articolo.
