Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 241
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Здравствуйте, трейдеры.
Эта библиотека содержит все функции для получения текущего местного времени на определенном или всех рынках Forex. Вы можете конвертировать местное время между часовыми поясами или в серверное время вашего брокера. Вы также можете торговать в определенные сессии, устанавливая время начала и окончания сессии для каждой сессии отдельно. Библиотека позаботится о различных смещениях времени и переходах на летнее время у брокера и на этих рынках. Это избавляет вас от необходимости изобретать колесо каждый раз, когда вы программируете советник или технический индикатор, который должен иметь дело с часовыми поясами и часами местных сессий.
Что такое часовой пояс?
Часовой пояс определяется как стандартное время, зависящее от географического положения данного места. Другими словами, часовой пояс - это местное время определенного региона, основанное на вращении Земли. Он определяется в UTC (всемирное координированное время), стандарте, по которому координируется время в разных регионах мира.
Например, время в Нью-Йорке отстает от Гринвича на 5 часов и представлено как UTC-5 или UTC-4 в зависимости от освещенности дня. Время в Сиднее опережает время по Гринвичу на 10 часов и представлено как UTC+10 или UTC+11 в зависимости от освещенности дня (лето или зима). Термины UTC и GMT часто используются как взаимозаменяемые для выражения смещения, поэтому UTC+2 и GMT+2 часто имеют одинаковое значение.
Смещение UTC положительно, если часовой пояс находится к востоку от GMT, и отрицательно, если часовой пояс находится к западу от GMT.
Идентификаторы часовых поясов
//+------------------------------------------------------------------+ //| Идентификаторы часовых поясов| //+------------------------------------------------------------------+ enum ENUM_ZONE_ID { ZONE_ID_SYDNEY, // Сидней ZONE_ID_TOKYO, // Токио ZONE_ID_FRANKFURT, // Франкфурт ZONE_ID_LONDON, // Лондон ZONE_ID_NEWYORK, // Нью-Йорк ZONE_ID_UTC, // UTC ZONE_ID_LOCAL, // LOCAL ZONE_ID_BROKER, // БРОКЕР ZONE_ID_CUSTOM // CUSTOM };
Интерфейс класса
//+------------------------------------------------------------------+ //| Класс CTimeZoneInfo.| //| Назначение: Класс для доступа к локальному времени для указанного | //| местоположение, а также информация о часовом поясе, время | //| Изменения за текущий год.| //|| //| Нотация смещения, используемая в библиотеке:| //| Обратите внимание, что библиотека обозначает положительное время | //| зоны с положительным смещением и отрицательные часовые пояса | //| отрицательными смещениями.| //| Напротив, встроенная в MQL5 функция TimeGMTOffset()|. //| функция обозначает положительные часовые пояса, такие как GMT+3,| //| отрицательными смещениями, например -10800, и наоборот.| //+------------------------------------------------------------------+ class CTimeZoneInfo { public: CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW ); ~CTimeZoneInfo( void ); string Name( void ); // Возвращает название часового пояса string ToString( bool secs = true, bool tzname = true ); // Возвращает строку местного времени, отформатированную со смещением TZ/DST и именем tzname bool RefreshTime( void ); // Обновление текущего местного времени и заполнение информации о часовом поясе bool SetLocalTime( datetime pLocalTime = TIME_NOW ); // Установите местное время для этого места на указанное время datetime TimeLocal( void ); // Возвращает местное время в часовом поясе datetime TimeUTC( void ); // Возвращает время UTC (одинаковое во всех часовых поясах) int TimeGMTOffset( void ); // Положительное значение для положительных часовых поясов (например, GMT+3), в противном случае отрицательное. (включает DST) int TimeDaylightSavings( void ); // Возвращает поправку DST (в секундах) для часового пояса, в котором установлено местное время. datetime ConvertLocalTime( ENUM_ZONE_ID destinationId ); // Переведите местное время в этом часовом поясе в другой часовой пояс bool GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end ); // Получите время начала и окончания перехода на летнее время в течение года datetime GetDaylightNextSwitch( void ); // Получите местное время следующего перехода на летнее время void PrintObject( void ); //--- статические методы, не требующие создания объекта. static datetime GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId ); // Получите текущее местное время для указанного часового пояса static string FormatTimeForPlace ( datetime time, ENUM_ZONE_ID placeId, bool secs = true, bool tzname = true ); static datetime ConvertTimeForPlace ( datetime time, ENUM_ZONE_ID placeId, ENUM_ZONE_ID destinationId ); static int TimeGMTOffset ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Возвращает общее смещение tz (UTC+DST) от GMT для часового пояса в заданное местное время static int TimeDaylightSavings ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Возвращает поправку dst в секундах, для часового пояса по заданному местному времени static bool IsDaylightSavingTime ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Проверяет, попадает ли указанное время на переход на летнее время. static bool GetDaylightSwitchTimes ( ENUM_ZONE_ID placeId, int iYear, datetime &dst_start, datetime &dst_end ); static bool GetDaylightSwitchDeltas( ENUM_ZONE_ID placeId, int iYear, int &delta_start, int &delta_end ); static bool SetCustomTimeZone( string name, int baseGMTOffset = 0, // Определяет часовой пояс, который не найден в библиотеке. ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC ); static void SetUsingGoldSymbol( bool enabled = true ); // Устанавливает опцию использования символа золота для оценки TZ/DST сервера. };
Интерфейс класса
//+------------------------------------------------------------------+ //| Класс CSessionHours.| //| Назначение: Класс для доступа к часам локальной торговой сессии | //| указанное место.| //| Производные от класса CTimeZoneInfo.| //| Примечание: По умолчанию время сеанса установлено на 8:00 утра - 5:00 вечера | //| Местное время для новых объектов CSessionHours.| //+------------------------------------------------------------------+ class CSessionHours : public CTimeZoneInfo { public: CSessionHours( ENUM_ZONE_ID placeId ); ~CSessionHours( void ); //--- методы для доступа к локальному времени сессии bool RefreshTime( void ); // Обновление текущего местного времени и часов сессии за день bool SetLocalTime( datetime pLocalTime ); //--- методы для переопределения локальных часов сессии по умолчанию bool BeginLocalTime( int pHour, int pMinute ); // Установите время начала локального сеанса, используя час и минуту начала сеанса. bool EndLocalTime( int pHour, int pMinute ); // Установите время окончания локальной сессии, используя час и минуту окончания //--- методы для доступа к часам локальной сессии datetime BeginLocalTime( void ); datetime EndLocalTime( void ); bool CheckLocalSession( void ); // Проверьте, активна ли в данный момент локальная торговая сессия. int SecRemainingSession( void ); // Время, оставшееся в секундах до закрытия локальной сессии. //--- статические методы, не требующие создания объекта. static datetime ForexCloseTime( void ); // Время брокера, когда рынок Forex закрывается на этой неделе. static int SecRemainingForex( void ); // Время, оставшееся в секундах до закрытия рынка Forex на этой неделе. };
Условные обозначения смещения, используемые в библиотеке
Обратите внимание, что в библиотеке положительные часовые пояса обозначаются положительными смещениями, а отрицательные - отрицательными.
Это противоположно встроенной в MQL5 функции TimeGMTOffset(), которая обозначает положительные часовые пояса, например GMT+3, отрицательными смещениями, например -10800, и наоборот.
Выбор символа для оценки TZ/DST сервера
По умолчанию библиотека будет искать и загружать символ XAUUSD для оценки смещения часового пояса сервера. XAUUSD может дать более надежные результаты (особенно для брокеров, которые следуют графику ЕС DST) в недели, когда графики US DST и EU DST не синхронизированы (март и конец октября). Как вариант, если ваш брокер придерживается графика US DST или вообще не придерживается, то использование символа графика также подойдет. Вызовите CTimeZoneInfo::SetUsingGoldSymbol() с параметром 'false', чтобы использовать символ текущего графика, а не XAUUSD.
Чтобы определить расписание дня (DST) вашего брокера, вы можете использовать этот скрипт https://www.mql5.com/ru/code/48650.
//+------------------------------------------------------------------+ //| Устанавливает возможность использования символа XAUUSD (золото) для оценки | //| TZ/DST сервера путем анализа истории котировок H1.| //| TRUE: поиск и загрузка символа Gold (поведение по умолчанию)|. //| FALSE : использовать символ текущего графика.| //+------------------------------------------------------------------+ void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);
Примечание:
В качестве побочного эффекта того, что XAUUSD начинается на час позже Forex, переключение DST будет происходить на час позже (только в тестере стратегий, но не в обычном режиме).
Примечание о совместимости с тестером стратегий
При тестировании в тестере стратегийTimeGMT() всегда равно симулированному серверному времениTimeTradeServer().
Библиотека TimeZoneInfo рассчитывает правильное время в часовых поясах на основе "истинного" GMT путем анализа истории котировок H1, а не на основе времени, возвращаемого вызовом встроенной функции TimeGMT.
Если для оценки TZ/DST сервера используется символ XAUUSD, то в тестере стратегий переключение dst будет происходить на час позже.
I. Работа с локальными часовыми поясами
Как получить текущее время?
Метод RefreshTime()обновляет текущее локальное время часового пояса. Давайте посмотрим на примере, как можно получить текущее время.
Print("\n========== Get the current time in a timezone =========="); CTimeZoneInfo tz(ZONE_ID_TOKYO); tz.RefreshTime(); // заполните информацию о текущем часовом поясе Print("Name() : ", tz.Name()); Print("TimeLocal() : ", tz.TimeLocal()); Print("ToString() : ", tz.ToString());
вывод:
// ========== Получение текущего времени в часовом поясе ========== // Имя() : Токио // TimeLocal() : 2024.02.28 19:58:50 // ToString() : Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]
Вам нужна дополнительная информация?
Print("\n========== More information about a timezone =========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); tz.RefreshTime(); Print("Name() : ", tz.Name()); Print("TimeUTC() : ", tz.TimeUTC()); Print("TimeLocal() : ", tz.TimeLocal()); Print("TimeGMTOffset() : ", tz.TimeGMTOffset()); Print("TimeDaylightSavings() : ", tz.TimeDaylightSavings()); Print("ToString() : ", tz.ToString()); datetime dst_start, dst_end; tz.GetDaylightSwitchTimes(dst_start, dst_end); Print("dst_start : ", dst_start); Print("dst_end : ", dst_end); Print("GetDaylightNextSwitch() : ", tz.GetDaylightNextSwitch());
output:
// ========== Дополнительная информация о часовом поясе ========== // Имя() : Нью-Йорк // TimeUTC() : 2024.03.17 16:50:38 // TimeLocal() : 2024.03.17 12:50:38 // TimeGMTOffset() : -14400 // TimeDaylightSavings() : 3600 // ToString() : Sun, 2024.03.17 12:50:38 GMT-4 [New York] (DST) // dst_start : 2024.03.10 02:00:00 // dst_end : 2024.11.03 02:00:00 // GetDaylightNextSwitch() : 2024.11.03 02:00:00
Примечания:
- Метод TimeUTC() возвращает время UTC, что эквивалентно времени GMT.
- Метод TimeLocal() возвращает местное время данного часового пояса (которое могло быть изменено в результате вызова методов RefreshTime или SetLocalTime ).
- Метод TimeGMTOffset() возвращает текущую разницу между местным временем данного часового пояса и временем по Гринвичу в секундах, с учетом перехода на зимнее или летнее время. Возвращаемое смещение включает поправку на DST для текущего часового пояса. Смещение GMT положительно, если часовой пояс находится к востоку от (впереди) GMT, и отрицательно, если часовой пояс находится к западу от (позади) GMT.
- Метод TimeDaylightSavings() возвращает корректировку перехода на летнее время (DST) в секундах, если в зонах, где действует DST, был осуществлен переход на летнее время. Если был осуществлен переход на зимнее (стандартное) время (или если часовой пояс не поддерживает DST), возвращается 0. Корректировка dst уже является частью TimeGMTOffset.
Как настроить встроенный пользовательский часовой пояс для последующего использования?
Класс CTimeZoneInfo содержит метод SetCustomTimeZone , который можно использовать для настройки встроенного пользовательского часового пояса. В дальнейшем пользовательский часовой пояс можно будет использовать через идентификатор ZONE_ID_CUSTOM. Рассмотрим пример, показывающий, как можно настроить встроенный пользовательский часовой пояс на указанное имя, смещение относительно среднего времени по Гринвичу (GMT) и идентификатор летнего графика.
Print("\n========== Configure the built-in custom timezone =========="); string name = "Custom+3"; // Имя пользовательского часового пояса int baseGMTOffset = 10800; // Базовое смещение по GMT для пользовательского часового пояса (в секундах) ENUM_ZONE_ID daylightRuleId = ZONE_ID_LONDON; // Расписание DST для пользовательского часового пояса bool success = CTimeZoneInfo::SetCustomTimeZone(name, baseGMTOffset, daylightRuleId); Print("Parameter 'name' : ", name); Print("Parameter 'baseGMTOffset' : ", baseGMTOffset); Print("Parameter 'daylightRuleId' : ", EnumToString(daylightRuleId)); Print("SetCustomTimeZone() returns : ", success);
Вывод:
// ========== Настройка встроенного пользовательского часового пояса ========== // Параметр 'name' : Custom+3 // Параметр 'baseGMTOffset' : 10800 // Параметр 'daylightRuleId' : ZONE_ID_LONDON // SetCustomTimeZone() возвращает : true
Получение текущего времени во всех часовых поясах
Давайте посмотрим на примере, как можно получить текущее местное время во всех часовых поясах.
Print("\n========== Get Current Time in All Timezones =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); }
вывод:
// ========== Получение текущего времени во всех часовых поясах ========== // Сидней : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // Токио : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] // Франкфурт : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] // Лондон : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [London] // Нью-Йорк : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York] // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC] // Главная : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Главная] // FXOpen-MT5 : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
Это можно сделать и другим способом, используя статический метод GetCurrentTimeForPlace(). Также обратите внимание, что существует еще один статический метод FormatTimeForPlace(), который можно использовать для форматирования обычных переменных mql datetime в строку ( аналогично TimeToString), но с указанием дня недели, даты, времени, названия часового пояса и смещения. Эти статические методы не требуют создания объектов для их вызова.
Print("\n========== GetCurrentTimeForPlace() =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { datetime time = CTimeZoneInfo::GetCurrentTimeForPlace(id); PrintFormat("Time : %s | %s", TimeToString(time), CTimeZoneInfo::FormatTimeForPlace(time, id)); }
выход:
// ========== GetCurrentTimeForPlace() ========== // Время : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // Время : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] // Время : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] // Время : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [London] // Время : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York] // Время : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC] // Время : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Home] // Время : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
Как установить локальное время для часового пояса?
Метод SetLocalTime()установитуказанное локальное время. Рассмотрим пример, показывающий, как можно установить местное время для часового пояса.
Print("\n========== Set the local time for a timezone =========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); if(tz.SetLocalTime(D'2021.07.15 09:31')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); if(tz.SetLocalTime(D'2022.01.23 17:04')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); if(tz.SetLocalTime(D'2023.03.12 02:21')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());
вывод:
// ========== Установите местное время для часового пояса ========== // New York : 2021.07.15 09:31 | Thu, 2021.07.15 09:31:00 GMT-4 [New York] (DST) // Нью-Йорк : 2022.01.23 17:04 | Sun, 2022.01.23 17:04:00 GMT-5 [New York] // >>Ошибка: Время 2023.03.12 02:21 не существует в Нью-Йорке. Это связано с тем, что переход на летнее время пропустил один час.
Причина последнего сообщения об ошибке будет описана в следующем параграфе.
Летнее время (DST):
DST - это сезонная мера изменения времени, при которой часы переводятся вперед по сравнению со стандартным временем в течение части года.
см. https://www. timeanddate.com/time/dst/transition.html
("Летний пропуск", "Зимний откат").
Когда весной наступает зимнее время, наши часы переводятся на определенное время вперед, обычно на один час. Это означает, что на часах пропускается один час. Осенью (осенью) период DST обычно заканчивается, и наши часы снова возвращаются к стандартному времени.
Пример начала перехода на зимнее время
(несуществующий час)
В Соединенных Штатах Америки период DST всегда начинается в 02:00 (2 часа ночи) по местному времени. В тот момент, когда время впервые достигает 1:59:59 по стандартному времени, часы переходят на 3:00:00 по летнему времени. Таким образом, часа с 2:00:00 до 2:59:59 в ночь перехода не существует.

II. Получение информации о часовом поясе
1. Смещение UTC и текущее смещение DST
Приведем пример, показывающий, как можно получить имя часового пояса, смещение UTC и текущее смещение DST, если действует DST.
Print("\n========== UTC offset and current DST offset =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); // заполните информацию о текущем часовом поясе PrintFormat("%-12s: GMT%+g | DST%+g", tz.Name(), tz.TimeGMTOffset()/3600., tz.TimeDaylightSavings()/3600.); }
вывод:
// ========== Смещение UTC и текущее смещение DST ========== // Сидней : GMT+11 | DST+1 // Токио : GMT+9 | DST+0 // Франкфурт : GMT+1 | DST+0 // Лондон : GMT+0 | DST+0 // Нью-Йорк : GMT-4 | DST+1 // UTC : GMT+0 | DST+0 // Дом : GMT+2 | DST+0 // FXOpen-MT5 : GMT+2 | DST+0
Примечания:
- Метод TimeGMTOffset() возвращает текущую разницу между местным временем данного часового пояса и временем по Гринвичу в секундах с учетом перехода на зимнее или летнее время. Возвращаемое смещение включает поправку на DST для текущего часового пояса. Смещение GMT положительно, если часовой пояс находится к востоку от (впереди) GMT, и отрицательно, если часовой пояс находится к западу от (позади) GMT.
- Метод TimeDaylightSavings() возвращает корректировку перехода на летнее время (DST) в секундах, если в зонах, где действует DST, был осуществлен переход на летнее время. Если был осуществлен переход на зимнее (стандартное) время (или если часовой пояс не поддерживает DST), возвращается 0. Корректировка dst уже является частью TimeGMTOffset.
2. Время перехода на DST для текущего года
.
Рассмотрим пример, показывающий, как можно получить информацию о DST.
Print("\n========== DST switch times for the current year =========="); datetime dst_start, dst_end; for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); // заполните информацию о текущем часовом поясе //--- только для часовых поясов, в которых соблюдается летнее время. if(tz.GetDaylightSwitchTimes(dst_start, dst_end)) { PrintFormat("%-12s: DST starts on %s | DST ends on %s", tz.Name(), TimeToString(dst_start), TimeToString(dst_end)); } }
вывод:
// ========== Время перехода на DST для текущего года ========== // Сидней : DST начинается в 2024.04.07 03:00 | DST заканчивается в 2024.10.06 02:00 // Франкфурт : DST начинается в 2024.03.31 02:00 | DST заканчивается в 2024.10.27 03:00 // Лондон : DST начинается в 2024.03.31 01:00 | DST заканчивается в 2024.10.27 02:00 // Нью-Йорк : DST начинается в 2024.03.10 02:00 | DST заканчивается в 2024.11.03 02:00
3. Время следующего перехода на зимнее время
Приведем пример, показывающий, как можно получить время следующего перехода на летнее время.
Print("\n========== Time of the next DST switch =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); datetime nxswitch = tz.GetDaylightNextSwitch(); //--- только для часовых поясов, в которых соблюдается летнее время. if(nxswitch) { PrintFormat("%-12s: Time: %s | dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch)); } }
вывод:
// ========== Время следующего перехода на летнее время ========== // Сидней : Время: 2024.02.28 21:58 | dstNextSwitch: 2024.04.07 03:00 // Франкфурт : Время: 2024.02.28 11:58 | dstNextSwitch: 2024.03.31 02:00 // Лондон : Время: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00 // Нью-Йорк : Время: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00
4. Список DST
Приведем пример, показывающий, как можно получить информацию о DST для всех часовых поясов в этой библиотеке за ряд лет.
Print("\n========== DST List =========="); datetime dst_start, dst_end; int delta_start, delta_end; // часы меняются в сек. for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo timezone(id); PrintFormat("========= %s Summer Time (DST) =========", timezone.Name()); for(int year=2008; year<=2030; year++) { //--- только для часовых поясов, в которых соблюдается летнее время. if(CTimeZoneInfo::GetDaylightSwitchTimes(id, year, dst_start, dst_end)) { CTimeZoneInfo::GetDaylightSwitchDeltas(id, year, delta_start, delta_end); PrintFormat("DST starts on %s (%+d) and ends on %s (%+d)",TimeToString(dst_start), delta_start/3600, TimeToString(dst_end), delta_end/3600); } } }
output:
// ========== Список ДСТ ========== // ========= Сиднейское летнее время (DST) ========= // DST начинается в 2008.04.06 03:00 (-1) и заканчивается в 2008.10.05 02:00 (+1) // DST начинается в 2009.04.05 03:00 (-1) и заканчивается в 2009.10.04 02:00 (+1) // DST начинается в 2010.04.04 03:00 (-1) и заканчивается в 2010.10.03 02:00 (+1) // DST начинается 2011.04.03 03:00 (-1) и заканчивается 2011.10.02 02:00 (+1) // DST начинается 2012.04.01 03:00 (-1) и заканчивается 2012.10.07 02:00 (+1) // ... // ... // ...
5. Смещение GMT сервера (текущее)
Смещение GMT брокера показывает, на сколько секунд время брокера опережает время GMT, смещение брокера = TimeTradeServer() - TimeGMT(). Положительные значения указывают на то, что время сервера опережает GMT. Давайте посмотрим на примере, как можно получить текущее смещение GMT брокера.
Print("\n========== Current GMT offset of the broker ========== "); CTimeZoneInfo broker(ZONE_ID_BROKER); broker.RefreshTime(); Print("Name() : ", broker.Name()); Print("TimeLocal() : ", broker.TimeLocal()); // время брокера Print("ToString() : ", broker.ToString()); Print("TimeGMTOffset() : ", broker.TimeGMTOffset());
вывод:
// ========== Текущее GMT смещение брокера ========== // Имя() : ICMarketsSC-Demo // TimeLocal() : 2024.03.08 06:33:06 // ToString() : Fri, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo] // TimeGMTOffset() : 7200
Примечание: Важным замечанием для функции TimeGMTOffset() является то, что она возвращает смещение utc с учетом поправки dst (UTC+DST). Положительные значения указывают на то, что время сервера опережает (восточнее) GMT.
6. Смещение GMT сервера (историческое)
Прошлое GMT смещение сервера можно рассчитать как разницу между временем появления на графике первого бара недели сервера и временем UTC, соответствующим 5 часам вечера воскресенья по нью-йоркскому времени. Рассмотрим на примере, как можно получить прошлое GMT смещение брокера. Для этого примера в качестве прошлого времени брокера мы будем использовать время свечей графика.
Print("\n========== Past GMT offsets of the broker (chart candles) =========="); datetime bartimes[]; int copied = CopyTime(Symbol(), PERIOD_D1, D'2022.03.18', 9, bartimes); if(copied<=0) Print("CopyTime() failed."); for(int i =0; i < copied; i++) { datetime t = bartimes[i]; CTimeZoneInfo broker(ZONE_ID_BROKER); broker.SetLocalTime(t); PrintFormat("bar #%i Time: %s | offset: %5d (GMT%+g) | %s", i+1, TimeToString(broker.TimeLocal()), broker.TimeGMTOffset(), broker.TimeGMTOffset()/3600.0, broker.ToString()); }
вывод:
// ========== Прошлые GMT смещения брокера (свечи графика) ========== // бар #1 Время: 2022.03.08 00:00 | смещение: 7200 (GMT+2) | Tue, 2022.03.08 00:00:00 GMT+2 [ICMarketsSC-Demo] // бар #2 Время: 2022.03.09 00:00 | смещение: 7200 (GMT+2) | Wed, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo] // бар #3 Время: 2022.03.10 00:00 | смещение: 7200 (GMT+2) | Thu, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo] // бар #4 Время: 2022.03.11 00:00 | смещение: 7200 (GMT+2) | Fri, 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo] // бар #5 Время: 2022.03.14 00:00 | Смещение: 10800 (GMT+3) | Mon, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo] // бар #6 Время: 2022.03.15 00:00 | Смещение: 10800 (GMT+3) | Tue, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo] // бар #7 Время: 2022.03.16 00:00 | Смещение: 10800 (GMT+3) | Wed, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo] // бар #8 Время: 2022.03.17 00:00 | Смещение: 10800 (GMT+3) | Thu, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #9 Время: 2022.03.18 00:00 | Смещение: 10800 (GMT+3) | Fri, 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]
Как видно на баре №5, сервер перешел с зимнего времени +2 на летнее +3, причем время перехода соответствует американскому графику DST (2-е воскресенье марта). В неделю бывает пять свечей D1, а в субботу и воскресенье свечей нет.Время на этих серверах всегда опережает Нью-Йорк на 7 часов в течение года и представлено как NY+7. Обратите внимание, что зимой NY -5, а летом -4.
Это первая библиотека в кодовой базе, способная определять смещение GMT сервера в прошлом (исторические смещения GMT). Алгоритм, реализованный в расчетах, очень быстрый и точный, и он совместим - насколько это возможно - с различными брокерами (протестирован на большом количестве брокеров с различными GMT-смещениями или DST-расписаниями).
III. Конвертация между часовыми поясами
Конвертация текущего местного времени в другой часовой пояс
Используйте метод ConvertLocalTime() для преобразования установленного местного времени данного экземпляра часового пояса в определенный часовой пояс. Этот метод возвращает новое время заданного часового пояса.
Рассмотрим пример, показывающий, как можно преобразовать"текущее" местное время в определенный часовой пояс.
Print("\n========== Convert current local time in Sydney to New York =========="); CTimeZoneInfo sydney(ZONE_ID_SYDNEY); sydney.RefreshTime(); datetime localtime = sydney.TimeLocal(); datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK); PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString()); PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));
вывод:
// ========== Перевести текущее местное время в Сиднее в нью-йоркское ========== // 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York]
Преобразовать конкретное местное время в другой часовой пояс
Приведем пример, показывающий, как можно преобразовать конкретное местное время в конкретный часовой пояс.
Print("\n========== Convert a specific local time in Sydney to New York =========="); CTimeZoneInfo sydney(ZONE_ID_SYDNEY); sydney.SetLocalTime(D'2016.05.21 14:47:08'); datetime localtime = sydney.TimeLocal(); datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK); PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString()); PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));
output:
// ========== Преобразование определенного местного времени в Сиднее в Нью-Йорк ========== // 2016.05.21 14:47 | Sat, 2016.05.21 14:47:08 GMT+10 [Sydney] // 2016.05.21 00:47 | Sat, 2016.05.21 00:47:08 GMT-4 [New York] (DST)
Преобразовать текущее местное время во всех часовых поясах в время брокера
Приведем пример, показывающий, как можно преобразовать текущее местное время во всех часовых поясах в брокерское время.
Print("\n========== Convert the current local time in all timezones to the broker time =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { datetime localtime = CTimeZoneInfo::GetCurrentTimeForPlace(id); datetime converted = CTimeZoneInfo::ConvertTimeForPlace(localtime, id, ZONE_ID_BROKER); PrintFormat("%-49s | %s", CTimeZoneInfo::FormatTimeForPlace(localtime, id), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_BROKER)); }
вывод:
// ========== Преобразуйте текущее местное время во всех часовых поясах в время брокера ==========. // Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 10:58:50 GMT+0 [London] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 05:58:50 GMT-5 [New York] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 10:58:50 GMT+0 [UTC] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 12:58:50 GMT+2 [Home] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
IV. Работа с часами локальных сессий
A. Класс CTimeZoneInfo
Обратите внимание, что использование родительского класса CTimeZoneInfo , а не класса CSessionHours , не является предпочтительным, так как требует большего количества кодирования и, следовательно, чревато ошибками. Давайте посмотрим на примере, как мы получаем часы сессии Forex во всех часовых поясах и конвертируем их во время брокера.
Print("\n======= Local Session Hours (CTimeZoneInfo Class) ======="); const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK}; for(int i = 0; i < ArraySize(ids); i++) { ENUM_ZONE_ID id = ids[i]; CTimeZoneInfo tz(id); tz.RefreshTime(); datetime localtime = tz.TimeLocal(); //--- установите время сеанса на 8:00 утра - 5:00 вечера по местному времени datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00"); datetime endlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00"); //--- перевод в брокерское время tz.SetLocalTime(beginlocal); datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER); tz.SetLocalTime(endlocal); datetime endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER); //--- местный день недели в часовом поясе MqlDateTime st; TimeToStruct(localtime, st); int dow = st.day_of_week; //string state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ? "открыто" : "закрыто"; string state_str = ((dow != SATURDAY && dow != SUNDAY) && (TimeTradeServer() >= beginbroker && TimeTradeServer() < endbroker)) ? "open" : "closed"; PrintFormat("%-12s: %s | %s [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str); } Print("-----------------------------------"); Print("broker time : ", TimeTradeServer()); Print("broker time : ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));
вывод:
// ======= Часы локальной сессии (класс CTimeZoneInfo) ======= // Сидней : Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [сессия закрыта] // Токио : Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [сессия закрыта] // Франкфурт : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [сессия открыта] // Лондон : Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [сессия открыта] // Нью-Йорк : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [сессия открыта] // ----------------------------------- // время брокера : 2024.02.28 15:32:30 // время брокера : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]
B. Класс CSessionHours
Назначение: Класс для доступа к часам локальной торговой сессии для указанного местоположения.
Производный от класса CTimeZoneInfo.
Примечание: Для новых объектов CSessionHours часы сессии по умолчанию устанавливаются на 8:00 утра - 5:00 вечера по местному времени. Эти значения по умолчанию могут быть переопределены по желанию.
Работа с объектами CSessionHours
Рассмотрим пример использования этого объекта.
Print("\n========== Working with CSessionHours Objects =========="); CSessionHours tz(ZONE_ID_SYDNEY); tz.RefreshTime(); // заполняем часовой пояс и информацию о сессии //--- от родителя Print("Name() : ", tz.Name()); Print("TimeUTC() : ", tz.TimeUTC()); Print("TimeLocal() : ", tz.TimeLocal()); Print("ToString() : ", tz.ToString()); //--- из класса Print("BeginLocalTime() : ", tz.BeginLocalTime()); Print("EndLocalTime() : ", tz.EndLocalTime()); Print("CheckLocalSession() : ", tz.CheckLocalSession()); Print("SecRemainingSession() : ", tz.SecRemainingSession()); Print("SecondsToString() : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));
вывод:
// ========== Работа с объектами CSessionHours ========== // Имя() : Сидни // TimeUTC() : 2024.02.28 10:58:50 // TimeLocal() : 2024.02.28 21:58:50 // ToString() : Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // BeginLocalTime() : 2024.02.28 08:00:00 // EndLocalTime() : 2024.02.28 17:00:00 // CheckLocalSession() : false // SecRemainingSession() : 0 // SecondsToString() : 00:00:00
Часы локальной сессии
CSessionHours предоставляет больше функциональности при меньшем количестве кода. Давайте посмотрим пример, как с помощью класса CSessionHours получить часы сессии Forex во всех часовых поясах и преобразовать их во время брокера. Обратите внимание, что преобразование во время брокера - это необязательный шаг, и он не требуется для проверки времени начала и окончания каждой сессии.
Print("\n======= Local Session Hours (CSessionHours Class) ======="); const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK}; for(int i = 0; i < ArraySize(ids); i++) { ENUM_ZONE_ID id = ids[i]; CSessionHours tz(id); tz.RefreshTime(); //--- по умолчанию время сеанса установлено на 8:00 утра - 5:00 вечера по местному времени datetime beginlocal = tz.BeginLocalTime(); datetime endlocal = tz.EndLocalTime(); //--- перевод в брокерское время datetime beginbroker = CTimeZoneInfo::ConvertTimeForPlace(beginlocal, id, ZONE_ID_BROKER); datetime endbroker = CTimeZoneInfo::ConvertTimeForPlace(endlocal, id, ZONE_ID_BROKER); string state_str = tz.CheckLocalSession() ? "open, ends in " + CSessionHours::SecondsToString(tz.SecRemainingSession()) : "closed"; PrintFormat("%-12s: %s | %s [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str); } Print("-----------------------------------"); Print("broker time : ", TimeTradeServer()); Print("broker time : ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER)); Print("Fx close : ", CTimeZoneInfo::FormatTimeForPlace(CSessionHours::ForexCloseTime(), ZONE_ID_BROKER)); int sec = CSessionHours::SecRemainingForex(); Print("closes in : ", sec, " sec = ", CSessionHours::SecondsToString(sec));
выход:
// ======= Локальные часы сеанса (класс CSessionHours) ======= // Сидней : Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [сессия закрыта] // Токио : Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [сессия закрыта] // Франкфурт : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [сессия открыта, заканчивается в 02:27:29]. // Лондон : Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [сессия открыта, заканчивается в 03:27:29]. // Нью-Йорк : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [сессия открыта, заканчивается в 08:27:29]. // ----------------------------------- // время брокера : 2024.02.28 15:32:30 // время брокера : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5] // Fx close : Sat, 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5] // закрывается через : 203249 сек = 2д 08:27:29
Как переопределить время локальной сессии по умолчанию?
Давайте рассмотрим пример, показывающий, как мы можем переопределить время сеанса по умолчанию в классе CSessionHours .
Print("\n=========== Override the default session hours ==========="); CSessionHours frankfurt(ZONE_ID_FRANKFURT); // измените время сеанса по умолчанию frankfurt.BeginLocalTime(9, 0); frankfurt.EndLocalTime(19, 0); frankfurt.RefreshTime(); // заполните новые часы сессии datetime beginlocal = frankfurt.BeginLocalTime(); datetime endlocal = frankfurt.EndLocalTime(); PrintFormat("new session hours : %s | %s", CTimeZoneInfo::FormatTimeForPlace(beginlocal, ZONE_ID_FRANKFURT), CTimeZoneInfo::FormatTimeForPlace(endlocal, ZONE_ID_FRANKFURT)); PrintFormat("current local time : %s", frankfurt.ToString());
вывод:
// =========== Переопределите часы сессии по умолчанию =========== // новые часы сеанса : Wed, 2024.02.28 09:00:00 GMT+1 [Frankfurt] | Wed, 2024.02.28 19:00:00 GMT+1 [Frankfurt] // текущее местное время : Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]
Как проверить закрытие позиций в выходные дни?
Статический метод SecRemainingForex() вернет время в секундах, оставшееся до закрытия рынка Forex на этой неделе. Этот метод следует вызывать из обработчика события OnTick()(или лучше из OnTimer(), если тики не приходят непосредственно перед выходными) , чтобы неоднократно проверять состояние закрытия. Рассмотрим пример, показывающий, как можно проверить закрытие позиций в выходные.
Print("\n======= Check For Closing Positions at Weekend ======="); int InpHours = 2; // За несколько часов до выходных int InpMinutes = 30; // За несколько минут до выходных int sec = CSessionHours::SecRemainingForex(); PrintFormat("Time remaining till the weekend : %s", CSessionHours::SecondsToString(sec)); PrintFormat("Close all if remaining time becomes %s or less.", CSessionHours::SecondsToString(InpHours * 3600 + InpMinutes * 60)); // проверьте, достигло ли оставшееся время цели if(sec <= InpHours * 3600 + InpMinutes * 60) { // CloseAll(); }
В качестве альтернативы можно проверить предыдущее условие, используя абсолютное время:
// проверьте, достигло ли время брокера целевого значения if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60)) { // CloseAll(); }
выход:
// ======= Проверьте закрытие вакансий в выходные дни ======= // Время, оставшееся до выходных : 3d 03:32:27 // Закройте все, если оставшееся время стало 02:30:00 или меньше.
Конец недели - часовой пояс брокера и график DST
Рынок Forex открывается в воскресенье в 17:00 по нью-йоркскому времени (GMT-5 зимой и GMT-4 летом) и закрывается в пятницу в то же время. Время открытия в Нью-Йорке соответствует Sun, 10:00 PM UTC зимой (и Sun, 09:00 PM UTC летом). Форекс закрывается в пятницу в 10:00 UTC зимой (и 09:00 UTC летом). Спот-рынок золота и серебра обычно начинается на час позже. ссылка
Каждый форекс-брокер имеет свой часовой пояс и время сервера. Поэтому начало торговой недели (свечи H1) у разных брокеров разное, и может варьироваться отSun, 02:00 PM по серверному времени для брокеров в Сан-Франциско (GMT-8), доMon, 09:00 AM по серверному времени для брокеров в Сиднее (GMT+11). Конец торговой недели также варьируется отFri, 02:00 PM по серверному времени, доSat, 09:00 AM по серверному времени.
Каждый брокер волен выбирать свое летнее время (DST). Причем DST не обязательно одинаково для данного часового пояса. Иногда они смешивают его, используя часовой пояс ЕС и DST США вместо DST ЕС. Для брокеров, которые не следуют американскому графику, серверное время начала (и конца) недели у одного и того же брокера варьируется на +/- один час в течение года. Метод ForexCloseTime() обрабатывает эти меж- и внутриброкерские вариации, конвертируя время закрытия в Нью-Йорке в 17:00 в брокерское время с учетом смещения времени и DST, что позволяет получить точные результаты.
Использование часового пояса +2 (и +3 летом на графике США) означает, что в неделю есть пять свечей D1. В субботу и воскресенье свечи отсутствуют в течение всего года. Просто время на этих серверах всегда опережает Нью-Йорк на 7 часов и представлено как NY+7. На сегодняшний день это самая распространенная настройка, но существует множество менее распространенных вариаций.
Образец индикатора TestIndi.mq5

iForexSessions - индикатор для MetaTrader 5
Выделяет сессии рынка Форекс
Получить его можно здесь https://www.mql5.com/ru/code/48842.
Ссылки
Мировые часы: https: //www.timeanddate.com/worldclock/
Конвертер часовых поясов: https: //www.timeanddate.com/worldclock/converter-classic.html
Обновления:
2024.03.01 - v.1.40 : Удален избыточный код в классе CTimeZoneInfo (использовался во время тестирования), добавлены дополнительные методы в класс CSessionHours, обновлен TestIndi.mq5 для отражения новых изменений.
2024.03.03 - v.1.45 : Обновлен код примера "Работа с часами локальной сессии - класс CTimeZoneInfo".
2024.03.08 - v.1.50 : В класс CTimeZoneInfo добавлены два внутренних метода HistoryBrokerOffset и FirstBarOfWeek. Обработка времени сервера в прошлом (смещение UTC, форматирование текста, преобразования и т.д.).
2024.03.15 - v.1.56 : Добавлен скрипт "SydneySession_Script.mq5", показывающий колебания часов сессии в Сиднее в течение года.
2024.03.30 - v.1.65 : Исправлено смещение GMT брокера. В настоящее время библиотека сканирует бары H1 только на графике GOLD, так как он имеет наиболее точное время начала на всех протестированных мной брокерах.
2024.04.01 - v.1.67 : Исправлена потенциальная проблема в расчете смещения GMT брокера в течение первого часа торговой недели.
2024.04.03 - v.1.70: Кэширование брокерских GMT-оффсетов в хэш-карту для более быстрого получения (например, из индикаторов). Кэш брокерских смещений будет содержать одну запись на торговую неделю.
2024.04.08 - v.1.72 : Повышена производительность библиотеки как минимум в 2-3 раза. Теперь в методе GetNthSunday используется StructToTime вместо StringToTime.
2024.04.09 - v.1.75 : Исправлена потенциальная проблема при расчете GMT-смещения брокера во время рождественских праздников у брокеров GMT+0.
2024.04.11 - v.1.77 : Ускорен метод GetDaylightSwitchTimes. Теперь используется статический массив для запоминания времени переключения для текущего года.
2024.04.12 - v.1.80 : Исправлена ошибка в расчете брокерского GMT-смещения у брокеров, не предоставляющих торговлю золотом.
2024.04.15 - v.1.82 : В класс CTimeZoneInfo добавлен метод SetCustomTimeZone , с помощью которого можно настроить встроенный пользовательский часовой пояс с указанным именем, GMT-смещением и DST-идентификатором. Доступ к пользовательской временной зоне можно получить через ZONE_ID_CUSTOM.
2024.04.16 - v.1.85 : Заменен внутренний метод GetNthSunday на более оптимизированный метод GetMonthTime.
2024.04.17 - v.1.87 : Заменен внутренний метод TimeYear на более оптимизированный метод GetYear.
2024.04.18 - v.1.88 : Добавлен внутренний метод CreateDateTime для построения временных значений из компонентов даты (год, месяц и день). Это в 100-120 раз быстрее, чем вызов функции StructToTime.
2024.10.22 - v.1.93 : Более быстрое определение смещения сервера по GMT в выходные дни при реальной торговле.
2024.10.26 - v.1.95 : Добавлены два новых статических метода: TimeGMTOffset() и TimeDaylightSavings(). Переименован метод HistoryBrokerOffset() в TimeServerGMTOffset().
2024.10.28 - v.1.97 : Преобразовал все макросы для работы со временем в функции, чтобы избежать двойной оценки параметров внутри тела макроса. Проведена дополнительная чистка кода в других строках.
2024.10.30 - v.1.98 : Исправлена проблема неправильной оценки смещения GMT из котировок XAUEUR у некоторых брокеров.
2024.11.01 - v.1.99 : Добавлена возможность отключить загрузку символа Gold по умолчанию для оценки TZ/DST сервера. Вызовите CTimeZoneInfo:: SetUsingGoldSymbol() с 'false', чтобы вместо этого использовать символ текущего графика.
2024.11.13 - v.2.00 : Улучшена оценка tz/dst онлайн-сервера и в стратегии стратегии (библиотека TimeGMT больше не нужна). Конструктор принимает параметры места и времени. Новые публичные методы для работы с данными типа datetime. Улучшена обработка ошибок и поддержка отладки.
2024.11.14 - v.2.02 : Исправлена ошибка ERR_HISTORY_NOT_FOUND (4401) при попытке получить доступ к истории котировок XAUUSD,H1 по объекту часового пояса сервера.
2024.11.17 - v.2.03 : Исправлены мелкие ошибки.
2024.11.23 - v.2.04 : Незначительные улучшения и исправления ошибок.
2024.12.05 - v.2.05 : Добавлен новый статический метод DaylightSavingsSupported(placeId).
2024.12.12 - v.2.10 : Улучшена производительность функций HistoryServerGMTOffset() и HistoryServerDaylightSavings(), а также внесены другие незначительные изменения в код.
2024.12.14 - v.2.11 : Улучшена работа функции FindSymbol().
2024.12.17 - v.2.12 : Дальнейшая оптимизация функций HistoryServerGMTOffset() и HistoryServerDaylightSavings().
2024.12.24 - v.2.13 : Исправлена потенциальная проблема в функциях HistoryServerGMTOffset() и HistoryServerDaylightSavings().
2025.01.12 - v.2.15 : Исправлена ошибка в HistoryServerDaylightSavings(), связанная с поиском истории котировок более ранней, чем загруженная история в тестере стратегий.
2025.10.13 - v.2.17 : Незначительные улучшения и исправления ошибок.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/48419
CVD (Cumulative Volume Delta)
Легкий CVD (Cumulative Volume Delta) для MT5 - на основе M1, показывает давление на покупку/продажу в виде свечей с возможностью сброса.
ErrorDescription - Обновленная библиотека
Эта библиотека является обновленной версией библиотеки ErrorDescription.mqh, опубликованной MetaQuotes, с некоторыми включенными функциями.
Class For Working With Databases In A Simplified Manner
easydatabase
Разработка мультивалютного эксперта - исходные коды из серии статей
Исходные коды, написанные в ходе разработки библиотеки для создания мультивалютных советников, объединяющих множество экземпляров различных торговых стратегий.
