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
Visualizzazioni:
37
Valutazioni:
(6)
Pubblicato:
\MQL5\Include\MQL5Book\
PRTF.mqh (1.49 KB) visualizza
Freelance MQL5 Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance

Questo script introduce la funzione TimeServerDaylightSavings() che manca tra quelle integrate, che forniscono solo TimeDaylightSavings() per il computer locale. Inoltre, l'header mqh-file allegato include alcune altre utili funzioni legate all'ora del server, in particolare per sapere se il broker utilizza gli interruttori DST in generale.

Tutto questo si basa sull'analisi empirica della storia delle quotazioni del vostro broker. L'intera idea è descritta nel libro di algotrading nella sezione dedicata all'ora legale (DST). In breve, il metodo analizza le statistiche degli orari di apertura della settimana e deduce gli offset GMT del vostro broker. Due massimi distinti nelle statistiche degli offset, se corrispondono a ore adiacenti, molto probabilmente corrispondono all'ora solare ("inverno") e all'ora legale ("estate").

In realtà questo script è una versione raffinata ed estesa dello script presentato nel libro. In particolare, le versioni a partire da ottobre 2024 includono un'importante correzione di un bug: le ore di apertura delle contrattazioni settimanali sono rilevate dal mercato statunitense, che a sua volta è influenzato dalle commutazioni DST in base al fuso orario degli Stati Uniti (EST, UTC-5, ora invernale standard <--> EDT, UTC-4, ora estiva legale); per questo motivo è importante eliminare l'effetto del DST statunitense per ottenere un flusso temporale naturale continuo tutto l'anno - questo è ciò che è stato fatto nella correzione. Tutto il merito va ad amrali.

Esempio di variazione dell'ora di apertura della settimana nelle quotazioni a causa del cambio DST


Si noti che nell'emisfero settentrionale e in quello meridionale i fusi orari sono regolati in senso opposto: nell'emisfero settentrionale viene aggiunta un'ora in "primavera" (marzo o aprile) e sottratta in "autunno" (ottobre o novembre), mentre nell'emisfero meridionale avviene il contrario (perché hanno tutte le stagioni scambiate).

A causa della specificità dell'analisi, si raccomanda di eseguire il codice per il ticker Forex più liquido, che di solito è EURUSD.

Ecco l'API:

// Informazioni sul fuso orario del server e sul DST attuale
struct ServerTimeZone  // secondo l'analisi storica degli orari di apertura settimanale
{
   int offsetGMT;      // sfasamento del fuso orario in secondi rispetto a UTC/GMT per la settimana corrente
   int offsetDST;      // Correzione DST in secondi (inclusa in offsetGMT, come da MQL5)
   bool supportDST;    // Le variazioni DST vengono rilevate nelle citazioni
};

// Stima del fuso orario del server e della modalità DST dalla cronologia delle quotazioni di H1
ServerTimeZone TimeServerZone(
  const datetime srvtime = 0,     // per impostazione predefinita, l'ora corrente, ma può specificare un momento nel passato
  const int threshold = THRESHOLD,
  const double lookupYears = 0.0, // per impostazione predefinita, tutte le barre disponibili, altrimenti 3 anni sembrano sufficienti
  const string symbol = NULL)     // per impostazione predefinita, simbolo del grafico corrente

