Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

TimeGMT library for the strategy tester - библиотека для MetaTrader 5

Просмотров:
153
Рейтинг:
(16)
Опубликован:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Функция TimeGMT()

Возвращает значение GMT, которое рассчитывается с учетом перехода на DST по локальному времени на компьютере, где запущен клиентский терминал. Существует 2 варианта функции.

Вызов без параметров

datetime  TimeGMT();

Вызов с параметром типа MqlDateTime

datetime  TimeGMT(
   MqlDateTime&  dt_struct      // Переменная типа структуры
   );

Однако при тестировании в тестере стратегий время TimeGMT() всегда равно симулированному серверному времени TimeTradeServer().



Библиотека TimeGMT

Эта библиотека исправит функцию TimeGMT(), чтобы обеспечить истинное время по Гринвичу во время тестирования в тестере стратегий. Библиотека установит глобальные API-хуки (через макроподстановку) для двух версий TimeGMT.

class CTimeGMT
  {
public:
   static datetime   TimeGMT(void);
   static datetime   TimeGMT(MqlDateTime &dt_struct);
  }

Применение:

Перед тестированием советника, использующего фильтр новостей или любое ограничение по времени в тестере стратегий, просто включите эту строку в начало кода, а затем перекомпилируйте исходный текст в MetaEditor.

#include "TimeGMT.mqh"

- В качестве опции, чтобы увидеть отладочные сообщения, добавьте эту строку перед директивой #include:

#define  PRINT_GMT_DETAILS

Никаких других модификаций или вызовов функций для советника или индикатора не требуется.

  • TimeGMT исправляется только при обнаружении тестера стратегий.
  • Исправление работает на символе, выбранном в тестере стратегий.
  • Отсутствие ошибок расчета в выходные и рождественские праздники.
  • Низкие накладные расходы и быстрое время расчета в тестере стратегий

Пересчет смещения брокера происходит только при запуске советника и каждую полночь воскресенья и понедельника. Рассчитанное смещение брокера кэшируется в памяти и используется при последующих обращениях к TimeGMT.

Выбор символа для оценки TZ/DST сервера

По умолчанию библиотека будет искать и загружать символ XAUUSD для оценки смещения часового пояса сервера. XAUUSD может дать более надежные результаты (особенно для брокеров, которые следуют графику ЕС DST ) в недели, когда графики US DST и EU DST не синхронизированы (март и конец октября). Если ваш брокер придерживается графика US DST или вообще не придерживается, то можно использовать символ графика. Вызовите CTimeGMT::SetUsingGoldSymbol() с 'false', чтобы использовать символ текущего графика, а не XAUUSD.

Чтобы определить расписание дня (DST) у вашего брокера, вы можете использовать этот скрипт https://www.mql5.com/ru/code/48650.

//+------------------------------------------------------------------+
//| Устанавливает возможность использования символа XAUUSD (золото) для оценки |
//| TZ/DST сервера путем анализа истории котировок H1.|
//| TRUE: поиск и загрузка символа Gold (поведение по умолчанию)|.
//| FALSE : использовать символ текущего графика.|
//+------------------------------------------------------------------+
void CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);

Примечание:

Побочным эффектом является то, что XAUUSD стартует на час позже Forex, поэтому в тестере стратегий переключение DST будет происходить на час позже.



TimeGMT_TestEA

Чтобы изучить работу библиотеки в тестере стратегий, в тестере стратегий тестируется демо-советник


вот результаты работы советника в тестере стратегий:

AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating
AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs:
  timer_hours=24
