MQL5 — Дата и время

Всем привет! Мы продолжаем изучать mql5 с нуля, и сегодня у нас будет интересный и разнообразный урок. Мы поговорим о дате и времени, коснемся понятия макроподстановок и вскользь познакомимся со структурами данных.


Предыдущие уроки


MQL5 программирование: Дата и Время (datetime)

Тип datetime

Тип datetime предназначен для хранения даты и времени в виде количества секунд, прошедших с 01 января 1970 года. Занимает он в памяти, как вы помните, 8 байт. По сути своей это тот же тип integer, но для времени в mql5 выделен специальный тип переменной.

Поэтому мы можем просто записать:

Datetime cur_time = 1649160709;

Но это не совсем удобная запись, есть вариант более удобный. Дело в том, что константы даты и времени можно задавать в виде строки, которая состоит из 6 частей. Это год, месяц, число месяца, час, минута и секунда. Константа обрамляется одинарными кавычками и начинается с символа D.

Диапазон значений может быть от 1 января 1970 года до 31 декабря 3000 года. При этом можно опустить либо дату (год, месяц, число), либо время (часы, минуты, секунды), либо все вместе. Но желательно указывать при такой записи год, месяц и день, иначе компилятор предупредит о неполной литеральной записи такой даты.

Примеры:

datetime NY=D'2015.01.01 00:00';     // время наступления 2015 года
datetime d1=D'1980.07.19 12:30:27';  // год месяц день часы минуты секунды
datetime d2=D'19.07.1980 12:30:27';  // равнозначно D'1980.07.19 12:30:27';
datetime d3=D'19.07.1980 12';        // равнозначно D'1980.07.19 12:00:00'
datetime d4=D'01.01.2004';           // равнозначно D'01.01.2004 00:00:00'
datetime compilation_date=__DATE__;             // дата компиляции
datetime compilation_date_time=__DATETIME__;    // дата и время компиляции 
datetime compilation_time=__DATETIME__-__DATE__;// время компиляции
//--- примеры объявлений, на которые будут получены предупреждения компилятора
datetime warning1=D'12:30:27';       // равнозначно D'[дата компиляции] 12:30:27'
datetime warning2=D'';               // равнозначно __DATETIME__

Предопределенные макроподстановки

В примере выше вам наверняка еще не знакомы такие записи, как __DATETIME__ и __DATE__. Дело в том, что для облегчения отладки программы в mql5 есть специальные константы-макросы, значения в которых устанавливаются в момент компиляции программы. Самый простой способ их использования – вывод через функцию Print().

__DATE__ - Дата компиляции файла без времени (часы, минуты и секунды равны 0)
__DATETIME__ - Дата и время компиляции файла
__LINE__ - Номер строки в исходном коде, на которой расположен данный макрос
__FILE__ - Имя текущего компилируемого файла
__PATH__ - Абсолютный путь к текущему компилируемому файлу
__FUNCTION__ - Имя функции, в теле которой расположен макрос
__FUNCSIG__ - Сигнатура функции, в теле которой расположен макрос. Вывод в лог полного описания функции с типами параметров может пригодиться при идентификации перегруженных функций
__MQLBUILD__, __MQL5BUILD__ - Номер билда компилятора
__COUNTER__ - Компилятор для каждого встретившегося объявления __COUNTER__ подставляет по месту значение счетчика от 0 до N-1, где N – число использований в коде.  При перекомпиляции исходного кода без изменений порядок __COUNTER__ гарантируется.
__RANDOM__ - Компилятор для каждого объявления __RANDOM__ подставляет в код случайное ulong-число.

Пример:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- пример вывода информации при инициализации советника
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//--- установка интервала между событиями таймера
   EventSetTimer(5);
//---
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- пример вывода информации при деинициализации советника
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- вывод информации при поступлении тика
   Print(" __MQLBUILD__ = ",__MQLBUILD__,"  __FILE__ = ",__FILE__);
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
   test1(__FUNCTION__);
   test2();
//---
  }
//+------------------------------------------------------------------+
//| test1                                                            |
//+------------------------------------------------------------------+
void test1(string par)
  {
//--- вывод информации внутри функции
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__," par=",par);
  }
//+------------------------------------------------------------------+
//| test2                                                            |
//+------------------------------------------------------------------+
void test2()
  {
//--- вывод информации внутри функции
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
  }
