Дата и время
Информационно-торговая система 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, который выводит время
поступления тика и время открытия бара:
int start()
{
Alert("TimeCurrent=",TimeToStr(TimeCurrent(),TIME_SECONDS),
" Time[0]=",TimeToStr(Time[0],TIME_SECONDS));
return;
}
На Рис. 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 для поиска бара не менее
заданного размера.
extern int Quant_Pt=20;
int start()
{
int H_L=0;
for(int i=0; H_L<Quant_Pt; i++)
{
H_L=MathAbs(High[i]-Low[i])/Point;
if (H_L>=Quant_Pt)
{
int YY=TimeYear( Time[i]);
int MN=TimeMonth( Time[i]);
int DD=TimeDay( Time[i]);
int HH=TimeHour( Time[i]);
int MM=TimeMinute(Time[i]);
Comment("The last price movement more than ",Quant_Pt,
" pt happened ", DD,".",MN,".",YY," ",HH,":",MM);
}
}
return;
}
Эксперт 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, выполняющий некоторые
действия при наступлении заданного времени.
extern double Time_Cls=16.10;
bool Flag_Time=false;
int 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;
}
int Executor()
{
if (Flag_Time==false)
{
Alert("Время важных новостей. Закройте ордера.");
Flag_Time=true;
}
return;
}
При исполнении специальной функции 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 Ltd. или к разделу "Справка" в редакторе MetaEditor.