// Stima dell'ora del server Correzione della modalità DST (in secondi)
int TimeServerDaylightSavings(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Stima dell'offset del fuso orario del server (in secondi)
int TimeServerGMTOffsetHistory(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Stima se il server è abilitato al DST (vero/falso)
bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Analogo della funzione TimeGMTOffset() per il server commerciale, differenza in secondi
int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer()

Le funzioni TimeServerDaylightSavings(), TimeServerGMTOffsetHistory(), TimeServerDaylightSavingsSupported() sono solo dei wrapper per TimeServerZone(), quindi se si ha bisogno di più di una caratteristica è preferibile usare quella successiva e leggere i valori dalla struct ServerTimeZone.

Tutte queste funzioni prendono come primo argomento l'ora del server alla quale si vuole ottenere la caratteristica corrispondente (nel presente o nel passato). Se l'ora del server è lasciata a 0 (per impostazione predefinita), il risultato viene restituito per il momento attuale.

La soglia del secondo argomento consente di regolare la sensibilità degli algoritmi. Per impostazione predefinita, è 52/4, ovvero un quarto di anno di statistiche necessarie per prendere una decisione (rilevamento del fuso orario senza la possibile interferenza di settimane brevi prima/dopo le vacanze). D'altra parte, questa impostazione impedisce il rilevamento tempestivo di cambi di fuso orario ad hoc (se il vostro broker decidesse di farlo a un certo punto). Si consiglia di impostare la soglia a 0 per consentire agli algoritmi di rilevare qualsiasi cambiamento il prima possibile.

La funzione TimeServerGMTOffset() non utilizza l'analisi della cronologia, ma calcola l'offset direttamente tramite le funzioni MQL5 (come TimeGMT() - TimeTradeServer()).

Si noti che questa funzione utilizza la stessa notazione di offset della funzione integrata TimeGMTOffset() di MQL5, ovvero i fusi orari positivi, come GMT+3, sono indicati da offset negativi, come -10800, e viceversa. Questa notazione è utilizzata da alcuni altri linguaggi di programmazione, come JaveScript, ma esistono anche altri linguaggi che indicano i fusi orari positivi con offset positivi e i fusi orari negativi con offset negativi. Controllare attentamente i propri algoritmi.

Lo script di test, ad esempio, riporta tutti i dati acquisiti nel log:

1 ~ Built-in functions ~
TimeLocal()=2024.10.05 00:39:01 / ok
TimeCurrent()=2024.10.05 00:38:59 / ok
TimeTradeServer()=2024.10.05 00:39:01 / ok
TimeGMT()=2024.10.04 21:39:01 / ok
TimeGMTOffset()=-10800 / ok
TimeDaylightSavings()=0 / ok
2 ~ Add-on over built-in functions ~
TimeServerGMTOffset()=-10800 / ok
3 ~ Estimation of server TZ with DST based on week opening hours in history ~
TimeServerDaylightSavings()=-3600 / ok
    [offsetGMT] [offsetDST] [supportDST]
[0]      -10800       -3600         true

In questo caso viene rilevato che il server è attualmente in modalità DST, mentre il computer locale non lo è.

Si ricorda che gli orologi di sistema del computer locale e del server possono normalmente mostrare orari leggermente diversi (secondi e persino minuti), anche se si trovano nello stesso fuso orario. Si noti anche che la funzione integrata TimeTradeServer() restituisce un datetime sintetico: è l'ora del server con precisione oraria, ma eredita le frazioni intra-orarie dall'orologio locale. Questo viene fatto in MQL5 per semplificare le conversioni tra i fusi orari - TimeLocal(), TimeGMT() restituiscono anche il "formato locale" e l'ora del server di trading.

È possibile abilitare la stampa dettagliata dei dati analizzati tramite una direttiva del preprocessore:

#define  PRINT_DST_DETAILS

che deve essere inserita nel codice prima dell'inclusione:

#include "TimeServerDST.mqh"

Ecco un esempio di dettagli nel log:

Got 20023 H1 bars, ~834 days
Week opening hours stats:
30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 83 54  0
Time Zone changes (UTC±X before/after weekstart):
            [weekstart]    [before] [DSTb] [after] [DSTa]
[0] 2021.07.25 00:00:00 -2147483648  false      -1  false
[1] 2021.11.08 00:00:00           0   true       0  false
[2] 2022.03.14 00:00:00           0  false       0   true
[3] 2022.11.07 00:00:00           0   true       0  false
[4] 2023.03.13 00:00:00           0  false       0   true
[5] 2023.11.06 00:00:00           0   true       0  false
[6] 2024.03.11 00:00:00           0  false       2  false
3 different timezones detected in quotes, 1 DST candidates
Server time offset: UTC+2 STD
TimeServerDaylightSavings()=-3600 / ok

Sentitevi liberi di eseguire lo script nei vostri ambienti e di pubblicare i log risultanti nella discussione.


Aggiornamenti

2024.10.10 - correzione di un bug: Gli interruttori DST degli Stati Uniti (che interferivano con le statistiche sugli orari di apertura) vengono eliminati dalla timeline prima dell'analisi principale.

2024.10.27 - l'ora di interesse del server e la soglia minima di statistiche settimanali sono state aggiunte come argomenti per tutte le funzioni; TimeServerGMTOffsetEmpiric() è stata rinominata in TimeServerGMTOffsetHistory().

2024.10.29 - piccolo bugfix per includere l'ora richiesta nel periodo di ricerca.

2024.10.30 - corretto il DST nell'array TimeZoneChange; la ricerca viene ora eseguita dal parametro srvtime, se specificato.

2024.11.01 - aggiunta una correzione automatica dei calcoli quando vengono applicati ai metalli preziosi, che può fornire risultati più affidabili nelle settimane in cui gli orari DST degli Stati Uniti e quelli dell'UE non sono sincronizzati.

2024.11.04 - perfezionato il rilevamento online dell'attivazione/disattivazione del DST.

2024.11.07 - aggiunta la memorizzazione nella cache dei cambiamenti di fuso orario/DST per le richieste di massa sulla cronologia degli indicatori o dei backtest degli eventi economici.

2024.11.08 - Ottimizzazione delle prestazioni della cache grazie a un piccolo refactoring del codice.

2024.11.16 - aggiustamento di 1 ora per i timestamp dedotti dai metalli da amrali.

2024.11.17 - refactoring e correzioni da parte di amrali: eliminate le ricostruzioni della cache per le richieste online durante i fine settimana, aggiunto lookahead di 48 ore per il rilevamento dei cambiamenti di TZ durante i fine settimana (con possibile transizione DST), la domenica 00:00 è usata come limite per i fusi orari (invece della prima barra della settimana).

2024.11.20 - la soglia predefinita è stata modificata a 1 (un equilibrio tra il rilevamento tempestivo dei cambi di fuso orario e l'eliminazione dei falsi positivi nelle settimane non standard, come quelle successive alle festività); è stata aggiunta una nuova serie di funzioni per la formattazione dell'ora, compresi gli offset dei fusi orari e la DST (consultare TimeZoneFmt.mqh); altri piccoli perfezionamenti.




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

Simplest Logger class for MetaTrader 5 Simplest Logger class for MetaTrader 5

La classe più semplice per il logging in MetaTrader 5 con supporto per i livelli, il formato dei messaggi, i filtri di inclusione ed esclusione delle sottostringhe.

Esplosione di Waddah Attar Esplosione di Waddah Attar

L'indicatore mostra quando il mercato inizia a muoversi più velocemente. Inoltre, indica al trader quando acquistare, vendere e uscire da un'operazione.

Martingale Pulse EA Martingale Pulse EA

Introducing MP by SPLpulse, a sophisticated and highly versatile Expert Advisor designed for the modern trader. Whether you are a scalper, a trend follower, or a reversal trader, MP by SPLpulse combines multiple trading strategies with an institutional-grade risk management suite to adapt to your unique trading style. Take control of your trading with unparalleled customization and powerful automation.

Linea StepMA Linea StepMA

Indicatore StepMA, progettato come una media mobile.