//+------------------------------------------------------------------+
//| OnTimer event handler                                            |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
   test1(__FUNCTION__);
  }

Структуры и MqlDateTime

Помимо типа datetime в языке mql5 дата может также храниться в структуре. Для начала разберемся, что это такое.

Структура – это набор элементов произвольного типа (кроме типа void, само собой). То есть структура объединяет логически связанные данные разных типов в один набор.

Структурный тип данных определяется следующим описанием:

struct имя_структуры 
  {
   описания_элементов
  };

Структура даты содержит в себе восемь полей типа int.

struct MqlDateTime
  {
   int year;           // год
   int mon;            // месяц
   int day;            // день
   int hour;           // час
   int min;            // минуты
   int sec;            // секунды
   int day_of_week;    // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
   int day_of_year;    // порядковый номер в году (1 января имеет номер 0)
  };

Будьте внимательны со следующим нюансом. Дело в том, что порядковый номер day_of_year в високосном году, начиная с марта, будет отличаться от порядкового номера соответствующего дня в невисокосном году.

Пример:

void OnStart()
  {
//---
   datetime date1=D'2008.03.01';
   datetime date2=D'2009.03.01';
 
   MqlDateTime str1,str2;
   TimeToStruct(date1,str1);
   TimeToStruct(date2,str2);
   printf("%02d.%02d.%4d, day of year = %d",str1.day,str1.mon,
          str1.year,str1.day_of_year);
   printf("%02d.%02d.%4d, day of year = %d",str2.day,str2.mon,
          str2.year,str2.day_of_year);
  }
/*  Результат
   01.03.2008, day of year = 60
   01.03.2009, day of year = 59
*/

Функции для работы с датой и временем

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в «Обзоре рынка» символов. В обработчике OnTick() эта функция вернет время пришедшего обрабатываемого в текущий момент тика. В других случаях это время прихода последней котировки по любому символу, доступному в окне «Обзор рынка», то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.

datetime TimeCurrent();

datetime TimeCurrent(
    MqlDateTime& dt_struct // переменная типа структуры
);

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом. При работе в тестере стратегий время последней котировки TimeCurrent() моделируется в соответствии с историческими данными.

TimeTradeServer

Возвращает расчетное текущее время торгового сервера. В отличие от функции TimeCurrent() расчет значения времени производится в клиентском терминале и зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.

datetime TimeTradeServer();

datetime TimeTradeServer(
    MqlDateTime& dt_struct // переменная типа структуры
);

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом. При работе в тестере стратегий время TimeTradeServer() моделируется в соответствии с историческими данными и всегда равно TimeCurrent().

TimeLocal

Возвращает локальное время компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.

datetime TimeLocal();

datetime TimeLocal(
    MqlDateTime& dt_struct // переменная типа структуры
);

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом. При работе в тестере стратегий локальное время TimeLocal() всегда равно моделируемому серверному времени TimeCurrent().

TimeGMT

Возвращает время GMT, которое вычисляется с учётом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.

datetime TimeGMT();

datetime TimeGMT(
    MqlDateTime& dt_struct // переменная типа структуры
);

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом. При работе в тестере стратегий время TimeGMT() всегда равно моделируемому серверному времени TimeTradeServer().

TimeDaylightSavings

Возвращает поправку на летнее время в секундах, если был произведен переход на летнее время. Зависит от настроек времени на компьютере пользователя.

int TimeDaylightSavings();

TimeGMTOffset

Возвращает текущую разницу между временем GMT и локальным временем компьютера в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.

int TimeGMTOffset();

Значение типа int, представляющее текущую разницу между временем GMT и локальным временем компьютера TimeLocal() в секундах.

TimeGMTOffset() = TimeGMT() — TimeLocal()

TimeToStruct

Производит конвертацию из значения типа datetime (количество секунд с 01.01.1970) в переменную типа структуры MqlDateTime.

bool TimeToStruct(
    datetime dt, // дата и время
    MqlDateTime& dt_struct // структура для принятия значений
);

StructToTime

Производит конвертацию из переменной типа структуры MqlDateTime в значение типа datetime и возвращает полученное значение.

datetime StructToTime(
    MqlDateTime& dt_struct // структура даты и времени
);

На этом все, всем пока!

Тема на форуме

С уважением, Дмитрий аkа Silentspec
Tlap.com

Уроки по MQL5 , , ,