Japan Bank Holiday and Gotobi Library は、MetaTrader 5 と MetaTrader 4 用の無料のライブラリです。円相場のカレンダーの問いに、お使いのエキスパートアドバイザ(EA)・インジケータ・スクリプトの中から答えます。このマニュアルは開発者向けで、どちらのプラットフォームもバージョン 1.00 が対象です。
答えられること
- 日本の国民の祝日(振替休日・国民の休日・一度きりの休日を含む)と、それぞれの英語名。
- 日本の銀行休業日:土曜・日曜・国民の祝日と12月31日〜1月3日。それ以外の日はすべて東京の営業日です。
- 五十日:毎月の5日・10日・15日・20日・25日と月末日。銀行休業日にあたるときは、同じ月の前の営業日に繰り上がります。
- 東京仲値の時刻(日本時間 09:55)と、サーバー時刻と日本時間の相互の換算。日本に夏時間はありません(JST = UTC+9)。
対象は 1980〜2099年です。決まりを計算で求めるため、更新が必要な祝日の表はありません。DLL・Web リクエスト・ファイル・売買の関数は使いません。

インストール
- 商品ページで Free Download(無料ダウンロード)をクリックするか(MetaTrader が開きます)、ツールボックス > マーケット で探します(MT4 ではこのウィンドウは「ターミナル」という名前です)。MT5 版と MT4 版は別の商品です。
- マーケットからは、ライブラリが MQL5\Libraries\Market\Japan Bank Holiday and Gotobi Library.ex5(MT5)または MQL4\Libraries\Market\Japan Bank Holiday and Gotobi Library MT4.ex4(MT4)としてインストールされます。これらのフォルダは ファイル > データフォルダを開く で表示できます。
- インストールした商品とその更新は、ツールボックス > マーケット > 購入済み にあります。
- ライブラリはチャートにセットするものではありません。お使いのプログラムが、インポートのブロックを通して読み込みます。
インポートの方法
お使いのプラットフォーム用のヘッダーを Include フォルダに保存し、プログラムの先頭に一行を加えます:
- JpMarketCalendar_Market.mqh(MT5):MQL5\Include に保存します。
- JpMarketCalendar_Market_MT4.mqh(MT4):MQL4\Include に保存します。
#include <JpMarketCalendar_Market.mqh> // MT5 #include <JpMarketCalendar_Market_MT4.mqh> // MT4
どちらのヘッダーも 17 個の関数をすべてインポートし、夏時間の決まり JP_DST_NONE (0)、 JP_DST_US (1)、 JP_DST_EU (2)を定義します。インポートのブロックをご自身で貼り付ける場合、その一行目は、インストールされたファイルと正確に一致している必要があります(バックスラッシュは二つ): #import "Market\\Japan Bank Holiday and Gotobi Library.ex5" (MT5)または #import "Market\\Japan Bank Holiday and Gotobi Library MT4.ex4" (MT4)。
手始めに使える二つのプログラムです(どちらも注文は出しません):
- JpCalendarDemo.mq5 / JpCalendarDemo_MT4.mq4:サーバー時刻と日本時間、次の仲値、選んだ年の祝日と五十日を出力するスクリプトです。これらが出力されれば、ライブラリは正しくインストールされ、インポートされています。
- JpCalendarExample.mq5 / JpCalendarExample_MT4.mq4:五十日の仲値の時刻、祝日の名前、または次の五十日を Comment() で表示するエキスパートアドバイザです。
六つのファイルはすべて、エラー 0・警告 0 でコンパイルできます。下は MT5 のデモサーバーでのデモスクリプトの出力で、MT4 版も同じ行を出力します。