2023.03.05 00:00:00   TimeCurrent() = Sun, 2023.03.05 00:00:00  | TimeTradeServer() = Sun, 2023.03.05 00:00:00  | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.06 00:00:00   TimeCurrent() = Mon, 2023.03.06 00:00:00  | TimeTradeServer() = Mon, 2023.03.06 00:00:00  | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.07 00:00:00   TimeCurrent() = Tue, 2023.03.07 00:00:00  | TimeTradeServer() = Tue, 2023.03.07 00:00:00  | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.08 00:00:00   TimeCurrent() = Wed, 2023.03.08 00:00:00  | TimeTradeServer() = Wed, 2023.03.08 00:00:00  | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.09 00:00:00   TimeCurrent() = Thu, 2023.03.09 00:00:00  | TimeTradeServer() = Thu, 2023.03.09 00:00:00  | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.10 00:00:00   TimeCurrent() = Fri, 2023.03.10 00:00:00  | TimeTradeServer() = Fri, 2023.03.10 00:00:00  | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.11 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sat, 2023.03.11 00:00:00  | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.12 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sun, 2023.03.12 00:00:00  | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.13 00:00:00   TimeCurrent() = Mon, 2023.03.13 00:00:00  | TimeTradeServer() = Mon, 2023.03.13 00:00:00  | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.14 00:00:00   TimeCurrent() = Tue, 2023.03.14 00:00:00  | TimeTradeServer() = Tue, 2023.03.14 00:00:00  | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.15 00:00:00   TimeCurrent() = Wed, 2023.03.15 00:00:00  | TimeTradeServer() = Wed, 2023.03.15 00:00:00  | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.16 00:00:00   TimeCurrent() = Thu, 2023.03.16 00:00:00  | TimeTradeServer() = Thu, 2023.03.16 00:00:00  | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.17 00:00:00   TimeCurrent() = Fri, 2023.03.17 00:00:00  | TimeTradeServer() = Fri, 2023.03.17 00:00:00  | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.18 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sat, 2023.03.18 00:00:00  | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.19 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sun, 2023.03.19 00:00:00  | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)


Обновления:

2024.03.30 - v.1.25 : Исправлено смещение GMT брокера. В настоящее время библиотека сканирует бары H1 только на графике GOLD, так как он имеет наиболее точное время начала.

2024.04.09 - v.1.33 : Исправлена потенциальная проблема в расчете брокерского GMT-смещения во время рождественских праздников у брокеров GMT+0.

2024.04.12 - v.1.35 : Исправлена проблема с расчетом GMT-смещения брокера на нескольких брокерах, не предоставляющих торговлю золотом.

2024.07.07 - v.1.36 : Исправлена проблема с правильным определением символа GOLD у некоторых брокеров.

2024.10.21 - v.1.40 : Улучшено обнаружение символа GOLD с возвратом к символу EURUSD.

2024.10.22 - v.1.45 : Более быстрое определение смещения сервера по GMT в выходные дни в тестере стратегий.

2024.10.26 - v.1.47 : Добавлен улучшенный код обработки ошибок и отладки. Переименован метод HistoryBrokerOffset() в TimeServerGMTOffset().

2024.10.28 - v.1.49 : Преобразовал все макросы для работы со временем в функции, чтобы избежать двойной оценки параметров внутри тела макроса. Больше чистки кода в других строках.

2024.10.30 - v.1.50 : Исправлена проблема неправильной оценки смещения GMT из котировок XAUEUR у некоторых брокеров.

2024.11.23 - v.1.55 : Добавлена возможность отключить загрузку символа Gold по умолчанию для оценки TZ/DST сервера. Вызовите CTimeGMT::SetUsingGoldSymbol() с 'false', чтобы вместо этого использовать символ текущего графика.

2024.12.12 - v.1.60 : Улучшена производительность функции HistoryServerGMTOffset() и другие незначительные изменения кода.

2024.12.14 - v.1.61 : Улучшена работа функции FindSymbol().

2024.12.17 - v.1.62 : Дальнейшая оптимизация функции HistoryServerGMTOffset().

2024.12.24 - v.1.63 : Исправлена потенциальная проблема в функции HistoryServerGMTOffset().



Часовой пояс брокера и график DST

Среднее время по Гринвичу (GMT), также называемое универсальным координированным временем (UTC), используется в качестве официального мирового эталона времени. Часто можно встретить представление часовых поясов в виде UTC - 3h или GMT - 3h. В данном примере (-3h) означает, что данный часовой пояс отстает от UTC или GMT на три часа. UTC+3h или GMT +3h означает, что данный часовой пояс опережает UTC или GMT на три часа. Разница во времени между нашим местным временем и временем по Гринвичу (UTC) называется GMT offset.

