Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 244
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Этот скрипт представляет функцию TimeServerDaylightSavings(), отсутствующую среди встроенных, которые предоставляют только TimeDaylightSavings() для локального компьютера. Кроме того, прилагаемый заголовочный mqh-файл содержит некоторые другие полезные функции, связанные с временем на сервере, в частности, позволяющие узнать, использует ли ваш брокер DST-переключатели в целом.
Все это основано на эмпирическом анализе истории котировок от вашего брокера. Вся идея описана в книге по алготрейдингу в разделе о переходе на летнее время (DST ). Вкратце, метод анализирует статистику часов работы недели и выводит GMT смещения вашего брокера. Два ярко выраженных максимума в статистике смещений, если они приходятся на соседние часы, скорее всего, соответствуют стандартному ("зимнему") и летнему ("летнему") времени.
Фактически этот скрипт является доработанной и расширенной версией скрипта, представленного в книге. В частности, в версиях с октября 2024 года исправлена важная ошибка: часы открытия недельных торгов определяются по рынку США, который сам подвержен влиянию перехода на летнее время в соответствии с часовым поясом США (EST, UTC-5, стандартное зимнее время <--> EDT, UTC-4, летнее время), поэтому важно устранить влияние US DST, чтобы получить непрерывное естественное течение времени круглый год - это и было сделано в исправлении. Вся заслуга в этом принадлежит amrali.