関数リファレンス
| 関数 | 戻り値 | 説明 |
|---|---|---|
| JpIsBankHoliday(datetime date_jst) | bool | 土曜・日曜・国民の祝日と12月31日〜1月3日に true。 |
| JpIsBusinessDay(datetime date_jst) | bool | 東京の営業日に true。1980-2099 の範囲外では、この関数も JpIsBankHoliday() も false を返します。 |
| JpIsNationalHoliday(datetime date_jst) | bool | 国民の祝日(振替休日・国民の休日・一度きりの休日を含む)に true。 |
| JpHolidayName(datetime date_jst) | string | 英語名。たとえば "Marine Day"。12月31日・1月2日・1月3日は、国民の祝日でなければ "Bank Holiday"。それ以外の日は ""(ふつうの週末も同じ)。 |
| JpIsGotobi(datetime date_jst) | bool | 五十日に true。五十日は必ず営業日です。 |
| JpGotobiDaysOfMonth(int year, int month, datetime &out[]) | int | 動的配列にその月の五十日(00:00 JST、古い順)を入れ、その数を返します。静的配列、1980-2099 の範囲外の年、1-12 の範囲外の月のときは -1。 |
| JpNextGotobi(datetime from_jst) | datetime | その日付以降で最初の五十日(00:00 JST)。その日自体も数え、09:55 を過ぎていても同じです。なければ 0。 |
| JpPrevGotobi(datetime from_jst) | datetime | その日付以前で最後の五十日(00:00 JST)。なければ 0。 |
| JpTokyoFixing(datetime date_jst) | datetime | その日の 09:55 JST。どの日でも返しますが、仲値が公表されるのは営業日だけです。 |
| JpNowJst() | datetime | 現在の日本時間(サーバー時刻から求めます。下を参照)。 |
| JpServerToJst(datetime server_time) | datetime | 使用中の時差で、サーバー時刻を日本時間に換算します。無効な時刻なら 0。 |
| JpJstToServer(datetime jst) | datetime | 日本時間をサーバー時刻に換算します。無効な時刻なら 0。 |
| JpServerGmtOffsetSeconds() | int | 現在のサーバーの GMT オフセット(秒)。 |
| JpSetServerGmtOffset(int seconds) | bool | 一年中同じ時差を設定します。たとえば GMT+2 なら 7200。 |
| JpSetServerTimeZone(int standard_offset_seconds, int dst_rule) | bool | 夏時間でないときの時差と、決まり:0 なし・1 米国・2 欧州(夏時間の間は +1 時間)。 |
| JpSetServerGmtOffsetAuto() | void | 自動の時差(既定)に戻します。 |
| JpLibraryVersion() | string | "1.00" |
日付の引数は日本時間です。その日のどの時刻を渡してもかまいません。1980-2099 の範囲外では、関数は false・0・""・-1 のいずれかを返します。二つの設定用の関数は、-43200〜50400 の範囲で 900 秒の倍数を受け付けます。それ以外の値では理由を出力して false を返し、前の設定を保ちます。
使用例
今日の日本:
datetime jst = JpNowJst(); // Japan time now
if(JpIsBankHoliday(jst))
Print("Tokyo banks are closed: ", JpHolidayName(jst)); // "" on a plain weekend
else if(JpIsGotobi(jst) && jst < JpTokyoFixing(jst))
Print("Gotobi morning, fixing at ", TimeToString(JpJstToServer(JpTokyoFixing(jst))), " server time"); まだ過ぎていない次の五十日の仲値:
datetime jst = JpNowJst();
datetime g = JpNextGotobi(jst); // today counts all day
if(g != 0 && JpTokyoFixing(g) < jst) // today's fixing has passed
g = JpNextGotobi(g + 86400);
Print("Next gotobi fixing: ", TimeToString(JpJstToServer(JpTokyoFixing(g))), " server time"); ある月の五十日:
datetime days[]; // must be a dynamic array int n = JpGotobiDaysOfMonth(2027, 5, days); // 5 days: 10, 14, 20, 25 and 31 for(int i = 0; i < n; i++) Print(TimeToString(days[i], TIME_DATE));
タイムゾーンとストラテジーテスター
- サーバー時刻は日本時間ではありません。上のデモでは、サーバーが10月13日 21:43 を示しているとき、日本は10月14日 03:43 です。日付について問い合わせる前に JpServerToJst() で換算するか、JpNowJst() を使ってください。
- 既定の時差は自動です:MT5 では TimeTradeServer() - TimeGMT() を 15 分単位に丸めた値で、呼ぶたびに読み直します。ターミナルの起動直後の数秒は 0 になることがあります。
- MT4 には TimeTradeServer() がなく、最後の値動き(クオート)の時刻である TimeCurrent() を使います。これは起動直後や市場が閉まっている間はずれることがあります。MT4 では、時差をご自身で設定してください。
- ストラテジーテスターでは TimeGMT() がサーバー時刻を返すため、自動の時差は 0 になります。ライブラリはテスターのログに一度だけ注意を書き出します。OnInit() で時差を設定してください。
- 自動の時差は、今日の時差です。夏時間の切り替えをまたぐ過去の足には、JpSetServerTimeZone() でサーバーの決まりを設定してください。
- 設定は、それを呼んだプログラムに効きます。エキスパートアドバイザやインジケータごとに、OnInit() で呼んでください。
input int ServerGmtWinter = 2; // server GMT offset outside summer time, in hours
input int ServerDstRule = 1; // summer time rule: 0 none, 1 US, 2 EU
int OnInit()
{
if(!JpSetServerTimeZone(ServerGmtWinter * 3600, ServerDstRule))
return(INIT_PARAMETERS_INCORRECT); // the library printed the reason
return(INIT_SUCCEEDED);
} 米国式:3月の第二日曜日から11月の第一日曜日まで(2007年より前は、米国の以前の日付)。欧州式:3月の最終日曜日から10月の最終日曜日まで(1996年より前は9月まで)。冬は GMT+2、米国の夏時間の間は GMT+3 のサーバーなら、7200 と決まり 1 です。デモスクリプトで、お使いのサーバーの現在の時差がわかります。どの夏時間に従っているかは、業者に問い合わせればわかります。MT5 で自動の時差をライブで使い続けるには、例の EA のように、 MQLInfoInteger(MQL_TESTER) が true のときだけ設定用の関数を呼んでください。
使っている決まりと、その確かめ方
- 国民の祝日に関する法律(改正を含む):日付の決まった祝日、月曜の祝日(成人の日(Coming of Age Day)と体育の日(Health and Sports Day)は2000年から、海の日(Marine Day)と敬老の日(Respect for the Aged Day)は2003年から)、2016年からの山の日(Mountain Day)、元号ごとの天皇誕生日、2020年と2021年の移動した日。
- 振替休日:国民の祝日が日曜日にあたるときは、その後の、国民の祝日でない最初の日が休日になります(2007年から。それより前は翌日だけ)。
- 国民の休日:二つの国民の祝日にはさまれた日(1986年から)。たとえば2026年9月22日。
- 一度きりの休日:1989-02-24、1990-11-12、1993-06-09、2019-05-01、2019-10-22。
- 春分の日・秋分の日:1980-2099 に有効な標準の近似式。政府は、各年の春分の日・秋分の日を前年の2月に公表します。
- 銀行休業日:土曜・日曜・国民の祝日と12月31日〜1月3日(銀行法)。今の決まりをすべての年に当てはめます。
- 五十日:5日が前の月に繰り上がる場合、その日はすでに前の月の月末の五十日なので、前の月にだけ数えます。そのため、2027年5月の五十日は 5 回です。
- これらは、バージョン 1.00 を作った時点(2026年10月)で有効な決まりです。

