Unisciti alla nostra fan page
- Visualizzazioni:
- 89
- Valutazioni:
- Pubblicato:
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
Salve, trader.
Questa libreria contiene tutte le funzioni per ottenere l'ora locale corrente in uno specifico o in tutti i mercati Forex. È possibile convertire l'ora locale tra i fusi orari o l'ora del server del proprio broker. È anche possibile operare in sessioni specifiche impostando gli orari di inizio e fine sessione per ogni sessione, separatamente. La libreria si occuperà dei diversi offset temporali e dei cambi di ora legale del broker e di questi mercati. In questo modo si evita di dover reinventare la ruota ogni volta che si programma un consulente esperto o un indicatore tecnico che deve gestire i fusi orari e gli orari delle sessioni locali.
Che cos'è il fuso orario?
Il fuso orario è definito come l'ora standard a seconda della rappresentazione geografica di quel luogo. In altre parole, il fuso orario si riferisce all'ora locale di una particolare regione basata sulla rotazione terrestre. È definito in UTC (Coordinated Universal Time), lo standard rispetto al quale è coordinato il tempo delle regioni del mondo.
Ad esempio, l'ora di New York è 5 ore indietro rispetto a Greenwich e viene rappresentata come UTC-5 o UTC-4 in base alla luce del giorno. L'ora di Sydney è 10 ore avanti rispetto a Greenwich e viene rappresentata come UTC+10 o UTC+11 in base alla luce del giorno (estate o inverno). I termini UTC e GMT sono spesso usati in modo intercambiabile per esprimere gli offset, quindi UTC+2 e GMT+2 hanno spesso lo stesso significato.
L'offset UTC è positivo se il fuso orario è a est del GMT, mentre è negativo se il fuso orario è a ovest del GMT.
Identificatori di fuso orario
//+------------------------------------------------------------------+ //| Identificatori di fuso orario| //+------------------------------------------------------------------+ enum ENUM_ZONE_ID { ZONE_ID_SYDNEY, // Sydney ZONE_ID_TOKYO, // Tokyo ZONE_ID_FRANKFURT, // Francoforte ZONE_ID_LONDON, // Londra ZONE_ID_NEWYORK, // New York ZONE_ID_UTC, // UTC ZONE_ID_LOCAL, // LOCALE ZONE_ID_BROKER, // BROKER ZONE_ID_CUSTOM // PERSONALIZZATO };
Interfaccia di classe
//+------------------------------------------------------------------+ //| Classe CTimeZoneInfo.| //| Scopo: classe per accedere all'ora locale per l'area specificata. //| posizione, così come le informazioni sul fuso orario, l'ora | //| modifiche per l'anno in corso.| //|| //| Notazione di offset utilizzata nella libreria:| //| Si noti che la libreria denota un tempo positivo. //| zone con offset positivi e fusi orari negativi | //per offset negativi.| //| Al contrario, la funzione integrata TimeGMTOffset() di MQL5 | //| la funzione indica i fusi orari positivi, come GMT+3, | //per offset negativi, come ad esempio -10800, e viceversa. //+------------------------------------------------------------------+ class CTimeZoneInfo { public: CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW ); ~CTimeZoneInfo( void ); string Name( void ); // Restituisce il nome del fuso orario string ToString( bool secs = true, bool tzname = true ); // Restituisce una stringa dell'ora locale formattata con l'offset TZ/DST e il nome tz. bool RefreshTime( void ); // Aggiornare l'ora locale corrente e inserire le informazioni sul fuso orario bool SetLocalTime( datetime pLocalTime = TIME_NOW ); // Impostare l'ora locale di questa località all'ora specificata datetime TimeLocal( void ); // Restituisce l'ora locale nel fuso orario datetime TimeUTC( void ); // Restituisce l'ora UTC (la stessa in tutti i fusi orari) int TimeGMTOffset( void ); // Valore positivo per fusi orari positivi (es. GMT+3), altrimenti negativo. (include DST) int TimeDaylightSavings( void ); // Restituisce la correzione DST (in secondi) per il fuso orario, all'ora locale impostata. datetime ConvertLocalTime( ENUM_ZONE_ID destinationId ); // Convertire l'ora locale di questo fuso orario in un altro fuso orario bool GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end ); // Ottenere gli orari di inizio e fine dell'ora legale per l'anno in corso datetime GetDaylightNextSwitch( void ); // Ottenere l'ora locale del prossimo passaggio all'ora legale void PrintObject( void ); //--- metodi statici che non richiedono la creazione di un oggetto. static datetime GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId ); // Ottenere l'ora locale corrente per il fuso orario specificato static string FormatTimeForPlace ( datetime time, ENUM_ZONE_ID placeId, bool secs = true, bool tzname = true ); static datetime ConvertTimeForPlace ( datetime time, ENUM_ZONE_ID placeId, ENUM_ZONE_ID destinationId ); static int TimeGMTOffset ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Restituisce lo scostamento tz totale (UTC+DST) dal GMT, per un fuso orario all'ora locale data static int TimeDaylightSavings ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Restituisce la correzione di dst in secondi, per un fuso orario all'ora locale data static bool IsDaylightSavingTime ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Controlla se l'ora specificata cade nell'ora legale. static bool GetDaylightSwitchTimes ( ENUM_ZONE_ID placeId, int iYear, datetime &dst_start, datetime &dst_end ); static bool GetDaylightSwitchDeltas( ENUM_ZONE_ID placeId, int iYear, int &delta_start, int &delta_end ); static bool SetCustomTimeZone( string name, int baseGMTOffset = 0, // Definisce un fuso orario che non si trova nella libreria. ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC ); static void SetUsingGoldSymbol( bool enabled = true ); // Imposta l'opzione per l'utilizzo del simbolo Gold per la stima del TZ/DST del server. };
Interfaccia di classe
//+------------------------------------------------------------------+ //| Classe CSessionHours.| //| Scopo: classe per accedere all'orario della sessione di trading locale per | //| la posizione specificata.| //| Deriva dalla classe CTimeZoneInfo.| //| Nota: l'orario predefinito delle sessioni è impostato sulle 8:00-17:00. //| ora locale per i nuovi oggetti CSessionHours. | //+------------------------------------------------------------------+ class CSessionHours : public CTimeZoneInfo { public: CSessionHours( ENUM_ZONE_ID placeId ); ~CSessionHours( void ); //--- metodi per accedere all'orario della sessione locale bool RefreshTime( void ); // Aggiornare l'ora locale corrente e le ore di sessione del giorno bool SetLocalTime( datetime pLocalTime ); //--- metodi per sovrascrivere le ore di sessione locali predefinite bool BeginLocalTime( int pHour, int pMinute ); // Impostare l'ora di inizio della sessione locale, utilizzando un'ora e un minuto iniziali. bool EndLocalTime( int pHour, int pMinute ); // Impostare l'ora di fine della sessione locale, utilizzando un'ora e un minuto finali. //--- metodi per accedere alle ore della sessione locale datetime BeginLocalTime( void ); datetime EndLocalTime( void ); bool CheckLocalSession( void ); // Verifica se la sessione di trading locale è attualmente attiva. int SecRemainingSession( void ); // Tempo rimanente in secondi fino alla chiusura della sessione locale per il giorno. //--- metodi statici che non richiedono la creazione di un oggetto. static datetime ForexCloseTime( void ); // L'ora del broker in cui il mercato Forex chiude per questa settimana. static int SecRemainingForex( void ); // Tempo rimanente in secondi fino alla chiusura del mercato Forex per questa settimana. };
Notazione di offset utilizzata nella libreria
Si noti che la libreria indica i fusi orari positivi con offset positivi e i fusi orari negativi con offset negativi.
Questo è l'opposto della funzione integrata TimeGMTOffset() di MQL5 che indica i fusi orari positivi, come GMT+3, con offset negativi, come -10800, e viceversa.
Selezione del simbolo per la stima del TZ/DST del server
Per impostazione predefinita, la libreria cerca e carica il simbolo XAUUSD per stimare l'offset del fuso orario del server. XAUUSD può fornire risultati più affidabili (soprattutto per i broker che seguono l'orario DST dell'UE) nelle settimane in cui gli orari DST degli Stati Uniti e quelli dell'UE non sono sincronizzati (marzo e fine ottobre). Se il vostro broker segue l'orario DST statunitense o non lo segue affatto, va bene anche il simbolo del grafico. Richiamare CTimeZoneInfo::SetUsingGoldSymbol() con 'false' per utilizzare il simbolo del grafico corrente, invece di XAUUSD.
Per determinare l'orario diurno del vostro broker (DST), potete utilizzare questo script https://www.mql5.com/it/code/48650.
//+------------------------------------------------------------------+ //| Imposta l'opzione di utilizzare il simbolo XAUUSD (Oro) per stimare il valore di riferimento. //| il TZ/DST del server analizzando la cronologia delle quotazioni di H1. //| TRUE: ricerca e caricamento del simbolo Gold (comportamento predefinito). //| FALSO: utilizza il simbolo del grafico corrente. //+------------------------------------------------------------------+ void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);
Nota:
Come effetto collaterale del fatto che XAUUSD inizia un'ora dopo il Forex, il cambio di DST avverrà un'ora dopo (solo nel tester della strategia e non nella modalità normale).
Nota sulla compatibilità con il tester di strategia
Durante i test nel tester della strategia,TimeGMT() è sempre uguale all'ora simulata del server diTimeTradeServer().
La libreria TimeZoneInfo stima gli orari corretti dei fusi orari in base al "vero" GMT analizzando la cronologia delle quotazioni H1 e non in base all'orario restituito dalla funzione integrata TimeGMT.
Se si utilizza il simbolo XAUUSD per stimare il TZ/DST del server, nel tester della strategia il cambio di dst avverrà un'ora dopo.
I. Lavorare con i fusi orari locali
Come ottenere l'ora corrente?
Il metodo RefreshTime()aggiorna l'ora locale del fuso orario. Vediamo un esempio per mostrare come ottenere l'ora corrente.
Print("\n========== Get the current time in a timezone =========="); CTimeZoneInfo tz(ZONE_ID_TOKYO); tz.RefreshTime(); // popola le informazioni sul fuso orario attuale Print("Name() : ", tz.Name()); Print("TimeLocal() : ", tz.TimeLocal()); Print("ToString() : ", tz.ToString());
output:
// ========== Ottenere l'ora corrente in un fuso orario ========== // Name() : Tokyo // TimeLocal() : 2024.02.28 19:58:50 // ToString() : Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]
Avete bisogno di ulteriori informazioni?
Print("\n========== More information about a timezone =========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); tz.RefreshTime(); Print("Name() : ", tz.Name()); Print("TimeUTC() : ", tz.TimeUTC()); Print("TimeLocal() : ", tz.TimeLocal()); Print("TimeGMTOffset() : ", tz.TimeGMTOffset()); Print("TimeDaylightSavings() : ", tz.TimeDaylightSavings()); Print("ToString() : ", tz.ToString()); datetime dst_start, dst_end; tz.GetDaylightSwitchTimes(dst_start, dst_end); Print("dst_start : ", dst_start); Print("dst_end : ", dst_end); Print("GetDaylightNextSwitch() : ", tz.GetDaylightNextSwitch());
output:
// ========== Ulteriori informazioni su un fuso orario ========== // Name() : New York // TimeUTC() : 2024.03.17 16:50:38 // TimeLocal() : 2024.03.17 12:50:38 // TimeGMTOffset() : -14400 // TimeDaylightSavings() : 3600 // ToString() : Sun, 2024.03.17 12:50:38 GMT-4 [New York] (DST) // dst_start : 2024.03.10 02:00:00 // dst_end : 2024.11.03 02:00:00 // GetDaylightNextSwitch() : 2024.11.03 02:00:00
Note:
- Il metodo TimeUTC() restituisce l'ora UTC, che equivale all'ora GMT.
- Il metodo TimeLocal() restituisce l'ora locale di questo fuso orario (che potrebbe essere stata modificata in seguito alle chiamate ai metodi RefreshTime o SetLocalTime ).
- Il metodo TimeGMTOffset() restituisce la differenza attuale tra l'ora locale di questo fuso orario e l'ora GMT in secondi, tenendo conto del passaggio all'ora invernale o estiva. L'offset restituito include l'adeguamento DST del fuso orario corrente. L'offset GMT è positivo se il fuso orario è a est (avanti) rispetto al GMT, mentre è negativo se il fuso orario è a ovest (indietro) rispetto al GMT.
- Il metodo TimeDaylightSavings() restituisce l'adeguamento all'ora legale (DST) in secondi, se è stato effettuato il passaggio all'ora legale nelle zone in cui è in vigore la DST. Se è stato effettuato il passaggio all'ora invernale (standard) (o se il fuso orario non supporta la DST), restituisce 0. L'aggiustamento dst è già parte del TimeGMTOffset.
Come configurare il fuso orario personalizzato integrato per un uso successivo?
La classe CTimeZoneInfo include il metodo SetCustomTimeZone , che può essere utilizzato per configurare il fuso orario personalizzato integrato. In seguito, il fuso orario personalizzato può essere utilizzato tramite l'identificatore ZONE_ID_CUSTOM. Vediamo un esempio per mostrare come configurare il fuso orario personalizzato integrato con un nome specificato, un offset rispetto all'ora di Greenwich (GMT) e un identificatore di orario diurno.
Print("\n========== Configure the built-in custom timezone =========="); string name = "Custom+3"; // Nome del fuso orario personalizzato int baseGMTOffset = 10800; // Offset GMT di base del fuso orario personalizzato (in secondi) ENUM_ZONE_ID daylightRuleId = ZONE_ID_LONDON; // Orario personalizzato del fuso orario DST bool success = CTimeZoneInfo::SetCustomTimeZone(name, baseGMTOffset, daylightRuleId); Print("Parameter 'name' : ", name); Print("Parameter 'baseGMTOffset' : ", baseGMTOffset); Print("Parameter 'daylightRuleId' : ", EnumToString(daylightRuleId)); Print("SetCustomTimeZone() returns : ", success);
Output:
// ========== Configurare il fuso orario personalizzato integrato ========== // Parametro 'nome' : Personalizzato+3 // Parametro 'baseGMTOffset' : 10800 // Parametro 'daylightRuleId' : ZONA_ID_LONDRA // SetCustomTimeZone() restituisce : true
Ottenere l'ora corrente in tutti i fusi orari
Vediamo un esempio per mostrare come ottenere l'ora locale corrente in tutti i fusi orari.
Print("\n========== Get Current Time in All Timezones =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); }
output:
// ========== Ottenere l'ora corrente in tutti i fusi orari ========== // Sydney : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // Tokyo : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] // Francoforte : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] // Londra : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [Londra] // New York : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York] // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC] // Home : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Home] // FXOpen-MT5 : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
Questo può essere fatto in altro modo, utilizzando il metodo statico GetCurrentTimeForPlace(). Si noti inoltre che esiste un altro metodo statico FormatTimeForPlace() che può essere usato per formattare le variabili datetime mql semplici in una stringa ( simile a TimeToString), ma con il giorno della settimana, la data, l'ora, il nome del fuso orario e gli offset. Questi metodi statici non richiedono la creazione di oggetti per essere richiamati.
Print("\n========== GetCurrentTimeForPlace() =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { datetime time = CTimeZoneInfo::GetCurrentTimeForPlace(id); PrintFormat("Time : %s | %s", TimeToString(time), CTimeZoneInfo::FormatTimeForPlace(time, id)); }
uscita:
// ========== GetCurrentTimeForPlace() ========== // Ora : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // Ora : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] // Ora : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] // Ora : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [London] // Ora : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York] // Ora : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC] // Ora : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Home] // Ora : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
Come impostare l'ora locale per il fuso orario?
Il metodo SetLocalTime()imposta l'ora locale specificata. Vediamo un esempio per mostrare come impostare l'ora locale per il fuso orario.
Print("\n========== Set the local time for a timezone =========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); if(tz.SetLocalTime(D'2021.07.15 09:31')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); if(tz.SetLocalTime(D'2022.01.23 17:04')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); if(tz.SetLocalTime(D'2023.03.12 02:21')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());
output:
// ========== Impostare l'ora locale per un fuso orario ========== // New York : 2021.07.15 09:31 | Thu, 2021.07.15 09:31:00 GMT-4 [New York] (DST) // New York : 2022.01.23 17:04 | Sun, 2022.01.23 17:04:00 GMT-5 [New York] // >>Errore: L'ora 2023.03.12 02:21 non esiste a New York. Questo perché l'ora legale è saltata di un'ora.
La causa dell'ultimo messaggio di errore verrà spiegata nel prossimo paragrafo.
Ora legale (DST):
L'ora legale è una misura di cambiamento stagionale dell'orario in cui gli orologi vengono anticipati rispetto all'ora standard durante una parte dell'anno.
vedere https://www.timeanddate.com/time/dst/transition.html
("Summer Skip", "Winter Wind-back")
Quando la DST inizia in primavera, gli orologi vengono spostati in avanti di una certa quantità di tempo, di solito di un'ora. Ciò significa che l'orologio salta un'ora. In autunno, il periodo di DST solitamente termina e gli orologi tornano all'ora solare.
Esempio di inizio DST
(l'ora inesistente)
Negli Stati Uniti, la DST inizia sempre alle 02:00 (2 del mattino) ora locale. Nel momento in cui l'ora raggiunge per la prima volta l'1:59:59 dell'ora standard, gli orologi saltano in avanti alle 3:00:00 dell'ora legale. Quindi l'ora dalle 2:00:00 alle 2:59:59 non esiste nella notte del cambio.

II. Ottenere informazioni sul fuso orario
1. Offset UTC e offset DST corrente
Vediamo un esempio per mostrare come ottenere il nome del fuso orario, l'offset UTC e l'offset DST corrente se è in vigore la DST.
Print("\n========== UTC offset and current DST offset =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); // popola le informazioni sul fuso orario attuale PrintFormat("%-12s: GMT%+g | DST%+g", tz.Name(), tz.TimeGMTOffset()/3600., tz.TimeDaylightSavings()/3600.); }
uscita:
// ========== offset UTC e offset DST corrente ========== // Sydney : GMT+11 | DST+1 // Tokyo : GMT+9 | DST+0 // Francoforte : GMT+1 | DST+0 // Londra : GMT+0 | DST+0 // New York : GMT-4 | DST+1 // UTC : GMT+0 | DST+0 // Casa : GMT+2 | DST+0 // FXOpen-MT5 : GMT+2 | DST+0
Note:
- Il metodo TimeGMTOffset() restituisce la differenza attuale tra l'ora locale di questo fuso orario e l'ora GMT in secondi, tenendo conto del passaggio all'ora invernale o estiva. L'offset restituito include l'adeguamento DST del fuso orario corrente. L'offset GMT è positivo se il fuso orario è a est (avanti) rispetto al GMT, mentre è negativo se il fuso orario è a ovest (indietro) rispetto al GMT.
- Il metodo TimeDaylightSavings() restituisce l'adeguamento all'ora legale (DST) in secondi, se è stato effettuato il passaggio all'ora legale nelle zone in cui è in vigore la DST. Se è stato effettuato il passaggio all'ora invernale (standard) (o se il fuso orario non supporta la DST), restituisce 0. L'aggiustamento dst fa già parte del TimeGMTOffset.
2. Orari di cambio DST per l'anno in corso
Vediamo un esempio per mostrare come ottenere le informazioni sul DST.
Print("\n========== DST switch times for the current year =========="); datetime dst_start, dst_end; for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); // popola le informazioni sul fuso orario attuale //--- solo per i fusi orari che osservano l'ora solare. if(tz.GetDaylightSwitchTimes(dst_start, dst_end)) { PrintFormat("%-12s: DST starts on %s | DST ends on %s", tz.Name(), TimeToString(dst_start), TimeToString(dst_end)); } }
output:
// ========== Orari di commutazione DST per l'anno in corso ========== // Sydney : L'ora legale inizia il 2024.04.07 alle 03:00 | L'ora legale termina il 2024.10.06 alle 02:00 // Francoforte : Il DST inizia il 2024.03.31 alle 02:00 | Il DST termina il 2024.10.27 alle 03:00 // Londra : Il DST inizia il 2024.03.31 01:00 | Il DST termina il 2024.10.27 02:00 // New York : Il DST inizia il 2024.03.10 02:00 | Il DST termina il 2024.11.03 02:00
3. Ora del prossimo cambio DST
Vediamo un esempio per mostrare come ottenere l'ora del prossimo cambio DST.
Print("\n========== Time of the next DST switch =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); datetime nxswitch = tz.GetDaylightNextSwitch(); //--- solo per i fusi orari che osservano l'ora solare. if(nxswitch) { PrintFormat("%-12s: Time: %s | dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch)); } }
uscita:
// ========== Ora del prossimo cambio DST ========== // Sydney : Ora: 2024.02.28 21:58 | dstNextSwitch: 2024.04.07 03:00 // Francoforte : Ora: 2024.02.28 11:58 | dstNextSwitch: 2024.03.31 02:00 // Londra : Ora: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00 // New York : Ora: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00
4. Elenco DST
Vediamo un esempio per mostrare come ottenere le informazioni DST per tutti i fusi orari di questa libreria per un intervallo di anni.
Print("\n========== DST List =========="); datetime dst_start, dst_end; int delta_start, delta_end; // l'orologio cambia in un secondo for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo timezone(id); PrintFormat("========= %s Summer Time (DST) =========", timezone.Name()); for(int year=2008; year<=2030; year++) { //--- solo per i fusi orari che osservano l'ora solare. if(CTimeZoneInfo::GetDaylightSwitchTimes(id, year, dst_start, dst_end)) { CTimeZoneInfo::GetDaylightSwitchDeltas(id, year, delta_start, delta_end); PrintFormat("DST starts on %s (%+d) and ends on %s (%+d)",TimeToString(dst_start), delta_start/3600, TimeToString(dst_end), delta_end/3600); } } }
output:
// ========== Elenco DST ========== // ========= Ora legale di Sydney (DST) ========= // La DST inizia il 2008.04.06 alle 03:00 (-1) e termina il 2008.10.05 alle 02:00 (+1). // La DST inizia il 2009.04.05 alle 03:00 (-1) e termina il 2009.10.04 alle 02:00 (+1). // La DST inizia il 2010.04.04 alle 03:00 (-1) e termina il 2010.10.03 alle 02:00 (+1). // Il DST inizia il 2011.04.03 alle 03:00 (-1) e termina il 2011.10.02 alle 02:00 (+1). // La DST inizia il 2012.04.01 alle 03:00 (-1) e termina il 2012.10.07 alle 02:00 (+1). // ... // ... // ...
5. Offset GMT del server (corrente)
L'offset GMT del broker indica di quanti secondi l'orario del broker è in anticipo rispetto al GMT, offset del broker = TimeTradeServer() - TimeGMT(). I valori positivi indicano che l'orario del server è in anticipo rispetto al GMT. Vediamo un esempio per mostrare come ottenere l'offset GMT corrente del broker.
Print("\n========== Current GMT offset of the broker ========== "); CTimeZoneInfo broker(ZONE_ID_BROKER); broker.RefreshTime(); Print("Name() : ", broker.Name()); Print("TimeLocal() : ", broker.TimeLocal()); // tempo del broker Print("ToString() : ", broker.ToString()); Print("TimeGMTOffset() : ", broker.TimeGMTOffset());
output:
// ========== Offset GMT corrente del broker ========== // Nome() : ICMarketsSC-Demo // TimeLocal() : 2024.03.08 06:33:06 // ToString() : Fri, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo] // TimeGMTOffset() : 7200
Nota: Una nota importante per TimeGMTOffset() è che restituisce l'offset utc compresa la correzione dst (UTC+DST). Valori positivi indicano che l'ora del server è in anticipo (a est) rispetto al GMT.
6. Offset GMT del server (storico)
Gli offset GMT passati del server possono essere calcolati come la differenza tra l'ora di comparsa della prima barra della settimana del server sul grafico e l'ora UTC corrispondente alle 17:00 di domenica, ora di New York. Vediamo un esempio per mostrare come ottenere gli offset GMT passati del broker. Per questo esempio, utilizzeremo l'orario delle candele del grafico come orario passato del broker.
Print("\n========== Past GMT offsets of the broker (chart candles) =========="); datetime bartimes[]; int copied = CopyTime(Symbol(), PERIOD_D1, D'2022.03.18', 9, bartimes); if(copied<=0) Print("CopyTime() failed."); for(int i =0; i < copied; i++) { datetime t = bartimes[i]; CTimeZoneInfo broker(ZONE_ID_BROKER); broker.SetLocalTime(t); PrintFormat("bar #%i Time: %s | offset: %5d (GMT%+g) | %s", i+1, TimeToString(broker.TimeLocal()), broker.TimeGMTOffset(), broker.TimeGMTOffset()/3600.0, broker.ToString()); }
output:
// ========== Offset GMT passati del broker (candele del grafico) ========== // bar #1 Ora: 2022.03.08 00:00 | offset: 7200 (GMT+2) | Tue, 2022.03.08 00:00:00 GMT+2 [ICMarketsSC-Demo] // barra #2 Ora: 2022.03.09 00:00 | offset: 7200 (GMT+2) | Wed, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo] // barra #3 Ora: 2022.03.10 00:00 | offset: 7200 (GMT+2) | Thu, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo] // barra #4 Ora: 2022.03.11 00:00 | offset: 7200 (GMT+2) | Ven, 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo] // barra #5 Ora: 2022.03.14 00:00 | offset: 10800 (GMT+3) | Mon, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo] // barra #6 Ora: 2022.03.15 00:00 | offset: 10800 (GMT+3) | Tue, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #7 Ora: 2022.03.16 00:00 | offset: 10800 (GMT+3) | Wed, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo] // barra #8 Ora: 2022.03.17 00:00 | offset: 10800 (GMT+3) | Thu, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #9 Ora: 2022.03.18 00:00 | offset: 10800 (GMT+3) | Fri, 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]
Come si vede nella barra #5, il server è passato dall'orario invernale +2 all'orario estivo +3, e l'orario del passaggio segue l'orario DST degli Stati Uniti (2a domenica di marzo). Ci sono cinque candele D1 a settimana, e nessuna candela il sabato e la domenica. L'orario su questi server è sempre 7 ore avanti rispetto a New York durante tutto l'anno ed è rappresentato come NY+7. Si noti che NY è -5 in inverno e -4 in estate.
Questa è la prima libreria sul codice in grado di determinare l'offset GMT del server nel passato (offset GMT storici). L'algoritmo implementato nei calcoli è molto veloce e preciso ed è compatibile, per quanto possibile, con diversi broker (testato su un gran numero di broker con diversi offset GMT o orari DST).
III. Conversione tra fusi orari
Convertire l'ora locale corrente in un altro fuso orario
Utilizzare il metodo ConvertLocalTime() per convertire l'ora locale impostata di questa istanza di fuso orario in un fuso orario specifico. Questo metodo restituisce una nuova ora di un determinato fuso orario.
Vediamo un esempio per mostrare come convertire l'ora locale"corrente" in un fuso orario specifico.
Print("\n========== Convert current local time in Sydney to New York =========="); CTimeZoneInfo sydney(ZONE_ID_SYDNEY); sydney.RefreshTime(); datetime localtime = sydney.TimeLocal(); datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK); PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString()); PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));
output:
// ========== Convertire l'ora locale di Sydney in quella di New York ========== // 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York]
Convertire un'ora locale specifica in un altro fuso orario
Vediamo un esempio per mostrare come convertire un'ora locale specifica in un fuso orario specifico.
Print("\n========== Convert a specific local time in Sydney to New York =========="); CTimeZoneInfo sydney(ZONE_ID_SYDNEY); sydney.SetLocalTime(D'2016.05.21 14:47:08'); datetime localtime = sydney.TimeLocal(); datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK); PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString()); PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));
output:
// ========== Convertire un'ora locale specifica di Sydney in New York ========== // 2016.05.21 14:47 | Sat, 2016.05.21 14:47:08 GMT+10 [Sydney] // 2016.05.21 00:47 | Sat, 2016.05.21 00:47:08 GMT-4 [New York] (DST)
Converte l'ora locale corrente in tutti i fusi orari nell'ora del broker
Vediamo un esempio per mostrare come convertire l'ora locale corrente in tutti i fusi orari nell'ora del broker.
Print("\n========== Convert the current local time in all timezones to the broker time =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { datetime localtime = CTimeZoneInfo::GetCurrentTimeForPlace(id); datetime converted = CTimeZoneInfo::ConvertTimeForPlace(localtime, id, ZONE_ID_BROKER); PrintFormat("%-49s | %s", CTimeZoneInfo::FormatTimeForPlace(localtime, id), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_BROKER)); }
uscita:
// ========== Convertire l'ora locale corrente in tutti i fusi orari nell'ora del broker ========== // Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 10:58:50 GMT+0 [Londra] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 05:58:50 GMT-5 [New York] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 10:58:50 GMT+0 [UTC] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 12:58:50 GMT+2 [Home] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
IV. Lavorare con gli orari delle sessioni locali
A. Classe CTimeZoneInfo
Si noti che l'uso della classe madre CTimeZoneInfo , piuttosto che della classe CSessionHours , non è preferibile in quanto richiede una maggiore quantità di codice ed è quindi soggetto a errori. Vediamo un esempio per mostrare come ottenere le ore della sessione Forex in tutti i fusi orari e convertirle nell'ora del broker.
Print("\n======= Local Session Hours (CTimeZoneInfo Class) ======="); const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK}; for(int i = 0; i < ArraySize(ids); i++) { ENUM_ZONE_ID id = ids[i]; CTimeZoneInfo tz(id); tz.RefreshTime(); datetime localtime = tz.TimeLocal(); //--- impostare l'orario della sessione alle 8:00 - 17:00 ora locale datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00"); datetime endlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00"); //--- conversione in tempo del broker tz.SetLocalTime(beginlocal); datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER); tz.SetLocalTime(endlocal); datetime endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER); //--- giorno locale della settimana nel fuso orario MqlDateTime st; TimeToStruct(localtime, st); int dow = st.day_of_week; //stringa state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ? "aperto" : "chiuso"; string state_str = ((dow != SATURDAY && dow != SUNDAY) && (TimeTradeServer() >= beginbroker && TimeTradeServer() < endbroker)) ? "open" : "closed"; PrintFormat("%-12s: %s | %s [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str); } Print("-----------------------------------"); Print("broker time : ", TimeTradeServer()); Print("broker time : ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));
output:
// ======= Orario della sessione locale (classe CTimeZoneInfo) ======= // Sydney : Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [sessione chiusa] // Tokyo : Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [sessione chiusa] // Francoforte : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [sessione aperta] // Londra : Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [sessione aperta] // New York : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [sessione aperta] // ----------------------------------- // ora del broker : 2024.02.28 15:32:30 // ora del broker : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]
B. Classe CSessionHours
Scopo: Classe per accedere agli orari delle sessioni di trading locali per la località specificata.
Deriva dalla classe CTimeZoneInfo.
Nota: l'orario predefinito della sessione è impostato alle 8:00-17:00 ora locale per i nuovi oggetti CSessionHours . Questi valori predefiniti possono essere modificati a piacere.
Lavorare con gli oggetti CSessionHours
Vediamo un esempio di utilizzo dell'oggetto.
Print("\n========== Working with CSessionHours Objects =========="); CSessionHours tz(ZONE_ID_SYDNEY); tz.RefreshTime(); // popola il fuso orario e le informazioni sulla sessione //--- dal genitore Print("Name() : ", tz.Name()); Print("TimeUTC() : ", tz.TimeUTC()); Print("TimeLocal() : ", tz.TimeLocal()); Print("ToString() : ", tz.ToString()); //--- dalla classe Print("BeginLocalTime() : ", tz.BeginLocalTime()); Print("EndLocalTime() : ", tz.EndLocalTime()); Print("CheckLocalSession() : ", tz.CheckLocalSession()); Print("SecRemainingSession() : ", tz.SecRemainingSession()); Print("SecondsToString() : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));
uscita:
// ========== Lavorare con gli oggetti CSessionHours ========== // Name() : Sydney // TimeUTC() : 2024.02.28 10:58:50 // TimeLocal() : 2024.02.28 21:58:50 // ToString() : Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // BeginLocalTime() : 2024.02.28 08:00:00 // EndLocalTime() : 2024.02.28 17:00:00 // CheckLocalSession() : false // SecRemainingSession() : 0 // SecondsToString() : 00:00:00
Orario della sessione locale
CSessionHours offre più funzionalità con meno codice. Vediamo un esempio per mostrare come ottenere le ore della sessione Forex in tutti i fusi orari utilizzando la classe CSessionHours e convertirle nell'ora del broker. Si noti che la conversione nell'ora del broker è una fase facoltativa e non è necessaria per controllare gli orari di inizio e fine di ogni sessione.
Print("\n======= Local Session Hours (CSessionHours Class) ======="); const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK}; for(int i = 0; i < ArraySize(ids); i++) { ENUM_ZONE_ID id = ids[i]; CSessionHours tz(id); tz.RefreshTime(); //--- l'orario di sessione predefinito è impostato sulle 8:00-17:00 ora locale datetime beginlocal = tz.BeginLocalTime(); datetime endlocal = tz.EndLocalTime(); //--- conversione in tempo del broker datetime beginbroker = CTimeZoneInfo::ConvertTimeForPlace(beginlocal, id, ZONE_ID_BROKER); datetime endbroker = CTimeZoneInfo::ConvertTimeForPlace(endlocal, id, ZONE_ID_BROKER); string state_str = tz.CheckLocalSession() ? "open, ends in " + CSessionHours::SecondsToString(tz.SecRemainingSession()) : "closed"; PrintFormat("%-12s: %s | %s [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str); } Print("-----------------------------------"); Print("broker time : ", TimeTradeServer()); Print("broker time : ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER)); Print("Fx close : ", CTimeZoneInfo::FormatTimeForPlace(CSessionHours::ForexCloseTime(), ZONE_ID_BROKER)); int sec = CSessionHours::SecRemainingForex(); Print("closes in : ", sec, " sec = ", CSessionHours::SecondsToString(sec));
uscita:
// ======= Ore di sessione locali (classe CSessionHours) ======= // Sydney : Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [sessione chiusa] // Tokyo : Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [sessione chiusa] // Francoforte : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [sessione aperta, termina in 02:27:29] // Londra : Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [sessione aperta, termina in 03:27:29] // New York : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [sessione aperta, termina alle 08:27:29] // ----------------------------------- // ora del broker : 2024.02.28 15:32:30 // ora del broker : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5] // Chiusura Fx : Sat, 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5] // chiude in : 203249 sec = 2d 08:27:29
Come sovrascrivere l'orario predefinito della sessione locale?
Vediamo un esempio per mostrare come si possono sovrascrivere le ore di sessione predefinite nella classe CSessionHours .
Print("\n=========== Override the default session hours ==========="); CSessionHours frankfurt(ZONE_ID_FRANKFURT); // modificare i tempi di sessione predefiniti frankfurt.BeginLocalTime(9, 0); frankfurt.EndLocalTime(19, 0); frankfurt.RefreshTime(); // popola le ore della nuova sessione datetime beginlocal = frankfurt.BeginLocalTime(); datetime endlocal = frankfurt.EndLocalTime(); PrintFormat("new session hours : %s | %s", CTimeZoneInfo::FormatTimeForPlace(beginlocal, ZONE_ID_FRANKFURT), CTimeZoneInfo::FormatTimeForPlace(endlocal, ZONE_ID_FRANKFURT)); PrintFormat("current local time : %s", frankfurt.ToString());
output:
// =========== Sovrascrivere le ore di sessione predefinite =========== // nuove ore di sessione : Mer, 2024.02.28 09:00:00 GMT+1 [Francoforte] | Mer, 2024.02.28 19:00:00 GMT+1 [Francoforte] // ora locale attuale : Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]
Come verificare la chiusura delle posizioni nel fine settimana?
Il metodo statico SecRemainingForex() restituisce il tempo rimanente in secondi fino alla chiusura del mercato Forex per questa settimana. Questo metodo deve essere richiamato dal gestore dell'evento OnTick()(o meglio da OnTimer() nel caso in cui non ci siano tick prima del fine settimana) per verificare ripetutamente la condizione di chiusura. Vediamo un esempio per mostrare come controllare le posizioni di chiusura nel fine settimana.
Print("\n======= Check For Closing Positions at Weekend ======="); int InpHours = 2; // Ore prima del weekend int InpMinutes = 30; // Minuti prima del weekend int sec = CSessionHours::SecRemainingForex(); PrintFormat("Time remaining till the weekend : %s", CSessionHours::SecondsToString(sec)); PrintFormat("Close all if remaining time becomes %s or less.", CSessionHours::SecondsToString(InpHours * 3600 + InpMinutes * 60)); // verifica che il tempo rimanente abbia raggiunto l'obiettivo if(sec <= InpHours * 3600 + InpMinutes * 60) { // CloseAll(); }
In alternativa, la condizione precedente può essere verificata utilizzando i tempi assoluti:
// verifica che il tempo del broker abbia raggiunto il target if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60)) { // CloseAll(); }
uscita:
// ======= Controlla le posizioni in chiusura nel fine settimana ======= // Tempo rimanente fino al fine settimana : 3d 03:32:27 // Chiudere tutto se il tempo rimanente diventa 02:30:00 o meno.
Fine della settimana - Fuso orario del broker e orario DST
Il mercato Forex apre la domenica alle 17:00 ora di New York (GMT-5 in inverno e GMT-4 in estate) e chiude il venerdì alla stessa ora. L'orario di apertura a New York corrisponde alla domenica alle 22:00 UTC in inverno (e alla domenica alle 21:00 UTC in estate). Il Forex chiude venerdì alle 22:00 UTC in inverno (e alle 21:00 UTC in estate). Il mercato spot dell'oro e dell'argento inizia solitamente un'ora dopo. link
Ogni broker forex ha il suo fuso orario e l'orario del server. Pertanto, l'inizio della settimana di trading (candele H1) varia da un broker all'altro e può variare dadom, 02:00 PM ora del server per i broker di San Francisco (GMT-8), fino alun, 09:00 AM ora del server per i broker di Sydney (GMT+11). Anche la fine della settimana di trading varia daven, ore 14:00 ora del server, asab, ore 09:00 ora del server.
Ogni broker è libero di scegliere l'ora legale (DST). E la DST non è necessariamente la stessa per quel fuso orario. A volte si mescolano utilizzando un fuso orario dell'UE e un DST degli Stati Uniti invece del DST dell'UE. Per i broker che non seguono l'orario statunitense, l'orario del server per l'inizio (e la fine) della settimana varia di +/- un'ora per lo stesso broker nel corso dell'anno. Il metodo ForexCloseTime() gestisce queste variazioni tra e all'interno del broker convertendo l'orario di chiusura a NYC alle 17:00 di venerdì nell'orario del broker, tenendo conto degli sfalsamenti temporali e della DST, fornendo così risultati accurati.
L'utilizzo di un fuso orario di +2 (e +3 in estate sull'orario statunitense) significa quindi che ci sono cinque candele D1 a settimana. Non ci sono candele il sabato e la domenica durante tutto l'anno. Semplicemente, l 'ora su questi server è sempre 7 ore avanti rispetto a New York e viene rappresentata come NY+7. Questa è di gran lunga l'impostazione più comune, ma esistono molte varianti meno comuni.
Esempio di indicatore TestIndi.mq5

