Discussão do artigo "Trabalho com datas e horas no MQL5"

 

Novo artigo Trabalho com datas e horas no MQL5 foi publicado:

É muito importante que os operadores e desenvolvedores de ferramentas de negociação entendam como manusear datas e horas de forma adequada e eficiente. Neste artigo, mostrarei como podemos trabalhar com datas e horas ao criar ferramentas de negociação eficientes.

Ninguém no mercado financeiro esconde a importância do tempo e como ele pode afetar as decisões de negociação e os resultados. MQL5 (MetaQuotes Language 5) oferece uma solução para trabalhar efetivamente com datas e horas. Podemos abordar este importante tópico com a ajuda de diversos complementos que podem ser programados como parte de nosso sistema de negociação, mas primeiro vamos examinar os aspectos mais importantes deste tópico na linguagem de programação MQL5.


Autor: Mohamed Abdelmaaboud

 

Deve-se mencionar que StructToTime, TimeToStruct e, especialmente, TimeToString e StringToTime são operações bastante "caras" e, em situações de tempo crítico, às vezes podem ser substituídas por outras mais simples.

Em particular, não é muito recomendável obter o início do dia de forma diretiva:

StringToTime(TimeToString(TimeCurrent(),TIME_DATE))

melhor fazer:

TimeCurrent() / 86400 * 86400

Devido à aritmética de números inteiros, o restante da divisão será descartado.


Ou, às vezes, é suficiente saber o tempo decorrido desde o início do dia, e o ano, o mês, o número e o dia da semana não são importantes (ou podem ser obtidos uma vez no início de um novo dia).

Em segundos: tempo % 86400

Horas: tempo % 86400 / 3600

Minutos: hora % 3600 / 60

Segundos: hora % 60

 

Ao resolver o problema de atribuir nomes exclusivos a objetos (do tipo ARROW), usamos o tempo em 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 #:

Ao resolver o problema de atribuir nomes exclusivos a objetos (do tipo ARROW), usamos o tempo em segundos:

Acredito que seja muito mais barato organizar um contador incremental global.

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

É exatamente disso que eu estava falando. Uso ineficiente da "cara" função TimeToStruct.

Apenas essa é 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);
}

tudo é muito mais simples - datetime é segundos. Ele não precisa ser analisado pelo TimeToStruct para multiplicar e adicionar os campos posteriormente

long timeIsSeconds = (long)TimeCurrent();

Se o seu algoritmo garantir a ausência de duas setas em um segundo, ele funcionará.

 
Maxim Kuznetsov #:

Aparentemente, são necessários segundos a partir do início do mês para tornar o número mais curto.

Embora com quase (se você não precisar recalcular o nome do objeto para o dia do mês) o mesmo resultado, você pode pegar o restante da divisão de TimeCurrent() por um número próximo ao número médio de segundos no mês.

 
JRandomTrader #:

Ele está retirando segundos do início do mês para diminuir o número.

Embora com quase (se você não precisar recalcular o nome do objeto para o dia do mês) o mesmo resultado, você pode pegar o restante da divisão de TimeCurrent() por um número próximo ao número médio de segundos no mês.

e subtrair de uma data outra data (o início do mês) não permite alguma religião astuta? :-)

Na prática, se em algum lugar você precisar saber o início exato do mês, dia ou semana, eles são contados e memorizados uma vez. Assim, você não precisa recalculá-los a cada espirro.

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();  /// обработчик "начало года"
        }
    }
}

 

Desculpe, acabei de pensar em algo sobre o assunto:

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

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

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

Desculpe, acabei de pensar em algo sobre o assunto:

Provavelmente deveria ter invertido não apenas a ordem das palavras, mas também a ordem das letras ;)
 
JRandomTrader #:

Desculpe, acabei de pensar em algo sobre o assunto:

Lembrei-me de uma história de ficção científica soviética em que a filha ficava dizendo a ele "ukponk imzhan" antes do experimento de seu pai no instituto da época, e ele não entendia o mimo infantil dela.

E ela o salvou com isso.