Meridian Session Clock
- librerie
-
Syarief Azman Bin Rosli
Ciao e benvenuto sul mio profilo ufficiale MQL5!
Sono Syarief Azman Bin Rosli, sviluppatore di sistemi di trading algoritmico e ingegnere software quantitativo con oltre dieci anni di esperienza nello sviluppo di soluzioni automatizzate per MetaTrader 5 e MetaTrader 4. - Versione: 1.0
- Attivazioni: 5
Libreria del tempo per MQL4: conversioni corrette con l'ora legale tra UTC e 12 fusi orari, un modello dell'orologio del server del vostro broker (rilevato automaticamente dallo storico dei prezzi), le sessioni di Sydney, Tokyo, London e New York più le vostre, con stato aperto, orari di inizio e fine e range OHLC, il giorno di trading FX e il fine settimana. A differenza di TimeGMT(), dà gli stessi risultati nel Tester strategie e dal vivo. Non opera mai, non disegna e non scrive file. Ricevete il file compilato Meridian_Session_Clock.ex4; questa pagina è il riferimento completo dell'API.
Avvio rapido
- Copiate Meridian_Session_Clock.ex4 in MQL4/Libraries (File > Apri cartella dati).
- Incollate il blocco #import qui sotto nel vostro EA, indicatore o script.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), oppure MSC_SetBroker(MSC_US_DST, 120) se conoscete l'orologio del server.
- Usate orari del server (TimeCurrent(), Time[i]): MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Verifica: eseguite l'esempio qui sotto nel Tester strategie; il log mostra il modello rilevato e gli orari di London a ogni barra.
Dichiarazione di import (pronta da copiare)
#import "Meridian_Session_Clock.ex4"
int MSC_ZoneOffset(int zone, datetime utc);
bool MSC_IsDST(int zone, datetime utc);
datetime MSC_ToZone(datetime utc, int zone);
datetime MSC_FromZone(datetime local, int zone);
datetime MSC_NextChange(int zone, datetime utc);
string MSC_ZoneName(int zone);
bool MSC_SetBroker(int model, int base_minutes);
int MSC_DetectBroker(string symbol, int weeks, int &base_minutes, double &confidence, int &weeks_used);
int MSC_BrokerOffset(datetime utc);
datetime MSC_ServerToUTC(datetime server_time);
datetime MSC_UTCToServer(datetime utc);
int MSC_SessionAdd(int zone, int start_minute, int end_minute, int days_mask);
void MSC_SessionClear();
string MSC_SessionName(int session);
bool MSC_SessionIsOpen(int session, datetime server_time);
datetime MSC_SessionStart(int session, datetime server_time, int index);
datetime MSC_SessionEnd(int session, datetime server_time, int index);
int MSC_SessionRange(string symbol, int timeframe, int session, datetime server_time, int index, double &result[]);
datetime MSC_TradingDayStart(datetime server_time);
bool MSC_IsWeekend(datetime server_time);
int MSC_LastError();
string MSC_ErrorText(int code);
#import
enum MSC_ZONE { MSC_UTC, MSC_LONDON, MSC_FRANKFURT, MSC_ATHENS, MSC_MOSCOW, MSC_DUBAI, MSC_SINGAPORE, MSC_TOKYO,
MSC_SYDNEY, MSC_WELLINGTON, MSC_NEW_YORK, MSC_CHICAGO };
enum MSC_MODEL { MSC_FIXED, MSC_US_DST, MSC_EU_DST };
enum MSC_SESSION { MSC_SYDNEY_SESSION, MSC_TOKYO_SESSION, MSC_LONDON_SESSION, MSC_NEW_YORK_SESSION }; Concetti
- Tre tipi di orario: utc; server (orario del server del broker: TimeCurrent, orari delle barre); local (ora dell'orologio in un fuso).
- Fusi 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (anche Hong Kong, Shanghai), Tokyo, Sydney, Wellington, New York, Chicago. L'ora legale segue la legge di ogni fuso dal 2000, compresi i cambi USA 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 e Moscow 2011 / 2014. Intervallo supportato 2000-2099; altre date sono calcolate con le stesse regole e segnalano -2.
- Un orario locale saltato dal passaggio all'ora legale, o ripetuto dal ritorno all'ora solare, viene letto con lo scostamento in vigore prima del cambio (New York 02:30 nel giorno del cambio di marzo = 07:30 UTC; 01:30 nel giorno di novembre = 05:30 UTC, la prima occorrenza).
- Orologio del broker = UTC + scostamento. Modelli: 0 FIXED (base tutto l'anno), 1 US DST (base + 60 nell'estate USA: broker "New York close", GMT+2 / GMT+3), 2 EU DST (base + 60 nell'estate europea). Predefinito 1 con base 120.
- Le sessioni sono definite nell'ora locale di un fuso, dal lunedì al venerdì secondo il giorno di inizio: 0 SYDNEY 07:00-16:00 Sydney, 1 TOKYO 09:00-18:00 Tokyo, 2 LONDON 08:00-17:00 London, 3 NEW YORK 08:00-17:00 New York; id personalizzati 4-15. Un'istanza va dall'inizio (incluso) alla fine (esclusa). index 0 = l'ultima istanza iniziata all'orario dato o prima (aperta o conclusa), -1 la precedente, +1 la successiva; da -260 a 260.
Riferimento API
Tutte le funzioni aggiornano MSC_LastError. Id di fuso o di sessione errati danno -1 e 0, false, "UNKNOWN" o -1.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
Scostamento del fuso da UTC in minuti a utc; se è in vigore l'ora legale (Moscow 2011-2014, UTC+4 permanente, non è ora legale); utc + scostamento come ora locale; ora locale riportata in UTC con la regola sopra.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange e MSC_ZoneName
Primo cambio di scostamento dopo utc (in UTC), 0 se non ce n'è nessuno entro tre anni (UTC, Dubai, Singapore, Tokyo, Moscow dopo il 2014). Nome di un fuso, come nell'elenco sopra.
MSC_SetBroker
model 0-2, base_minutes da -720 a 840 a passi di 15. Altrimenti false e -1.
MSC_DetectBroker
Legge la prima barra H1 dopo ogni buco del fine settimana (36 ore o più) di symbol ("" = simbolo del grafico), dalla più recente indietro, fino a weeks (4-520, 0 = 104). Il mercato FX apre la domenica alle 17:00 di New York, quindi ogni settimana dà uno scostamento; vincono il modello e la base che si adattano al maggior numero di settimane (parità: US DST, poi EU DST, poi FIXED). Restituisce il modello e lo applica se si adatta ad almeno il 60% delle settimane; altrimenti -1 con -5 NOT DETECTED (base_minutes e confidence sono comunque compilati). -3 NO DATA senza storico H1. Usate una coppia FX principale 24/5: metalli e indici aprono più tardi la domenica e leggono un'ora in più (XAUUSD ha dato base 180 invece di 120 nei test). Usate 52 settimane o più per includere i cambi d'ora; le settimane festive abbassano la confidenza. Nel Tester strategie è visibile solo lo storico caricato dal tester (weeks_used indica quante settimane sono state lette).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
Scostamento del server in minuti a utc; orario del server in UTC (regola sopra per l'ora attorno a un cambio); UTC in orario del server.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Aggiunge una sessione: zone, inizio e fine in minuti dopo la mezzanotte locale (0-1439, diversi; fine minore dell'inizio = notturna), days_mask dei giorni di inizio (bit 0 domenica fino a bit 6 sabato, 62 = lunedì-venerdì, 1-127). Restituisce l'id 4-15, oppure -1 con -1 o -4 SESSION LIMIT. MSC_SessionClear elimina le sessioni personalizzate (gli id vengono riutilizzati da 4). Nomi: SYDNEY, TOKYO, LONDON, NEW YORK, CUSTOM n.
int fra = MSC_SessionAdd(MSC_FRANKFURT, 7 * 60, 15 * 60 + 30, 62); // 07:00-15:30 Frankfurt
MSC_SessionIsOpen, MSC_SessionStart, MSC_SessionEnd
Se l'istanza 0 contiene server_time; orario del server di inizio o fine dell'istanza index. 0 in caso di errore.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
OHLC dell'istanza index dalle barre di symbol ("" = grafico) su timeframe (0 = grafico; M1, M5, M15, M30 o H1) il cui orario di apertura cade nell'istanza. result[] riceve 7 valori: 0 apertura, 1 massimo, 2 minimo, 3 chiusura, 4 orario della prima barra al massimo, 5 orario della prima barra al minimo, 6 barre. Restituisce il numero di barre; 0 con -3 NO DATA se nessuna barra cade dentro; -1 per timeframe, sessione o index errati. Un'istanza in corso usa le barre finora.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart e MSC_IsWeekend
Orario del server delle ultime 17:00 di New York a server_time o prima (inizio del giorno FX). Fine settimana = venerdì 17:00 fino a domenica 17:00 di New York.
MSC_LastError e MSC_ErrorText
Codice dell'ultima chiamata; testo: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, altrimenti UNKNOWN.
Esempio di integrazione funzionante
Un Expert Advisor; incollate prima il blocco di import e le righe enum qui sopra.
datetime last = 0;
int OnInit()
{
int base, used; double conf;
int m = MSC_DetectBroker("EURUSD", 104, base, conf, used);
if(m < 0) MSC_SetBroker(MSC_US_DST, 120);
PrintFormat("model %d base %d conf %.2f weeks %d: %s", m, base, conf, used, MSC_ErrorText(MSC_LastError()));
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(Time[0] == last) return;
last = Time[0];
datetime now = TimeCurrent();
PrintFormat("London %s - %s server, open %d, FX day since %s, weekend %d",
TimeToString(MSC_SessionStart(MSC_LONDON_SESSION, now, 0)), TimeToString(MSC_SessionEnd(MSC_LONDON_SESSION, now, 0)),
MSC_SessionIsOpen(MSC_LONDON_SESSION, now), TimeToString(MSC_TradingDayStart(now)), MSC_IsWeekend(now));
} Architettura e note
- Calcolo puro: le regole sono calcolate, non consultate, quindi non si scarica nulla. Il modello del broker e la tabella delle sessioni sono conservati per ogni programma che importa la libreria.
- MetaTrader 4, qualsiasi simbolo e timeframe; EA, indicatori, script. Sicura nel Tester strategie e nell'ottimizzazione: niente DLL, file, richieste web, oggetti grafici, timer o variabili globali. Solo MSC_DetectBroker e MSC_SessionRange leggono barre.
- Limiti: 16 sessioni (4 integrate), index di istanza da -260 a 260, anni 2000-2099.
- Configurazioni tipiche. Filtro di sessione: operare solo mentre MSC_SessionIsOpen(MSC_LONDON_SESSION, now). Breakout del range asiatico: MSC_SessionRange di MSC_TOKYO_SESSION, index 0, all'apertura di London (Tokyo è ancora aperta). Logica giornaliera: azzerare a MSC_TradingDayStart. Backtest: chiamare MSC_DetectBroker o MSC_SetBroker in OnInit, mai TimeGMT().
- Gli screenshot e il video mostrano un EA dimostrativo costruito con questa libreria; non fa parte dell'acquisto.
Avviso sui rischi
Gli orari delle sessioni descrivono quando i mercati sono di solito attivi, non come si muoveranno i prezzi. Controllate il calendario festivo del vostro broker; provate prima su un conto demo.
