Русский

Учебник по MQL4  Стандартные функции  Дата и время

Дата и время


Информационно-торговая система MetaTrader использует показания двух источников времени - локальное (компьютерное) время и серверное время.

Локальное время - это время, установленное на локальном компьютере.

Серверное время - это время, установленное на сервере.


Функция TimeLocal()

datetime TimeLocal()

Функция возвращает локальное компьютерное время в виде количества секунд, прошедших после 00:00 1 января 1970 года. Замечание: при тестировании локальное время моделируется и совпадает с моделированным последним известным временем сервера.


Подавляющее большинство событий, происходящих в клиентском терминале, учитываются в соответствии с серверным временем. По серверному времени отмечается приход тика, начало нового бара, открытие и закрытие ордеров. Для получения значения серверного времени, соответствующего текущему моменту, необходимо исполнить функцию TimeCurrent():

Функция TimeCurrent()

datetime TimeCurrent()

Функция возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года. Перед запуском на исполнение специальных функций клиентский терминал обновляет время прихода последней котировки (наряду с другими переменными окружения). Каждый тик характеризуется своим значением серверного времени, которое можно получить с помощью TimeCurrent(). В процессе выполнения программы это значение может быть изменено только в результате вызова функции RefreshRates() и только в том случае, если с момента последнего исполнения RefreshRates() данные были фактически обновлены, т.е с сервера поступили новые значения каких-либо переменных окружения.

Время открытия бара Time[i], как правило, не совпадает со временем поступления тика. Время открытия бара для любого таймфрейма всегда кратно таймфрейму. Любой первый тик, возникший в пределах таймфрейма, является барообразующим; если же в пределах таймфрейма не поступило ни одного тика, то и бар в пределах этого таймфрейма не образуется.

Например, тик, поступивший в терминал в момент (серверного) времени t 0, приводит к образованию бара со временем открытия Time[i+2] (Рис. 143). Момент, отмеченный началом таймфрейма, не совпадает с моментом t 0, а в общем случае может совпадать случайно. Последующие тики, поступающие в терминал в пределах того же таймфрейма (в моменты t 1 и t 2), могут изменить характеристики бара, например, максимальную цену или цену закрытия, но уже не влияют на время открытия бара. Время закрытия бара в информационно-торговой системе MetaTrader не учитывается (формально временем закрытия бара можно считать время поступления последнего тика в пределах таймфрейма, как показано на Рис. 143, или время начала следующего таймфрейма).


Рис. 143. Порядок формирования баров в информационно-торговой системе MetaTrader.

На Рис. 143. показано, что на некоторых временных интервалах, равных таймфрейму, бары могут не образовываться. Так, в промежуток между временем поступления тика t 5 и временем поступления очередного тика t 6 укладывается полный таймфрейм, поэтому в данном временном промежутке новый бар не образовался. Таким образом, время открытия бара может отличаться от времени открытия соседнего бара более, чем на один таймфрейм, но всегда кратно таймфрейму. Для наглядного представления порядка формирования баров можно исполнить эксперт timebars.mq4, который выводит время поступления тика и время открытия бара:

//--------------------------------------------------------------------
// timebars.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Спец. функция start
{
Alert("TimeCurrent=",TimeToStr(TimeCurrent(),TIME_SECONDS),
" Time[0]=",TimeToStr(Time[0],TIME_SECONDS));
return; // Выход из start()
}
//--------------------------------------------------------------------

На Рис. 144 представлены результаты работы эксперта timebars.mq4. Очевидно, что первый тик на очередном временном промежутке, длительностью 1 минуту, поступил в 14:29:12, при этом образовался новый бар, время открытия которого 14:29:00. Обратите внимание, в правом столбце окна сообщений отображается серверное время, а в левом столбце - локальное.


Рис. 144. Порядок формирования баров в информационно-торговой системе MetaTrader.

В случае, если тики поступают редко (например, в период между окончанием европейской и началом азиатской сессии), то при исполнении эксперта timebars.mq4 можно наблюдать и другое явление - время открытия соседних баров может отличаться более, чем на 1 минуту (для минутного таймфрейма), при этом индексация баров сохраняется подряд, без пропусков.

Серверное время в разных серверах, установленных в разных дилинговых центрах, может отличаться. Время начала и окончания торгов также устанавливается на каждом сервере персонально и может не совпадать со временем начала или окончания очередного дня. В некоторых дилинговых центрах, например, выполнены такие настройки, при которых открытие торгов происходит в воскресенье, в 23:00 по серверному времени. Это приводит к образованию "неполноценных" дневных баров, фактическая продолжительность которых равна одному часу (Рис. 145).


Рис. 145. Различная баровая история в разных дилинговых центрах.

Использование функций даты и времени в MQL4 достаточно просто. Некоторые из них преобразуют серверное или локальное время, выраженное в количестве секунд, прошедших после 00:00 1 января 1970 года, в целое число, соответствующее часу, дню и пр. Другие функции возвращают целое значение, соответствующее текущему часу, минуте, дню и пр.

Функции TimeSeconds (), TimeMinute(), TimeHour(), TimeDay(), TimeMonth(), TimeYear(), TimeDayOfWeek () и TimeDayOfYear()


Это - группа подобных функций, возвращающих соответственно количество секунд, прошедших с начала минуты, минуту, час, день, месяц, год, день недели и день в году для указанного времени. Например:

int TimeMinute(datetime time)

Функция возвращает минуты для указанного времени.

Параметры:

time - дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

int TimeDayOfWeek(datetime time)

Возвращает день недели (0-Воскресенье,1,2,3,4,5,6) для указанной даты.

