Meridian Session Clock
- 라이브러리
- 버전: 1.0
- 활성화: 5
MQL4 시간 라이브러리입니다: UTC 와 12 개 시간대 사이를 서머타임까지 올바르게 변환하고, 브로커 서버 시계를 모델링(가격 기록에서 자동 감지)하며, Sydney, Tokyo, London, New York 세션과 사용자 세션에 대해 열림 상태, 시작과 종료 시각, OHLC 범위를 제공하고, FX 거래일과 주말도 다룹니다. TimeGMT() 와 달리 전략 테스터에서도 실거래와 같은 결과를 줍니다. 거래, 그리기, 파일 쓰기를 절대 하지 않습니다. 컴파일된 Meridian_Session_Clock.ex4 를 받게 되며, 이 페이지가 API 전체 레퍼런스입니다.
빠른 시작
- Meridian_Session_Clock.ex4 를 MQL4/Libraries 에 복사합니다(파일 > 데이터 폴더 열기).
- 아래 #import 블록을 EA, 지표 또는 스크립트에 붙여 넣습니다.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), 서버 시계를 알면 MSC_SetBroker(MSC_US_DST, 120).
- 서버 시각(TimeCurrent(), Time[i])을 사용합니다: MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- 확인: 아래 예제를 전략 테스터에서 실행합니다. 로그가 매 바마다 감지된 모델과 London 세션 시각을 출력합니다.
가져오기 선언 (복사해서 바로 사용)
#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 }; 기본 개념
- 세 가지 시각: utc, server(브로커 서버 시각: TimeCurrent, 바 시각), local(시간대의 현지 시각).
- 시간대 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore(홍콩, 상하이도 동일), Tokyo, Sydney, Wellington, New York, Chicago. 서머타임은 2000 년 이후 각 시간대의 법을 따르며 미국 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008, Moscow 2011 / 2014 변경도 포함합니다. 지원 범위는 2000-2099 년이며 그 밖의 시각도 같은 규칙으로 계산하고 -2 를 표시합니다.
- 서머타임 시작으로 건너뛰거나 종료로 반복되는 현지 시각은 전환 전의 오프셋으로 읽습니다(3 월 전환일 New York 02:30 = 07:30 UTC, 11 월 전환일 01:30 = 05:30 UTC, 첫 번째).
- 브로커 시계 = UTC + 오프셋. 모델: 0 FIXED(연중 기준값), 1 US DST(미국 여름에 기준 + 60: "New York close" 브로커, GMT+2 / GMT+3), 2 EU DST(유럽 여름에 기준 + 60). 기본값 1, 기준 120.
- 세션은 시간대의 현지 시각으로, 시작일 기준 월요일-금요일로 정의됩니다: 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 4-15. 인스턴스는 시작(포함)부터 종료(제외)까지입니다. index 0 = 주어진 시각 또는 그 이전에 시작한 가장 최근 인스턴스(진행 중 또는 종료), -1 은 그 이전, +1 은 다음, 범위 -260 ~ 260.
API 레퍼런스
모든 함수는 MSC_LastError 를 설정합니다. 잘못된 시간대나 세션 id 는 -1 과 함께 0, false, "UNKNOWN" 또는 -1 을 줍니다.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
utc 시점의 시간대 UTC 오프셋(분), 서머타임 여부(Moscow 2011-2014 의 영구 UTC+4 는 서머타임이 아님), utc + 오프셋인 현지 시각, 위 규칙에 따른 현지 시각의 UTC 변환.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange 와 MSC_ZoneName
utc 이후 첫 오프셋 변경(UTC 시각), 3 년 안에 없으면 0(UTC, Dubai, Singapore, Tokyo, 2014 년 이후 Moscow). 시간대 이름은 위 목록과 같습니다.
MSC_SetBroker
model 0-2, base_minutes 는 -720 ~ 840, 15 단위. 그 외에는 false 와 -1.
MSC_DetectBroker
symbol("" = 차트 심볼)의 각 주말 공백(36 시간 이상) 직후 첫 H1 바를 최신부터 weeks 주(4-520, 0 = 104)까지 읽습니다. FX 는 일요일 New York 시각 17:00 에 열리므로 매주 오프셋이 하나 나오고, 가장 많은 주에 맞는 모델과 기준이 선택됩니다(동률이면 US DST, 다음 EU DST, 다음 FIXED). 60% 이상의 주가 맞으면 모델을 반환하고 적용하며, 아니면 -1 과 -5 NOT DETECTED(base_minutes 와 confidence 는 채워짐). H1 기록이 없으면 -3 NO DATA. 24/5 주요 FX 페어를 사용하십시오: 금속과 지수는 일요일에 늦게 열려 한 시간 더 크게 읽힙니다(테스트에서 XAUUSD 는 기준 120 대신 180). 서머타임 전환이 포함되도록 52 주 이상을 쓰고, 휴일 주는 신뢰도를 낮춥니다. 전략 테스터에서는 테스터가 불러온 기록만 보입니다(weeks_used 가 읽은 주 수를 알려 줍니다).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
utc 시점의 서버 오프셋(분), 서버 시각을 UTC 로(전환 전후 한 시간은 위 규칙), UTC 를 서버 시각으로.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
세션을 추가합니다: zone, 현지 자정 이후 분 단위 시작과 종료(0-1439, 서로 다름, 종료가 시작보다 작으면 야간), 시작일 days_mask(bit 0 일요일 ~ bit 6 토요일, 62 = 월-금, 1-127). id 4-15 를 반환하거나 -1 과 -1 또는 -4 SESSION LIMIT. MSC_SessionClear 는 사용자 세션을 삭제합니다(id 는 4 부터 재사용). 이름: 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
인스턴스 0 이 server_time 을 포함하는지, 인스턴스 index 의 시작 또는 종료 서버 시각. 오류 시 0.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
symbol("" = 차트)의 timeframe(0 = 차트, M1, M5, M15, M30, H1)에서 시가 시각이 인스턴스 안에 있는 바로 인스턴스 index 의 OHLC 를 구합니다. result[] 에 7 개 값: 0 시가, 1 고가, 2 저가, 3 종가, 4 고가에 처음 닿은 바 시각, 5 저가에 처음 닿은 바 시각, 6 바 개수. 바 개수를 반환하며, 안에 바가 없으면 0 과 -3 NO DATA, timeframe, 세션, index 가 잘못되면 -1. 진행 중인 인스턴스는 지금까지의 바를 사용합니다.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart 와 MSC_IsWeekend
server_time 또는 그 이전의 가장 최근 New York 17:00 의 서버 시각(FX 거래일 시작). 주말 = New York 시각 금요일 17:00 부터 일요일 17:00 까지.
MSC_LastError 와 MSC_ErrorText
마지막 호출의 코드와 텍스트: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, 그 외 UNKNOWN.
동작하는 통합 예제
Expert Advisor 입니다. 먼저 위의 가져오기 블록과 enum 줄을 붙여 넣으십시오.
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));
} 아키텍처와 참고 사항
- 순수 계산: 규칙은 표를 찾지 않고 계산하므로 아무것도 내려받지 않습니다. 브로커 모델과 세션 표는 라이브러리를 가져오는 프로그램마다 따로 유지됩니다.
- MetaTrader 4, 모든 심볼과 타임프레임. EA, 지표, 스크립트에서 사용. 전략 테스터와 최적화에서 안전: DLL, 파일, 웹 요청, 차트 객체, 타이머, 전역 변수를 쓰지 않습니다. 바를 읽는 것은 MSC_DetectBroker 와 MSC_SessionRange 뿐입니다.
- 제한: 세션 16 개(기본 4 개), 인스턴스 index -260 ~ 260, 연도 2000-2099.
- 대표 설정. 세션 필터: MSC_SessionIsOpen(MSC_LONDON_SESSION, now) 인 동안에만 거래. 아시아 범위 돌파: London 개장 시 MSC_TOKYO_SESSION 의 MSC_SessionRange, index 0(이때 Tokyo 는 아직 열려 있음). 일일 로직: MSC_TradingDayStart 에서 초기화. 백테스트: OnInit 에서 MSC_DetectBroker 또는 MSC_SetBroker 를 호출하고 TimeGMT() 는 쓰지 마십시오.
- 스크린샷과 동영상은 이 라이브러리로 만든 데모 EA 를 보여 줍니다. 구매 내용에는 포함되지 않습니다.
위험 고지
세션 시각은 시장이 보통 활발한 시간을 설명할 뿐 가격이 어떻게 움직일지는 알려 주지 않습니다. 브로커의 휴일 일정을 확인하고 먼저 데모 계좌에서 테스트하십시오.
