Discusión sobre el artículo "Trabajamos con fechas y horas en MQL5"

 

Artículo publicado Trabajamos con fechas y horas en MQL5:

Resulta esencial que los tráders y desarrolladores de herramientas comerciales comprendan cómo manejar las fechas y horas de manera adecuada y eficaz. En este artículo, veremos cómo podemos manejar fechas y horas al crear herramientas comerciales efectivas.

Nadie en el mercado financiero oculta la importancia del tiempo y cómo este puede influir en las decisiones y los resultados comerciales. MQL5 (MetaQuotes Language 5) ofrece una solución para trabajar eficazmente con la fecha y la hora. Podemos abordar este importante tema con una amplia variedad de aplicaciones que se pueden programar como parte de nuestro sistema comercial, pero primero veremos los aspectos más importantes de este tema en el lenguaje de programación MQL5.


Autor: Mohamed Abdelmaaboud

 

Hay que mencionar que StructToTime, TimeToStruct y especialmente TimeToString y StringToTime son operaciones bastante "caras" y en situaciones de tiempo crítico a veces se pueden sustituir por otras más sencillas.

En particular, es muy poco recomendable obtener el comienzo del día de forma directiva:

StringToTime(TimeToString(TimeCurrent(),TIME_DATE))

mejor hacer:

TimeCurrent() / 86400 * 86400

Debido a la aritmética de enteros, se descartará el resto de la división.


O, a veces es suficiente saber el tiempo transcurrido desde el comienzo del día, y el año, mes, número, día de la semana no son importantes (o se pueden obtener una vez al comienzo de un nuevo día).

En segundos: tiempo % 86400

Horas: tiempo % 86400 / 3600

Minutos: tiempo % 3600 / 60

Segundos: tiempo % 60

 

Al resolver el problema de asignar nombres únicos a los objetos (de tipo FLECHA) utilizamos el tiempo en segundos:

//+------------------------------------------------------------------+

int TimeInSec(datetime date)
{
MqlDateTime tm;
TimeToStruct(date, tm);
int sec_int = tm.day * 24 *3600 + tm.hour * 3600 + tm.min * 60 + tm.sec * 1;
return(sec_int);
}

//+------------------------------------------------------------------+

int TimeMinute(datetime date)
{
MqlDateTime tm;
TimeToStruct(date, tm);
return(tm.min);
}

 
gerien #:

Al resolver el problema de asignar nombres únicos a los objetos (de tipo FLECHA) utilizamos el tiempo en segundos:

Creo que es mucho más barato organizar un contador incremental global.

 
gerien #:
int TimeMinute(datetime date)
{
MqlDateTime tm;
TimeToStruct(date, tm);
return(tm.min);
}

Esto es exactamente a lo que me refería. Uso ineficiente de la "cara" función TimeToStruct.

Con esta es suficiente:

int TimeMinute(datetime date)
  {
   return((int)(date % 3600 / 60));
  } 
 
gerien TimeToStruct(date, tm);
int sec_int = tm.day * 24 *3600 + tm.hour * 3600 + tm.min * 60 + tm.sec * 1;
return(sec_int);
}

//+------------------------------------------------------------------+

int TimeMinute(datetime date)
{
MqlDateTime tm;
TimeToStruct(date, tm);
return(tm.min);
}

todo es mucho más simple - datetime son segundos. No necesita ser analizado a través de TimeToStruct para multiplicar y añadir los campos después

long timeIsSeconds = (long)TimeCurrent();

si su algoritmo garantiza la ausencia de dos flechas en un segundo, funcionará.

 
Maxim Kuznetsov #:

Aparentemente, para que el número sea más corto se necesitan segundos desde el principio del mes.

Aunque con casi (si no necesitas recalcular el nombre del objeto al día del mes) el mismo resultado puedes tomar el resto de dividir TimeCurrent() por un número cercano a la media de segundos del mes.

 
JRandomTrader #:

Está tomando segundos del principio del mes para hacer el número más corto.

Aunque con casi (si no necesitas recalcular el nombre del objeto al día del mes) el mismo resultado puedes tomar el resto de dividir TimeCurrent() por un número cercano a la media de segundos del mes.

y restar de una fecha otra fecha (el principio del mes) no permite alguna astuta religión ? :-)

En la práctica - si en algún lugar dentro de lo que necesita saber el comienzo exacto del mes, día, semana, se cuentan y se memorizan una vez. Para no tener que recalcularlos en cada estornudo.

datetime thisDayTime, nextDayTime;
datetime thisYearTime,thisMonTime;
int thisYear, thisMon;

// вызывать внутри всех обработчиков OnXXX терминала- это прототип службы времени
void TimeService() {
    datetime now=TimeCurrent();
    if (now>=nextDayTime) {
        MqlDateTime dt; TimeToStruct(dt,now);
        dt.hour=dt.min=dt.sec=0;
        thisDayTime=StructToTime(dt);
        nextDayTime=thisDayTime+24*60*60;
        OnDay();  /// обработчик "начало дня"
        if (dt.month!=thisMon|| dt.year!=thisYear) {
               thisMon=dt.month;
               dt.day=0; thisMon=StructToTime(dt);
               OnMon();   /// обработчик "начало месяца"
        }

        if ( dt.year!=thisYear ) {
               thisYear=dt.year; 
               dt.month=0; thisYearTime=StructToTime(dt);
               OnYear();  /// обработчик "начало года"
        }
    }
}

 

Lo siento, se me acaba de ocurrir algo sobre el tema:

Фредерик Браун
Конец начал

Профессор Джонс долгое время работал над теорией времени.
- И сегодня я нашел ключевое уравнение, - сказал он своей дочери как-то утром.
- Время это поле. Я создал  машину, которая способна управлять этим полем.
Он протянул руку и, нажимая кнопку, сказал:
- Это заставит время идти назад идти время заставит это
- :сказал, кнопку нажимая, и руку протянул он.
- Полем этим управлять способна которая, машину создал я. Поле это время,
- утром как-то дочери своей он сказал. - Уравнение ключевое нашел я сегодня и.
Времени теорией над работал время долгое Джонс профессор.

Начал конец
Браун Фредерик
 
JRandomTrader #:

Lo siento, se me acaba de ocurrir algo sobre el tema:

Probablemente debería haber invertido no sólo el orden de las palabras, sino también el de las letras ;)
 
JRandomTrader #:

Lo siento, se me acaba de ocurrir algo sobre el tema:

Recordé una historia de ciencia ficción soviética en la que la hija no paraba de decirle "ukponk imzhan" ante el experimento de su padre en el instituto de la época, y él no entendía sus mimos infantiles.

Y ella le salvó con eso.