Japan Bank Holiday and Gotobi Library
- 라이브러리
-
Mikoto Hamazono
AI Trader Kyo | MQL 개발자 & FX 이노베이터
MQL 개발자이자 FX 혁신에 열정을 가진 사람으로서, 인공지능의 힘을 최대한 활용하는 최첨단 트레이딩 솔루션을 만들고 있습니다.
금융공학과 프로그래밍 경험을 결합해, 고도화된 AI와 검증된 알고리즘 전략을 하나로 묶은 자동매매 도구를 개발합니다.
또한 슈퍼컴퓨터 'K(京)'에서 금융 개발 프로젝트에 참여한 경험이 있어, 다양한 관점에서 시스템을 설계할 수 있습니다.
주요 성과: - 버전: 1.0
Japan Bank Holiday and Gotobi Library는 엔화 시장의 달력 질문에 여러분의 EA, 지표, 스크립트 안에서 답합니다. 오늘이 일본의 은행 휴무일인지, 고토비(五十日)인지, 다음 도쿄 픽싱(仲値)은 언제인지, 브로커 서버 시간 기준으로 지금 일본은 몇 시인지 알 수 있습니다.
모든 규칙을 계산으로 구하므로 공휴일 표를 갱신할 필요가 없습니다. 1980-2027년의 결과는 일본 내각부의 국민 공휴일 목록과 하루 단위로 일치합니다. DLL, 웹 요청, 파일, 매매 함수를 사용하지 않습니다.
답할 수 있는 것
- 일본의 국민 공휴일(대체 휴일과 '국민의 휴일' 포함)과 각 공휴일의 영어 이름.
- 일본의 은행 휴무일: 토요일, 일요일, 국민 공휴일, 12월 31일-1월 3일. 그 밖의 날은 영업일입니다.
- 고토비: 매월 5, 10, 15, 20, 25일과 말일. 그날이 은행 휴무일이면 직전 영업일로 앞당겨집니다.
- 도쿄 픽싱 시각: 일본 시간 09:55.
- 브로커 서버 시간과 일본 시간의 상호 변환. 일본에는 서머타임이 없습니다(JST = UTC+9).
함수
- JpIsBankHoliday(date) - 토요일, 일요일, 국민 공휴일, 12월 31일-1월 3일이면 true.
- JpIsBusinessDay(date) - 도쿄 은행 영업일이면 true.
- JpIsNationalHoliday(date) - 국민 공휴일(대체 휴일과 국민의 휴일 포함)이면 true.
- JpHolidayName(date) - 영어 이름(예: "Marine Day", "Substitute Holiday", "Bank Holiday"). 그 밖의 날은 빈 문자열.
- JpIsGotobi(date) - 고토비이면 true.
- JpGotobiDaysOfMonth(year, month, days[]) - 그 달의 고토비를 모두 반환하며, 개수를 돌려줍니다.
- JpNextGotobi(date) / JpPrevGotobi(date) - 그 날짜 또는 이후의 첫 고토비 / 그 날짜 또는 이전의 마지막 고토비.
- JpTokyoFixing(date) - 그날 일본 시간 09:55.
- JpNowJst() - 현재 일본 시간.
- JpServerToJst(time) / JpJstToServer(time) - 서버 시간과 일본 시간을 변환합니다.
- JpServerGmtOffsetSeconds() - 서버의 GMT 기준 시차(초). 자동일 때는 TimeTradeServer() - TimeGMT()를 15분 단위로 반올림합니다.
- JpSetServerGmtOffset(seconds) - 1년 내내 같은 시차를 지정합니다(예: GMT+2는 7200).
- JpSetServerTimeZone(seconds, rule) - 서머타임이 아닐 때의 시차와 서머타임 규칙(0 없음, 1 미국, 2 유럽)을 지정합니다.
- JpSetServerGmtOffsetAuto() - 자동 시차로 되돌립니다(기본값).
- JpLibraryVersion() - 버전("1.00").
날짜 인수는 일본 시간으로 전달합니다. 그날의 어느 시각이든 상관없습니다. 공휴일과 고토비 날짜는 일본 시간 00:00으로 반환됩니다.
사용 방법
Market에서는 MQL5\Libraries\Market\Japan Bank Holiday and Gotobi Library.ex5로 설치됩니다. 아래 import 블록을 프로그램 맨 앞에 붙여 넣으세요(MQL5\Include\JpMarketCalendar.mqh로 저장한 뒤 그 파일을 include해도 됩니다).
#import "Market\\Japan Bank Holiday and Gotobi Library.ex5" string JpLibraryVersion(); bool JpIsNationalHoliday(datetime date_jst); bool JpIsBankHoliday(datetime date_jst); bool JpIsBusinessDay(datetime date_jst); string JpHolidayName(datetime date_jst); bool JpIsGotobi(datetime date_jst); int JpGotobiDaysOfMonth(int year, int month, datetime &out[]); datetime JpNextGotobi(datetime from_jst); datetime JpPrevGotobi(datetime from_jst); datetime JpTokyoFixing(datetime date_jst); int JpServerGmtOffsetSeconds(); bool JpSetServerGmtOffset(int seconds); bool JpSetServerTimeZone(int standard_offset_seconds, int dst_rule); void JpSetServerGmtOffsetAuto(); datetime JpServerToJst(datetime server_time); datetime JpJstToServer(datetime jst); datetime JpNowJst(); #import
EA 예제:
int OnInit()
{
// In the Strategy Tester TimeGMT() returns server time: set the offset yourself
if(MQLInfoInteger(MQL_TESTER))
JpSetServerTimeZone(2 * 3600, 1); // GMT+2, +1 hour in US summer time
return(INIT_SUCCEEDED);
}
void OnTick()
{
datetime jst = JpNowJst(); // Japan time now
if(JpIsGotobi(jst))
Comment("Gotobi - Tokyo fixing at ",
TimeToString(JpJstToServer(JpTokyoFixing(jst))), " server time");
else if(JpIsBankHoliday(jst))
Comment("Japanese bank holiday ", JpHolidayName(jst));
else
Comment("Next gotobi: ", TimeToString(JpNextGotobi(jst), TIME_DATE));
} 사용하는 규칙
- 일본 「국민의 공휴일에 관한 법률」과 그 개정: 날짜가 정해진 공휴일, 월요일 공휴일(성인의 날과 체육의 날은 2000년부터, 바다의 날과 경로의 날은 2003년부터), 2016년부터의 산의 날, 연호별 천황 탄생일, 2020년과 2021년의 이동.
- 대체 휴일: 공휴일이 일요일과 겹치면 그 뒤의 가장 가까운, 공휴일이 아닌 날이 휴일(2007년부터. 그 이전에는 다음 날만).
- 국민의 휴일: 두 공휴일 사이에 낀 날(1986년부터). 예: 2026년 9월 22일.
- 한 번뿐인 휴일: 1989-02-24, 1990-11-12, 1993-06-09, 2019-05-01, 2019-10-22.
- 춘분의 날과 추분의 날: 1980-2099년에 쓸 수 있는 표준 근사식. 2027년까지 모든 해에서 공식 날짜와 일치하고, 2099년까지 모든 해에서 천문 계산과 일치합니다. 정부는 각 날짜를 전년도 2월에 공표합니다.
- 은행 휴무일: 토요일, 일요일, 국민 공휴일, 12월 31일-1월 3일(은행법. 현재 규칙을 모든 해에 적용합니다).
- 고토비: 은행 휴무일이면 같은 달의 직전 영업일로 앞당깁니다. 5일이 전달로 넘어가는 경우(예: 2027년 5월) 그 영업일은 이미 전달 말일의 고토비이므로 전달에만 표시됩니다.
알아 둘 점
- 사용 가능한 연도: 1980-2099년. 범위 밖에서는 false, 0, 빈 문자열 또는 -1을 반환합니다.
- 전략 테스터: 테스터에서는 TimeGMT()가 서버 시간을 반환하므로 자동 시차가 0이 됩니다. 예제처럼 OnInit()에서 JpSetServerGmtOffset() 또는 JpSetServerTimeZone()을 호출하세요. 테스터에서 자동 시차를 쓰면 라이브러리가 테스터 기록에 안내를 한 번 남깁니다.
- 자동 시차에는 거래 서버와 동기화된 터미널이 필요합니다. 터미널을 시작한 직후 몇 초 동안은 0이 될 수 있으며, 호출할 때마다 다시 읽습니다.
- 자동 시차는 현재의 시차입니다. 서머타임 전환을 넘어 과거 봉을 변환하려면 JpSetServerTimeZone()으로 서버의 규칙을 지정하세요.
- 설정은 호출한 프로그램에 적용됩니다. EA나 지표마다 OnInit()에서 호출하세요.
- JpGotobiDaysOfMonth()에는 동적 배열(datetime days[];)이 필요합니다.
- 결과는 연도별로 캐시됩니다. 같은 해 안에서 반복 호출하면 1회 약 0.01마이크로초입니다.
지원
궁금한 점이 있으면 MQL5에서 개인 메시지를 보내 주세요.