Параметры:

time - дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.


Указанные функции можно использовать, например, для анализа времени открытия любого бара. Ниже представлен эксперт bigbars.mq4 для поиска бара не менее заданного размера.

//--------------------------------------------------------------------
// bigbars.mq4
// The program is intended to be used as an example in MQL4 Tutorial.
//--------------------------------------------------------------- 1 --
extern int Quant_Pt=20;                // Number of points
//--------------------------------------------------------------- 2 --
int start()                            // Spec. start function
  {
   int H_L=0;                          // Height of the bar
   for(int i=0; H_L<Quant_Pt; i++)     // Cycle for bars
     {
      H_L=MathAbs(High[i]-Low[i])/Point;//Height of the bar
      if (H_L>=Quant_Pt)               // if the high bar is not found
        {
         int YY=TimeYear(  Time[i]);   // Year
         int MN=TimeMonth( Time[i]);   // Month        
         int DD=TimeDay(   Time[i]);   // Day
         int HH=TimeHour(  Time[i]);   // Hour        
         int MM=TimeMinute(Time[i]);   // Minute
         Comment("The last price movement more than ",Quant_Pt,//Message
         " pt happened ", DD,".",MN,".",YY," ",HH,":",MM);//output
        }
     }
   return;                             // Exit from start()
  }
//--------------------------------------------------------------- 3 --

Эксперт bigbars.mq4 ищет ближайший бар, высота которого (разница между максимумом и минимумом) больше или равна значению, указанному пользователем во внешней переменной Quant_Pt. Дата и время найденного бара выводятся в окно финансового инструмента с помощью функции Comment().


Функции Seconds (), Minute(), Hour(), Day(), TimeMonth(), TimeYear(), DayOfWeek () и DayOfYear()


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

int Hour()

Возвращает текущий час (0,1,2,..23) последнего известного серверного времени. Замечание: при тестировании последнее известное время сервера моделируется.

int DayOfYear()

Возвращает текущий день года (1-1 января,..,365(6) - 31 декабря), т.е. день года последнего известного серверного времени. Замечание: при тестировании последнее известное время сервера моделируется.

Примером использования указанных функций может служить эксперт timeevents.mq4, выполняющий некоторые действия при наступлении заданного времени.

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10; // Время закрытия ордеров
bool Flag_Time=false; // Флаг, сообщения ещё не было
//--------------------------------------------------------------- 2 --
int start() // Спец. функция start
{
int Cur_Hour=Hour(); // Серверное время в часах
double Cur_Min =Minute(); // Серверное время в минутах
double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
Alert(Cur_time);
if (Cur_time>=Time_Cls) // Если наступило время события
Executor(); //.. то выполняем задуманное
return; // Выход из start()
}
//--------------------------------------------------------------- 3 --
int Executor() // Пользовательская функция
{
if (Flag_Time==false) // Если ещё не было сообщения..
{ // .. то сообщаем (1 раз)
Alert("Время важных новостей. Закройте ордера.");
Flag_Time=true; // Теперь сообщение уже было
}
return; // Выход из польз. функции
}
//--------------------------------------------------------------- 4 --

При исполнении специальной функции start() (блок 2-3) вычисляется серверное время в часах и минутах. В строке:

   double Cur_time = Cur_Hour + Cur_Min100; // Текущее время

текущее серверное время представлено в виде действительной переменной Cur_time. Действительные переменные удобно использовать в операциях сравнения:

   if (Cur_time >= Time_Cls)           // Если наступило время события

Если текущее время оказывается больше или равным времени, указанному пользователем во внешней переменной Time_Cls, то вызывается для исполнения пользовательская функция Executor(). В данном примере пользовательская функция выводит сообщение с рекомендациями по ведению торгов. В общем случае эта функция может содержать любой код, например, осуществлять торговые операции, отправлять электронные письма, создавать графические объекты и пр.

Функции даты и времени


Функция Краткое описание
Day Возвращает текущий день месяца, т.е день месяца последнего известного времени сервера.
DayOfWeek Возвращает порядковый номер дня недели (воскресенье-0,1,2,3,4,5,6) последнего известного времени сервера.
DayOfYear Возвращает текущий день года (1-1 января,..,365(6) - 31 декабря), т.е день года последнего известного времени сервера.
Hour Возвращает текущий час (0,1,2,..23) последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).
Minute Возвращает текущую минуту (0,1,2,..59) последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).
Month Возвращает номер текущего месяца (1-Январь,2,3,4,5,6,7,8,9,10,11,12), т.е. номер месяца последнего известного времени сервера.
Seconds Возвращает количество секунд, прошедших с начала текущей минуты последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).
TimeCurrent Возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.
TimeDay Возвращает день месяца (1 - 31) для указанной даты.
TimeDayOfWeek Возвращает день недели (0-Воскресенье,1,2,3,4,5,6) для указанной даты.
TimeDayOfYear Возвращает день (1 - 1 января,..,365(6) - 31 декабря) года для указанной даты.
TimeHour Возвращает час для указанного времени.
TimeLocal Возвращает локальное компьютерное время в виде количества секунд, прошедших после 00:00 1 января 1970 года.
TimeMinute Возвращает минуты для указанного времени.
TimeMonth Возвращает номер месяца для указанного времени (1-Январь,2,3,4,5,6,7,8,9,10,11,12).
TimeSeconds Возвращает количество секунд, прошедших с начала минуты для указанного времени.
TimeYear Возвращает год для указанной даты. Возвращаемая величина может быть в диапазоне 1970-2037.
Year Возвращает текущий год, т.е. год последнего известного времени сервера.

Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor.