Japan Bank Holiday and Gotobi Library
- 程序库
- 版本: 1.0
Japan Bank Holiday and Gotobi Library 在您自己的 EA、指标或脚本中回答日元市场的日历问题:今天是否为日本银行休息日、是否为五十日(gotobi)、下一次东京定盘价(仲值)在何时,以及按您经纪商的服务器时间,日本现在是几点。
所有规则均通过计算得出,无需更新节假日表。1980-2027 年的结果与日本内阁府公布的国民节假日列表逐日一致。不使用 DLL、不发送网络请求、不读写文件、不含任何交易函数。
可以回答的问题
- 日本国民节假日,包括调休假日(振替休日)和国民休息日(国民の休日),并给出每个节日的英文名称。
- 日本银行休息日:周六、周日、国民节假日以及 12 月 31 日至 1 月 3 日。其余日期为营业日。
- 五十日(gotobi):每月 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) - 固定偏移,例如 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。请把下面的导入块粘贴到您程序的开头(或保存为 MQL5\Include\JpMarketCalendar.mqh 后包含该文件):
#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;每次调用都会重新读取。
- 自动偏移是当前的偏移。若要跨越夏令时切换来换算历史 K 线,请用 JpSetServerTimeZone() 设置服务器的规则。
- 设置只对调用它的程序生效:请在每个 EA 或指标的 OnInit() 中调用。
- JpGotobiDaysOfMonth() 需要动态数组:datetime days[];
- 结果按年缓存;同一年内重复调用一次约需 0.01 微秒。
技术支持
如有任何不清楚之处,请在 MQL5 上给我发私信。
