Japan Bank Holiday and Gotobi Library (MT5/MT4): руководство пользователя, функции и примеры

Japan Bank Holiday and Gotobi Library (MT5/MT4): руководство пользователя, функции и примеры

14 октября 2026, 03:33
Mikoto Hamazono
0
14

Japan Bank Holiday and Gotobi Library — бесплатная библиотека для MetaTrader 5 и MetaTrader 4. Она отвечает на календарные вопросы рынка иены прямо в вашем собственном советнике, индикаторе или скрипте. Это руководство предназначено для разработчиков и относится к версии 1.00 на обеих платформах.

На какие вопросы отвечает библиотека

  • Государственные праздники Японии, включая перенесённые выходные, «народные выходные» и разовые праздники, с английским названием каждого.
  • Выходные дни японских банков: субботы, воскресенья, государственные праздники и с 31 декабря по 3 января. Все остальные дни — рабочие дни в Токио.
  • Дни gotobi: 5-е, 10-е, 15-е, 20-е, 25-е число и последний день месяца. Если такой день — банковский выходной, gotobi переносится на предыдущий рабочий день того же месяца.
  • Время токийского фиксинга — 09:55 по японскому времени, а также перевод серверного времени в японское и обратно. В Японии нет летнего времени (JST = UTC+9).

Годы с 1980 по 2099. Правила вычисляются, поэтому таблицу праздников обновлять не нужно. Без DLL, без веб-запросов, без файлов, без торговых функций.

График USDJPY H4 с фиксингами в дни gotobi и японскими банковскими выходными, отмеченными скриптом, который вызывает библиотеку

Установка

  1. На странице продукта нажмите кнопку бесплатной загрузки (Free Download) — откроется MetaTrader — или найдите библиотеку в разделе Инструменты > Маркет (в MT4 это окно называется «Терминал»). MT5 и MT4 — отдельные продукты.
  2. Маркет устанавливает библиотеку в файл MQL5\Libraries\Market\Japan Bank Holiday and Gotobi Library.ex5 (MT5) или MQL4\Libraries\Market\Japan Bank Holiday and Gotobi Library MT4.ex4 (MT4). Эти папки открываются через Файл > Открыть каталог данных.
  3. Установленные продукты и их обновления находятся в разделе Инструменты > Маркет > Покупки.
  4. Библиотека не устанавливается на график. Ваша собственная программа загружает её через блок импорта.

Импорт

Сохраните заголовочный файл для вашей платформы в папке 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: скрипт, который выводит серверное и японское время, ближайшие фиксинги, а также праздники и дни gotobi за выбранные вами годы. Если он их выводит, библиотека установлена и импортирована правильно.
  • JpCalendarExample.mq5 / JpCalendarExample_MT4.mq4: советник, который с помощью Comment() показывает время фиксинга в день gotobi, название праздника или следующий день gotobi.

Все шесть файлов компилируются с 0 ошибок и 0 предупреждений. Ниже — вывод демо-скрипта на демо-сервере MT5; версия для MT4 выводит те же строки.

Вывод демо-скрипта: серверное и японское время, ближайшие фиксинги, праздники 2026 года

Справочник функций

ФункцияВозвращаетПримечания
JpIsBankHoliday(datetime date_jst) booltrue в субботы, воскресенья, государственные праздники и с 31 декабря по 3 января.
JpIsBusinessDay(datetime date_jst) booltrue в рабочие дни в Токио. Вне диапазона 1980-2099 и эта функция, и JpIsBankHoliday() возвращают false.
JpIsNationalHoliday(datetime date_jst) booltrue в государственные праздники, включая перенесённые выходные, «народные выходные» и разовые праздники.
JpHolidayName(datetime date_jst) stringАнглийское название, например "Marine Day"; "Bank Holiday" — 31 декабря, 2 января и 3 января, если они не являются государственными праздниками; "" — в остальные дни, в том числе в обычные выходные.
JpIsGotobi(datetime date_jst) booltrue в дни gotobi, которые всегда являются рабочими днями.
JpGotobiDaysOfMonth(int year, int month, datetime &out[]) intЗаполняет динамический массив днями gotobi этого месяца (00:00 JST, от ранних к поздним) и возвращает их количество; -1 — для статического массива, года вне диапазона 1980-2099 или месяца вне диапазона 1-12.
JpNextGotobi(datetime from_jst) datetimeПервый день gotobi в эту дату или позже (00:00 JST). Сам этот день учитывается, в том числе после 09:55. 0, если такого дня нет.
JpPrevGotobi(datetime from_jst) datetimeПоследний день gotobi в эту дату или раньше (00:00 JST). 0, если такого дня нет.
JpTokyoFixing(datetime date_jst) datetime09:55 JST этого дня, для любого дня; сам фиксинг публикуется только в рабочие дни.
JpNowJst() datetimeТекущее японское время (по серверному времени, см. ниже).
JpServerToJst(datetime server_time) datetimeПереводит серверное время в японское с используемым смещением. 0 для недопустимого времени.
JpJstToServer(datetime jst) datetimeПереводит японское время в серверное. 0 для недопустимого времени.
JpServerGmtOffsetSeconds() intТекущее смещение сервера от GMT в секундах.
JpSetServerGmtOffset(int seconds) boolОдно смещение на весь год, например 7200 для GMT+2.
JpSetServerTimeZone(int standard_offset_seconds, int dst_rule) boolСмещение вне летнего времени и правило: 0 — нет, 1 — США, 2 — ЕС (+1 час в период летнего времени).
JpSetServerGmtOffsetAuto() voidВозврат к автоматическому смещению (по умолчанию).
JpLibraryVersion() string"1.00"

