Guarda come scaricare robot di trading gratuitamente
Ci trovi su Telegram!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Librerie

TimeGMT library for the strategy tester - libreria per MetaTrader 5

Visualizzazioni:
23
Valutazioni:
(16)
Pubblicato:
Freelance MQL5 Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance

Funzione TimeGMT()

Restituisce il GMT, calcolato tenendo conto del cambio DST dall'ora locale del computer in cui è in esecuzione il terminale client. Esistono 2 varianti della funzione.

Chiamata senza parametri

datetime  TimeGMT();

Chiamata con parametro di tipo MqlDateTime

datetime  TimeGMT(
   MqlDateTime&  dt_struct      // Variabile di tipo struttura
   );

Tuttavia, durante i test nel tester della strategia,TimeGMT() è sempre uguale all'ora simulata del server di TimeTradeServer().



Libreria TimeGMT

Questa libreria corregge la funzione TimeGMT() in modo da fornire il vero GMT durante i test nel tester della strategia. La libreria installerà ganci API globali (tramite sostituzione di macro) per le due versioni di TimeGMT.

class CTimeGMT
  {
public:
   static datetime   TimeGMT(void);
   static datetime   TimeGMT(MqlDateTime &dt_struct);
  }

Utilizzo:

Prima di testare un expert advisor che utilizza il filtro News o qualsiasi restrizione temporale nello strategy tester, è sufficiente includere questa riga all'inizio del codice, quindi ricompilare il sorgente in MetaEditor.

#include "TimeGMT.mqh"

- Opzionalmente, per visualizzare i messaggi di debug, aggiungete questa riga prima della direttiva #include:

#define  PRINT_GMT_DETAILS

Non sono necessarie altre modifiche o chiamate di funzione per l'expert advisor o l'indicatore.

  • TimeGMT viene corretto solo se viene rilevato il tester della strategia.
  • La correzione funziona sul simbolo selezionato nel tester della strategia.
  • Nessun errore di calcolo durante i fine settimana o le vacanze di Natale.
  • Basso overhead e tempi di calcolo rapidi nello strategy tester

Il ricalcolo del broker offset avviene solo all'avvio dell'expert advisor e ogni domenica e lunedì a mezzanotte. L'offset del broker calcolato viene memorizzato e utilizzato per le successive chiamate a TimeGMT.

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 l'uso del simbolo del grafico. Chiamate CTimeGMT::SetUsingGoldSymbol() con 'false' per usare 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 CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);

Nota:

Come effetto collaterale, XAUUSD inizia un'ora dopo il Forex, quindi il cambio di DST avverrà un'ora dopo nel tester della strategia.



TimeGMT_TestEA

Per esplorare la libreria nel tester di strategia, viene testato un expert advisor dimostrativo nel tester di strategia


Questi sono i risultati dell'esecuzione dell'expert advisor nello strategy tester:

AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating
AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs:
  timer_hours=24
2023.03.05 00:00:00   TimeCurrent() = Sun, 2023.03.05 00:00:00  | TimeTradeServer() = Sun, 2023.03.05 00:00:00  | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.06 00:00:00   TimeCurrent() = Mon, 2023.03.06 00:00:00  | TimeTradeServer() = Mon, 2023.03.06 00:00:00  | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.07 00:00:00   TimeCurrent() = Tue, 2023.03.07 00:00:00  | TimeTradeServer() = Tue, 2023.03.07 00:00:00  | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.08 00:00:00   TimeCurrent() = Wed, 2023.03.08 00:00:00  | TimeTradeServer() = Wed, 2023.03.08 00:00:00  | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.09 00:00:00   TimeCurrent() = Thu, 2023.03.09 00:00:00  | TimeTradeServer() = Thu, 2023.03.09 00:00:00  | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.10 00:00:00   TimeCurrent() = Fri, 2023.03.10 00:00:00  | TimeTradeServer() = Fri, 2023.03.10 00:00:00  | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.11 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sat, 2023.03.11 00:00:00  | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.12 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sun, 2023.03.12 00:00:00  | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.13 00:00:00   TimeCurrent() = Mon, 2023.03.13 00:00:00  | TimeTradeServer() = Mon, 2023.03.13 00:00:00  | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.14 00:00:00   TimeCurrent() = Tue, 2023.03.14 00:00:00  | TimeTradeServer() = Tue, 2023.03.14 00:00:00  | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.15 00:00:00   TimeCurrent() = Wed, 2023.03.15 00:00:00  | TimeTradeServer() = Wed, 2023.03.15 00:00:00  | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.16 00:00:00   TimeCurrent() = Thu, 2023.03.16 00:00:00  | TimeTradeServer() = Thu, 2023.03.16 00:00:00  | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.17 00:00:00   TimeCurrent() = Fri, 2023.03.17 00:00:00  | TimeTradeServer() = Fri, 2023.03.17 00:00:00  | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.18 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sat, 2023.03.18 00:00:00  | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.19 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sun, 2023.03.19 00:00:00  | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)


