文章 "了解如何在MQL5中处理日期和时间"

 

新文章 了解如何在MQL5中处理日期和时间已发布:

这是一篇关于一个新的重要话题的新文章,这个话题是关于日期和时间的。作为交易工具的交易员或程序员,了解如何很好、有效地处理日期和时间这两个方面至关重要。因此,我将分享一些重要信息,关于我们如何处理日期和时间,以便顺利、简单地创建有效的交易工具。

金融市场领域的任何人都不会隐瞒时间的重要性,以及它如何影响交易决策和结果。MQL5(MetaQuotes Language 5)提供了一个有效处理日期和时间的惊人解决方案,这是我们将在本文中学习的内容,因为在理解了MQL5编程语言中该主题的最重要方面后,我们将看到如何通过许多可作为交易系统一部分进行编码的应用程序来处理这一重要主题。


作者:Mohamed Abdelmaaboud

 

值得一提的是,StructToTime、TimeToStruct,尤其是 TimeToString 和 StringToTime 是相当 "昂贵 "的操作,在时间紧迫的情况下,有时可以用更简单的操作来代替。

尤其不建议用指令方式获取一天的开始时间:

StringToTime(TimeToString(TimeCurrent(),TIME_DATE))

更好:

TimeCurrent() / 86400 * 86400

因为在整数运算中,除法的余数 会被丢弃。


或者,有时只需知道从一天开始的时间,而年、月、数字、星期并不重要(或者可以在新的一天开始时获得)。

秒:时间 % 86400

小时:时间 % 86400 / 3600

分钟:时间 % 3600 / 60

秒:时间 % 60

 

在解决为对象(箭头类型)分配唯一名称的问题时,我们使用以秒为单位的时间:

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

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 #:

在解决为对象(箭头类型)分配唯一名称的问题时,我们使用以秒为单位的时间:

我认为组织一个全局递增计数器要便宜得多。

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




这正是我要说的。对 "昂贵 "的 TimeToStruct 函数的使用效率低下。

只要这一个就够了:

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);
}

一切都简单多了--datetime 就是秒。它不需要通过 TimeToStruct 进行解析,也不需要在之后对字段进行乘法和加法运算

long timeIsSeconds = (long)TimeCurrent();

如果你的算法能保证在一秒内没有两个箭头,那么它就能工作。

 
Maxim Kuznetsov #:

显然,从月初开始计算的秒数会使数字变短。

虽然(如果不需要重新计算对象名称到月份的哪一天)结果几乎相同,但可以用 TimeCurrent() 除以接近该月平均秒数的余数。

 
JRandomTrader #:

他从月初开始取秒,使数字更短。

虽然结果几乎一样(如果不需要重新计算对象名称到月份的哪一天),但可以用 TimeCurrent() 除以接近该月平均秒数的余数。

从一个日期中减去另一个日期(月初)不允许某些狡猾的宗教吗?:-)

在实践中,如果您需要知道某月、某日、某周的确切开始时间,您可以计算并记忆一次。这样就不用每次打喷嚏都要重新计算了。

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

 

对不起,我只是想到了这个问题:

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

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

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

对不起,我只是想到了这个问题:

也许不仅应该颠倒词序,还应该颠倒字母顺序;)
 
JRandomTrader #:

对不起,我只是想到了这个问题:

我记得有一个苏联科幻故事,女儿在父亲的实验研究所前一直对父亲说 "ukponk imzhan",父亲不理解女儿的撒娇。

她就这样救了他。