Meridian Session Clock
- Bibliotecas
-
Syarief Azman Bin Rosli
Olá e seja bem-vindo ao meu perfil oficial no MQL5!
Sou Syarief Azman Bin Rosli, desenvolvedor de sistemas de trading algorítmico e engenheiro de software quantitativo com mais de uma década de experiência especializada na criação de Expert Advisors para MetaTrader 5 e MetaTrader 4. - Versão: 1.0
- Ativações: 5
Biblioteca de tempo para MQL4: conversões corretas com horário de verão entre UTC e 12 fusos horários, um modelo do relógio do servidor da sua corretora (detectado automaticamente a partir do histórico de preços), as sessões de Sydney, Tokyo, London e New York mais as suas próprias, com estado aberto, horários de início e fim e faixa OHLC, o dia de trading FX e o fim de semana. Ao contrário de TimeGMT(), dá as mesmas respostas no Testador de estratégia e na conta real. Nunca opera, não desenha e não grava arquivos. Você recebe o arquivo compilado Meridian_Session_Clock.ex4; esta página é a referência completa da API.
Início rápido
- Copie Meridian_Session_Clock.ex4 para MQL4/Libraries (Arquivo > Abrir pasta de dados).
- Cole o bloco #import abaixo no seu EA, indicador ou script.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), ou MSC_SetBroker(MSC_US_DST, 120) se você conhece o relógio do servidor.
- Use horários do servidor (TimeCurrent(), Time[i]): MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Verificação: execute o exemplo abaixo no Testador de estratégia; o log mostra o modelo detectado e o horário de London a cada barra.
Declaração de importação (pronta 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 }; Conceitos
- Três tipos de horário: utc; server (horário do servidor da corretora: TimeCurrent, horários das barras); local (horário de relógio num fuso).
- Fusos 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (também Hong Kong, Xangai), Tokyo, Sydney, Wellington, New York, Chicago. O horário de verão segue a lei de cada fuso desde 2000, incluindo as mudanças dos EUA 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 e Moscow 2011 / 2014. Suportado 2000-2099; outras datas são calculadas com as mesmas regras e marcam -2.
- Um horário local pulado pelo adiantamento da primavera, ou repetido pelo atraso do outono, é lido com o deslocamento em vigor antes da mudança (New York 02:30 no dia da mudança de março = 07:30 UTC; 01:30 no dia de novembro = 05:30 UTC, a primeira ocorrência).
- Relógio da corretora = UTC + deslocamento. Modelos: 0 FIXED (base o ano todo), 1 US DST (base + 60 no verão dos EUA: corretoras "New York close", GMT+2 / GMT+3), 2 EU DST (base + 60 no verão europeu). Padrão 1 com base 120.
- As sessões são definidas no horário local de um fuso, de segunda a sexta pelo dia de início: 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 próprios 4-15. Uma instância vai do início (incluído) ao fim (excluído). index 0 = a última instância que começou no horário dado ou antes (aberta ou encerrada), -1 a anterior, +1 a seguinte; de -260 a 260.
Referência da API
Todas as funções atualizam MSC_LastError. Ids de fuso ou sessão inválidos dão -1 e 0, false, "UNKNOWN" ou -1.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
Deslocamento do fuso em relação a UTC em minutos em utc; se o horário de verão está em vigor (Moscow 2011-2014, UTC+4 permanente, não é horário de verão); utc + deslocamento como horário local; horário local de volta a UTC com a regra acima.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange e MSC_ZoneName
Primeira mudança de deslocamento após utc (em UTC), 0 se não houver nenhuma em três anos (UTC, Dubai, Singapore, Tokyo, Moscow após 2014). Nome de um fuso, como na lista acima.
MSC_SetBroker
model 0-2, base_minutes de -720 a 840 em passos de 15. Caso contrário false e -1.
MSC_DetectBroker
Lê a primeira barra H1 após cada lacuna de fim de semana (36 horas ou mais) de symbol ("" = símbolo do gráfico), da mais recente para trás, até weeks (4-520, 0 = 104). O FX abre no domingo às 17:00 de New York, então cada semana dá um deslocamento; vencem o modelo e a base que se ajustam a mais semanas (empates: US DST, depois EU DST, depois FIXED). Retorna o modelo e o aplica se ajustar pelo menos 60% das semanas; senão -1 com -5 NOT DETECTED (base_minutes e confidence são preenchidos mesmo assim). -3 NO DATA sem histórico H1. Use um par FX principal 24/5: metais e índices abrem mais tarde no domingo e leem uma hora a mais (XAUUSD deu base 180 em vez de 120 nos testes). Use 52 semanas ou mais para incluir mudanças de horário; semanas de feriado baixam a confiança. No Testador de estratégia só se vê o histórico carregado pelo testador (weeks_used informa quantas semanas foram lidas).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
Deslocamento do servidor em minutos em utc; horário do servidor para UTC (regra acima para a hora em torno de uma mudança); UTC para horário do servidor.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Adiciona uma sessão: zone, início e fim em minutos após a meia-noite local (0-1439, diferentes; fim menor que início = noturna), days_mask dos dias de início (bit 0 domingo a bit 6 sábado, 62 = segunda-sexta, 1-127). Retorna o id 4-15, ou -1 com -1 ou -4 SESSION LIMIT. MSC_SessionClear apaga as sessões próprias (os ids são reutilizados a partir de 4). Nomes: 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 a instância 0 contém server_time; horário do servidor do início ou do fim da instância index. 0 em caso de erro.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
OHLC da instância index a partir das barras de symbol ("" = gráfico) em timeframe (0 = gráfico; M1, M5, M15, M30 ou H1) cujo horário de abertura está dentro da instância. result[] recebe 7 valores: 0 abertura, 1 máxima, 2 mínima, 3 fechamento, 4 horário da primeira barra na máxima, 5 horário da primeira barra na mínima, 6 barras. Retorna o número de barras; 0 com -3 NO DATA se nenhuma barra estiver dentro; -1 para timeframe, sessão ou index inválidos. Uma instância em andamento usa as barras até agora.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart e MSC_IsWeekend
Horário do servidor das últimas 17:00 de New York em server_time ou antes (início do dia FX). Fim de semana = sexta 17:00 a domingo 17:00 de New York.
MSC_LastError e MSC_ErrorText
Código da última chamada; texto: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, caso contrário UNKNOWN.
Exemplo de integração funcional
Um Expert Advisor; cole antes o bloco de importação e as linhas enum acima.
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));
} Arquitetura e notas
- Cálculo puro: as regras são calculadas, não consultadas, então nada é baixado. O modelo da corretora e a tabela de sessões ficam guardados por programa que importa a biblioteca.
- MetaTrader 4, qualquer símbolo e timeframe; EAs, indicadores, scripts. Seguro no Testador de estratégia e na otimização: sem DLLs, arquivos, requisições web, objetos gráficos, timers ou variáveis globais. Só MSC_DetectBroker e MSC_SessionRange leem barras.
- Limites: 16 sessões (4 embutidas), index de instância de -260 a 260, anos 2000-2099.
- Configurações típicas. Filtro de sessão: operar só enquanto MSC_SessionIsOpen(MSC_LONDON_SESSION, now). Rompimento da faixa asiática: MSC_SessionRange de MSC_TOKYO_SESSION, index 0, na abertura de London (Tokyo ainda está aberta). Lógica diária: reiniciar em MSC_TradingDayStart. Backtests: chamar MSC_DetectBroker ou MSC_SetBroker em OnInit, nunca TimeGMT().
- As capturas de tela e o vídeo mostram um EA de demonstração construído com esta biblioteca; ele não faz parte da compra.
Aviso de risco
Os horários de sessão descrevem quando os mercados costumam estar ativos, não como os preços vão se mover. Verifique o calendário de feriados da sua corretora; teste primeiro numa conta demo.
