如何在 MQL4 中计算(添加)日期时间值?

whi*_*ear 5 algorithmic-trading mt4 metatrader4 mql4

使用 MQL4 我在处理datetime.

我想做的是datetime按月或按年排列。

目前我就是这样做的。

datetime myDate;

myDate[0] = D'2010.01.01 00:00';
myDate[1] = D'2010.02.01 00:00';
myDate[2] = D'2010.03.01 00:00';
myDate[3] = D'2010.04.01 00:00';
.
.
Run Code Online (Sandbox Code Playgroud)

不过我想像下面这样做

myDate[0] = D'2010.01.01 00:00';
for (int i = 1;i < 6 ;i+=){
    myDate[i] = myDate[i - 1] + 1year;
}
Run Code Online (Sandbox Code Playgroud)

如果是月份,

myDate[0] = D'2010.01.01 00:00';
for (int i = 1; i < 12 ; i++){
    myDate[i] = myDate[i - 1] + 1month
}
Run Code Online (Sandbox Code Playgroud)

问:如何计算加1month1year

use*_*197 6

MQL4文档声明datetime类型在内部表示为自商定的时间尺度数据 (being) 以来的秒数1970-01-01 00:00

这就是说(并稍微完善了语法合规性)
代码
可以读取

oneYear = 60 * 60 * 24 * 365;   // yes, astronomers would kill me
                                // for not solving those seconds,
                                // that sum up until a leap year
                                // consumes 'em on Feb-29th day     :o)
Run Code Online (Sandbox Code Playgroud)

另一种选择是
为了以
datetime
舒适的方式进行操作,寻址
datetime的自然组件很hacky,但值得:StringToTime

string TimeToString( datetime aDatetimeVALUE,
                     int aModeOfDISPLAY = TIME_DATE|TIME_MINUTES
                    )
Run Code Online (Sandbox Code Playgroud)

将包含自 1970 年 1 月 1 日以来经过的时间(以秒为单位)的值转换为stringof"yyyy.mm.dd hh:mi"格式。

在这里,可以简单地将 +1 添加到此中间格式的适当位置(无需处理 、 其中struct MqlDateTimeday_of_week绝对day_of_year不是我最喜欢在移动 +1 个月后重新计算的所有派生值和受影响值) 。

aCurrentYEAR  = int(  StringSubstr( aDatetimeSTRING, 0, 4 ) );
aCurrentMONTH = int(  StringSubstr( aDatetimeSTRING, 5, 2 ) );
aCurrentDAY   = int(  StringSubstr( aDatetimeSTRING, 8, 2 ) );

aNextYEAR     = aCurrentYEAR  + 1;
aNextMONTH    = aCurrentMONTH + 1;
Run Code Online (Sandbox Code Playgroud)

最后

StringFormat( "%04d.%02d.%02d 00:00", aYearNUMBER, aMonthNUMBER, aDayNUMBER )
Run Code Online (Sandbox Code Playgroud)

将重新组装以调用另一个 MQL4 标准函数:

datetime StringToTime( string aDatetimeSTRING )

该函数将包含时间或日期格式的字符串转换"yyyy.mm.dd [hh:mi]"datetime类型。

datetime另一种方法可以通过使用完全分解的算术

int aYE  = TimeYear(      aDatetimeVALUE );
int aMO  = TimeMonth(     aDatetimeVALUE );
int aDA  = TimeDay(       aDatetimeVALUE );
int aHO  = TimeHour(      aDatetimeVALUE );
int aMI  = TimeMinute(    aDatetimeVALUE );
int aDoW = TimeDayOfWeek( aDatetimeVALUE );
int aDoY = TimeDayOfYear( aDatetimeVALUE );

datetime aSameTimeNextYEAR = StructToTime( (MqlDateTime) { aYE + 1,
                                                           aMO,
                                                           aDA,
                                                           aHO,
                                                           aMI,
                                                           aDoW,
                                                           aDoY
                                                           }
                                           );
Run Code Online (Sandbox Code Playgroud)