Discussão do artigo "Trabalhando com o tempo (Parte 2): funções" - página 2

 
Nikita Chernyshov # :

1. Porque o suporte nem sempre fornece informações corretas. Você mesmo apontou isso sobre o revendedor da Alpari. + é caro: descobrir a transição de cada revendedor. Porque assim não é possível criar uma boa solução, pois não sei com quem o usuário final está discutindo.

2. Bem, mais ou menos, sim, mas se um revendedor não mudar do inverno para o verão e vice-versa, os cálculos ficarão um pouco estranhos.

Tentei modificar um pouco sua biblioteca, mas aparentemente algo deu errado. Achei que o código deveria levar ao fato de que o Expert Advisor detecta automaticamente o horário GMT e negocia de acordo com o GMT, e não de acordo com o servidor da corretora. Não tenho certeza se o código é ideal, mas a solução parece funcionar. Entretanto, nas corretoras que não alteram o horário, há alguns cálculos incorretos.

  1. O que você alterou?
  2. Você pode me indicar uma corretora (link) em que isso não funciona?
  3. Acabei de usá-lo novamente:
     for (i=start; i<rates_total && ! IsStopped (); i++) {
          checkTimeOffset( time[i]);
          tGMT           = time[i] + OffsetBroker.actOffset; // GMT 
    
    }


     
    Carl Schreiber #:
    1. O que você mudou?
    2. Você pode me indicar um corretor (link) em que isso não funcione?
    3. Acabei de usá-lo novamente:


      1.

      - Não me fixei no EURUSD, usamos o par onde quer que o EA seja colocado.

      - Também não fixei a hora, apenas subtraí 1 ano do atual.

         datetime setDate = StringToTime(IntegerToString(NowYear()-1)+".06.21 14:00");
      
         nextDST("EUR", setDate);                        // EUR: obtém o horário de verão e define a próxima mudança

      E eu passo os parâmetros para bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1) para obter esse bloco dinamicamente.

      input int   USwinEUwin=  -7200;    // EUA=inverno e UE=inverno
      input int   USsumEUsum= -10800;    // EUA=Verão e UE=Verão
      input int   USsumEUwin=  -7200;    // EUA=Verão e UE=Inverno

      2. alpha forex. Posso fornecer dados da conta de demonstração para que você possa verificar sem abrir nada. O problema é que o revendedor não muda do inverno para o verão, e a diferença com o GMT ainda ocorre.

      3. Não está claro como e onde o design é usado.

       

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

      Em um indicador, esse é o topo do loop em todas as barras.

       
      Em geral, mudei para Greenwich. Eu defino o tempo de transição para o horário de inverno como a diferença entre o horário do servidor e o horário de Greenwich. O único problema é que, para cada corretora, essa diferença precisa ser calculada por mim e inserida nas constantes do Expert Advisor. Quando os usuários têm turnos, corretores, bolsas diferentes e o horário de transição para o inverno não é o mesmo, Greenwich é o mesmo para todos.
       
      Valeriy Yastremskiy #:
      Em geral, mudei para Greenwich. Eu defino o tempo de transição para o horário de inverno como a diferença entre o horário do servidor e o horário de Greenwich. O único problema é que, para cada corretora, essa diferença precisa ser calculada por mim e inserida nas constantes do Expert Advisor. Quando os usuários têm turnos, corretores, bolsas diferentes e o horário de transição para o horário de inverno não é o mesmo, Greenwich é o mesmo para todos.

      Como exatamente você fez isso? Como as constantes são calculadas?

       
      Nikita Chernyshov #:

      Como exatamente você fez isso? Como as constantes são calculadas?

      O horário de Greenwich menos a timecarrent, com a transição para o horário de inverno, mudará em uma hora. Escrevi uma vez o horário de início e término do trabalho, com o cliente a diferença em horas +3 e +2, corretores +3, +2, -6 horário de Greenwich))))). E era necessário começar a trabalhar em um determinado horário, o mesmo para todos. A hora de Greenwich é a mesma, mas o servidor e a hora local são diferentes. Refiz o código do livro didático de Fedoseyev).

      Em geral, o problema é que não há uma função padrão para a diferença entre o horário do servidor e o horário de Greenwich. Mas ela é contada. Há também o problema de que o horário local também pode ter uma transição para o horário de inverno, e em um horário diferente da transição do corretor.

      // TimeGMT()-TimeCurrent(); um valor no verão, outro no inverno.
      // 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); //Alerta(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 #:

      O horário de Greenwich menos a timecarrent, com a transição para o horário de inverno, mudará em uma hora. Escrevi uma vez o horário de início e término do trabalho, com o cliente a diferença em horas +3 e +2, corretores +3, +2, -6 horário de Greenwich)))). E era necessário começar a trabalhar em um determinado horário, o mesmo para todos. A hora de Greenwich é a mesma, mas o servidor e a hora local são diferentes. O código do livro didático de Fedoseyev foi reformulado).

      Em geral, o problema é que não há uma função padrão para a diferença entre o horário do servidor e o horário de Greenwich. Mas ela é contada. Há também o problema de que o horário local também pode ter uma transição para o horário de inverno, e em um horário diferente da transição do corretor.

      Obrigado, sim, essa solução está na minha cabeça, está +- implementada. Mas você apontou a dor no último parágrafo)

       

      Oi @Carl Schreiber Feliz Ano Novo.

      Sei que esse artigo já está no ar há algum tempo, mas acabei de encontrá-lo. Obrigado por compartilhar esse trabalho. É necessário que eu faça alguns testes para realmente entendê-lo. Mas, por enquanto, tenho uma pergunta simples:

      Vejo que você tem um cálculo diferente para o dia da semana, em vez de usar a estrutura .day_of_week do MqlDateTime. Por que você está usando esse outro método de cálculo? Há alguma vantagem em termos de precisão? Ou é apenas para evitar a conversão para a estrutura?

       
      Comecei a codificar algumas noções básicas de tempo, como HoD(), e depois me desafiei a codificar outras coisas também, pois parece mais fácil escrever DoW(...) em vez de atribuir o tempo a uma estrutura e solicitar outros valores também - fique à vontade para usar o que quiser.
       

      Esse código calcula o horário de verão automaticamente para corretores europeus e norte-americanos:

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

      //+------------------------------------------------------------------+
      //| Calcular as mudanças no horário de verão em Londres, Reino Unido
      //| 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;
         /* O horário de verão do Reino Unido começa à 01:00, horário local, no último domingo de março
       e termina às 02:00, horário local, no último domingo de outubro */
         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);
        }
      //+------------------------------------------------------------------+
      //| Calcular as mudanças no horário de verão em Nova York, EUA
      //| Validado para 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;
         /* O horário de verão dos EUA começa às 02:00, horário local, no segundo domingo de março
       e termina às 02:00, horário local, no primeiro domingo de novembro */
         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;
      
      //--- Na União Europeia, o horário de verão começa no último domingo de
      //--- março e termina no último domingo de outubro.
      
         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);
           }
      
      //--- Nos Estados Unidos, o horário de verão começa no segundo domingo de setembro
      //--- março e termina no primeiro domingo de novembro.
      
         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);
           }
        }
      //+------------------------------------------------------------------+
      
      /*
      output:
      ========= European Summer Time (DST) =========
      DST starts on 2010.03.28 01:00:00 and ends on 2010.10.31 02:00:00
      DST starts on 2011.03.27 01:00:00 and ends on 2011.10.30 02:00:00
      O horário de verão começa em 2012.03.25 01:00:00 e termina em 2012.10.28 02:00:00
      O horário de verão começa em 2013.03.31 01:00:00 e termina em 2013.10.27 02:00:00
      O horário de verão começa em 2014.03.30 01:00:00 e termina em 2014.10.26 02:00:00
      DST começa em 2015.03.29 01:00:00 e termina em 2015.10.25 02:00:00
      DST começa em 2016.03.27 01:00:00 e termina em 2016.10.30 02:00:00
      DST starts on 2017.03.26 01:00:00 and ends on 2017.10.29 02:00:00
      DST starts on 2018.03.25 01:00:00 and ends on 2018.10.28 02:00:00
      DST starts on 2019.03.31 01:00:00 e termina em 2019.10.27 02:00:00
      O horário de verão começa em 2020.03.29 01:00:00 e termina em 2020.10.25 02:00:00
      O horário de verão começa em 2021.03.28 01:00:00 e termina em 2021.10.31 02:00:00
      DST começa em 2022.03.27 01:00:00 e termina em 2022.10.30 02:00:00
      DST começa em 2023.03.26 01:00:00 e termina em 2023.10.29 02:00:00
      DST começa em 2024.03.31 01:00:00 e termina em 2024.10.27 02:00:00
      O horário de verão começa em 2025.03.30 01:00:00 e termina em 2025.10.26 02:00:00
      O horário de verão começa em 2026.03.29 01:00:00 e termina em 2026.10.25 02:00:00
      O horário de verão começa em 2027.03.28 01:00:00 and ends on 2027.10.31 02:00:00
      DST starts on 2028.03.26 01:00:00 and ends on 2028.10.29 02:00:00
      DST starts on 2029.03.25 01:00:00 and ends on 2029.10.28 02:00:00
      ========= Horário de Verão Americano (DST) =========
      O DST começa em 2010.03.14 02:00:00 e termina em 2010.11.07 02:00:00
      O DST começa em 2011.03.13 02:00:00 e termina em 2011.11.06 02:00:00
      O horário de verão começa em 2012.03.11 02:00:00 e termina em 2012.11.04 02:00:00
      O horário de verão começa em 2013.03.10 02:00:00 e termina em 2013.11.03 02:00:00
      O horário de verão começa em 2014.03.09 02:00:00 e termina em 2014.11.02 02:00:00
      DST começa em 2015.03.08 02:00:00 e termina em 2015.11.01 02:00:00
      DST começa em 2016.03.13 02:00:00 e termina em 2016.11.06 02:00:00
      DST starts on 2017.03.12 02:00:00 and ends on 2017.11.05 02:00:00
      DST starts on 2018.03.11 02:00:00 and ends on 2018.11.04 02:00:00
      DST starts on 2019.03.10 02:00:00 and ends on 2019.11.03 02:00:00
      DST starts on 2020.03.08 02:00:00 and ends on 2020.11.01 02:00:00
      DST starts on 2021.03.14 02:00:00 and ends on 2021.11.07 02:00:00
      DST starts on 2022.03.13 02:00:00 e termina em 2022.11.06 02:00:00
      O horário de verão começa em 2023.03.12 02:00:00 e termina em 2023.11.05 02:00:00
      O horário de verão começa em 2024.03.10 02:00:00 e termina em 2024.11.03 02:00:00
      O horário de verão começa em 2025.03.09 02:00:00 e termina em 2025.11.02 02 02:00:00
      O horário de verão começa em 2026.03.08 02:00:00 e termina em 2026.11.01 02:00:00
      O horário de verão começa em 2027.03.14 02:00:00 e termina em 2027.11.07 02:00:00
      DST começa em 2028.03.12 02:00:00 e termina em 2028.11.05 02:00:00
      DST começa em 2029.03.11 02:00:00 e termina em 2029.11.04 02:00:00
      */
      

      O código acima foi usado no Forex Market Hours https://www.mql5.com/pt/code/27771 para calcular as mudanças no horário de verão.

      Funções semelhantes podem ser criadas para diferentes áreas do mundo.

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