Обратите внимание, что в Северном и Южном полушариях часовые пояса корректируются в обратном направлении: в Северном полушарии 1 час прибавляется к "весне" (март или апрель) и вычитается к "осени" (октябрь или ноябрь), а в Южном полушарии - наоборот (потому что у них все сезоны поменяны местами).
В связи со спецификой анализа рекомендуется запускать код для наиболее ликвидного тикера Forex, которым обычно является EURUSD.
Вот API:
// Текущая информация о часовом поясе сервера и DST struct ServerTimeZone // по истории анализ часов работы в неделю { int offsetGMT; // смещение часового пояса в секундах относительно UTC/GMT для текущей недели int offsetDST; // Поправка на суточное время в секундах (включена в offsetGMT, согласно MQL5) bool supportDST; // Изменения ГВС определяются в котировках }; // Оцениваем часовой пояс сервера и режим DST из истории котировок H1 ServerTimeZone TimeServerZone( const datetime srvtime = 0, // по умолчанию текущее время, но можно указать момент в прошлом const int threshold = THRESHOLD, const double lookupYears = 0.0, // по умолчанию, все доступные бары, иначе 3 года кажется достаточно const string symbol = NULL) // по умолчанию, символ текущего графика // Оценка времени сервера с поправкой на режим DST (в секундах) int TimeServerDaylightSavings(const datetime srvtime = 0, const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // Оценка смещения часового пояса сервера (в секундах) int TimeServerGMTOffsetHistory(const datetime srvtime = 0, const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // Оцениваем, поддерживает ли сервер DST (true/false) bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0, const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // Аналог функции TimeGMTOffset() для торгового сервера, разница в секундах int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer()
Функции TimeServerDaylightSavings(), TimeServerGMTOffsetHistory(), TimeServerDaylightSavingsSupported() являются лишь обертками для TimeServerZone(), поэтому если вам нужно более одной характеристики, то предпочтительнее использовать более позднюю и читать значения из структуры ServerTimeZone.
Все эти функции принимают в качестве 1-го аргумента серверное время, по которому вы хотите получить соответствующую характеристику (в настоящем или в прошлом). Если серверное время оставить равным 0 (по умолчанию), то результат будет возвращен для текущего момента.
2-й аргумент threshold позволяет настроить чувствительность алгоритмов. По умолчанию он равен 52/4, то есть четверть года необходимой статистики для принятия решения (определение часового пояса без возможного вмешательства коротких недель до/после праздников). С другой стороны, такие настройки не позволяют оперативно определять смену часового пояса (если ваш брокер решит это сделать в какой-то момент). Вы можете установить порог в 0, чтобы алгоритмы могли обнаружить любые изменения как можно быстрее.
Функция TimeServerGMTOffset() не использует анализ истории, а рассчитывает смещение непосредственно через функции MQL5 (как TimeGMT() - TimeTradeServer()).
Обратите внимание, что данная функция использует ту же нотацию смещения, что и встроенная в MQL5 функция TimeGMTOffset(), то есть положительные часовые пояса, такие как GMT+3, обозначаются отрицательными смещениями, такими как -10800, и наоборот. Эта нотация используется и в некоторых других языках программирования, например в JaveScript, но есть и другие языки, которые обозначают положительные часовые пояса положительными смещениями, а отрицательные - отрицательными смещениями. Внимательно проверяйте свои алгоритмы.
Например, тестовый скрипт выводит все полученные данные в журнал:
1 ~ Built-in functions ~ TimeLocal()=2024.10.05 00:39:01 / ok TimeCurrent()=2024.10.05 00:38:59 / ok TimeTradeServer()=2024.10.05 00:39:01 / ok TimeGMT()=2024.10.04 21:39:01 / ok TimeGMTOffset()=-10800 / ok TimeDaylightSavings()=0 / ok 2 ~ Add-on over built-in functions ~ TimeServerGMTOffset()=-10800 / ok 3 ~ Estimation of server TZ with DST based on week opening hours in history ~ TimeServerDaylightSavings()=-3600 / ok [offsetGMT] [offsetDST] [supportDST] [0] -10800 -3600 true
В данном случае обнаружено, что сервер в данный момент находится в режиме DST, а локальный компьютер - нет.
Пожалуйста, помните, что системные часы локального компьютера и сервера могут показывать немного разное время (секунды и даже минуты), даже если они находятся в одном часовом поясе. Также обратите внимание, что встроенная функция TimeTradeServer() возвращает синтетическое время: это время сервера с почасовой точностью, но внутричасовые доли оно наследует от локальных часов. Это сделано в MQL5 для упрощения конвертации между часовыми поясами - TimeLocal(), TimeGMT() возвращаются также в "местном формате", а время торгового сервера.
Включить подробную печать анализируемых данных можно с помощью директивы препроцессора:
#define PRINT_DST_DETAILS , которую необходимо поместить в код перед include:
#include "TimeServerDST.mqh"
Вот пример подробной информации в журнале:
Got 20023 H1 bars, ~834 days Week opening hours stats: 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 54 0 Time Zone changes (UTC±X before/after weekstart): [weekstart] [before] [DSTb] [after] [DSTa] [0] 2021.07.25 00:00:00 -2147483648 false -1 false [1] 2021.11.08 00:00:00 0 true 0 false [2] 2022.03.14 00:00:00 0 false 0 true [3] 2022.11.07 00:00:00 0 true 0 false [4] 2023.03.13 00:00:00 0 false 0 true [5] 2023.11.06 00:00:00 0 true 0 false [6] 2024.03.11 00:00:00 0 false 2 false 3 different timezones detected in quotes, 1 DST candidates Server time offset: UTC+2 STD TimeServerDaylightSavings()=-3600 / ok
Пожалуйста, не стесняйтесь запускать скрипт в своих средах и публиковать полученные логи в обсуждении.
Обновления
2024.10.10 - исправление ошибки: Переключатели US DST (которые влияли на статистику часов работы) удалены из временной шкалы перед основным анализом.
2024.10.27 - интересующее время сервера и минимальный недельный порог статистики добавлены в качестве аргументов для всех функций; TimeServerGMTOffsetEmpiric() переименована в TimeServerGMTOffsetHistory().
2024.10.29 - исправлена небольшая ошибка, связанная с включением запрашиваемого времени в период поиска.
2024.10.30 - исправлен DST в массиве TimeZoneChange; поиск теперь выполняется по параметру srvtime, если он указан.
2024.11.01 - добавлена автокорректировка расчетов при применении к драгоценным металлам, что может обеспечить более надежные результаты в недели, когда графики US DST и EU DST не синхронизированы.
2024.11.04 - улучшено онлайн-определение включения/выключения DST.
2024.11.07 - добавлено кэширование изменений часового пояса/DST для массовых запросов на истории для бэктестинга индикаторов или экономических событий.
2024.11.08 - оптимизирована производительность кэширования за счет небольшого рефакторинга кода.
2024.11.16 - корректировка на 1 час для временных меток, вычисленных из металлов с помощью amrali.
2024.11.17 - рефакторинг и исправления от amrali: устранено перестроение кэша для онлайн-запросов в выходные дни, добавлено 48-часовое опережение для обнаружения изменений TZ в выходные дни (с возможным переходом на DST), воскресенье 00:00 используется как граница для часовых поясов (вместо 1-го бара недели).
2024.11.20 - порог по умолчанию изменен на 1 (баланс между оперативным обнаружением смены часовых поясов и устранением ложных срабатываний в нестандартные недели, например после праздников); добавлен новый набор функций для форматирования времени, включая смещения часовых поясов и DST (смотрите TimeZoneFmt.mqh); другие мелкие доработки.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/52557
Simplest Logger class for MetaTrader 5
Простейший класс для ведения журнала в MetaTrader 5 с поддержкой уровней, формата сообщений, фильтров включения и исключения подстрок.
Renko_Subwindow_ATRTrend
Комбинация многих известных показателей
Custom crosshair cursor with synchronization
Синхронизированный пользовательский индикатор перекрестия, показывающий цену и (серверное/местное) время.
Perfect Seconds Chart
Индикатор Perfect Seconds позволяет конвертировать минутные свечи живых данных в секунды. 1. Выберите любое количество секунд для закрытия бара с точным временем. 2. Это живые данные, основанные на тарифах OHLC, он работает, даже если тики недоступны. 3. Не требует внешних DLL, работает на VPS 4. Быстрый и оптимизированный код 5. Поддерживает криптовалютные пары, такие как BInance, Kucoin и все другие биржи, где живой график фьючерсов может быть легко преобразован в секунды. 6. Поддержка всех типов символов, таких как золото и пары Forex. 7. Возможность удаления символов и курсов.