Перейти к содержанию

[Библиотека] Trade Time


Rigal

Рекомендуемые сообщения

[Библиотека] Trade Time Опубликовано (изменено)

Внимание!

Добавлена новая версия библиотеки, 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

 

Если есть конструктивные пожелания - я попытаюсь выкроить время на поддержку.

Всем профитов!

 

 

 

 

TimeLib.zip

TradeTimeFull.zip

Изменено пользователем Rigal
новая библиотека TradeTimeFull
  • Лайк 7
  • Спасибо 8
  • Огонь! 2
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Trade Time Опубликовано

пока ковырялся с настройками Генерика, поймал забавный баг реализации в библиотеке: 24:00 неправильно интерпретировалось, как 23:00

С одной стороны, это правильно: нет такого времени в сутках.

С другой - при задании интервалов, 22:00-24:00 звучит вполне осмысленно.

Поправил, перезалил в шапку.

  • Лайк 1
  • Спасибо 2
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Trade Time Опубликовано

Послушался совета бывалого @Rever27 и переписал обращение к серверу wordclock, чтобы не нужно было прописывать URL в терминале.

Теперь, правда, нужно включить DLL.

Перезалил в шапку

  • Лайк 1
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Trade Time Опубликовано

Обнаружилось, что в основном файле я зачем-то ссылался на вспомогательные библиотечки, которые в действительности не используются.

Видимо, последствия каких-то копипастов.

Вычистил, перезалил.

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

  • 2 months later...
[Библиотека] Trade Time Опубликовано

@Viktor Frolov (просто по последней реакции) - в этой версии есть несколько ошибок.

Я загружу новую, но уже завтра, ночь у меня глубокая.

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Trade Time Опубликовано (изменено)

Перезалил, перекачайте

В качестве приложения - SwapFilter.

Ему можно задать, как вы хотите избегать свопов: тройного отрицательного, отрицательного всегда, или не избегать.

Для этого вставьте строчку

#include <SwapFilter.mqh>

в то место, где вы хотите, чтобы появилась его единственная настройка выбора режима фильтрации.

После этого создать объект фильтра, например, так:

SwapFilter swapFilter(180); //в качестве параметра принимает, сколько минут живет ваш ордер - чтобы за это время до соответствующего ролловера запретить открытие. 

Но лучше так:

SwapFilter* swapFilter

void OnInit() {

    swapFilter = new SwapFilter(180);

    ...

}

void OnDeinit() {

    if(CheckPointer(swapFilter) == POINTER_DYNAMIC)

        delete (swapFilter);

    ....

}

Преимущество второго способа перед первым в том, что при, например, обновлении параметров советника, первая реализация не подхватит новое количество минут, если оно поменялось. А вторая - подхватит. (минутка перфекционизма, извините).

После этого в удобном месте в коде можно проверить, разрешено ли сейчас открываться в определенную сторону:

if(swapFilter.IsAllowed(OP_BUY))

    OrderSend(OP_BUY....

SwapFilter.mqh

Изменено пользователем Rigal
  • Лайк 3
  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

В шапку добавлена новая версия библиотеки, TradeTimeFull

Реализованы все возможные финтифлюшки:

  • поддержка множества интервалов внутри дня
  • возможность задать разное расписание в разные дни
  • возможность задать разное расписание зимой и летом
  • есть встроенная поддержка оптимизации добавочного интервала
  • переходы на летнее время и обратно
  • обход ролловера
  • автоопределение GMT с синхронизацией по стороннему серверу (через ДЛЛ и через WebRequest по выбору разработчика)
  • задание расписания в произвольном часовом поясе с произвольным контрактом перехода на летнее время
  • обход рождества
  • обход определенных месяцев в году
  • все настройки, которые требуются, изолированы в подключаемый файл, то есть всю библиотеку вместе с настройками можно включить одним include statement

 

Все это оптимизировано с точки зрения скорости выключения, есть удобные флажки "торговать круглосуточно" (который очень быстро считается), "торговать летом по зимнему расписанию"

В целом, все, что может захотеться от библиотеки расчета времени.

 

В архиве присутствует руководство PDF по настройкам и пример подключения в советника (без реализации торговых функций, но с комментариями на экране)

 

  • Лайк 5
  • Спасибо 2
Ссылка на сообщение
Поделиться на другие сайты

  • 11 months later...

@Rigal

https://www.mql5.com/ru/forum/170952/page209#comment_24726214

Игорь, что думаеш на счет этого комментария? Удасться автоматически определить DST ? 

Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, ademen сказал:

@Rigal

https://www.mql5.com/ru/forum/170952/page209#comment_24726214

Игорь, что думаеш на счет этого комментария? Удасться автоматически определить DST ? 

Я с уважением отношусь к разработкам fxsaber, мсье понимает толк в извращениях - и, в частности, использую его реализацию синхронного интерфейса общения с системой ордеров МТ5 в стиле МТ4, помогло мне безболезненно перенести почти весь мой код в кросс-платформенную плоскость.

Но, если честно, в этом случае - из пушки по воробьям.

Механизм довольно затратный, кроме того, позволяет определить, когда был ролловер на прошедшей неделе, а не на текущей - и мы, получается, будем разъезжаться с реальным ролловером как минимум на неделю

В целом, кстати, нестандартный способ определения GMT, я присмотрюсь.

А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда.

Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Rigal сказал:

Я с уважением отношусь к разработкам fxsaber, мсье понимает толк в извращениях - и, в частности, использую его реализацию синхронного интерфейса общения с системой ордеров МТ5 в стиле МТ4, помогло мне безболезненно перенести почти весь мой код в кросс-платформенную плоскость.

Но, если честно, в этом случае - из пушки по воробьям.

Механизм довольно затратный, кроме того, позволяет определить, когда был ролловер на прошедшей неделе, а не на текущей - и мы, получается, будем разъезжаться с реальным ролловером как минимум на неделю

В целом, кстати, нестандартный способ определения GMT, я присмотрюсь.

А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда.

https://www.mql5.com/ru/forum/170952/page209#comment_24703987

У коллеги @fxsaber код в разы короче на определения GMT, было бы интересно услышать твое мнение.

Проще - надежнее?

Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Rigal сказал:

А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда.

@Rigal, тяжело узнать, а не проставить. 

Из 3х брокеров где я спрашивал у поддержки - ответили 0 брокеров.

 

@pavlus777, может найдешь где-то в уголку сайта  место для таблицы с типами переходами на летнее время разных брокеров? 

Как раз скоро будет переход на зимнее, можно пропросить коллегу @Rigal написать простой индикатор для определения, и коллегу @Мерлин попросить поставить индикатор на терминалы от разных брокеров.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, ademen сказал:

 

@pavlus777, может найдешь где-то в уголку сайта  место для таблицы с типами переходами на летнее время разных брокеров? 

Как раз скоро будет переход на зимнее, можно пропросить коллегу @Rigal написать простой индикатор для определения, и коллегу @Мерлин попросить поставить индикатор на терминалы от разных брокеров.

Я бы с удовольствием мини-статью такую сделал. 

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, pavlus777 сказал:

Я бы с удовольствием мини-статью такую сделал. 

Паша, это очень переплетено с тестированием, и оптимизацией. 

Я бы сначала собрал данные и потом включил их в статью об оптимизации и тестировании советников, если делать мини статью отдельно, много не поймут что к чему, имхо.

Так же эти данные будут полезные в статьи о TDS2, которая уже есть на сайте. 

Ссылка на сообщение
Поделиться на другие сайты

Я могу написать коротенький скриптец (пользуясь наработками fxsaber), который бы позволил для брокера определить.

С автоопределением DST проблема на боевой машине будет в том, что будет нужна история на минутках прошлого года, чтобы автоматически определить контракт предстоящего перехода - чего никто из нас явно не может себе позволить в метатрейдере, слишком ресурсоемко.

А пробежаться в тестере по барам и определить, что у заданного брокера за контракт - это запросто.

 

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

  • 4 months later...

Попробовал оптимизировать версию под мт5, что бы быблиотека была кросплатформенная

Эти библиотеки нужно запустить вместе:

MT4Orders.mqh

KimIVToMT5.mqh

Новая версия времени

Time.rar

  • Лайк 2
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
В 20.09.2021 в 19:38, Rigal сказал:

Механизм довольно затратный, кроме того, позволяет определить, когда был ролловер на прошедшей неделе, а не на текущей - и мы, получается, будем разъезжаться с реальным ролловером как минимум на неделю

В целом, кстати, нестандартный способ определения GMT, я присмотрюсь.

А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда.

@Rigal недавно попалась статья, где насколько я понял, уже реализованое автоматическое определения DST

Возможно пригодиться для будущего развития столь интересной библиотеки, учитывая то что у некоторых брокерах узнать какой тип перехода та еще задача.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...