iForexSessions - indicatore per MetaTrader 5
Evidenzia le sessioni del mercato Forex
Acquistatelo qui https://www.mql5.com/it/code/48842
Collegamenti
Orologio mondiale: https: //www.timeanddate.com/worldclock/
Convertitore di fuso orario: https: //www.timeanddate.com/worldclock/converter-classic.html
Aggiornamenti:
2024.03.01 - v.1.40 : Rimosso il codice ridondante nella classe CTimeZoneInfo (usata durante i test), aggiunti altri metodi alla classe CSessionHours, aggiornato TestIndi.mq5 per riflettere le nuove modifiche.
2024.03.03 - v.1.45 : Aggiornato il codice di esempio per "Lavorare con gli orari delle sessioni locali - Classe CTimeZoneInfo".
2024.03.08 - v.1.50 : Aggiunti due metodi interni HistoryBrokerOffset e FirstBarOfWeek alla classe CTimeZoneInfo. Gestione dell'ora del server nel passato (offset UTC, formattazione del testo, conversioni, ecc.).
2024.03.15 - v.1.56 : Aggiunto lo script "SydneySession_Script.mq5" per mostrare la fluttuazione delle ore di sessione a Sydney nel corso dell'anno.
2024.03.30 - v.1.65 : Corretto l'offset GMT del broker. Attualmente, la libreria analizza le barre H1 solo sul grafico GOLD, che ha gli orari di inizio più precisi su tutti i broker che ho testato.
2024.04.01 - v.1.67 : Corretto un potenziale problema nel calcolo dell'offset GMT del broker durante la prima ora della settimana di trading.
2024.04.03 - v.1.70 : memorizzazione nella cache degli offset GMT dei broker in una mappa hash per un recupero più rapido (ad esempio, dagli indicatori). La cache degli offset dei broker conterrà una voce per ogni settimana di trading.
2024.04.08 - v.1.72 : Migliorate le prestazioni della libreria di almeno 2-3 volte. Ora si utilizza StructToTime invece di StringToTime nel metodo GetNthSunday.
2024.04.09 - v.1.75 : Risolto un potenziale problema nel calcolo dell'offset GMT del broker durante le vacanze di Natale sui broker GMT+0.
2024.04.11 - v.1.77 : Velocizzazione del metodo GetDaylightSwitchTimes. Ora si utilizza un array statico per memorizzare gli orari di commutazione per l'anno corrente.
2024.04.12 - v.1.80 : Corretto un problema nel calcolo dell'offset GMT del broker sui broker che non forniscono il trading in oro.
2024.04.15 - v.1.82 : Aggiunto il metodo SetCustomTimeZone alla classe CTimeZoneInfo, che può essere utilizzato per configurare il fuso orario personalizzato integrato con un nome, un offset GMT e un identificatore DST specificati. È possibile accedere al fuso orario personalizzato tramite ZONE_ID_CUSTOM.
2024.04.16 - v.1.85 : Sostituito il metodo interno GetNthSunday con il metodo più ottimizzato GetMonthTime.
2024.04.17 - v.1.87 : Sostituito il metodo interno TimeYear con il metodo GetYear, più ottimizzato.
2024.04.18 - v.1.88 : Aggiunto il metodo interno CreateDateTime per costruire i valori datetime dai componenti della data (anno, mese e giorno). Questo metodo è 100-120 volte più veloce della funzione StructToTime.
2024.10.22 - v.1.93 : Determinazione più rapida dell'offset GMT del server durante il fine settimana nel trading live.
2024.10.26 - v.1.95 : Aggiunti due nuovi metodi statici: TimeGMTOffset() e TimeDaylightSavings(). Rinominato il metodo HistoryBrokerOffset() in TimeServerGMTOffset().
2024.10.28 - v.1.97 : Convertite tutte le macro che trattano il tempo in funzioni per evitare la doppia valutazione dei parametri all'interno del corpo della macro. Maggiore pulizia del codice in altre righe.
2024.10.30 - v.1.98 : Corretto il problema della stima errata dell'offset GMT dalle quotazioni XAUEUR su alcuni broker.
2024.11.01 - v.1.99 : Aggiunta un'opzione per disattivare il caricamento predefinito del simbolo Gold per la stima del TZ/DST del server. Richiamare CTimeZoneInfo:: SetUsingGoldSymbol() con 'false' per utilizzare invece il simbolo del grafico corrente.
2024.11.13 - v.2.00 : Miglioramento della stima di tz/dst del server online e della strategia (la libreria TimeGMT non è più necessaria). Il costruttore accetta parametri di luogo e tempo. Nuovi metodi pubblici per lavorare con dati di tipo datetime. Migliorata la gestione degli errori e il supporto al debug.
2024.11.14 - v.2.02 : Corretto l'errore ERR_HISTORY_NOT_FOUND (4401) quando si cerca di accedere alla cronologia delle quotazioni di XAUUSD,H1 tramite l'oggetto timezone del server.
2024.11.17 - v.2.03 : Correzione di bug minori.
2024.11.23 - v.2.04 : miglioramenti minori e correzioni di bug.
2024.12.05 - v.2.05 : Aggiunto nuovo metodo statico DaylightSavingsSupported(placeId).
2024.12.12 - v.2.10 : Migliorate le prestazioni delle funzioni HistoryServerGMTOffset() e HistoryServerDaylightSavings() e altre modifiche minori al codice.
2024.12.14 - v.2.11 : Migliorate le prestazioni della funzione FindSymbol().
2024.12.17 - v.2.12 : Ulteriore ottimizzazione delle funzioni HistoryServerGMTOffset() e HistoryServerDaylightSavings().
2024.12.24 - v.2.13 : Risolto un potenziale problema nelle funzioni HistoryServerGMTOffset() e HistoryServerDaylightSavings().
2025.01.12 - v.2.15 : Corretto il problema nella funzione HistoryServerDaylightSavings() della ricerca della cronologia delle quotazioni precedente a quella caricata nel tester della strategia.
2025.10.13 - v.2.17 : Miglioramenti minori e correzioni di bug.
Tradotto dall’inglese da MetaQuotes Ltd.
Codice originale https://www.mql5.com/en/code/48419
CVD (Cumulative Volume Delta)
Leggero CVD (Cumulative Volume Delta) per MT5 - basato su M1, mostra la pressione di acquisto/vendita come candele con reset opzionale.
CFastFile - classe per lavorare con array di byte come file
La classe CFastFile elimina la necessità di scrivere i dati in un file fisico sul disco. Ciò consente di ottenere una notevole accelerazione nel lavoro con i dati.
MA-Env
Inviluppi di medie mobili.
Funzioni statistiche statistics.mqh
Una libreria che contiene funzioni statistiche come il calcolo della media, della varianza, della skewness, dell'eccesso, della covarianza, della correlazione, ecc.
