Обсуждение статьи "Работаем со временем (Часть 2): Функции" - страница 3

 

Привет @Carl Schreiber,

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

Я использую брокера eightcap и попытался использовать простой скрипт, чтобы показать фактическое время в соответствующей стране, и обнаружил, что время в Токио отстает от фактического на 1 час. Вот скрипт, который я использую,

void OnStart()
  {
   bool isTimeSet = setBokerOffset();
   if(!isTimeSet)
     {
      Alert("setBokerOffset failed");
      return;
     }

   Alert("+++++++++++++++");
   checkTimeOffset(TimeCurrent());
   datetime tGMT  = TimeCurrent() + OffsetBroker.actOffset;    // GMT
   datetime tNY   = tGMT - (NYShift+DST_USD);                  // время в нью-йорке
   datetime tLon  = tGMT - (LondonShift+DST_EUR);              // время в лондоне
   datetime tSyd  = tGMT - (SidneyShift+DST_AUD);              // время в сиднее
   datetime tMosc = tGMT - (MoskwaShift+DST_RUS);              // время в москве
   datetime tTok  = tGMT - (TokyoShift);                       // время в Токио - без суточного времени

   Alert("time NY: ", tNY);
   Alert("time Lon: ", tLon);
   Alert("time Syd: ", tSyd);
   Alert("time Tok: ", tTok);
  }

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

Carl Schreiber
Carl Schreiber
  • 2023.03.22
  • www.mql5.com
Trader's profile
 
Luandre Ezra #:

Привет @Карл Шрайбер,

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

Я использую брокера eightcap и попытался использовать простой скрипт, чтобы показать фактическое время в соответствующей стране, и обнаружил, что время в Токио отстает от фактического на 1 час. Вот скрипт, который я использую,

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

От GMT (=UTC) разница во времени составляет 0900 часов (от https://www.worldtimeserver.com/current_time_in_JP.aspx?city=Tokyo)

= 9*-3600=32400 секунд:

И это установлено:

#define  TokyoShift   -32400                           // всегда 9h
Current local time in Tokyo, Japan
  • www.worldtimeserver.com
Current local time and date in Tokyo, Japan from a trusted independent resource
 
Carl Schreiber #:

От GMT (=UTC) разница во времени составляет 0900 часов (с https://www.worldtimeserver.com/current_time_in_JP.aspx?city=Tokyo).

= 9*-3600=32400 секунд:

И это установлено:

Ошибка, которую я совершил. Это не Токио, а Сидней.


 
Возможно, расчет австралийского переключателя DST неисправен - я посмотрю, спасибо.
Time Zones - WorldTimeServer.com
  • www.worldtimeserver.com
A list of all worldwide time zones with abbreviation and name. Click on a time zone to see more details.
 

Australian First Sunday of October at 02:00 to First Sunday of April at 02:00

Австралийский ДСТ 2010 начало 2010.10.03 - конец 2010.04.04
Австралийский ДСТ 2011 начало 2011.10.02 - конец 2011.04.03
Австралийский ДСТ 2012 начало 2012.10.07 - конец 2012.04.01
Австралийский ДСТ 2013 начало 2013.10.06 - конец 2013.04.07
Австралийский ДСТ 2014 начало 2014.10.05 - конец 2014.04.06
Австралийский ДСТ 2015 начало 2015.10.04 - конец 2015.04.05
Австралийский ДСТ 2016 начало 2016.10.02 - конец 2016.04.03
Австралийский ДСТ 2017 начало 2017.10.01 - конец 2017.04.02
Австралийский ДСТ 2018 начало 2018.10.07 - конец 2018.04.01
Австралийский ДСТ 2019 начало 2019.10.06 - конец 2019.04.07
ДСТ Австралии 2020 начало 2020.10.04 - конец 2020.04.05
ДСТ Австралии 2021 начало 2021.10.03 - конец 2021.04.04
ДСТ Австралии 2022 начало 2022.10.02 - конец 2022.04.03
ДСТ Австралии 2023 начало 2023.10.01 - конец 2023.04.02
ДСТ Австралии 2024 начало 2024.10.06 - конец 2024.04.07
Австралийский ДСТ 2025 начало 2025.10.05 - конец 2025.04.06
Австралийский ДСТ 2026 начало 2026.10.04 - конец 2026.04.05
Австралийский ДСТ 2027 начало 2027.10.03 - конец 2027.04.04
Австралийский ДСТ 2028 начало 2028.10.01 - конец 2028.04.02
Австралийский ДСТ 2029 начало 2029.10.07 - конец 2029.04.01

Australia & New Zealand End DST
Australia & New Zealand End DST
  • www.timeanddate.com
People in New Zealand and parts of Australia will get an additional hour to enjoy when Daylight Saving Time (DST) ends on Sunday, April 2, 2023.
 

Я нашел проблему: я пропустил проверку:

В начале функции void checkTimeOffset(datetime tB) я поставил галочку:

if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR)
      return;  

И это я должен был изменить на:

if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR && tB < nxtSwitch_AUD)
      return;  

