Что за время на графиках котировок ?

Время - деньгиВ последние времена стали появляться и обсуждаться советники, торгующие в привязке к определённому времени суток или дням недели. Например: разрешить (запретить) советнику операции с ордерами в привязке ко времени завершения азиатских торговых сессий. Увязывание времени биржевых сессий с торговой стратегией робота-советника может оказаться весьма перспективной «свежей струёй» в технике программирования торговых роботов, но… Как лицо, непосредственно активно занятое в экспериментах с торговыми программами, я задался, прежде, вопросом: «А какое же такое время мы видим под котировочными кривыми, и к какому времени привязать советника?». Некоторые ответы на этот вопрос показались мне настолько любопытными, что я решил обратить на них внимание всех коллег, программирующих торговых роботов.

По какому времени живут трейдеры?

Вечер. На моём компьютере локальное время ~22:00 (малые минуты я устраняю из рассмотрения для ясности картины), это украинское время (GMT+2), т.е. соответствующее 20:00 GMT. Открываю в терминале MT4 от дилингового центра Alpari график GBPUSD, H1, к примеру (всё показанное делалось на демо-счетах, конкретные ДЦ в описании выбраны произвольно, я то же самое проделывал ещё с четырьмя компаниями), время последнего бара на открытом графике (формирующегося) 21:00, последнего завершённого (Time[1]) — 20:00.

Далее, та же валютная пара и таймфрейм, но на терминал MetaTrader 4 от дилингового центра InstaForex. Время последнего бара на графике (формирующегося) 22:00, последнего завершённого — 21:00. Попросил в Skype знакомого трейдера из С.-Петербурга (GMT+3) проконтролировать отметки времени: его локальное время 23:19, последний сформированный бар в MT4 от Alpari — 21:00, т.е. с моим совпадает.