Aggiornamenti:

2024.03.30 - v.1.25 : 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.

2024.04.09 - v.1.33 : Risolto un potenziale problema nel calcolo dell'offset GMT del broker durante le vacanze di Natale sui broker GMT+0.

2024.04.12 - v.1.35 : Corretto un problema nel calcolo dell'offset GMT del broker su alcuni broker che non forniscono il trading di oro.

2024.07.07 - v.1.36 : Risolto un problema nel rilevamento corretto del simbolo ORO su alcuni broker.

2024.10.21 - v.1.40 : Migliorato il rilevamento del simbolo ORO con un ritorno al simbolo EURUSD.

2024.10.22 - v.1.45 : Determinazione più rapida dell'offset GMT del server durante il fine settimana nel tester della strategia....

2024.10.26 - v.1.47 : Aggiunta di una migliore gestione degli errori e del codice di debug. Rinominato il metodo HistoryBrokerOffset() in TimeServerGMTOffset().

2024.10.28 - v.1.49 : 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.50 : Risolto il problema della stima errata dell'offset GMT dalle quotazioni XAUEUR su alcuni broker.

2024.11.23 - v.1.55 : Aggiunta un'opzione per disattivare il caricamento predefinito del simbolo Gold per la stima del TZ/DST del server. Chiamare CTimeGMT::SetUsingGoldSymbol() con 'false' per utilizzare invece il simbolo del grafico corrente.

2024.12.12 - v.1.60 : Miglioramento delle prestazioni della funzione HistoryServerGMTOffset() e altre modifiche minori al codice.

2024.12.14 - v.1.61 : Migliorate le prestazioni della funzione FindSymbol().

2024.12.17 - v.1.62 : Ulteriore ottimizzazione della funzione HistoryServerGMTOffset().

2024.12.24 - v.1.63 : Risolto un potenziale problema nella funzione HistoryServerGMTOffset().



Fuso orario del Broker e orario DST

Il Tempo Medio di Greenwich (GMT), chiamato anche Tempo Universale Coordinato (UTC), è utilizzato come riferimento ufficiale del mondo per l'ora. Spesso si vedono fusi orari rappresentati come UTC - 3h o GMT - 3h. In questo esempio il (-3h) si riferisce al fatto che il fuso orario in questione è tre ore indietro rispetto all'UTC o al GMT. UTC+3h o GMT +3h indica che il fuso orario è tre ore avanti rispetto a UTC o GMT. La differenza di orario tra la nostra ora locale e il GMT (UTC) è chiamata offset GMT.

Il mercato Forex apre la domenica alle 17:00 ora di New York (GMT-5:00 in inverno e GMT-4:00 in estate) e chiude il venerdì alla stessa ora. L'orario di inizio del mercato Forex alle 17:00 di domenica a New York corrisponde alla domenica alle 22:00 UTC in inverno (e alla domenica alle 21:00 UTC in estate). Il mercato 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 serverper i broker di San Francisco (GMT-8), fino alun, 09:00 AM ora del serverper 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 durante l'anno. Per gestire queste variazioni, il ricalcolo dell'offset del broker deve essere effettuato su base settimanale, in modo da poter rilevare in tempo i cambiamenti della DST sul broker.

