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

 

La versión de DealingWithTime.mqh v. 1.01 del artículo Dealing with Time (Part 2): Funciones ( https://www.mql5.com/en/articles/9929 ) dejó de funcionar porque MQ cambió el comportamiento de la función CopyTime( ) algún tiempo después de la publicación de este artículo. Ahora esta función ya no devuelve valores de tiempo futuros si son mayores que TimeCurrent( ) especificado para los parámetros start_time y/o stop_time. En su lugar, se devuelve la hora de apertura de la última barra actual como el mayor valor posible.

Dado que el final de la sesión FX se determinaba de esta forma para determinar el cambio de hora del broker, ¡esto conduce ahora a valores incorrectos!

Este cálculo se ha modificado en la versión 2.03. Esta versión ya está disponible en CodeBase aquí: https://www.mql5.com/en/code/45287.

Pero también el cálculo del cambio de hora ha sido completamente cambiado, de modo que ahora se cubren los complicados tiempos del cambio de hora de Sydney (Australia) hasta los años 70.

También se adjunta la tabla DST 1975 - 2030.xlsx en archivo zip con todos los cambios de hora desde los años 70 para que todo el mundo pueda comprobar que las fórmulas funcionan correctamente, aquí hay un ejemplo de una serie de la tabla:

El 1 de enero de 1982 es la hora estándar en EEUU (DST==0) y el próximo cambio será el 25 de abril de 1982, el último (25 del mes) domingo de abril (4). La tabla ya está ordenada por zona horaria geográfica (columna A), luego por zona horaria del año (columna L, spr=primavera, aut=otoño,) y finalmente por fecha de consulta (columna C). La tabla puede ser creada automáticamente por el EA incluido (no se puede ejecutar un script en modo depuración). Test_DST 2.mq5 si lo ejecuta en modo depuración y copia las líneas del registro del diario en el depurador y las pega en una hoja de cálculo; El separador de celdas sería el espacio.

Además, ahora hay una nueva y sencilla función SecTillClose(), que proporciona el tiempo restante en segundos (la moneda del tiempo MQ) hasta que se cierre el mercado de divisas - sin CopyTime(). Esto es interesante para aquellos que quieren cerrar sus posiciones antes del fin de semana o no quieren abrir una nueva posición en un período definido antes del fin de semana.

El indicador incluido DealingWithTime_TestIndi.mq5, como comentario en el gráfico, muestra no sólo el horario de verano en Europa, EE.UU. y Australia (Sydney), sino también la hora actual y la diferencia horaria de varias ciudades. Aquí puedes encontrar una tabla con diferentes horas locales en las principales ciudades para comparar: https://www.timeanddate.com/worldclock/. Así podrás comprobar los valores en cualquier momento. Este indicador también muestra cómo se determinan y utilizan estos valores (qué se resta o se suma a qué), lo que facilita su uso por tu cuenta: copiar y pegar, la forma más rápida de programar.

Las dos últimas líneas también muestran el último segundo de la sesión FX actual y el tiempo restante en horas (que es más fácil de juzgar) y en segundos. En Nueva York, cuando la sesión FX se cierra a las 17:00 hora local de un viernes, no hay barras válidas abiertas a las 17:00 hora de Nueva York. Por lo tanto, en esta función, se resta 1 segundo para obtener la última hora de apertura válida de la última barra en el horario del broker. Sin embargo, algunos brokers cierran su sesión de FX unos minutos antes, dejando de proporcionar precios y dejando de aceptar órdenes de negociación.

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.
 

Tiempo de procesamiento del artículo (Parte 2): La versión DealingWithTime.mqh v. 1.01 de la función ( https://www.mql5.com/en/articles/9929 ) dejó de funcionar porque MQ cambió CopyTime() para que funcionara algún tiempo después de la publicación de este artículo. Ahora, la función ya no devuelve el valor de tiempo futuro si es mayor que el TimeCurrent( ) especificado para los parámetros start_time y/o stop_time. En su lugar, se devuelve la hora de apertura de la última barra actual como valor máximo posible.

Dado que el final de la sesión FX se determina de este modo para determinar el desfase horario del corredor, ¡se obtiene un valor incorrecto!

Este cálculo se ha modificado en la versión 2.03. Esta versión ya está disponible en la base de código: https: //www.mql5.com/en/code/45287.

También se ha cambiado completamente el cálculo del cambio de hora, de forma que ahora cubre el tiempo complejo del cambio de hora de Sydney (Australia) a los años 70.

También se adjunta como archivo zip la tabla DST 1975 - 2030.xlsx con todos los cambios de hora desde los años 70 para que todo el mundo pueda comprobar que las fórmulas funcionan correctamente, y a continuación se muestra una serie de ejemplo de la tabla:

El 1 de enero de 1982 está en hora estándar de EEUU (DST==0) y el próximo cambio será el 25 de abril de 1982, el último (25º día del mes) domingo (4) de abril. La tabla se ha ordenado por huso horario geográfico (columna A), después por huso horario anual (columna L, spr=primavera, aut=otoño) y, por último, por fecha de consulta (columna C). La tabla puede crearse automáticamente mediante el EA incluido (el script no puede ejecutarse en modo de depuración). Test_DST 2.mq5 Si lo ejecuta en modo de depuración y copia las filas del registro del diario desde el depurador y las pega en la hoja de cálculo; los separadores de celdas son los espacios.

Además, ahora hay una nueva función simple SecTillClose() que le da el tiempo restante en segundos antes del cierre del mercado de divisas (moneda de tiempo de MQ) - no hay necesidad de CopyTime(). Esto es interesante para aquellos que quieren cerrar una posición antes del fin de semana o no quieren abrir una nueva posición dentro del tiempo especificado antes del fin de semana.

El indicador incluido DealingWithTime_TestIndi.mq5 como nota al gráfico muestra no sólo el horario de verano en Europa, EE.UU. y Australia (Sydney), sino también la hora actual y la diferencia horaria entre las ciudades. Aquí puede encontrar tablas para comparar las diferentes horas locales en las principales ciudades: https: //www.timeanddate.com/worldclock/. Así, podrá comprobar estos valores en cualquier momento. El indicador también muestra cómo determinar y utilizar estos valores (a qué restarle o sumarle qué), lo que facilita que lo utilices tú mismo: copiar y pegar, que es la forma más rápida de programar.

Las dos últimas líneas también muestran el último segundo de la sesión actual de Forex, así como el tiempo restante en horas (más fácil de juzgar) y segundos. En Nueva York, cuando la sesión Forex se cierra a las 17:00 hora local del viernes, no hay barras válidas abiertas a las 17:00 hora de Nueva York. Por lo tanto, en esta función, reste 1 segundo para obtener la última hora de apertura válida de la última barra en el horario del broker. Sin embargo, algunos corredores cierran el mercado de divisas unos minutos antes y ya no ofrecen precios ni aceptan órdenes de operaciones.

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.
 

La versión de DealingWithTime.mqh v. 1.01 del artículo Dealing with Time (Part 2): Funciones ( https://www.mql5.com/es/articles/9929 ) dejó de funcionar porque MQ cambió el comportamiento de CopyTime( ) algún tiempo después de la publicación de este artículo. Ahora esta función ya no devuelve valores de tiempo futuros si son mayores que el TimeCurrent( ) especificado para los parámetros start_time y/o stop_time. En su lugar, devuelve el valor de tiempo de apertura máximo posible de la última barra actual.

Dado que el final de la sesión de divisas se definió de forma que determinara el desfase horario del corredor, ¡esto da lugar ahora a valores incorrectos!

Este cálculo se ha modificado en la versión 2.03. Esta versión ya está disponible en CodeBase aquí: https://www.mql5.com/es/code/45287.

Pero también el cálculo de la traducción de la hora ha sido completamente cambiado, de modo que los complejos tiempos de traducción de la hora desde Sydney, Australia hasta los años 70 están ahora cubiertos.

También se adjunta la tabla DST 1975 - 2030.xlsx como un archivo zip con todos los cambios de tiempo desde los años 70 para que todos puedan comprobar las fórmulas funcionan correctamente, aquí está un ejemplo de la serie de la tabla:

1 de enero de 1982. - Hora estándar de EEUU (DST == 0), y el siguiente cambio es el 25 de abril de 1982, el último (25 del mes) domingo de abril (4). La tabla ya está ordenada por zona horaria geográfica (columna A), luego por zona horaria del año (columna L, spr=primavera, aut=otoño), y finalmente por la fecha de la consulta (columna C). La hoja de cálculo puede crearse automáticamente mediante un EA habilitado (el script no puede ejecutarse en modo de depuración). Test_DST 2.mq5 si lo ejecuta en modo de depuración y copia las líneas de registro en el depurador y las pega en la hoja de cálculo; El separador de celdas será un espacio.

Además, ahora hay una nueva función simple SecTillClose(), que le da el tiempo restante en segundos (moneda de tiempo MQ) hasta el cierre del mercado de divisas - sin CopyTime(). Esto es interesante para aquellos que quieren cerrar sus posiciones antes del fin de semana o no quieren abrir una nueva posición en un determinado período antes del fin de semana.

El indicador incluido DealingWithTime_TestIndi.mq5, como comentario al gráfico, muestra no sólo el horario de verano en Europa, EE.UU. y Australia (Sydney), sino también la hora actual y la diferencia horaria de diferentes ciudades. Aquí puedes encontrar una tabla con las diferentes horas locales de las principales ciudades para comparar: https://www.timeanddate.com/worldclock/. De esta forma puede comprobar los valores en cualquier momento. Este indicador también muestra cómo se definen y utilizan estos valores (qué se resta o se suma de qué), lo que facilita su uso por su cuenta: copiar y pegar, la forma más rápida de programar.

Las dos últimas líneas también muestran el último segundo de la sesión FX actual y el tiempo restante en horas (que es más fácil de juzgar) y segundos. En Nueva York, cuando la sesión FX se cierra a las 17:00 hora local del viernes, no hay ninguna barra válida abierta a las 17:00 hora de Nueva York. Por lo tanto, esta función resta 1 segundo para obtener la última hora de apertura válida de la última barra en el horario del broker. Sin embargo, algunos corredores terminan su sesión de divisas unos minutos antes, dejando de proporcionar precios o de aceptar órdenes de negociación.

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.
 

Hola @Anil Varma

He leído el último post del autor @Carl Schreiber sobre la función CopyTime() pero como me resulta más comprensible la 1ª versión sigo usando DealingWithTime.mqh v . 1.01.

En mi indicador quiero:

Asigne a cada barra el tiempo bruto NY (segundos), la hora NY y el minuto NY utilizando los siguientes buffers para poder visualizarlos en la ventana de datos:
double NyRawTimeBuffer[];
double NyHourBuffer[];
double NyMinuteBuffer[];
 void AssignNyTime (const datetime& time[],int rates_total)
   {
      
      MqlDateTime dT_struc;
      
      //--- Asignar a cada vela NY tiempo bruto (en segundos), NY hora, NY min
      ArraySetAsSeries(time,true);
      for(int z=0;z<rates_total;z++)
         { 
            checkTimeOffset(time[z]);                   // comprobar cambios de DST
            datetime tC, tGMT, tNY;
            tC    = time[z];
            tGMT  = time[z] + OffsetBroker.actOffset;   // GMT
            tNY   = tGMT - (NYShift+DST_USD);           // tiempo en Nueva York
            int j = int (tNY);                          // conversión de datetime a int 
            NyRawTimeBuffer[z]=j;
            
            TimeToStruct(tNY,dT_struc);
            NyHourBuffer[z]=dT_struc.hour;
            NyMinuteBuffer[z]=dT_struc.min;
 
         }        
       
   return;
   }

La función funcione solo cuando el gráfico del timeframe donde se inicia la terminal esta en H1.

Si cierro el terminal y el timeframe se establece en digamos M5, y luego reinicio el terminal me da el siguiente error:

2024.02.18 15:33:38.048 MyFractals_V4 (EURUSD,M5) 240: CopyTime() FAILED for EURUSD H1: need times from 2024.02.12 02:00:00, but there are only from 1970.01.01 00:00:00 error: 4401

Usted ya me sugirió a través de mensajes a utilizar CheckLoadHistory() de este artículo ( https://www.mql5.com/es/code/1251 ) y colocarlo antes de CopyXXXX() función en su biblioteca:

//--- encuentra el offset del broker
    OffsetBroker.set = false;
    
    CheckLoadHistory("EURUSD",PERIOD_H1,TERMINAL_MAXBARS,true);
      
    b = CopyTime("EURUSD",PERIOD_H1,BegWk+26*3600,5,arrTme);      // obtener la hora de la última barra de 1h antes del cambio en EU

Pero el problema sigue ahí.

En el checkhistory.mqh (fila 19) anoté el siguiente comentario pero no entiendo si puede ser un problema. Intenté comentarlo y probar el programa de nuevo pero no funcionó.

//--- no pida la carga de sus propios datos si es un indicador
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol) return(true);

¿Hay alguna forma de corregir el error sin cambiar a la librería actualizada DealingWithTimeV2.03.mqh sin reescribir todo el código?




CheckHistory - Check and load history function
CheckHistory - Check and load history function
  • www.mql5.com
Slightly modified history load function from MetaQuotes.
 
Nauris Zukas probador de estrategias, pero no funciona.


¿Tiene la "La alternativa utilizando a través de variables de entrada" la única manera de obtener tiempos correctos en el probador de estrategia?

Hola

He intentado modificar el código como a continuación y hasta ahora está trabajando para mí. Tenga en cuenta que he convertido la clase con constructores y todos los métodos son parte de la clase. La clase necesita ser llamada e inicializada en su EA/Clase de Estrategia.

CDealWithTime.OnTick() debe colocarse en EA/Strategy OnTick()

//+-----------------------------------------------------------------------------------------------------------------------------+
//| función para determinar el offset del broker para el tiempo dado (tB)
//+-----------------------------------------------------------------------------------------------------------------------------+
void CDealWithTime::OnTick(void) {

                string vMethod = __FUNCTION__ + " Line[" + (string)__LINE__ + "] ";

                // Realizar la actualización horaria de TimeH01[]
                if(IsNewBarH01()) {
      // ... BegWk = BoW(tC), Código original
                        datetime weekBegin = BoW(TimeCurrent());
                        // El código original añadía 5 compases al tiempo de WeakBegin.
                        // Sumar 5 días * 3600 segundosEnHora a la hora de inicio débil, no es igual a cinco compases, ya que puede que no haya compases en
                        // fin de semana/festivo. Por lo tanto WeekBegin+5*3600 puede resultar un tiempo mientras que no hay barra en él.
                        int                      barShift  = iBarShift(mSymbol,mTimeFrame,weekBegin+(5*3600));
                        // Devolverá la primera barra disponible en Time(weekBegin+(5*3600)
                        datetime timeStop        = iTime(mSymbol,mTimeFrame,barShift);          // Última barra de una hora del viernes, antes del cambio en la UE.
                        // Resultado al sumar segundos (weekBegin)+(5*3600): CDealWithTime::OnTick Line[229] : GetLastError[0] copiedTime EURUSD-PERIOD_H1 for [0] bars weekBegin[2024.01.01 02:00] to timeStop[2023.12.31 21:00] time5th[2023.12.29 23:00]
                        int bars = Bars(mSymbol,mTimeFrame,weekBegin,timeStop);

                        // Necesitamos el bucle while..ya que IsNewBarH01() se comprobará sólo una vez en el Tick, si es true entonces hasta la siguiente nueva barra no se comprobará más
                        ResetLastError();
                        int attempt = 0;
                        while(CopyTime(mSymbol,mTimeFrame,weekBegin,timeStop,TimeH01) != bars && attempt <= 10) {
                                Sleep(100);
                                attempt++;
                        }
                        if(attempt > 0) {
                                PrintFormat("%s: GetLastError[%i] copiedTime %s-%s for [%i] bars weekBegin[%s] to timeStop[%i][%s]",vMethod,GetLastError(),mSymbol,EnumToString(mTimeFrame),bars,TimeToString(weekBegin),barShift,TimeToString(timeStop));
                        }
                }

                // Realice una comprobación semanal, si hay cambios en el horario de ahorro de luz diurna (DST).
                if(IsNewBarW01()) {
                        checkTimeOffset(TimeCurrent());
                        int  attempt  = 0;
                        bool isOffset = false;
                        do{
                                isOffset = setBokerOffset();
                                attempt++;
                        } while(!isOffset && attempt <= 10);
                }

} // Fin de OnTick()
 
amrali #:

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

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

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 distintas zonas del mundo.

Hola Amrali

Bonito y sencillo código como alternativa al artículo DealingWithTime v2.03. Lo estudiaré con más detalle.

 
Daniel K #:
DealingWithTime.mqh v . 1.01.

Hola Daniel

DealingWithTime.mqh v . 1.01. Este artículo y su código ya no funciona debido a los cambios en los métodos de cálculo MQL, como se explica por Carl en DealingWithTime.mqh v 2.03 artículo https://www.mql5.com/es/code/45287

Usted no debe usarlo en absoluto.

Dealing with time (2) functions
  • www.mql5.com
Calculate DST for USA, EUR, AUD and RUB and the offset time of the broker automatically from the 70's until 2030 - even in the Strategy Tester of MQ.