Скачать MetaTrader 5

Увеличение (уменьшение) MqlDateTime

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делись ссылками на форуме. Теперь они имеют Rich Content!
Vitaly Zyrianov
190
Vitaly Zyrianov 2011.11.15 12:10 

Как оптимальнее организовать изменение структуры типа MqlDateTime? В простейшем случае на +/- 1 день. Само собой, с проверкой переходов через месяц/год.

Будет ли быстрее проверить граничные состояния (30, 31, 01 числа), чем 1) провести преобразование в datetime -> 2) преобразованное значение увеличить на 86400 -> 3) произвести обратное преобразование к MqlDateTime?

Ну и в общем случае - изменение на произвольное количество любых единиц (секунд, минут, часов и т. д.).

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура даты
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура даты
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура даты - Документация по MQL5
Andrey Voytenko
23090
Andrey Voytenko 2011.11.15 13:29  
Это уже обсуждалось здесь - https://www.mql5.com/ru/forum/1084#comment_6812
Vitaly Zyrianov
190
Vitaly Zyrianov 2011.11.15 15:41  
avoitenko:
Это уже обсуждалось здесь - https://www.mql5.com/ru/forum/1084#comment_6812
MqlDateTime dt;
datetime DT;
DT=TimeCurrent();
TimeToStruct(DT,dt);
dt.day=dt.day-20;
DT=StructToTime(dt);
Print(DT);

 Предложенный вариант решения не учитывает хронологические моменты. И, по большому счёту, работает некорректно, на мой взгляд.

 Если, допустим, 

MqlDateTime dt_struct;
TimeCurrent (dt_struct);
Print (StructToTime(dt_struct));

 даёт на выходе '2011.11.15 12:15:01', то

MqlDateTime dt_struct;
TimeCurrent (dt_struct);
dt_struct.day = dt_struct.day - 20;
Print (StructToTime(dt_struct));

 даёт '2011.11.01 12:15:01'.

Т. е. если количество отнимаемых дней превышает число дней до начала месяца, то мы в любом случае получаем дату начала месяца.

Интересует же функция, учитывающая количество дней в месяце, году и т. п. Собственно, можно ли это сделать как-то иначе, нежели описанный в оп-посте вариант с преобразованиями в datetime и обратно? 

o_o
Модератор
23690
o_o 2011.11.15 15:43  

посмотрите по ссылке на пост выше. там и есть ответ.


Vitaly Zyrianov
190
Vitaly Zyrianov 2011.11.15 16:09  
sergeev:

посмотрите по ссылке на пост выше. там и есть ответ.


В посте по ссылке предложено два решения:

1. Отнять количество секунд от переменной типа datetime;

2. Отнять количество дней от поля day структуры типа MqlDateTime (оно приведено в первом отрывке кода).

Если мы применяем второй вариант, то можем отнять только количество дней,  меньшее, чем значение, содержащееся в поле day. Эту мысль я отразил в приведённом примере. Проще говоря, если сегодня 15 ноября, то если мы отнимем число больше 14 - в любом случае получим 1 ноября.

Объективно, если мы отнимаем от 15 ноября 15 дней, то должны получить 31 октября. Нет? 

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура даты
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура даты
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура даты - Документация по MQL5
Dmitriy Skub
11617
Dmitriy Skub 2011.11.15 16:39  
VAZ_ik:

В посте по ссылке предложено два решения:

1. Отнять количество секунд от переменной типа datetime;

2. Отнять количество дней от поля day структуры типа MqlDateTime (оно приведено в первом отрывке кода).

Если мы применяем второй вариант, то можем отнять только количество дней,  меньшее, чем значение, содержащееся в поле day. Эту мысль я отразил в приведённом примере. Проще говоря, если сегодня 15 ноября, то если мы отнимем число больше 14 - в любом случае получим 1 ноября.

Объективно, если мы отнимаем от 15 ноября 15 дней, то должны получить 31 октября. Нет? 

Используйте первое решение - не ошибетесь.
Andrey Voytenko
23090
Andrey Voytenko 2011.11.15 16:45  

Есть предположение, что второй вариант в старых билдах работал и на больших вычетах по времени. 

Но сейчас остался только первый:

   datetime dt = TimeCurrent() - PeriodSeconds(PERIOD_D1)*20;

   Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES)," - ",
         TimeToString(dt, TIME_DATE|TIME_MINUTES));

 

o_o
Модератор
23690
o_o 2011.11.15 17:04  
VAZ_ik:

В посте по ссылке предложено два решения:

1. Отнять количество секунд от переменной типа datetime;

2. Отнять количество дней от поля day структуры типа MqlDateTime (оно приведено в первом отрывке кода).

Если мы применяем второй вариант, то можем отнять только количество дней,  меньшее, чем значение, содержащееся в поле day. Эту мысль я отразил в приведённом примере.

а если мы применяем первый вариант? то что будет?
Vitaly Zyrianov
190
Vitaly Zyrianov 2011.11.15 18:11  
Dima_S:
Используйте первое решение - не ошибетесь.
avoitenko:

Есть предположение, что второй вариант в старых билдах работал и на больших вычетах по времени. 

Но сейчас остался только первый:

 

Что-то мне тоже подсказывает, что сперва второе решение работало. Собственно, поэтому и выбрал сейчас первое, чтобы не зависеть от подобных неожиданностей) Спасибо!

sergeev:
а если мы применяем первый вариант? то что будет?

Будет преобразование типов взад-вперёд, что на мой взгляд не лучшим образом может сказаться на производительности в определённой ситуации. Хотя в данный момент я ушёл от этой проблемы алгоритмически. Просто перегрузка простейших арифметических операций для работы с датами была бы приятным дополнением к остальным нововведениям в MQL5)

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Основы языка / Операции и выражения / Арифметические операции - Документация по MQL5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий