2016-11-11 9 views
1

С MQL4 У меня проблемы с обращением datetime.Как рассчитать (добавить) значения datetime в MQL4?

Что я хочу сделать, это положить 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'; 
. 
. 

Однако я хочу, чтобы это сделать, как это ниже

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

в случае месяц,

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

Q: Как рассчитать добавление 1month или 1year?

ответ

2

MQL4 документация объявлена ​​datetime типа, чтобы быть внутренне представлена ​​в виде количества секунд, прошедших с согласованной шкалы времени нулевой точки (будучи 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) 

другой вариант
так, чтобы манипулировать
datetime в немного более
комфортабельной способ, адресация
datetime 's natural component is hac ка, но стоит: StringToTime

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

Преобразования времени значения, содержащих в секундах, прошедшее с 01.01.1970 в string форматом "yyyy.mm.dd hh:mi".

Здесь можно просто добавить +1 в надлежащее положение этого промежуточного формата (без необходимости обрабатывать все полученные и влиял значения, присутствующие в struct MqlDateTime, где day_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; 

Наконец

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

сделает повторную сборку для вызова другой стандартной функции MQL4:

datetime StringToTime(string aDatetimeSTRING)

Функция преобразует строку, содержащую дату или время в формате "yyyy.mm.dd [hh:mi]" в datetime type.

Другой подход может использовать полную разложенные datetime aritmetics с помощью

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

Спасибо я понял. Нет простого способа добавить 1 мес., Однако эта работа очень полезна для меня. – whitebear

+0

Рад это услышать. Не стесняйтесь проголосовать за полезные ответы и принять наиболее продуманный ответ. ** Наслаждайтесь активным, способствующим членом этого замечательного сообщества, ориентированного на знания! ** – user3666197

0
int month = PeriodSeconds(PERIOD_MONTH); 

за год - не уверен, что вы можете использовать некоторые постоянны, но выглядит как 12 месяцев в порядке, другой вариант - использовать MqlDateTime год назначения и затем преобразовать в datetime с использованием StructToTime();

UPDATE: месяц не хороший подход, поскольку каждый месяц имеет различное количество секунд

+1

Daniel, «PERIOD_MONTH» - это искусственный поток времени «обрамление», служащий ** постоянному ** количеству секунд - определенно не путь к заданной проблеме, как естественный поток времени в феврале, с ** '{28 | 29}' -календарными днями ** имеет по определению разное количество секунд, чем в январе, с ** '31 '-календарные дни ** – user3666197

+1

Вы правы. никогда не думал об этом, спасибо! –

+0

Всегда приветствую, Даниэль. – user3666197

0

Я придаю сценарий, иллюстрирующий петлю.

Essential логик:

  1. добавить 31 дней к определенной дате-времени
  2. получить новый месяц, не обращая внимания на определенный день
  3. генерировать новую дату в виде строки с новым месяцем
  4. новообращенного строка в новое время datetime
  5. Добавить 31 дней до это новое время datetime
  6. повтор от 2

void OnStart(){ 

     datetime myDate[6]; 
     myDate[0] = D'2010.01.01 00:00'; 
     Print(TimeToStr(myDate[0])); 

     datetime dTempDate = myDate[0]; 
     int iSecondsIn31Days = 24*60*60*31, iTempMonth = 0; 

     for(int i=1; i<6; i++){ 
      iTempMonth = TimeMonth(dTempDate + iSecondsIn31Days); //add 31 days and get the month, we don't care whether the day is the 1st, 2nd, or 3rd, we just want the month 
      myDate[i] = dTempDate = StrToTime(TimeYear(myDate[0]) +"." +iTempMonth +"." +TimeDay(myDate[0])); //format the string to datetime 
      Print(TimeToStr(myDate[i])); //to verify 
     } 

    } 

enter image description here