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

 
Nikita Chernyshov # :

1. Потому что поддержка не всегда выдает корректную информацию. Вы сами это указали про дилера Альпари. + это накладно: выяснить у каждого дилера переход. Ведь тогда не получается создать хорошего решения, я не знаю, конечный пользователь у кого обсулживается.

2. Ну, вроде как, да, но вот если дилер не переход с зимнего на летнее и обратно, то получается в расчетах какая-то странная штука.

Я попробовал чутка модифицировать вашу библиотеку, но, видимо, что-то не так пошло. Думал код привести к тому, что советник  автоматически определяет время GMT и торгует именно по GMT, а не по серверу брокера. Не уверен, что код оптимальный, но решение, кажется, работает. Правда, у тех дилеров, что время не меняют - там получаются какие-то неверные расчеты.

  1. Что вы изменили?
  2. Можете ли вы назвать мне брокера (ссылка), где это не работает?
  3. Я только что использовал его снова:
     for (i=start; i<rates_total && ! IsStopped (); i++) {
          checkTimeOffset( time[i]);
          tGMT           = time[i] + OffsetBroker.actOffset; // GMT 
    
    }


     
    Carl Schreiber #:
    1. Что вы изменили?
    2. Можете ли вы назвать мне брокера (ссылка), где это не работает?
    3. Я только что использовал его снова:


      1.

      - не стал зацикливаться на EURUSD, туда, куда поставлен советник, ту пару и берем.

      - время тоже не стал жестко фиксировать, я просто отнимаю 1 год от текущего.

         datetime setDate = StringToTime(IntegerToString(NowYear()-1)+".06.21 14:00");
      
         nextDST("EUR", setDate);                        // EUR: get DST and set next change

      И по ссылке передаю параметры bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1), что их динамично получить вот это блок

      input int   USwinEUwin=  -7200;    // US=Winter & EU=Winter
      input int   USsumEUsum= -10800;    // US=Summer & EU=Summer
      input int   USsumEUwin=  -7200;    // US=Summer & EU=Winter

      2. Альфа-форекс. Могу в лс дать данные от демо-счета, чтобы вы могли проверить, не открывая ничего. Дело в том, что дилер не переходит с зимнего на летнее, а разница с GMT все равно возникает.

      3. Немного не понял, как и где использована конструкция. 

       

      3. Немного не понял, как и где использована конструкция.

      In an indicator that is the top of the loop though all bars.

       
      Вообще перешел на гринвич. И время перехода на зимнее определяю как разницу серверного времени и гринвича. Единственно, что для каждого брокера эту разницу приходится считать самому и забивать в константы советника. Просто когда у пользователей разные сдвиги, у брокеров, у бирж, и время перехода на зимнее не одинаково, гринвич одинаков для всех.
       
      Valeriy Yastremskiy #:
      Вообще перешел на гринвич. И время перехода на зимнее определяю как разницу серверного времени и гринвича. Единственно, что для каждого брокера эту разницу приходится считать самому и забивать в константы советника. Просто когда у пользователей разные сдвиги, у брокеров, у бирж, и время перехода на зимнее не одинаково, гринвич одинаков для всех.

      А как именно вы это сделали? Каким образом высчитывается константы?

       
      Nikita Chernyshov #:

      А как именно вы это сделали? Каким образом высчитывается константы?

      Время гринвича минус таймкаррент, с переходом на зимнее он изменится на час. Писал как то время начала и окончания работы, с клиентом разница в час +3 и +2, у брокеров +3, +2, -6 по гринвичу.))) А начинать работу надо было в определенное время, одинаковое для всех. Гринвич одинаков, а серверное и локальное время разные. Код из учебника Федосеева переделал.) 

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

      // TimeGMT()-TimeCurrent(); летом одна величина, зимой другая.
      // TimeGMTOffset() =  TimeGMT() - TimeLocal(); серверным временем нет штатной функции
      
      
      
      
      #property strict
      //+------------------------------------------------------------------+ class CTradeTimeGMT{ protected: int StartTime; int EndTime; int GMTShiftTest; int GMTShiftCur; public: void Init(int StartHour, int StartMinute, int EndHour, int EndMinute, int GMTshift){ StartTime=3600*StartHour+60*StartMinute; EndTime=3600*EndHour+60*EndMinute; GMTShiftCur=GMTshift; GMTShiftTest=GMTshift+int((TimeGMTOffset())/3600); //Alert(TimeGMTOffset()); if(MQLInfoInteger( MQL_TESTER))GMTShiftCur=GMTShiftTest; } bool Check(int GMTshift){ int CurTime=(int)((TimeGMT()+(GMTShiftCur*3600))%86400); if(StartTime<EndTime){ return(CurTime>=StartTime && CurTime<EndTime); } else{ return(CurTime>=StartTime || CurTime<EndTime); } } };
       
      Valeriy Yastremskiy #:

      Время гринвича минус таймкаррент, с переходом на зимнее он изменится на час. Писал как то время начала и окончания работы, с клиентом разница в час +3 и +2, у брокеров +3, +2, -6 по гринвичу.))) А начинать работу надо было в определенное время, одинаковое для всех. Гринвич одинаков, а серверное и локальное время разные. Код из учебника Федосеева переделал.) 

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

      Спасибо, да, такое решение есть в голове, оно +- так и реализовано. Но вы в последнем абзаце указали на всю боль)

       

      Привет @Carl Schreiber С Новым годом.

      Я знаю, что эта статья была опубликована уже давно, но я только что нашел ее. Спасибо, что поделились этой работой. Мне нужно провести некоторое тестирование, чтобы действительно понять ее. Но пока у меня есть простой вопрос:

      Я вижу, что вы используете другой метод вычисления дня недели, а не полагаетесь на структуру MqlDateTime.day_of_week. Почему вы используете этот другой метод вычисления, есть ли преимущество в точности? Или это просто для того, чтобы избежать преобразования в структуру?

       
      Я начал кодировать некоторые основы времени, такие как HoD(), а затем бросил вызов и другим вещам, так как выглядит проще написать DoW(...) вместо того, чтобы назначать время в struct и запрашивать другие значения - не стесняйтесь использовать то, что вам нравится.
       

      Этот код автоматически вычисляет DST для европейских и американских брокеров:

      https://www.mql5.com/ru/code/27860

      //+------------------------------------------------------------------+
      //| Вычислите изменения перехода на летнее время в Лондоне, Великобритания |
      //| Validated to https://www.timeanddate.com/time/change/uk/london   |
      //+------------------------------------------------------------------+
      void DST_Europe(int iYear, datetime &dst_start, datetime &dst_end)
        {
         datetime dt1,dt2;
         MqlDateTime st1,st2;
         /* Переход на зимнее время в Великобритании начинается в 01:00 по местному времени в последнее воскресенье марта
       и заканчивается в 02:00 по местному времени в последнее воскресенье октября */.
         dt1=StringToTime((string)iYear+".03.31 01:00");
         dt2=StringToTime((string)iYear+".10.31 02:00");
         TimeToStruct(dt1,st1);
         TimeToStruct(dt2,st2);
         dst_start=dt1-(st1.day_of_week*86400);
         dst_end  =dt2-(st2.day_of_week*86400);
        }
      //+------------------------------------------------------------------+
      //| Вычислите изменения летнего времени в Нью-Йорке, США |
      //| Проверено на https://www.timeanddate.com/time/change/usa/new-york|.
      //+------------------------------------------------------------------+
      void DST_USA(int iYear, datetime &dst_start, datetime &dst_end)
        {
         datetime dt1,dt2;
         MqlDateTime st1,st2;
         /* Переход на зимнее время в США начинается в 02:00 по местному времени во второе воскресенье марта
       и заканчивается в 02:00 по местному времени в первое воскресенье ноября */
         dt1=StringToTime((string)iYear+".03.14 02:00");
         dt2=StringToTime((string)iYear+".11.07 02:00");
         TimeToStruct(dt1,st1);
         TimeToStruct(dt2,st2);
         dst_start=dt1-(st1.day_of_week*86400);
         dst_end  =dt2-(st2.day_of_week*86400);
        }
      //+------------------------------------------------------------------+
      //||
      //+------------------------------------------------------------------+
      void OnStart()
        {
         datetime dst_start,dst_end;
         dst_start=dst_end=0;
      
      //--- В Европейском Союзе летнее время начинается в последнее воскресенье в
      //--- марта и заканчивается в последнее воскресенье октября.|
      
         Print("========= European Summer Time (DST) =========");
         for(int year=2010; year<=2029; year++)
           {
            DST_Europe(year,dst_start,dst_end);
            Print("DST starts on ",dst_start," and ends on ",dst_end);
           }
      
      //--- В Соединенных Штатах летнее время начинается во второе воскресенье | года.
      //--- марта и заканчивается в первое воскресенье ноября.|
      
         Print("========= American Summer Time (DST) =========");
         for(int year=2010; year<=2029; year++)
           {
            DST_USA(year,dst_start,dst_end);
            Print("DST starts on ",dst_start," and ends on ",dst_end);
           }
        }
      //+------------------------------------------------------------------+
      
      /*
      вывод:
      ========= Европейское летнее время (DST) =========
      DST начинается в 2010.03.28 01:00:00 и заканчивается в 2010.10.31 02:00:00
      DST начинается в 2011.03.27 01:00:00 и заканчивается в 2011.10.30 02:00:00
      DST начинается 2012.03.25 01:00:00 и заканчивается 2012.10.28 02:00:00
      DST начинается 2013.03.31 01:00:00 и заканчивается 2013.10.27 02:00:00
      DST начинается 2014.03.30 01:00:00 и заканчивается 2014.10.26 02:00:00
      DST начинается 2015.03.29 01:00:00 и заканчивается 2015.10.25 02:00:00
      DST начинается 2016.03.27 01:00:00 и заканчивается 2016.10.30 02:00:00
      DST начинается 2017.03.26 01:00:00 и заканчивается 2017.10.29 02:00:00
      DST начинается 2018.03.25 01:00:00 и заканчивается 2018.10.28 02:00:00
      DST начинается 2019.03.31 01:00:00 и заканчивается 2019.10.27 02:00:00
      DST начинается 2020.03.29 01:00:00 и заканчивается 2020.10.25 02:00:00
      DST начинается 2021.03.28 01:00:00 и заканчивается 2021.10.31 02:00:00
      DST начинается в 2022.03.27 01:00:00 и заканчивается в 2022.10.30 02:00:00
      DST начинается в 2023.03.26 01:00:00 и заканчивается в 2023.10.29 02:00:00
      DST начинается в 2024.03.31 01:00:00 и заканчивается в 2024.10.27 02:00:00
      DST начинается в 2025.03.30 01:00:00 и заканчивается в 2025.10.26 02:00:00
      DST начинается в 2026.03.29 01:00:00 и заканчивается в 2026.10.25 02:00:00
      DST начинается в 2027.03.28 01:00:00 и заканчивается 2027.10.31 02:00:00
      DST начинается 2028.03.26 01:00:00 и заканчивается 2028.10.29 02:00:00
      DST начинается 2029.03.25 01:00:00 и заканчивается 2029.10.28 02:00:00
      ========= Американское летнее время (DST) =========
      DST начинается 2010.03.14 02:00:00 и заканчивается 2010.11.07 02:00:00
      DST начинается 2011.03.13 02:00:00 и заканчивается 2011.11.06 02:00:00
      DST начинается 2012.03.11 02:00:00 и заканчивается 2012.11.04 02:00:00
      DST начинается 2013.03.10 02:00:00 и заканчивается 2013.11.03 02:00:00
      DST начинается 2014.03.09 02:00:00 и заканчивается 2014.11.02 02:00:00
      DST начинается 2015.03.08 02:00:00 и заканчивается 2015.11.01 02:00:00
      DST начинается 2016.03.13 02:00:00 и заканчивается 2016.11.06 02:00:00
      DST начинается 2017.03.12 02:00:00 и заканчивается 2017.11.05 02:00:00
      DST начинается 2018.03.11 02:00:00 и заканчивается 2018.11.04 02:00:00
      DST начинается 2019.03.10 02:00:00 и заканчивается 2019.11.03 02:00:00
      DST начинается в 2020.03.08 02:00:00 и заканчивается в 2020.11.01 02:00:00
      DST начинается в 2021.03.14 02:00:00 и заканчивается в 2021.11.07 02:00:00
      DST начинается в 2022.03.13 02:00:00 и заканчивается в 2022.11.06 02:00:00
      DST начинается в 2023.03.12 02:00:00 и заканчивается в 2023.11.05 02:00:00
      DST начинается в 2024.03.10 02:00:00 и заканчивается в 2024.11.03 02:00:00
      DST начинается в 2025.03.09 02:00:00 и заканчивается в 2025.11.02 02:00:00
      DST начинается в 2026.03.08 02:00:00 и заканчивается в 2026.11.01 02:00:00
      DST начинается в 2027.03.14 02:00:00 и заканчивается 2027.11.07 02:00:00
      DST начинается 2028.03.12 02:00:00 и заканчивается 2028.11.05 02:00:00
      DST начинается 2029.03.11 02:00:00 и заканчивается 2029.11.04 02:00:00
      */
      

      Приведенный выше код был использован в Forex Market Hours https://www.mql5.com/ru/code/27771 для расчета изменения времени перехода на летнее время.

      Аналогичные функции можно построить для разных регионов мира.

      Daylight changes (summer time)
      Daylight changes (summer time)
      • www.mql5.com
      Compute the daylight saving time changes (start/end of the summer time).