公開前の確認:両方の版がエラー 0・警告 0 でコンパイルできます。MT4 版は同じソースから作っています(違うのは時刻の関数だけです)。1980年から2027年までの国民の祝日 789 日すべてが、内閣府の一覧と一日ずつ一致しました。この一覧は現在2027年までです。春分の日・秋分の日の式は、2027年までのすべての年で公式の日付と一致し、2099年までのすべての年で天文計算と一致します。Market のパスからのインポートは、ストラテジーテスターでも読み込めます。
開発者の方からよくいただく質問
- プログラムがライブラリについてのエラーで止まります。ライブラリがインストールされていること、#import の行がファイル名と正確に一致していることを確かめてください。MT4 のファイル名は MT4 で終わります。
- 夜になると、日本の日付が一日ずれます。サーバー時刻を渡しています。先に JpServerToJst() で換算してください。
- JpGotobiDaysOfMonth() が -1 を返します。動的配列( datetime days[]; )、1980〜2099 の年、1〜12 の月を渡してください。
- OnTick() で使っても十分に速いですか?はい。結果は年ごとにキャッシュされます。キャッシュは 2 年分なので、多くの年の間を行き来するループでは遅くなります。
商品ページ:Japan Bank Holiday and Gotobi Library(MT5)と Japan Bank Holiday and Gotobi Library MT4。ご不明な点があれば、お使いのコードと「エキスパート」タブの最後の数行を添えて、MQL5 の個人メッセージでお送りください。