Теперь для последнего сформированного бара на графиках котировок GBPUSD H1 смотрим числовые значения цены закрытия: для Alpari это 1.60963 (5-тизначная котировка), для InstaTrader это 1.6097 (4-

fortrader.org

это в точности то, что даёт вам функция TimeCurrent() MQL4, и что вам покажет строчка кода: TimeToStr( TimeCurrent(), TIME_SECONDS). Но это определённо не то время, к которому я хотел бы синхронизировать работу робота-советника.

Время — деньги

Во что практически может вылиться разница временных шкал, даваемых разными ДЦ?

1. Это одна из причин того, что при отработке вашего советника в тестере MetaTrader 4 на котировочных историях от разных ДЦ, вы никогда не получите абсолютно совпадающих результатов тестов, потому что «сутки» у этих ДЦ будут начинаться и заканчиваться в разные моменты времени.

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

Как делу можно помочь?

На просторах сети Интернет (я, к сожалению, не смог восстановить источник) как-то раньше я встречал функции, возвращающие в программу MQL4 локальное время вашего компьютера (GetWinLocalDateTime()) и соответствующее ему время GMT (GetWinUtcDateTime() — это же время ещё называют UTC), именно в единицах той размерности, с которой оперирует программа MQL4 (т.е. так же, как и встроенная функция TimeCurrent()):

#import «kernel32.dll»
int SystemTimeToFileTime(int& TimeArray[], int& FileTimeArray[]);
int FileTimeToLocalFileTime(int& FileTimeArray[], int& LocalFileTimeArray[]);
void GetSystemTime(int& TimeArray[]);
#import
datetime GetWinLocalDateTime() {
double hundrednSecPerSec = 10.0 * 1000000.0;
double bit32to64 = 65536.0 * 65536.0;
double secondsBetween1601And1970 = 11644473600.0;
int TimeArray[4];
int FileTimeArray[2]; // 100nSec since 1601/01/01 UTC
int LocalFileTimeArray[2]; // 100nSec since 1601/01/01 Local
GetSystemTime( TimeArray );
SystemTimeToFileTime( TimeArray, FileTimeArray );
FileTimeToLocalFileTime( FileTimeArray, LocalFileTimeArray );
double lfLo32 = LocalFileTimeArray[0];
if( lfLo32 < 0 )
lfLo32 = bit32to64 + lfLo32;
double ticksSince1601 = LocalFileTimeArray[1] * bit32to64 + lfLo32;
double secondsSince1601 = ticksSince1601 / hundrednSecPerSec;
double secondsSince1970 = secondsSince1601 — secondsBetween1601And1970;
return (secondsSince1970);
}
datetime GetWinUtcDateTime() {
double hundrednSecPerSec = 10.0 * 1000000.0;
double bit32to64 = 65536.0 * 65536.0;
double secondsBetween1601And1970 = 11644473600.0;
int TimeArray[4];
int FileTimeArray[2]; // 100nSec since 1601/01/01 UTC
GetSystemTime( TimeArray );
SystemTimeToFileTime( TimeArray, FileTimeArray );
double lfLo32 = FileTimeArray[0];
if(lfLo32 < 0) lfLo32 = bit32to64 + lfLo32; double ticksSince1601 = FileTimeArray[1] * bit32to64 + lfLo32; double secondsSince1601 = ticksSince1601 / hundrednSecPerSec; double secondsSince1970 = secondsSince1601 — secondsBetween1601And1970; return (secondsSince1970); }

Кому данная функция может пригодиться — пользуйтесь. И вот скрипт для примера, вычисляющий метки времени котировок в локальном времени и в GMT, независимо от меток времени ДЦ. Простенько и со вкусом:

start() {
int serv2lock = TimeLocal() — TimeCurrent(),
serv2utc = GetWinUTCDateTime() — TimeCurrent(),
local2utc = GetWinUTCDateTime() — GetWinLocalDateTime();
Print( «время открытия бара (Time[0]):»,
» server=», TimeToStr( Time[ 0 ], TIME_DATE | TIME_SECONDS ),
» local=», TimeToStr( Time[ 0 ] + serv2lock, TIME_DATE | TIME_SECONDS ),
» UTC=», TimeToStr( Time[ 0 ] + serv2utc, TIME_DATE | TIME_SECONDS )
);
}

И его результат на MetaTrader 4 разных дилинговых центров:

— ДЦ Alpari:

2011.02.11 01:07:36 LocalTime2 EURUSD, H1: время открытия бара (Time[0]): server=2011.02.11 00:00:00 local=2011.02.11 01:00:01 UTC=2011.02.10 23:00:01.

Вот теперь всё корректно, даже в дате сутки перескочили (локальная дата и UTC отличаются).

— ДЦ InstaForex:

2011.02.11 01:07:52 LocalTime2 GBPUSD,H1: время открытия бара (Time[0]): server=2011.02.11 01:00:00 local=2011.02.11 01:00:13 UTC=2011.02.10 23:00:13.

Независимо от меток времени, которые нам соизволит давать дилинговые центры, последние котировки теперь совпадают (и в локальном времени и в UTC) от разных ДЦ.

Это уже куда ближе к цели привязать работу советника ко времени GMT, но только при условии, что установленное на вашем компьютере системное время не сбито, а ваш часовой пояс установлен корректно. А это не всегда соответствует действительности.

Используем сервера точного времени NTP или SNTP

Ещё интереснее было бы явно использовать (из программы MQL4) для увязки времени разветвлённую мировую сеть серверов точного времени протоколов NTP или SNTP.

Идея состояла бы в том, что запросить время с сервера точного времени, а потом к этому значению привязать все метки времени программы. Но как из программы запросить время по протоколу NTP, мне, например, совершенно понятно в операционных системах UNIX, а вот как это сделать в Windows я как-то не соображу. Вместо этого, я просто покажу, как синхронизировать установленное время вашей собственной компьютерной системы с серверами точного времени NTP/SNTP при её включении, по крайней мере, как это сделать в Windows XP:

1. после загрузки операционной системы остановите её сервис времени командой в консоли («выполнить команду»): > net stop w32time

2. задайте адрес сервера точного времени NTP (или список адресов, см. далее):
> net time /setsntp:ntp.vc.ukrtel.net

3. можете проверить, какой сервер NTP у вас установлен в системе по умолчанию для синхронизации (но это вовсе не означает, что это лучший выбор):
> net time /querysntp

4. после задания сервера, снова запустить службу времени Windows XP:
> net start w32time

Секунд через 25 после таких манипуляций ваше системное время «перепрыгнет», и будет установлено на точное мировое с рассогласованием всего в несколько тысячных долей секунды! Убедиться, что всё это именно так и работает, вы можете, специально установив неправильное время в своей системе, и, посмотрев, что с ним произойдёт после таких действий.

После выполнения п.2 адрес NTP сервера (или список нескольких адресов) запомнится службой времени, и впредь вы можете его не устанавливать (до тех пор, пока не вздумаете его поменять).

Откуда же взять адреса серверов точного времени, один из которых, Укртелеком, в качестве примера, я записал выше в п.2 примера? Вот по этому адресу Интернет  вы найдете добрую сотню официальных адресов серверов точного времени, из которых штук 40 российских и 2 украинских, берите любые из них на свой вкус.

Как записать (для страховки) в команде список из нескольких серверов точного времени? Вот в таком синтаксисе — кавычки обязательны, адреса серверов (сколько угодно много) разделяются пробелами:
> net time /setsntp:»ntp.vc.ukrtel.net ntp21.vniiftri.ru»

А что относительно Windows Vista и Windows 7? В обсуждениях в Интернет утверждается, что в Windows 7 служба времени управляется точно так же. Относительно Windows Vista вообще ничего не могу сказать.

P.S. Попался мне попутно адрес WWW-страницы для уточнения GMT времени, может изрядно помочь при отработке всяких экспериментов со временем: http://wwp.greenwichmeantime.com/

Добавить комментарий

Кнопка возврата к началу