Дата и время

MQL5 предоставляет специальный тип для хранения времени datetime. Как следует из названия, значения datetime включают и дату, и время, но при необходимости могут содержать только дату или только время внутри дня.

Значения этого типа могут использоваться в программах для отслеживания событий, таких как расписание торговых сессий, выход новостей, таймауты для временного отключения торговли советника после неудачных сделок.

Размер datetime в памяти — 8 байт. Внутреннее представление данных полностью идентично типу ulong, поскольку внутри хранится количество секунд, прошедшее с 1 января 1970 года. Максимальная поддерживаемая дата — 31 декабря 3000 года.

Константы datetime записываются в виде литеральной строки, заключенной в одинарные кавычки, перед которой ставится символ 'D'. Внутри строки выделено 6 полей с числами для всех компонент даты и времени в следующих форматах:

D'YYYY.MM.DD HH:mm:ss'
D'DD.MM.YYYY HH:mm:ss'

Здесь YYYY — год, MM — месяц, DD — день, HH — часы, mm — минуты, ss — секунды. Либо дату, либо время можно опустить. Также можно не указывать секунды или минуты с секундами.

Для максимально разрешенного значения даты в MQL5 заведена особая константа DATETIME_MAX, равная целочисленному значению 0x793406fff, что и соответствует  D"3000.12.31 23:59:59".

Примеры записи значений типа datetime представлены в файле MQL5/Scripts/MQL5Book/p2/TypeDateTime.mq5.

void OnStart()
{
  // WARNINGS: invalid date
  datetime blank = D'';           // blank = day of compilation
  datetime noday = D'15:45:00';   // noday = day of compilation + 15:45
  datetime feb30 = D'2021.02.30'; // feb30 = 2021.03.02 00:00:00
  datetime mon22 = D'2021.22.01'; // mon22 = 2022.10.01 00:00:00
  // OK
  datetime dt0 = 0;                      // 1970.01.01 00:00:00
  datetime all = D'2021.01.01 10:10:30'; // 2021.01.01 10:10:30
  datetime day = D'2025.12.12 12';       // 2025.12.12 12:00:00
}

Первые четыре переменных вызывают предупреждение компилятора о некорректной дате. В случае blank литерал полностью пустой. В переменной noday пропущен день. В обоих случаях компилятор подставляет в константу дату компиляции. Переменные feb30 и mon22 содержат некорректные номера дня и месяца. Компилятор их автоматически исправляет, перенося переполнение в старшее поле (30 февраля превращается во 2-е марта, а 22-й месяц — в 10-й месяц следующего года). Однако от предупреждений, как всегда, рекомендуется избавляться.

Переменная dt0 демонстрирует инициализацию значения datetime целым числом.

Тип datetime поддерживает набор операций, свойственных целым числам (см. главу Выражения). Это, например, позволяет прибавлять к времени заданное количество секунд (получая некий момент в будущем) или вычислять разницу между датами.