Скачать MetaTrader 5

Поиск и преобразование дат datetime

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrew
87
Andrew 2010.10.21 18:58 

мне нужно получить три даты:

date1 = Текущий год, месяц, ЧИСЛО ВЧЕРАШНЕГО ДНЯ - 00:00

date2 = Текущий год, месяц, СЕГОДНЯШНЕЕ ЧИСЛО - 00:00 

date3 = Текущий год, месяц, ЗАВТРАШНЕЕ ЧИСЛО - 00:00

 т.е если сегодня date2=D'2010.10.21 00:00' то date1=D'2010.10.20 00:00' и date3=D'2010.10.22 00:00';

 

как это можно сделать?

hrenfx
3672
hrenfx 2010.10.21 19:11  
#define PERIOD__D1 PERIOD_D1 * 60

date2 = TimeCurrent();
date2 -= date2 % PERIOD__D1;
 
date1 = date2 - PERIOD__D1;
date3 = date2 + PERIOD__D1;
Andrew
87
Andrew 2010.10.21 20:30  

почемуто не получилось) но спасибо за подсказку, разобрался и получилось вот что:

  date2=TimeCurrent()-Hour()*3600-Minute()*60-Seconds();
  date1=date2-PERIOD_D1*60;
  date3=date2+PERIOD_D1*60;
hrenfx
3672
hrenfx 2010.10.21 20:38  
kristopher:

почемуто не получилось

У MQL4, к сожалению, ограничения в #define, поэтому правильно будет так:

#define PERIOD__D1 86400 
Андрей
1890
Андрей 2010.10.21 21:44  

Вот так немного лучше:

#define DAY_SECONDS 86400 
Лучше не дублировать имена
Andrew
87
Andrew 2010.10.25 01:35  

окончательный рабочий вариант:

 

date2=TimeCurrent()-Hour()*3600-Minute()*60-Seconds();
 if (DayOfWeek()==1) date1=date2-PERIOD_D1*60*3;
 else date1=date2-PERIOD_D1*60; 
date3=date2+PERIOD_D1*60;
Андрей
1890
Андрей 2010.10.25 02:24  

Вот тут

date2=TimeCurrent()-Hour()*3600-Minute()*60-Seconds();
написано неправильно.
Потому что функция Seconds() [и Hour/Minute] формально может отработать на секунду позже, чем TimeCurrent().
А правильный вариант- такого плана, как вам написал Иван
datetime d = TimeCurrent();
datetime e = d - d % (PERIOD_D1 * 60)

Андрей
1890
Андрей 2010.10.25 03:11  

P.S.: и вообще, судя по тому что вы хотели- этот вариант- полностью неправильный.
Потому что нужны три дня, в которых есть данные.
А пятница может быть выходным или коротким днем (2-3 часа), который нужно проигнорировать.

Andrew
87
Andrew 2010.10.25 17:37  

про нерабочии дни вообще забыл!

jartmail.ru предложи чтонить? :) 

может вот так?

   date2=TimeCurrent();
   date2-=date2%(PERIOD_D1*60);

   date1=Time[iBarShift(NULL,Period(),date2,false)+1];
   date1-=date1%(PERIOD_D1*60);

   date3=date2+PERIOD_D1*60;
ток вот короткий день не проигнорируется..
Андрей
1890
Андрей 2010.10.25 18:13  

А что тут можно предлагать?
Залез в массив котировок и с какой-то точки в обратном направлении сканируешь.
Нашёл нормальный день- отложи.

Andrew
87
Andrew 2010.10.25 18:17  
ага)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий