Meridian Session Clock
- Библиотеки
-
Syarief Azman Bin Rosli
Здравствуйте и добро пожаловать в мой официальный профиль MQL5!
Меня зовут Шариф Азман Бин Росли (Syarief Azman Bin Rosli). Я разработчик алгоритмических торговых систем и количественный инженер с более чем десятилетним опытом создания надежных решений для MetaTrader 5 и MetaTrader 4. - Версия: 1.0
- Активации: 5
Библиотека времени для MQL4: корректные с учётом летнего времени преобразования между UTC и 12 часовыми поясами, модель часов сервера вашего брокера (определяется автоматически по истории цен), сессии Sydney, Tokyo, London и New York и ваши собственные, с состоянием «открыта», временем начала и конца и диапазоном OHLC, торговый день FX и выходные. В отличие от TimeGMT() даёт в тестере стратегий те же ответы, что и в реальной торговле. Никогда не торгует, ничего не рисует и не пишет файлы. Вы получаете скомпилированный Meridian_Session_Clock.ex4; эта страница - полный справочник API.
Быстрый старт
- Скопируйте Meridian_Session_Clock.ex4 в MQL4/Libraries (Файл > Открыть каталог данных).
- Вставьте блок #import ниже в ваш советник, индикатор или скрипт.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), или MSC_SetBroker(MSC_US_DST, 120), если вы знаете часы сервера.
- Используйте время сервера (TimeCurrent(), Time[i]): MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Проверка: запустите пример ниже в тестере стратегий; журнал на каждом баре выводит определённую модель и часы London.
Объявление импорта (готово к копированию)
#import "Meridian_Session_Clock.ex4"
int MSC_ZoneOffset(int zone, datetime utc);
bool MSC_IsDST(int zone, datetime utc);
datetime MSC_ToZone(datetime utc, int zone);
datetime MSC_FromZone(datetime local, int zone);
datetime MSC_NextChange(int zone, datetime utc);
string MSC_ZoneName(int zone);
bool MSC_SetBroker(int model, int base_minutes);
int MSC_DetectBroker(string symbol, int weeks, int &base_minutes, double &confidence, int &weeks_used);
int MSC_BrokerOffset(datetime utc);
datetime MSC_ServerToUTC(datetime server_time);
datetime MSC_UTCToServer(datetime utc);
int MSC_SessionAdd(int zone, int start_minute, int end_minute, int days_mask);
void MSC_SessionClear();
string MSC_SessionName(int session);
bool MSC_SessionIsOpen(int session, datetime server_time);
datetime MSC_SessionStart(int session, datetime server_time, int index);
datetime MSC_SessionEnd(int session, datetime server_time, int index);
int MSC_SessionRange(string symbol, int timeframe, int session, datetime server_time, int index, double &result[]);
datetime MSC_TradingDayStart(datetime server_time);
bool MSC_IsWeekend(datetime server_time);
int MSC_LastError();
string MSC_ErrorText(int code);
#import
enum MSC_ZONE { MSC_UTC, MSC_LONDON, MSC_FRANKFURT, MSC_ATHENS, MSC_MOSCOW, MSC_DUBAI, MSC_SINGAPORE, MSC_TOKYO,
MSC_SYDNEY, MSC_WELLINGTON, MSC_NEW_YORK, MSC_CHICAGO };
enum MSC_MODEL { MSC_FIXED, MSC_US_DST, MSC_EU_DST };
enum MSC_SESSION { MSC_SYDNEY_SESSION, MSC_TOKYO_SESSION, MSC_LONDON_SESSION, MSC_NEW_YORK_SESSION }; Понятия
- Три вида времени: utc; server (время сервера брокера: TimeCurrent, время баров); local (время на часах в поясе).
- Пояса 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (также Гонконг, Шанхай), Tokyo, Sydney, Wellington, New York, Chicago. Летнее время следует законам каждого пояса с 2000 года, включая изменения США 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 и Moscow 2011 / 2014. Поддерживаются 2000-2099 годы; другие даты считаются по тем же правилам с флагом -2.
- Местное время, пропущенное при переходе на летнее время или повторённое при возврате, читается со смещением, действовавшим до перехода (New York 02:30 в день мартовского перехода = 07:30 UTC; 01:30 в ноябрьский день = 05:30 UTC, первое вхождение).
- Часы брокера = UTC + смещение. Модели: 0 FIXED (база весь год), 1 US DST (база + 60 летом в США: брокеры «New York close», GMT+2 / GMT+3), 2 EU DST (база + 60 летом в Европе). По умолчанию 1 с базой 120.
- Сессии задаются в местном времени пояса, с понедельника по пятницу по дню начала: 0 SYDNEY 07:00-16:00 Sydney, 1 TOKYO 09:00-18:00 Tokyo, 2 LONDON 08:00-17:00 London, 3 NEW YORK 08:00-17:00 New York; собственные id 4-15. Экземпляр длится от начала (включительно) до конца (не включая). index 0 = последний экземпляр, начавшийся в заданное время или раньше (открытый или завершённый), -1 предыдущий, +1 следующий; от -260 до 260.
Справочник API
Все функции обновляют MSC_LastError. Неверные id пояса или сессии дают -1 и 0, false, "UNKNOWN" или -1.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
Смещение пояса от UTC в минутах в момент utc; действует ли летнее время (Moscow 2011-2014, постоянное UTC+4, летним временем не считается); utc + смещение как местное время; местное время обратно в UTC по правилу выше.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange и MSC_ZoneName
Первое изменение смещения после utc (в UTC), 0, если в ближайшие три года изменений нет (UTC, Dubai, Singapore, Tokyo, Moscow после 2014). Название пояса, как в списке выше.
MSC_SetBroker
model 0-2, base_minutes от -720 до 840 с шагом 15. Иначе false и -1.
MSC_DetectBroker
Читает первый бар H1 после каждого разрыва выходных (36 часов и более) у symbol ("" = символ графика), от новых к старым, до weeks (4-520, 0 = 104). Рынок FX открывается в воскресенье в 17:00 New York, поэтому каждая неделя даёт смещение; побеждают модель и база, подходящие наибольшему числу недель (при равенстве: US DST, затем EU DST, затем FIXED). Возвращает модель и применяет её, если подходят не менее 60% недель; иначе -1 с -5 NOT DETECTED (base_minutes и confidence всё равно заполняются). -3 NO DATA без истории H1. Используйте основную пару FX 24/5: металлы и индексы открываются в воскресенье позже и дают час лишний (XAUUSD в тестах дал базу 180 вместо 120). Берите 52 недели и больше, чтобы попали переходы времени; праздничные недели снижают уверенность. В тестере стратегий видна только история, загруженная тестером (weeks_used сообщает, сколько недель прочитано).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
Смещение сервера в минутах в момент utc; время сервера в UTC (правило выше для часа вокруг перехода); UTC во время сервера.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Добавляет сессию: zone, начало и конец в минутах после местной полуночи (0-1439, разные; конец меньше начала = ночная), days_mask дней начала (бит 0 воскресенье … бит 6 суббота, 62 = понедельник-пятница, 1-127). Возвращает id 4-15 или -1 с -1 или -4 SESSION LIMIT. MSC_SessionClear удаляет собственные сессии (id снова выдаются с 4). Названия: SYDNEY, TOKYO, LONDON, NEW YORK, CUSTOM n.
int fra = MSC_SessionAdd(MSC_FRANKFURT, 7 * 60, 15 * 60 + 30, 62); // 07:00-15:30 Frankfurt
MSC_SessionIsOpen, MSC_SessionStart, MSC_SessionEnd
Содержит ли экземпляр 0 время server_time; время сервера начала или конца экземпляра index. 0 при ошибке.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
OHLC экземпляра index по барам symbol ("" = график) на timeframe (0 = график; M1, M5, M15, M30 или H1), время открытия которых внутри экземпляра. result[] получает 7 значений: 0 открытие, 1 максимум, 2 минимум, 3 закрытие, 4 время первого бара на максимуме, 5 время первого бара на минимуме, 6 число баров. Возвращает число баров; 0 с -3 NO DATA, если внутри нет баров; -1 при неверных timeframe, сессии или index. Идущий экземпляр использует уже сформированные бары.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart и MSC_IsWeekend
Время сервера последних 17:00 New York в момент server_time или раньше (начало дня FX). Выходные = с пятницы 17:00 до воскресенья 17:00 New York.
MSC_LastError и MSC_ErrorText
Код последнего вызова; текст: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, иначе UNKNOWN.
Рабочий пример интеграции
Советник; сначала вставьте блок импорта и строки enum выше.
datetime last = 0;
int OnInit()
{
int base, used; double conf;
int m = MSC_DetectBroker("EURUSD", 104, base, conf, used);
if(m < 0) MSC_SetBroker(MSC_US_DST, 120);
PrintFormat("model %d base %d conf %.2f weeks %d: %s", m, base, conf, used, MSC_ErrorText(MSC_LastError()));
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(Time[0] == last) return;
last = Time[0];
datetime now = TimeCurrent();
PrintFormat("London %s - %s server, open %d, FX day since %s, weekend %d",
TimeToString(MSC_SessionStart(MSC_LONDON_SESSION, now, 0)), TimeToString(MSC_SessionEnd(MSC_LONDON_SESSION, now, 0)),
MSC_SessionIsOpen(MSC_LONDON_SESSION, now), TimeToString(MSC_TradingDayStart(now)), MSC_IsWeekend(now));
} Архитектура и примечания
- Чистый расчёт: правила вычисляются, а не ищутся в таблицах, поэтому ничего не загружается. Модель брокера и таблица сессий хранятся отдельно для каждой программы, импортирующей библиотеку.
- MetaTrader 4, любой символ и таймфрейм; советники, индикаторы, скрипты. Безопасна в тестере стратегий и при оптимизации: без DLL, файлов, веб-запросов, графических объектов, таймеров и глобальных переменных. Бары читают только MSC_DetectBroker и MSC_SessionRange.
- Ограничения: 16 сессий (4 встроенные), index экземпляра от -260 до 260, годы 2000-2099.
- Типовые настройки. Фильтр сессии: торговать только пока MSC_SessionIsOpen(MSC_LONDON_SESSION, now). Пробой азиатского диапазона: MSC_SessionRange для MSC_TOKYO_SESSION, index 0, на открытии London (Tokyo в это время ещё открыта). Дневная логика: сброс в MSC_TradingDayStart. Бэктесты: вызывайте MSC_DetectBroker или MSC_SetBroker в OnInit, никогда TimeGMT().
- Скриншоты и видео показывают демонстрационный советник на основе этой библиотеки; он не входит в покупку.
Предупреждение о рисках
Время сессий описывает, когда рынки обычно активны, а не как будут двигаться цены. Проверьте праздничный календарь брокера; сначала тестируйте на демо-счёте.