Utilizzando un fuso orario di +2 (e +3 in estate per gli Stati Uniti), le candele di ogni settimana iniziano a mezzanotte del lunedì, ci sono cinque candele D1 a settimana e l'inizio di una candela giornaliera (e H4) è l'inizio di un nuovo giorno FX. Ogni settimana termina poco prima della mezzanotte di sabato. Non ci sono candele il sabato e la domenica.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 ci sono molte varianti meno comuni.


Dettagli sul calcolo del vero GMT

Quando una chiamata a TimeGMT() viene intercettata dalla libreria, essa controlla innanzitutto che non sia in esecuzione nello strategy tester, quindi restituisce la funzione originale. Se il tester della strategia viene rilevato, il codice inizia a calcolare l'offset del broker (vedere più avanti), quindi il valore restituito è semplicemente il risultato della sottrazione di questo offset dall'ora corrente del server di trading nel terminale client.

true GMT  = TimeTradeServer() - ServerGMTOffset (of the current trading week)

Il'ServerGMTOffset' stesso può essere stimato, attraverso l'analisi dello storico delle quotazioni H1, come la differenza tra due tempi noti:

1) l'ora in cui la prima barra della settimana di trading appare sul grafico di GOLD (FstBarWk),

2) il corrispondente orario UTC per l'inizio delle contrattazioni dell'ORO a New York alle ore 18:00 di domenica .

ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)  

Il calcolo del BrokerOffset utilizza una modifica ottimizzata dell'algoritmo pubblicato da Carl Schreiber qui in Dealing with time (2).


Secondo https://www.timeanddate.com/time/change/usa/new-york

  • A New York, la DST inizia (ora legale) alle 02:00 ora locale della seconda domenica di marzo. L'orologio si sposta in avanti di un'ora su GMT-4, quindi l'ora UTC corrispondente per NY Sun, 18:00 è (Sun, 22:00 UTC).

  • Poiché la DST termina (ora invernale) a New York alle 02:00 ora locale della prima domenica di novembre, l'orologio si sposterà indietro di un'ora a GMT-5, quindi l'ora UTC corrispondente per NY Sun, 18:00 è (Sun, 23:00 UTC).

Ad esempio, se la settimana FstBarWk sul grafico GOLD inizia il lun, 01:00, e a New York è inverno in quella barra, il BrokerOffset può essere calcolato come segue:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)

e, se a New York è estate, il BrokerOffset:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)



Conversione dell'orario della sessione nell'orario del server del broker

I trader possono utilizzare TimeGMT() per convertire gli orari delle sessioni nell'orario del server corrispondente per determinare l'apertura o la chiusura di determinati mercati. Ad esempio, se un trader vuole operare nella sessione asiatica (Tokyo), deve regolare di conseguenza i propri orari di negoziazione.

1] Determinare l'offset del server di negoziazione del broker

int ServerGMTOffset = TimeTradeServer() - TimeGMT();

    2] Convertire gli orari locali di specifici mercati nell'orario del server del broker corrispondente.

    datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset

    Il secondo termine dell'equazione (xxx_GMTOffset) deve essere aumentato di +1 ora, se il fuso orario di destinazione è attualmente in ora legale.

    Durante i test nel tester della strategia, TimeGMT() è sempre uguale all'orario del server simulato di TimeTradeServer(), quindi la conversione dei tempi di sessione diventa errata. Questa libreria correggerà la funzione TimeGMT() in modo da fornire il vero GMT, quindi i tempi di sessione convertiti diventano accurati durante i test nel tester della strategia.


    Tradotto dall’inglese da MetaQuotes Ltd.
    Codice originale https://www.mql5.com/en/code/48291

    Simple Bar Timer Simple Bar Timer

    Si tratta di uno script che visualizza il tempo rimanente all'arrivo della prossima barra.

    Notizie VLine Notizie VLine

    Lo script visualizza linee verticali sul grafico in corrispondenza dei punti di rilascio delle notizie.

    MA mass cloud MA mass cloud

    Nuvole formate dalle masse di medie mobili di periodi diversi.

    Indicatore direzionale Multi-Williams Percent Range Indicatore direzionale Multi-Williams Percent Range

    Indicatore di direzione della tendenza Multi-Williams Percent Range.