Внимание!
Добавлена новая версия библиотеки, TradeTimeFull
Реализованы все возможные финтифлюшки:
- поддержка множества интервалов внутри дня
- возможность задать разное расписание в разные дни
- возможность задать разное расписание зимой и летом
- есть встроенная поддержка оптимизации добавочного интервала
- переходы на летнее время и обратно
- обход ролловера
- автоопределение GMT с синхронизацией по стороннему серверу (через ДЛЛ и через WebRequest по выбору разработчика)
- задание расписания в произвольном часовом поясе с произвольным контрактом перехода на летнее время
- обход рождества
- обход определенных месяцев в году
- все настройки, которые требуются, изолированы в подключаемый файл, то есть всю библиотеку вместе с настройками можно включить одним include statement
Все это оптимизировано с точки зрения скорости выключения, есть удобные флажки "торговать круглосуточно" (который очень быстро считается), "торговать летом по зимнему расписанию"
В целом, все, что может захотеться от библиотеки расчета времени.
В архиве присутствует руководство PDF по настройкам и пример подключения в советника (без реализации торговых функций, но с комментариями на экране)
Ниже - описание первой версии
>>>>>>>>>>>>>>>>>
В некоторых торговых стратегиях мы выбираем определенный интервал времени для торговли.
Или набор интервалов.
Связано это с какими-то событиями, которые происходят непосредственно до, во время, или после этого интервала.
Эти события привязаны к определенной временной зоне, с ее переходами на летнее и зимнее время и все вот это вот - в то время, как ваш брокер может потенциально придерживаться других контрактов в вопросах DST и, кроме того, находится в совсем другой временной зоне.
Я искренне считаю, что для правильной реализации таких стратегий нужно указывать временные интервалы в координатах тех событий, к которым мы хотим привязываться.
Я написал библиотечку, которая принимает торговые интервалы в выбранной вами таймзоне, с определенным контрактом перехода на DST, а так же умеет автоматически определять, какой контракт у вашего брокера.
Поскольку в тесте это определить нельзя, для теста нужно указать вручную, каков зимний GMT Offset вашего брокера и каков контракт DST.
Для Альпари, например, контракт европейский, то есть, они переходят на летнее время в последнее воскресенье марта и обратно в последнее воскресенье октября (поэтому Альпари будет на час ближе к Нью-Йорку последние пару недель марта и около недели в конце октября - начале ноября)
Tickmill придерживается американского стандарта.
Ну и есть еще выродки, вроде IG Markets, которые вообще никуда на лето не ходят, потому, что у них бОльшая часть operations сосредоточена вблизи экватора, где большинство стран не знают, что такое DST и нафига он нужен.
Вы выбираете целевой рынок (например, американский, как в нашем скальпере), задаете смещение от GMT и контракт DST этого целевого рынка. Этот выбор можно оставить пользователю, или спрятать в реализации конкретного советника, если советник нацелен на определенный, заранее известный рынок.
После этого все торговые интервалы указываете во времени вашего целевого рынка.
Для теста нужно указать GMT Offset и DST контракт вашего брокера (или что вы выбрали в настройках ТДС2).
Ролловер
Ролловер это понятие с внятным временем, он случается на закрытии нью-йорка в 5pm EST.
Поэтому задавать время ролловера не надо. Можно задать, за сколько минут до, и сколько минут после действует фриз, и что вы хотите запретить в период фриза: открытие, закрытие.
Это все будет посчитано и отдано в советник в удобной для разработчика форме.
Ну и много еще плюшек.
Например, можно указать много интервалов, через запятую (например, "15:00-16:00,19:00-21:00"), библиотечка считает, сколько минут прошло с последней сессии, сколько осталось до следующей, сколько до конца текущей - практически любая логика советника, связанная с обсчетом времени, должна легко портироваться. Раздельно указываются сессии по дням недели.
Важно:
Формат интервала строго hh:mm-hh:mm, никаких пробелов, в том числе после запятых.
1:00-15:00 - неправильно. Правильно 01:00-15:00
Интервал считается интервалом понедельника, если он начинается в понедельник!
То есть, если для понедельника вы указали интервал с 23:00 до 02:00 - это значит, вы хотите, чтобы советние торговал с 11 вечера понедельника до 2 утра вторника (в выбранном вами часовом поясе).
Поскольку по американскому времени рынок открывается в 5 часов дня в воскресенье, в список дней добавлено воскресенье.
Как с этим работать:
В приложении три файла:
Include/TradeTimeImpl.mqh - сама библиотека. В ней объявлены все необходимые классы и структуры. Для работы с библиотекой нужно создать экземпляр класса TradeTimeStatus и отдать ему все параметры.
Например, так:
TradeTimeManager tradeTimeManager(SUNDAY_TradeIntervals, MONDAY_TradeIntervals, TUESDAY_TradeIntervals, WEDNESDAY_TradeIntervals, THURSDAY_TradeIntervals, FRIDAY_TradeIntervals, BrokerGMTOffsetWinter, BrokerDstMode, TargetGMTOffsetWinter, TargetDSTMode, OpenOrdersInRollover, CloseOrdersInRollover, FreezeMinutesBeforeRollover, FreezeMinutesAfterRollover);
После этого можно воспользоваться одним из трех публичных методов этого класса:
- GetLiveGMTOffset возвращает автоматически определенный сдвиг вашего брокера от GMT. Нужно разве что для отображения на экране, косметическая функция
- GetTradeTimeStruct - возвращает структуру, содержащую три времени: GMT, EST (обязательно вычисляется для определения времени ролловера) и target - время в вашем целевом рынке. Вспомогательный метод, структура также включена в результат следующего вызова
-
GetTradeTimeStatus - основная функция. Есть смысл вызывать раз на тике и переиспользовать результат вызова в советнике, ибо он содержит всю необходимую информацию, а именно:
- bool isTradingSessionActive - активна ли одна из торговых сессий
- bool isRollover - находимся ли мы в зоне заморозки ролловера
- bool isOpenAllowed - разрешено ли открытие (комбинация активной торговой сессии и настроек ролловера. Вне сессии false, внутри сессии true, за исключением ролловера. Внутри ролловера - зависит от соответствующего ограничения ролловера)
- bool isCloseAllowed - разрешено ли закрытие (Вне ролловера - true. Внутри ролловера - зависит от соответствующего ограничения ролловера)
- int activeSessionWeekDay - информационный элемент, сессия какого дня активна сейчас. 0 - воскресенье. -1, если сессия не активна.
- int minutesSinceSessionFinished - сколько минут прошло с окончания последней сессии (считается независимо от того, торговал советник в эту сессию, или нет). 0 когда сессия активна
- int minutesToSessionFinish - сколько минут до конца текущей сессии. 0 когда сессия не активна
- int minutesToNextSession - сколько минут до следующей сессии. 0 когда сессия активна
- TradeTimeStruct tradeTimeStruct - вышеупомянутая структура, содержащая три времени: GMT, EST, target
Include/TradeTimeEng.mqh - еще один подключаемый файл, в котором собраны все настройки и инициализация TradeTimeManager. Настройки на английском, можно создать TradeTimeRus по образу и подобию и использовать его. Если вы хотите отдать пользователю контроль за всеми настройками библиотеки, достаточно подключить этот файл и можно сразу обращаться к инициализированному в нем экземпляру tradeTimeManager, удобно и минимум хлопот. Если хочется более тонкой настройки, параметры и инициализацию можно скопировать из этого файла в советник и докрутить по вкусу.
Experts/SandboxTime.mq4 - пример советника, использующего библиотеку. Все, что он делает - это пишет большинство параметров в коммент на чарте, вычисляя разницы во времени и т д. Позволяет визуально протестировать логику: выберите разные контракты DST для брокера и целевого рынка и понаблюдайте, как разница во времени меняется вокруг середины-конца марта и конца октября-начала ноября.
Заодно задайте ему множество интервалов и посмотрите, как он справляется с вычислением минут до и после.
Напоследок покрутите его вокруг ролловера - он пишет, чего и когда он замораживает.
Библиотечка проверяет осмысленность ваших настроек при запуске, используя открытый API от worldclock.com
Вам нужно будет разрешить советникам/индикаторам, подключающим библиотеку, загружать DLL.
Вот полный URL, к которому он обращается: http://worldclockapi.com/api/json/gmt/now
Если есть конструктивные пожелания - я попытаюсь выкроить время на поддержку.
Всем профитов!
