Discusión sobre el artículo "Gestionando el Horario (Parte 2): Funciones" - página 2

 
Nikita Chernyshov # :

1. Porque el soporte no siempre da información correcta. Usted mismo ha señalado esto sobre el distribuidor Alpari. + es caro: averiguar de cada distribuidor la transición. Porque entonces no se puede crear una buena solución, no sé con quién está discutiendo el usuario final.

2. Bueno, más o menos, sí, pero si un concesionario no cambia de invierno a verano y viceversa, entonces los cálculos se vuelven un poco raros.

Intenté modificar un poco tu biblioteca, pero al parecer algo salió mal. Pensé que el código debería llevar a que el Asesor Experto detecte automáticamente la hora GMT y opere según GMT, no según el servidor del broker. No estoy seguro de si el código es óptimo, pero la solución parece funcionar. Sin embargo, en aquellos corredores que no cambian la hora - hay algunos cálculos incorrectos.

  1. ¿Qué han cambiado?
  2. ¿Puedes nombrarme un broker (link) donde no funcione?
  3. Acabo de usarlo de nuevo:
     for (i=start; i<rates_total && ! IsStopped (); i++) {
          checkTimeOffset( time[i]);
          tGMT           = time[i] + OffsetBroker.actOffset; // GMT 
    
    }


     
    Carl Schreiber #:
    1. ¿Qué ha cambiado?
    2. ¿Puedes nombrarme un corredor (enlace) en el que no funcione?
    3. Acabo de usarlo de nuevo:


      1.

      - No me fijé en EURUSD, tomamos el par donde se coloque el EA.

      - 2. Tampoco fijé la hora, simplemente resté 1 año a la actual.

         datetime setDate = StringToTime(IntegerToString(NowYear()-1)+".06.21 14:00");
      
         nextDST("EUR", setDate);                        // EUR: obtener DST y establecer el próximo cambio

      Y paso los parámetros a bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1) para obtener este bloque dinámicamente.

      input int   USwinEUwin=  -7200;    // US=Invierno & EU=Invierno
      input int   USsumEUsum= -10800;    // US=Verano & EU=Verano
      input int   USsumEUwin=  -7200;    // US=Verano & EU=Invierno

      2. alpha forex. Puedo en lis dar datos de la cuenta demo para que lo compruebes sin abrir nada. El caso es que el distribuidor no cambia de invierno a verano, y la diferencia con GMT se sigue produciendo.

      3. un poco confuso cómo y dónde se utiliza el diseño.

       

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

      En un indicador que es la parte superior del bucle a través de todas las barras.

       
      En general, he cambiado a Greenwich. Defino la hora de transición al horario de invierno como la diferencia entre la hora del servidor y la hora media de Greenwich. Lo único es que para cada broker esta diferencia tiene que ser calculada por mí mismo e introducida en las constantes del Asesor Experto. Justo cuando los usuarios tienen diferentes turnos, brokers, bolsas, y la hora de transición al invierno no es la misma, Greenwich es la misma para todos.
       
      Valeriy Yastremskiy #:
      En general, he cambiado a Greenwich. Defino la hora de transición al horario de invierno como la diferencia entre la hora del servidor y la hora media de Greenwich. Lo único es que para cada broker esta diferencia tiene que ser calculada por mí mismo e introducida en las constantes del Asesor Experto. Justo cuando los usuarios tienen diferentes turnos, brokers, bolsas, y la hora de transición al horario de invierno no es la misma, Greenwich es igual para todos.

      ¿Cómo se hace exactamente? ¿Cómo se calculan las constantes?

       
      Nikita Chernyshov #:

      ¿Cómo lo ha hecho exactamente? ¿Cómo se calculan las constantes?

      La hora de Greenwich menos timecarrent, con la transición al horario de invierno cambiará en una hora. Escribí una vez que el tiempo de inicio y finalización del trabajo, con el cliente la diferencia en hora +3 y +2, corredores +3, +2, -6 hora de Greenwich))))). Y era necesario para empezar a trabajar a una hora determinada, la misma para todos. Hora de Greenwich es el mismo, pero el servidor y la hora local son diferentes. Rehice el código del libro de texto de Fedoseyev).

      En general, el problema es que no hay una función estándar para la diferencia entre el servidor y la hora de Greenwich. Pero se cuenta. También hay un problema que la hora local también puede tener una transición a la hora de invierno, y en un momento diferente de la transición del corredor.

      // TimeGMT()-TimeCurrent(); un valor en verano, otro en invierno.
      // 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 #:

      Hora de Greenwich menos timecarrent, con la transición al horario de invierno cambiará en una hora. Escribí una vez que el tiempo de inicio y finalización del trabajo, con el cliente la diferencia de hora +3 y +2, corredores +3, +2, -6 hora de Greenwich)))). Y era necesario para empezar a trabajar a una hora determinada, la misma para todos. La hora de Greenwich es el mismo, pero el servidor y la hora local son diferentes. Se ha modificado el código del libro de texto de Fedoseyev).

      En general, el problema es que no existe una función estándar para la diferencia entre la hora del servidor y la hora de Greenwich. Pero se cuenta. También hay un problema que la hora local también puede tener una transición a la hora de invierno, y en un momento diferente de la transición del corredor.

      Gracias, sí, esta solución está en mi cabeza, es +- así implementado. Pero usted señaló el dolor en el último párrafo)

       

      Hola @Carl Schreiber Feliz Año Nuevo.

      Sé que este artículo ha estado para arriba por un tiempo, pero acabo de encontrarlo. Gracias por compartir este trabajo. Se requiere que yo haga algunas pruebas con él para realmente entenderlo. Pero, tengo una simple pregunta por ahora:

      Puedo ver que usted tiene un día diferente de cálculo de la semana en lugar de depender de la MqlDateTime struct .day_of_week. ¿Por qué estás usando este otro método de cálculo, hay un beneficio de precisión? ¿O es sólo para evitar la conversión a la struct?

       
      Empecé a codificar algunos conceptos básicos de tiempo como HoD() y luego me reté a codificar otras cosas también, ya que parece más fácil escribir DoW(..) en lugar de asignar el tiempo a una estructura y solicitar otros valores también - siéntase libre de usar lo que quiera.
       

      Este código calcula automáticamente el horario de verano para los corredores europeos y estadounidenses:

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

      //+------------------------------------------------------------------+
      //| Calcular los cambios de horario de verano en 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;
         /* El horario de verano en el Reino Unido comienza a la 01:00 hora local del último domingo de marzo
       y finaliza a las 02:00 hora local del último domingo de octubre */
         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 los cambios de horario de verano en Nueva York, EEUU |
      //| Validado en 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;
         /* El horario de verano de EE.UU. comienza a las 02:00 hora local del segundo domingo de marzo
       y finaliza a las 02:00 hora local del primer domingo de noviembre */
         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;
      
      //--- En la Unión Europea, el horario de verano comienza el último domingo de
      //--- marzo y termina el último domingo de octubre. |
      
         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);
           }
      
      //--- En Estados Unidos, el horario de verano comienza el segundo domingo de |
      //--- marzo y termina el primer domingo de noviembre. |
      
         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);
           }
        }
      //+------------------------------------------------------------------+
      
      /*
      salida:
      ========= Horario de verano europeo (DST) =========
      DST comienza en 2010.03.28 01:00:00 y termina en 2010.10.31 02:00:00
      DST comienza en 2011.03.27 01:00:00 y termina en 2011.10.30 02:00:00
      El horario de verano comienza el 2012.03.25 01:00:00 y finaliza el 2012.10.28 02:00:00
      El horario de verano comienza el 2013.03.31 01:00:00 y finaliza el 2013.10.27 02:00:00
      El horario de verano comienza el 2014.03.30 01:00:00 y termina en 2014.10.26 02:00:00
      DST comienza en 2015.03.29 01:00:00 y termina en 2015.10.25 02:00:00
      DST comienza en 2016.03.27 01:00:00 y termina en 2016.10.30 02:00:00
      El horario de verano empieza el 2017.03.26 01:00:00 y termina el 2017.10.29 02:00:00
      El horario de verano empieza el 2018.03.25 01:00:00 y termina el 2018.10.28 02:00:00
      El horario de verano empieza el 2019.03.31 01:00:00 y termina en 2019.10.27 02:00:00
      DST comienza en 2020.03.29 01:00:00 y termina en 2020.10.25 02:00:00
      DST comienza en 2021.03.28 01:00:00 y termina en 2021.10.31 02:00:00
      El DST comienza en 2022.03.27 01:00:00 y termina en 2022.10.30 02:00:00
      El DST comienza en 2023.03.26 01:00:00 y termina en 2023.10.29 02:00:00
      El DST comienza en 2024.03.31 01:00:00 y termina en 2024.10.27 02:00:00
      El horario de verano empieza en 2025.03.30 01:00:00 y termina en 2025.10.26 02:00:00
      El horario de verano empieza en 2026.03.29 01:00:00 y termina en 2026.10.25 02:00:00
      El horario de verano empieza en 2027.03.28 01:00:00 y termina en 2027.10.31 02:00:00
      DST comienza en 2028.03.26 01:00:00 y termina en 2028.10.29 02:00:00
      DST comienza en 2029.03.25 01:00:00 y termina en 2029.10.28 02:00:00
      ========= American Summer Time (DST) =========
      DST comienza el 2010.03.14 02:00:00 y termina el 2010.11.07 02:00:00
      DST comienza el 2011.03.13 02:00:00 y termina el 2011.11.06 02:00:00
      El horario de verano comienza el 2012.03.11 02:00:00 y finaliza el 2012.11.04 02:00:00
      El horario de verano comienza el 2013.03.10 02:00:00 y finaliza el 2013.11.03 02:00:00
      El horario de verano comienza el 2014.03.09 02:00:00 y finaliza el 2014.11.02 02 02:00:00
      DST comienza el 2015.03.08 02:00:00 y finaliza el 2015.11.01 02:00:00
      DST comienza el 2016.03.13 02:00:00 y finaliza el 2016.11.06 02:00:00
      El horario de verano comienza el 2017.03.12 02:00:00 y finaliza el 2017.11.05 02:00:00
      El horario de verano comienza el 2018.03.11 02:00:00 y finaliza el 2018.11.04 02:00:00
      El horario de verano comienza el 2019.03.10 02:00:00 y finaliza el 2019.11.03 02:00:00 y finaliza el 2019.11.03 02:00:00
      El DST comienza en 2020.03.08 02:00:00 y termina en 2020.11.01 02:00:00
      El DST comienza en 2021.03.14 02:00:00 y termina en 2021.11.07 02:00:00
      El DST comienza en 2022.03.13 02:00:00 y finaliza en 2022.11.06 02:00:00
      DST comienza en 2023.03.12 02:00:00 y finaliza en 2023.11.05 02:00:00
      DST comienza en 2024.03.10 02:00:00 y finaliza en 2024.11.03 02:00:00
      El DST comienza el 2025.03.09 02:00:00 y termina el 2025.11.02 02 02:00:00
      El DST comienza el 2026.03.08 02:00:00 y termina el 2026.11.01 02:00:00
      El DST comienza el 2027.03.14 02:00:00 y termina en 2027.11.07 02:00:00
      DST comienza en 2028.03.12 02:00:00 y termina en 2028.11.05 02:00:00
      DST comienza en 2029.03.11 02:00:00 y termina en 2029.11.04 02:00:00
      */
      

      El código anterior se utilizó en Forex Market Hours https://www.mql5.com/es/code/27771 para calcular los cambios de horario de verano.

      Se pueden construir funciones similares para diferentes zonas del mundo.

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