Я обновлю его ...

 
Carl Schreiber чек:

В начале функции void checkTimeOffset(datetime tB) я поместил проверку:

И это я должен был изменить на:

Я обновлю его ...

Привет, Карл, к сожалению, изменение соответствующего кода не устраняет проблему. Я также обнаружил, что московское время отличается от универсального.


 

Версия DealingWithTime.mqh v. 1.01 из статьи "Работа со временем (часть 2): Функции" ( https://www.mql5.com/en/articles/9929 ) больше не работает, потому что MQ изменила поведение функции CopyTime() через некоторое время после публикации этой статьи. Теперь эта функция больше не возвращает значения будущего времени, если они больше, чем TimeCurrent(), указанные для параметров start_time и/или stop_time. Вместо этого возвращается время открытия последнего, текущего бара как наибольшее возможное значение.

Поскольку конец FX-сессии определялся таким образом, в частности, для определения смещения времени брокера, это приводит к некорректным значениям!

Этот расчет был изменен в версии 2.03. Эта новая версия теперь доступна в CodeBase здесь: https://www.mql5.com/en/code/45287.

Расчет перехода на другое время также был полностью изменен, так что сложные моменты перехода на другое время из Сиднея (Австралия) в 1970-е годы теперь также охвачены.

Прилагается также таблица DST 1975 - 2030.xlsx в виде zip-файла со всеми изменениями времени с 70-х годов, чтобы каждый мог проверить правильность работы формул, вот пример серии из таблицы:

01.01.1982 - зимнее время в США (DST==0), следующий переход - 25.04.1982, последнее (25-е число месяца) воскресенье апреля (4). Таблица уже отсортирована по географическому часовому поясу (столбец A), затем по часовому поясу года (столбец L, spr=spring, aut=autumn,) и, наконец, по дате запроса (столбец C). Таблица может быть создана автоматически с помощью прилагаемого эксперта (скрипт не может быть запущен в режиме отладки). Test_DST 2.mq5, если вы запустите его в режиме отладки и скопируете строки журнала в отладчике и вставите их в таблицу программы; разделителем ячеек будет символ пробела.

Также появилась новая простая функция SecTillClose(), которая выдает оставшееся время в секундах (валюта времени в MQ) до закрытия рынка Форекс - без CopyTime(). Это интересно для тех, кто хочет закрыть свои позиции до выходных или не хочет открывать новую позицию в определенный период до выходных.

Входящий в комплект индикатор DealingWithTime_TestIndi.mq5 показывает в качестве комментария на графике не только летнее/зимнее время Европы, США и Австралии (Сидней), но и текущее время, а также разницу во времени различных городов. Здесь же вы найдете таблицу с различными значениями местного времени для крупных городов, например, для сравнения с: https://www.timeanddate.com/worldclock/. Таким образом, вы можете проверить значения в любое время. Этот индикатор также показывает, как определяются и используются эти значения (что из чего вычитается или к чему прибавляется), чтобы было проще использовать его самостоятельно - копировать и вставить, самая быстрая форма программирования.

Последние две строки также показывают последнюю секунду текущей FX-сессии и оставшееся время в часах (проще судить) и секундах. Если сессия FX в Нью-Йорке закрывается в 17:00 по местному времени по пятницам, то не существует действительного бара с временем открытия в 17:00 по нью-йоркскому времени. Поэтому в этой функции вычитается 1 секунда, чтобы получить время открытия последнего бара по времени брокера. Однако некоторые брокеры завершают свою FX-сессию на несколько минут раньше, переставая предоставлять цены и принимать торговые ордера.


Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Версия DealingWithTime.mqh v. 1.01 из статьи Dealing with Time (Part 2): Функции ( https://www.mql5.com/ru/articles/9929 ) перестала работать, потому что MQ изменила поведение функции CopyTime() через некоторое время после публикации этой статьи. Теперь эта функция больше не возвращает значения будущего времени, если они больше, чем TimeCurrent(), указанные для параметров start_time и/или stop_time. Вместо этого возвращается время открытия последнего, текущего бара как наибольшее возможное значение.

Поскольку конец FX-сессии определялся таким образом для определения смещения времени брокера, теперь это приводит к неверным значениям!

Этот расчет был изменен в версии 2.03. Эта версия теперь доступна в CodeBase здесь: https://www.mql5.com/ru/code/45287.

Кроме того, был полностью изменен расчет изменения времени, так что теперь охвачены сложные моменты изменения времени от Сиднея (Австралия) до 70-х годов.

Также прилагается таблица DST 1975 - 2030.xlsx в виде zip-файла со всеми изменениями времени с 70-х годов, чтобы каждый мог проверить правильность работы формул, вот пример серии из таблицы:

1 января 1982 года - стандартное время в США (DST==0), а следующий переход будет 25 апреля 1982 года, в последнее (25-е число месяца) воскресенье апреля (4). Таблица уже отсортирована по географическому часовому поясу (столбец A), затем по часовому поясу года (столбец L, spr=spring, aut=autumn,) и, наконец, по дате запроса (столбец C). Таблица может быть создана автоматически с помощью прилагаемого эксперта (скрипт не может быть запущен в режиме отладки). Test_DST 2.mq5, если вы запустите его в режиме отладки и скопируете строки журнала в отладчике и вставите их в электронную таблицу; разделителем ячеек будет пробел.

Также появилась новая простая функция SecTillClose(), которая выдает оставшееся время в секундах (валюта времени в MQ) до закрытия рынка форекс - без CopyTime(). Это интересно для тех, кто хочет закрыть свои позиции до выходных или не хочет открывать новую позицию в определенный период до выходных.

Входящий в комплект индикатор DealingWithTime_TestIndi.mq5 в виде комментария к графику показывает не только переход на летнее время в Европе, США и Австралии (Сидней), но и текущее время и разницу во времени разных городов. Здесь же вы можете найти таблицу с разным местным временем крупных городов для сравнения: https://www.timeanddate.com/worldclock/. Таким образом, вы можете проверить значения в любое время. Этот индикатор также показывает, как определяются и используются эти значения (что из чего вычитается или прибавляется), что облегчает самостоятельное использование - копирование и вставка, самая быстрая форма программирования.

Последние две строки также показывают последнюю секунду текущей FX-сессии и оставшееся время в часах (что легче оценить) и в секундах. В Нью-Йорке, когда сессия FX закрывается в 17:00 по местному времени в пятницу, нет ни одного действующего бара, открытого в 17:00 по нью-йоркскому времени. Поэтому в этой функции 1 секунда вычитается, чтобы получить время открытия последнего бара по времени брокера. Однако некоторые брокеры завершают свою FX-сессию на несколько минут раньше, переставая предоставлять цены и принимать торговые ордера.


Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Версия DealingWithTime.mqh v. 1.01 из статьи "Управление расписанием (часть 2): Функции" ( https://www.mql5.com/ru/articles/9929 ) перестала работать, потому что MetaQuotes изменила поведение CopyTime(), и теперь она перестала работать через некоторое время после публикации этой статьи. Теперь эта функция больше не возвращает значения будущего времени, если они больше, чем TimeCurrent(), указанный для параметров start_time и/или stop_time. Вместо этого в качестве наибольшего возможного значения возвращается время открытия последнего текущего бара.

Поскольку конец FX-сессии определялся таким образом для определения временного смещения брокера, теперь это приводит к неверным значениям!

Этот расчет был изменен в версии 2.03. Эта версия теперь доступна на CodeBase здесь: https://www.mql5.com/en/code/45287.

Кроме того, был полностью изменен расчет изменения времени, так что сложное время изменения времени от Сиднея (Австралия) до 1970-х годов теперь покрыто.

Также прилагается таблица DST 1975 - 2030.xlsx в виде zip-файла со всеми изменениями времени с 1970-х годов, чтобы каждый мог проверить правильность работы формул, вот несколько примеров из таблицы:

1 января 1982 года - стандартное время в США (DST==0), а следующее изменение будет 25 апреля 1982 года, в последнее (25-е число месяца) воскресенье апреля (4). Таблица уже отсортирована по географическому часовому поясу (столбец A), затем по часовому поясу года (столбец L, spr=весна, aut=осень) и, наконец, по дате запроса (столбец C). Таблица может быть создана автоматически с помощью прилагаемого эксперта (скрипт не может быть запущен в режиме отладки). Test_DST 2.mq5, если запустить его в режиме отладки, скопировать строки журнала в отладчике и вставить их в электронную таблицу; разделителем ячеек будет пробел.

Кроме того, появилась новая простая функция SecTillClose(), которая выдает время, оставшееся в секундах (валюта времени MetaQuotes) до закрытия рынка Форекс, без CopyTime(). Это интересно для тех, кто хочет закрыть свои позиции до выходных или не хочет открывать новую позицию в определенный период до выходных.

Входящий в комплект индикатор DealingWithTime_TestIndi.mq5 в виде комментария к графику показывает не только переход на летнее время в Европе, США и Австралии (Сидней), но и текущее время, а также разницу во времени разных городов. Здесь же вы можете найти таблицу с разным местным временем основных городов для сравнения: https://www.timeanddate.com/worldclock/. Таким образом, вы можете проверить значения в любое время. Этот индикатор также показывает, как определяются и используются эти значения (что вы вычитаете или прибавляете), что делает его простым в использовании: копируй и вставляй - самый быстрый способ программирования.

Последние две строки также показывают последнюю секунду текущей FX-сессии и оставшееся время в часах (что проще для восприятия) и секундах. В Нью-Йорке, когда сессия FX закрывается в 17:00 по местному времени в пятницу, нет ни одного действующего бара, открытого в 17:00 по нью-йоркскому времени. Поэтому в этой функции 1 секунда вычитается, чтобы получить время открытия последнего бара по времени брокера. Однако некоторые брокеры завершают свою валютную сессию на несколько минут раньше и больше не предоставляют цены и не принимают торговые ордера.