Аргументы-даты задаются в японском времени; можно передавать любое время суток. Вне диапазона 1980-2099 функции возвращают false, 0, "" или -1. Две функции установки принимают значение, кратное 900 секундам, от -43200 до 50400; при любом другом значении они выводят причину, возвращают 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");

Ближайший фиксинг в день gotobi, который ещё не прошёл:

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");

Дни gotobi одного месяца:

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));

Часовые пояса и тестер стратегий

  • Серверное время — это не японское время: в демо выше сервер показывает 21:43 13 октября, а в Японии в этот момент уже 03:43 14 октября. Прежде чем спрашивать о дне, переведите время с помощью JpServerToJst() или используйте JpNowJst().
  • По умолчанию смещение автоматическое: TimeTradeServer() - TimeGMT() в MT5, с округлением до 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);
  }

Правило США: со второго воскресенья марта по первое воскресенье ноября (до 2007 года в США действовали более ранние даты). Правило ЕС: с последнего воскресенья марта по последнее воскресенье октября (до 1996 года — по последнее воскресенье сентября). Сервер с GMT+2 зимой и GMT+3 в период летнего времени США — это 7200 с правилом 1. Демо-скрипт показывает текущее смещение вашего сервера; какому летнему времени следует сервер, может сказать ваш брокер. Чтобы в MT5 при реальной работе сохранялось автоматическое смещение, вызывайте функцию установки только тогда, когда MQLInfoInteger(MQL_TESTER) равно true, как это делает пример советника.

Используемые правила и их проверка

  • Закон Японии о государственных праздниках с поправками: фиксированные даты, праздники в понедельник (День совершеннолетия и День здоровья и спорта — с 2000 года, День моря и День почитания старших — с 2003 года), День гор с 2016 года, День рождения императора по эпохам и перенесённые дни 2020 и 2021 годов.
  • Перенесённый выходной: если государственный праздник выпадает на воскресенье, выходным становится ближайший следующий день, который не является государственным праздником (с 2007 года; до этого — только следующий день).
  • «Народный выходной»: день между двумя государственными праздниками (с 1986 года), например 22 сентября 2026 года.
  • Разовые праздники: 1989-02-24, 1990-11-12, 1993-06-09, 2019-05-01 и 2019-10-22.
  • Дни равноденствия: стандартная приближённая формула, действительная для 1980-2099 годов. Правительство объявляет каждый день равноденствия в феврале предыдущего года.
  • Выходные банков: субботы, воскресенья, государственные праздники и с 31 декабря по 3 января (Закон о банках); текущее правило применяется ко всем годам.
  • Gotobi: если 5-е число пришлось бы перенести в предыдущий месяц, этот день уже является gotobi конца предыдущего месяца и указывается только там. Поэтому в мае 2027 года 5 дней gotobi.
  • Это правила, действовавшие на момент выпуска версии 1.00 (октябрь 2026 года).

Дни gotobi 2026 и 2027 годов из демо-скрипта; * = перенесено на предыдущий рабочий день

Проверки перед выпуском: обе версии компилируются с 0 ошибок и 0 предупреждений; версия для MT4 собрана из того же исходного кода (отличается только функция времени). Все 789 государственных праздников с 1980 по 2027 год день в день совпадают со списком Кабинета министров Японии; сейчас этот список заканчивается 2027 годом. Формула равноденствия даёт официальную дату во всех годах до 2027 и совпадает с астрономическим расчётом во всех годах до 2099. Импорт по пути Маркета загружается и в тестере стратегий.

Вопросы разработчиков

  • Моя программа останавливается с ошибкой, связанной с библиотекой. Проверьте, что библиотека установлена и что строка #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 и приложите используемый код и последние строки вкладки «Эксперты».

Download Japan Bank Holiday and Gotobi Library from MQL5 Market