Meridian Session Clock
- Bibliotecas
-
Syarief Azman Bin Rosli
¡Hola y bienvenido a mi perfil oficial en MQL5!
Soy Syarief Azman Bin Rosli, desarrollador de sistemas de trading algorítmico e ingeniero de software cuantitativo con más de una década de experiencia especializada en la creación de soluciones automatizadas para MetaTrader 5 y MetaTrader 4. - Versión: 1.0
- Activaciones: 5
Biblioteca de tiempo para MQL4: conversiones correctas con horario de verano entre UTC y 12 zonas horarias, un modelo del reloj del servidor de su bróker (detectado automáticamente desde el historial de precios), las sesiones de Sydney, Tokyo, London y New York más las suyas propias, con estado abierto, horas de inicio y fin y rango OHLC, el día de trading FX y el fin de semana. A diferencia de TimeGMT(), da las mismas respuestas en el Probador de estrategias que en real. Nunca opera, no dibuja y no escribe archivos. Usted recibe el archivo compilado Meridian_Session_Clock.ex4; esta página es la referencia completa de la API.
Inicio rápido
- Copie Meridian_Session_Clock.ex4 en MQL4/Libraries (Archivo > Abrir carpeta de datos).
- Pegue el bloque #import de abajo en su EA, indicador o script.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), o MSC_SetBroker(MSC_US_DST, 120) si conoce el reloj del servidor.
- Use horas del servidor (TimeCurrent(), Time[i]): MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Verificación: ejecute el ejemplo de abajo en el Probador de estrategias; el registro muestra el modelo detectado y el horario de London en cada barra.
Declaración de importación (lista para copiar)
#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 }; Conceptos
- Tres tipos de hora: utc; server (hora del servidor del bróker: TimeCurrent, horas de las barras); local (hora de reloj en una zona).
- Zonas 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (también Hong Kong, Shanghái), Tokyo, Sydney, Wellington, New York, Chicago. El horario de verano sigue la ley de cada zona desde 2000, incluidos los cambios de EE. UU. 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 y Moscow 2011 / 2014. Soportado 2000-2099; otras fechas se calculan con las mismas reglas y marcan -2.
- Una hora local saltada por el adelanto de primavera, o repetida por el atraso de otoño, se lee con el desfase vigente antes del cambio (New York 02:30 el día del cambio de marzo = 07:30 UTC; 01:30 el día de noviembre = 05:30 UTC, la primera vez).
- Reloj del bróker = UTC + desfase. Modelos: 0 FIXED (base todo el año), 1 US DST (base + 60 en el verano de EE. UU.: brókers "New York close", GMT+2 / GMT+3), 2 EU DST (base + 60 en el verano europeo). Por defecto 1 con base 120.
- Las sesiones se definen en la hora local de una zona, de lunes a viernes según el día de inicio: 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; ids propios 4-15. Una instancia va del inicio (incluido) al fin (excluido). index 0 = la última instancia que empezó en la hora dada o antes (abierta o terminada), -1 la anterior, +1 la siguiente; de -260 a 260.
Referencia de la API
Todas las funciones actualizan MSC_LastError. Ids de zona o sesión erróneos dan -1 y 0, false, "UNKNOWN" o -1.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
Desfase de la zona respecto a UTC en minutos en utc; si rige el horario de verano (Moscow 2011-2014, UTC+4 permanente, no es horario de verano); utc + desfase como hora local; hora local de vuelta a UTC con la regla anterior.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange y MSC_ZoneName
Primer cambio de desfase después de utc (en UTC), 0 si no hay ninguno en tres años (UTC, Dubai, Singapore, Tokyo, Moscow después de 2014). Nombre de una zona, como en la lista de arriba.
MSC_SetBroker
model 0-2, base_minutes de -720 a 840 en pasos de 15. En otro caso false y -1.
MSC_DetectBroker
Lee la primera barra H1 tras cada hueco de fin de semana (36 horas o más) de symbol ("" = símbolo del gráfico), de la más reciente hacia atrás, hasta weeks (4-520, 0 = 104). El mercado FX abre el domingo a las 17:00 de New York, así que cada semana da un desfase; gana el modelo y la base que encajan en más semanas (empates: US DST, luego EU DST, luego FIXED). Devuelve el modelo y lo aplica si encaja en al menos el 60 % de las semanas; si no, -1 con -5 NOT DETECTED (base_minutes y confidence se rellenan igualmente). -3 NO DATA sin historial H1. Use un par FX principal 24/5: metales e índices abren más tarde el domingo y dan una hora de más (XAUUSD dio base 180 en vez de 120 en las pruebas). Use 52 semanas o más para incluir cambios de horario; las semanas festivas bajan la confianza. En el Probador de estrategias solo se ve el historial cargado por el probador (weeks_used indica cuántas semanas se leyeron).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
Desfase del servidor en minutos en utc; hora del servidor a UTC (regla anterior para la hora alrededor de un cambio); UTC a hora del servidor.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Añade una sesión: zone, inicio y fin en minutos tras la medianoche local (0-1439, distintos; fin menor que inicio = nocturna), days_mask de días de inicio (bit 0 domingo a bit 6 sábado, 62 = lunes-viernes, 1-127). Devuelve el id 4-15, o -1 con -1 o -4 SESSION LIMIT. MSC_SessionClear borra las sesiones propias (los ids se reutilizan desde 4). Nombres: 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
Si la instancia 0 contiene server_time; hora del servidor del inicio o del fin de la instancia index. 0 en caso de error.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
OHLC de la instancia index a partir de las barras de symbol ("" = gráfico) en timeframe (0 = gráfico; M1, M5, M15, M30 o H1) cuya hora de apertura cae dentro de la instancia. result[] recibe 7 valores: 0 apertura, 1 máximo, 2 mínimo, 3 cierre, 4 hora de la primera barra en el máximo, 5 hora de la primera barra en el mínimo, 6 barras. Devuelve el número de barras; 0 con -3 NO DATA si ninguna barra cae dentro; -1 si timeframe, sesión o index son erróneos. Una instancia en curso usa las barras hasta ahora.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart y MSC_IsWeekend
Hora del servidor de las últimas 17:00 de New York en server_time o antes (inicio del día FX). Fin de semana = viernes 17:00 a domingo 17:00 de New York.
MSC_LastError y MSC_ErrorText
Código de la última llamada; texto: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, en otro caso UNKNOWN.
Ejemplo de integración funcional
Un Expert Advisor; pegue antes el bloque de importación y las líneas enum de arriba.
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));
} Arquitectura y notas
- Cálculo puro: las reglas se calculan, no se consultan, así que nada se descarga. El modelo del bróker y la tabla de sesiones se guardan por cada programa que importa la biblioteca.
- MetaTrader 4, cualquier símbolo y marco temporal; EAs, indicadores, scripts. Seguro en el Probador de estrategias y la optimización: sin DLL, archivos, peticiones web, objetos gráficos, temporizadores ni variables globales. Solo MSC_DetectBroker y MSC_SessionRange leen barras.
- Límites: 16 sesiones (4 incorporadas), index de instancia de -260 a 260, años 2000-2099.
- Configuraciones típicas. Filtro de sesión: operar solo mientras MSC_SessionIsOpen(MSC_LONDON_SESSION, now). Ruptura del rango asiático: MSC_SessionRange de MSC_TOKYO_SESSION, index 0, en la apertura de London (Tokyo sigue abierta entonces). Lógica diaria: reiniciar en MSC_TradingDayStart. Backtests: llamar a MSC_DetectBroker o MSC_SetBroker en OnInit, nunca TimeGMT().
- Las capturas y el vídeo muestran un EA de demostración construido con esta biblioteca; no forma parte de la compra.
Aviso de riesgo
Los horarios de sesión describen cuándo suelen estar activos los mercados, no cómo se moverán los precios. Revise el calendario de festivos de su bróker; pruebe primero en una cuenta demo.