Рынок Forex открывается в воскресенье в 17:00 по нью-йоркскому времени (GMT-5:00 зимой и GMT-4:00 летом) и закрывается в пятницу в то же время. Время начала работы рынка Forex в 17:00 по нью-йоркскому времени соответствует 10:00 UTC зимой (и 09:00 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 ЕС. Для брокеров, которые не следуют американскому графику, время начала (и конца) недели на сервере одного и того же брокера варьируется на +/- один час в течение года. Чтобы справиться с этими колебаниями, перерасчет смещения брокера должен производиться еженедельно, чтобы вовремя обнаружить изменения DST на брокере.

Использование часового пояса +2 (и +3 летом на графике США) означает, что свечи на каждой неделе начинаются в полночь понедельника, есть пять свечей D1 в неделю, а начало дневной свечи (и H4) - это начало нового дня FX. Каждая неделя заканчивается незадолго до полуночи субботы.Просто время на этих серверах всегда опережает нью-йоркское на 7 часов и представлено как NY+7. На сегодняшний день это самая распространенная настройка, но существует множество менее распространенных вариаций.


Детали вычисления истинного времени по Гринвичу

Когда вызов TimeGMT() перехватывается библиотекой, она сначала проверяет, не запущена ли она в тестере стратегий, а затем возвращает исходную функцию. Если тестер стратегий обнаружен, код начинает вычислять смещение брокера (см. далее), а возвращаемое значение - это просто результат вычитания этого смещения из текущего времени торгового сервера в клиентском терминале.

true GMT  = TimeTradeServer() - ServerGMTOffset (of the current trading week)

Само значение'ServerGMTOffset' можно оценить, проанализировав историю котировок H1, как разницу между двумя известными временами:

1) временем появления первого бара торговой недели на графике GOLD (FstBarWk),

2) соответствующим временем UTC для времени начала торгов GOLD в Нью-Йорке в 18:00 .

ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)  

Для расчета BrokerOffset используется оптимизированная модификация алгоритма, который был опубликован Карлом Шрайбером в статье Dealing with time (2).


Согласно https://www.timeanddate.com/time/change/usa/new-york

  • В Нью-Йорке DST начинается (по летнему времени) в 02:00 утра по местному времени во второе воскресенье марта. Часы переводятся на один час вперед в GMT-4, таким образом, соответствующее время UTC для солнца Нью-Йорка в 18:00 будет (Sun, 22:00 UTC).

  • Поскольку зимнее время (DST) в Нью-Йорке заканчивается в 02:00 по местному времени в первое воскресенье ноября, часы переведут на один час назад в GMT-5, таким образом, соответствующее время UTC для NY Sun, 18:00 будет (Sun, 23:00 UTC).

Например, если FstBarWk на графике GOLD начинается в Mon, 01:00, и в Нью-Йорке на этом баре зима, то BrokerOffset можно рассчитать как:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)

, а если в Нью-Йорке лето, то BrokerOffset:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)



Пересчет часов сессии в серверное время брокера

Трейдеры могут использовать функцию TimeGMT() для преобразования времени сессии в соответствующее серверное время, чтобы определить, когда откроются или закроются определенные рынки. Например, если трейдер хочет торговать в азиатскую (токийскую) сессию, он должен скорректировать свое торговое время соответствующим образом

1] Определить смещение торгового сервера брокера

int ServerGMTOffset = TimeTradeServer() - TimeGMT();

    2] Перевести местное время конкретных рынков в соответствующее время сервера брокера

    datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset

    Второй член в уравнении (xxx_GMTOffset) должен быть увеличен на +1 час, если часовой пояс назначения в настоящее время находится в летнем времени.

    При тестировании в тестере стратегий функция TimeGMT() всегда равна симулированному серверному времени TimeTradeServer(), поэтому преобразование времени сессий становится неверным. Эта библиотека исправит функцию TimeGMT(), чтобы обеспечить истинное время GMT, таким образом, преобразованное время сессий станет точным при тестировании в тестере стратегий.


    Перевод с английского произведен MetaQuotes Ltd.
    Оригинальная публикация: https://www.mql5.com/en/code/48291

    Simple Bar Timer Simple Bar Timer

    Это скрипт для отображения времени, оставшегося до появления следующего бара.

    Разработка мультивалютного эксперта - исходные коды из серии статей Разработка мультивалютного эксперта - исходные коды из серии статей

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

    Statistical Zigzag Statistical Zigzag

    Это зигзаг, который создает новые поворотные точки зигзага на основе прохождения порога волатильности

    Historex: export the history of rates and ticks to CSV-files Historex: export the history of rates and ticks to CSV-files

    Это скрипт для экспорта курсов и тиков текущего символа графика в CSV-файлы, совместимые с форматом экспорта/импорта MT5.