Rigal Опубликовано 2 января, 2020 Поделиться [Библиотека] Trade Time Опубликовано 2 января, 2020 (изменено) Внимание! Добавлена новая версия библиотеки, 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 Изменено 27 сентября, 2020 пользователем Rigal новая библиотека TradeTimeFull 7 8 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 4 января, 2020 Автор Поделиться [Библиотека] Trade Time Опубликовано 4 января, 2020 пока ковырялся с настройками Генерика, поймал забавный баг реализации в библиотеке: 24:00 неправильно интерпретировалось, как 23:00 С одной стороны, это правильно: нет такого времени в сутках. С другой - при задании интервалов, 22:00-24:00 звучит вполне осмысленно. Поправил, перезалил в шапку. 1 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 4 января, 2020 Автор Поделиться [Библиотека] Trade Time Опубликовано 4 января, 2020 Послушался совета бывалого @Rever27 и переписал обращение к серверу wordclock, чтобы не нужно было прописывать URL в терминале. Теперь, правда, нужно включить DLL. Перезалил в шапку 1 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 6 января, 2020 Автор Поделиться [Библиотека] Trade Time Опубликовано 6 января, 2020 Обнаружилось, что в основном файле я зачем-то ссылался на вспомогательные библиотечки, которые в действительности не используются. Видимо, последствия каких-то копипастов. Вычистил, перезалил. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 23 марта, 2020 Автор Поделиться [Библиотека] Trade Time Опубликовано 23 марта, 2020 @Viktor Frolov (просто по последней реакции) - в этой версии есть несколько ошибок. Я загружу новую, но уже завтра, ночь у меня глубокая. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 24 марта, 2020 Автор Поделиться [Библиотека] Trade Time Опубликовано 24 марта, 2020 (изменено) Перезалил, перекачайте В качестве приложения - 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 Изменено 24 марта, 2020 пользователем Rigal 3 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 27 сентября, 2020 Автор Поделиться [Библиотека] Trade Time Опубликовано 27 сентября, 2020 В шапку добавлена новая версия библиотеки, TradeTimeFull Реализованы все возможные финтифлюшки: поддержка множества интервалов внутри дня возможность задать разное расписание в разные дни возможность задать разное расписание зимой и летом есть встроенная поддержка оптимизации добавочного интервала переходы на летнее время и обратно обход ролловера автоопределение GMT с синхронизацией по стороннему серверу (через ДЛЛ и через WebRequest по выбору разработчика) задание расписания в произвольном часовом поясе с произвольным контрактом перехода на летнее время обход рождества обход определенных месяцев в году все настройки, которые требуются, изолированы в подключаемый файл, то есть всю библиотеку вместе с настройками можно включить одним include statement Все это оптимизировано с точки зрения скорости выключения, есть удобные флажки "торговать круглосуточно" (который очень быстро считается), "торговать летом по зимнему расписанию" В целом, все, что может захотеться от библиотеки расчета времени. В архиве присутствует руководство PDF по настройкам и пример подключения в советника (без реализации торговых функций, но с комментариями на экране) 5 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 20 сентября, 2021 Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 @Rigal https://www.mql5.com/ru/forum/170952/page209#comment_24726214 Игорь, что думаеш на счет этого комментария? Удасться автоматически определить DST ? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 20 сентября, 2021 Автор Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 2 минуты назад, ademen сказал: @Rigal https://www.mql5.com/ru/forum/170952/page209#comment_24726214 Игорь, что думаеш на счет этого комментария? Удасться автоматически определить DST ? Я с уважением отношусь к разработкам fxsaber, мсье понимает толк в извращениях - и, в частности, использую его реализацию синхронного интерфейса общения с системой ордеров МТ5 в стиле МТ4, помогло мне безболезненно перенести почти весь мой код в кросс-платформенную плоскость. Но, если честно, в этом случае - из пушки по воробьям. Механизм довольно затратный, кроме того, позволяет определить, когда был ролловер на прошедшей неделе, а не на текущей - и мы, получается, будем разъезжаться с реальным ролловером как минимум на неделю В целом, кстати, нестандартный способ определения GMT, я присмотрюсь. А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда. Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 20 сентября, 2021 Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 1 минуту назад, Rigal сказал: Я с уважением отношусь к разработкам fxsaber, мсье понимает толк в извращениях - и, в частности, использую его реализацию синхронного интерфейса общения с системой ордеров МТ5 в стиле МТ4, помогло мне безболезненно перенести почти весь мой код в кросс-платформенную плоскость. Но, если честно, в этом случае - из пушки по воробьям. Механизм довольно затратный, кроме того, позволяет определить, когда был ролловер на прошедшей неделе, а не на текущей - и мы, получается, будем разъезжаться с реальным ролловером как минимум на неделю В целом, кстати, нестандартный способ определения GMT, я присмотрюсь. А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда. https://www.mql5.com/ru/forum/170952/page209#comment_24703987 У коллеги @fxsaber код в разы короче на определения GMT, было бы интересно услышать твое мнение. Проще - надежнее? Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 20 сентября, 2021 Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 6 минут назад, Rigal сказал: А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда. @Rigal, тяжело узнать, а не проставить. Из 3х брокеров где я спрашивал у поддержки - ответили 0 брокеров. @pavlus777, может найдешь где-то в уголку сайта место для таблицы с типами переходами на летнее время разных брокеров? Как раз скоро будет переход на зимнее, можно пропросить коллегу @Rigal написать простой индикатор для определения, и коллегу @Мерлин попросить поставить индикатор на терминалы от разных брокеров. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
pavlus777 Опубликовано 20 сентября, 2021 Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 1 минуту назад, ademen сказал: @pavlus777, может найдешь где-то в уголку сайта место для таблицы с типами переходами на летнее время разных брокеров? Как раз скоро будет переход на зимнее, можно пропросить коллегу @Rigal написать простой индикатор для определения, и коллегу @Мерлин попросить поставить индикатор на терминалы от разных брокеров. Я бы с удовольствием мини-статью такую сделал. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 20 сентября, 2021 Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 2 минуты назад, pavlus777 сказал: Я бы с удовольствием мини-статью такую сделал. Паша, это очень переплетено с тестированием, и оптимизацией. Я бы сначала собрал данные и потом включил их в статью об оптимизации и тестировании советников, если делать мини статью отдельно, много не поймут что к чему, имхо. Так же эти данные будут полезные в статьи о TDS2, которая уже есть на сайте. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 20 сентября, 2021 Автор Поделиться [Библиотека] Trade Time Опубликовано 20 сентября, 2021 Я могу написать коротенький скриптец (пользуясь наработками fxsaber), который бы позволил для брокера определить. С автоопределением DST проблема на боевой машине будет в том, что будет нужна история на минутках прошлого года, чтобы автоматически определить контракт предстоящего перехода - чего никто из нас явно не может себе позволить в метатрейдере, слишком ресурсоемко. А пробежаться в тестере по барам и определить, что у заданного брокера за контракт - это запросто. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 4 февраля, 2022 Поделиться [Библиотека] Trade Time Опубликовано 4 февраля, 2022 Попробовал оптимизировать версию под мт5, что бы быблиотека была кросплатформенная Эти библиотеки нужно запустить вместе: MT4Orders.mqh KimIVToMT5.mqh Новая версия времени Time.rar 2 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
ademen Опубликовано 17 февраля, 2022 Поделиться [Библиотека] Trade Time Опубликовано 17 февраля, 2022 В 20.09.2021 в 19:38, Rigal сказал: Механизм довольно затратный, кроме того, позволяет определить, когда был ролловер на прошедшей неделе, а не на текущей - и мы, получается, будем разъезжаться с реальным ролловером как минимум на неделю В целом, кстати, нестандартный способ определения GMT, я присмотрюсь. А вот DST контракт я бы оставил настройкой - ну это реально несложно проставить один раз и он будет работать всегда. @Rigal недавно попалась статья, где насколько я понял, уже реализованое автоматическое определения DST Возможно пригодиться для будущего развития столь интересной библиотеки, учитывая то что у некоторых брокерах узнать какой тип перехода та еще задача. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти