algorithmic-tradingmql4metatrader4mt4

How to calculate (add) datetime values in MQL4?


With MQL4 I have troubles in handling datetime.

What I want to do is put datetime in array by month or by year.

For now I do in this way.

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';
.
.

However I want to do this like this below

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

in case of month,

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

Q: How do I calculate adding 1month or 1year?


Solution

  • MQL4 documentation declared datetime type to be internally represented as an amount of seconds since an agreed time-scale datum ( being 1970-01-01 00:00 ).

    This said ( and polishing a bit the syntax compliance )
    the code
    may read

    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)
    

    another option
    so as to manipulate
    datetime in a bit more
    comfortable manner, addressing
    datetime's natural component is hacky, but worth: StringToTime

    string TimeToString( datetime aDatetimeVALUE,
                         int aModeOfDISPLAY = TIME_DATE|TIME_MINUTES
                        )
    

    Converting a value containing time in seconds elapsed since 01.01.1970 into a string of "yyyy.mm.dd hh:mi" format.

    Here, one can simply add +1 to proper position of this intermediate format ( without a need to handle all the derived and influenced values as present in the struct MqlDateTime, where day_of_week and day_of_year are definitely not my favourite ones to re-calculate once moving +1 month etc.

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

    Finally

    StringFormat( "%04d.%02d.%02d 00:00", aYearNUMBER, aMonthNUMBER, aDayNUMBER )
    

    will do the re-assembly for calling another MQL4 standard function:

    datetime StringToTime( string aDatetimeSTRING )

    The function converts a string containing time or date in "yyyy.mm.dd [hh:mi]" format into datetime type.

    Another approach may use a fully-decomposed datetime aritmetics by using

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