Japan Bank Holiday and Gotobi Library
- ライブラリ
-
Mikoto Hamazono
AI Trader Kyo | MQL 開発者・FX イノベーター
MQL の開発者として、また FX の新しい技術に情熱を注ぐ一人として、AI(人工知能)の力を生かした最先端のトレードソリューションを開発しています。
金融工学とプログラミングの経験を組み合わせ、高度な AI と実績のあるアルゴリズム戦略を融合した自動売買ツールを作っています。
スーパーコンピュータ「京」での金融関連の開発にも携わった経験があり、システム設計を多角的な視点から組み立てられることが強みです。
主な取り組み:
- 初心者からプロまで使いやすい、AI を活用した EA の開発 - バージョン: 1.0
Japan Bank Holiday and Gotobi Library は、円相場のカレンダーの問いに、お使いの EA・インジケーター・スクリプトの中から答えるライブラリです。今日は日本の銀行休業日か、五十日(ごとうび)か、次の東京仲値はいつか、業者のサーバー時刻でいま日本は何時かが分かります。
決まりはすべて計算で求めるため、祝日の表を更新する必要はありません。1980〜2027 年の結果は、内閣府の「国民の祝日」の一覧と 1 日ずつ一致することを確かめています。DLL・Web リクエスト・ファイル・売買の関数は使いません。
答えられること
- 日本の国民の祝日(振替休日・国民の休日を含む)と、それぞれの祝日の英語名。
- 日本の銀行休業日: 土曜・日曜・国民の祝日と 12 月 31 日〜1 月 3 日。それ以外の日は営業日です。
- 五十日: 毎月 5・10・15・20・25 日と月末。その日が銀行休業日なら、前の営業日に繰り上げます。
- 東京仲値の時刻: 日本時間 9 時 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) - その日の日本時間 9 時 55 分。
- JpNowJst() - 現在の日本時間。
- JpServerToJst(time) / JpJstToServer(time) - サーバー時刻と日本時間を換算します。
- JpServerGmtOffsetSeconds() - サーバーの GMT からの時差(秒)。自動では TimeTradeServer() − TimeGMT() を 15 分単位に丸めます。
- JpSetServerGmtOffset(seconds) - 一年中同じ時差を指定します(例: GMT+2 なら 7200)。
- JpSetServerTimeZone(seconds, rule) - 夏時間でないときの時差と、夏時間の決まり(0 なし・1 米国・2 欧州)を指定します。
- JpSetServerGmtOffsetAuto() - 自動の時差に戻します(既定)。
- JpLibraryVersion() - 版("1.00")。
日付の引数は日本時間で渡します。その日のどの時刻でもかまいません。祝日と五十日の日付は日本時間の 0 時で返します。
使い方
Market からは MQL5\Libraries\Market\Japan Bank Holiday and Gotobi Library.ex5 としてインストールされます。次の読み込みの宣言をプログラムの先頭に貼り付けてください(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 の個人メッセージでご連絡ください。
