Что за время?
#1
Отправлено 09 February 2011 - 23:32
Открываю MT4 Alpari, GBPUSD H1, к примеру... (всё - демо-счета)
Время последнего бара на графике (формирующийся) - 21:00, последнего завершённого - 20:00.
Это Time[] ? - т.е. время открытия бара (по документации MQL4).
Теперь та же пара + ТФ на MT4 от InstaTrader...
Время последнего бара на графике (формирующийся) - 22:00, последнего завершённого - 21:00.
Поросил в Skype проконтроировать времена трейдера из С.-Петербурга:
- локальное время 23:19 (GMT+3)
- 21:00 последний бар MT4 Alpari (т.е. с моим совпадает)
...
- у меня 22:20 (GMT+2)
- 21:00 последний бар MT4 Alpari
Теперь смотрю цифры котировок GBPUSD H1:
- Alpari = 1.60963
- InstaTrader = 1.6097
... т.е. это практически одна и та же котировка, но Alpari её относит к 21:**, а InstaTrader - к 22:**
Кто-то может внести ясность? :
- что за время на графике MT4? на GMT это явно не тянет
- на локальное время МТ4 клиента - тем более...
- как эти времена соотносятся с GMT и местным поясным временем...
- но, самое противное, что за сдвиг на 1 час между Alpari и InstaTrader ???
 
#2
Отправлено 09 February 2011 - 23:40
Про сессии можно почитать по этой ссылке:
/*ссылки на сторонние ресурсы запрещены правилами форума*/
Но если короче то европейская сессия с 11:00 до 15:00 по Москве, американская сессия с 16:00 до 20:00 по Москве.
То как это время сессий: Европа, Азия, USA... - соотнести с временем, показываемым MT4, да ещё и с разным временм от разных ДЦ?
Сообщение отредактировал Necron: 09 February 2011 - 23:51
#3
Отправлено 10 February 2011 - 02:23
- но, самое противное, что за сдвиг на 1 час между Alpari и InstaTrader ???
Это время (на графике) - в точности соответствует тому, что покажет:
TimeToStr( TimeCurrent(), TIME_SECONDS )т.е. по описанию языка:
вот только почему это время сервера различается, и как (по каким правилам) оно определяется каждым ДЦ для своих серверов?datetime TimeCurrent( ) Возвращает последнее известное время сервера (время прихода последней котировки)
#4
Отправлено 10 February 2011 - 13:50
Если хотите узнать gmt время например, можно использовать прикрепленный скрипт. Думаю, разобраться несложно будет.
Прикрепленные файлы
#5
Отправлено 10 February 2011 - 20:01
Разные ДЦ дают свое время. Не знаю от чего зависит, может от места регистрации ДЦ, может от расположения сервера или еще от чего-либо.
Если хотите узнать gmt время например, можно использовать прикрепленный скрипт. Думаю, разобраться несложно будет.
За пример спасибо, хоть это я и сам могу сделать...
Но меня интересует разные временные шкалы от ДЦ - для начала это означает, что результаты тестирования советников на MT4 от разных ДЦ будут принципиально отличаться!
А по поводу кода вашего примера меня очень заинтересовало (не в тему) вот этот синтаксис:
#import "kernel32.dll"^M void GetLocalTime(int& TimeArray[]);Нигде в справочнике и описаниях MQL4 не всетречал такого ... int& - это ... по аналогии с С++ нужно думать "передача параметра по ссылке"?
Проверяем:
extern int N = 7; int A[]; //------------------------------------------------------------------ int init() { ArrayResize( A, N ); Alert( "размер массива " + ArraySize( A ) ); for( int i = 0; i < N; i++ ) A[ i ] = i + 1; } //------------------------------------------------------------------ int start() { static int nTick = 0, nBars = 0; if( nBars != Bars ) { nBars = Bars; Alert( "новый бар: " + TimeToStr( TimeCurrent(), TIME_SECONDS ) ); IncBars( nTick ); IncArray( A ); ShowArray( nTick, A ); } } //------------------------------------------------------------------ void IncBars( int& n ) { n++; } void IncArray( int& Array[] ) { int n = ArraySize( Array ); for( int i = 0; i < n; i++ ) Array[ i ]++; } void ShowArray( int t, int Array[] ) { int n = ArraySize( Array ); string Msg = "вход № " + t + " : "; for( int i = 0; i < n; i++ ) { Msg = Msg + Array[ i ]; if( i < n - 1 ) Msg = Msg + " , "; } Alert( Msg ); }
И получается ... что таки да!? :
2011.02.10 18:52:00 @parm EURUSD,M1: Alert: вход № 6 : 7 , 8 , 9 , 10 , 11 , 12 , 13
2011.02.10 18:52:00 @parm EURUSD,M1: Alert: новый бар: 17:52:00
Это даёт сильно расширенные возможности написания функций ... с побочными эффектами (как IncBars( int& n ) в моём примере).
#6
Отправлено 10 February 2011 - 20:14
Нигде в справочнике и описаниях MQL4 не всетречал такого ... int& - это ... по аналогии с С++ нужно думать "передача параметра по ссылке"?
И для того, чтобы проверить, создаётся ли копия (дубликат) параметра при вызове без ссылки, переписал:
void IncArray( int& Array[] ) {как :
void IncArray( int Array[] ) {
И получаю ошибку компиляции:
- т.е. контроль L-value делается ещё компилятором!'Array' - array item cannot be assigned C:\Program Files\MetaTrader - Alpari\experts\@parm.mq4 (26, 33)
#7
Отправлено 10 February 2011 - 20:44
void IncBars( int& n ) { n++; }в
void IncBars( int n ) { n++; }- вполне даже возможно , и, естественно, значение вне функции не изменяется (нет побочного эффекта), т.е. для параметра явно создаётся дубликат, и предыдущий пример поменяет свой результат на примерно так:
2011.02.10 19:43:09 @parm EURUSD,M1: alert: вход № 0 : 7 , 8 , 9 , 10 , 11 , 12 , 13
#8
Отправлено 10 February 2011 - 20:54
А вот переписать
И последний трюк.
Переписываю:
void IncArray( int& Array[] ) { int n = ArraySize( Array ); for( int i = 0; i < n; i++ ) Array[ i ]++; }как
void IncArray( int& Array[] ) { int n = ArraySize( Array ); ArrayResize( A, n + 1 ); for( int i = 0; i <= n; i++ ) Array[ i ] = i + 1; }Теперь на каждом баре меняется размер массива ... т.е. требуется его неявное переразмещение...
Ничего, номер проходит успешно, несколько последовательных строк вывода выглядят так:
...
2011.02.10 19:54:00 @parm EURUSD,M1: Alert: вход № 7 : 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14
2011.02.10 19:53:02 @parm EURUSD,M1: Alert: вход № 6 : 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13
2011.02.10 19:52:08 @parm EURUSD,M1: Alert: вход № 5 : 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12
...
#9
Отправлено 10 February 2011 - 21:20
Если хотите узнать gmt время например, можно использовать прикрепленный скрипт. Думаю, разобраться несложно будет.
Разобраться несложно было...
А вот посмотреть его вживую в работе - посложнее оказалось
2011.02.10 20:17:46 LocalTime EURUSD,M1: dll calls are not allowed; 'kernel32.dll'-'GetSystemTime'
Или это Wine+Linux ? ... или "лыжи не едут"(с) ?
#10
Отправлено 10 February 2011 - 21:29
Или это Wine+Linux ? ... или "лыжи не едут"(с) ?
Всё путём в Wine ... поехали лыжи (нужно в общих настройках навсегда разрешить импорт DLL)...
А вот цифирь меня как-то смущает:
2011.02.10 20:22:01 LocalTime EURUSD,M1: Daylight savings time is: 0.03.05 03:00:00
2011.02.10 20:22:01 LocalTime EURUSD,M1: Standard time is: 0.10.05 04:00:00
2011.02.10 20:22:01 LocalTime EURUSD,M1: Greenwich mean time is: 2011.02.10 16:22:01
2011.02.10 20:22:01 LocalTime EURUSD,M1: Current difference between your local time and GMT is: -120 minutes
2011.02.10 20:22:01 LocalTime EURUSD,M1: Difference between your local time and GMT is: -120 minutes
2011.02.10 20:22:01 LocalTime EURUSD,M1: Local time is: 2011.02.10 20:22:01:549
2011.02.10 20:22:01 LocalTime EURUSD,M1: TimeLocal function returns 2011.02.10 20:22
2011.02.10 20:22:01 LocalTime EURUSD,M1: System time is: 2011.02.10 18:22:01
Локальное время у меня вправду 20:22, разница GMT (GMT+2, киевское время) 120 min, ОК.
Но какого хрена тогда GMT = 16:22:01 ???
Если по всей арифметике должно быть 18:22 ...
Или я что-то не так считаю???
#11
Отправлено 10 February 2011 - 21:49
Разные ДЦ дают свое время. Не знаю от чего зависит, может от места регистрации ДЦ, может от расположения сервера или еще от чего-либо.
Если хотите узнать gmt время например, можно использовать прикрепленный скрипт. Думаю, разобраться несложно будет.
Теперь то же, но с ИнстаТрейдер ... чтобы как-то соотнести времена разных ДЦ...
Хотя уже написавши ... я понял, что разницы здесь не будет никакой, ведь скрипт использует только функции времени Win32 API локальной системы... та же фигня (GMT = 16:40):
2011.02.10 20:40:46 LocalTime EURUSD,H1: Daylight savings time is: 0.03.05 03:00:00
2011.02.10 20:40:46 LocalTime EURUSD,H1: Standard time is: 0.10.05 04:00:00
2011.02.10 20:40:46 LocalTime EURUSD,H1: Greenwich mean time is: 2011.02.10 16:40:46
2011.02.10 20:40:46 LocalTime EURUSD,H1: Current difference between your local time and GMT is: -120 minutes
2011.02.10 20:40:46 LocalTime EURUSD,H1: Difference between your local time and GMT is: -120 minutes
2011.02.10 20:40:46 LocalTime EURUSD,H1: Local time is: 2011.02.10 20:40:46:103
2011.02.10 20:40:46 LocalTime EURUSD,H1: TimeLocal function returns 2011.02.10 20:40
2011.02.10 20:40:46 LocalTime EURUSD,H1: System time is: 2011.02.10 18:40:46
2011.02.10 20:40:46 LocalTime EURUSD,H1: loaded successfully
Но вопрос даже не в этом ... смещения-нормировки времени можно подправить...
Но это не сдвикает ни на шаг в первоначальном вопросе:
- как параметр бара котировки (Time[0], например) привязать к GMT, если получаемые от ДЦ тики идут в привязке к непонятно какому времени?
Вот вопрос! : to be or not to be?
#12
Отправлено 10 February 2011 - 22:40
Верно. На MT от разных ДЦ будут отличаться графики, поэтому смысла анализировать свечные паттерны, к примеру, не вижу абсолютно никакого: графики будут разные, притом иногда значительно. Будь то H4 или W1, все равно будут отличаться. Единственное решение - использовать таймфреймы до H1. Это имхо.За пример спасибо, хоть это я и сам могу сделать...
Но меня интересует разные временные шкалы от ДЦ - для начала это означает, что результаты тестирования советников на MT4 от разных ДЦ будут принципиально отличаться!
Я учебник никогда не читал. Когда учился (давно это было ) - изучал коды других программистов, что не понимал - спрашивал у гуглаНигде в справочнике и описаниях MQL4 не всетречал такого ... int& - это ... по аналогии с С++ нужно думать "передача параметра по ссылке"?
По смещению - я проверил на альпари-демке:
Не могу сказать почему у вас отображается по-другому. Это на винде хр, может здесь "собака зарыта".2011.02.10 21:31:35 LocalTime EURUSD,Daily: Daylight savings time is: 0.03.05 02:00:00
2011.02.10 21:31:35 LocalTime EURUSD,Daily: Standard time is: 0.10.05 03:00:00
2011.02.10 21:31:35 LocalTime EURUSD,Daily: Greenwich mean time is: 2011.02.10 19:31:35
2011.02.10 21:31:35 LocalTime EURUSD,Daily: Current difference between your local time and GMT is: -120 minutes
2011.02.10 21:31:35 LocalTime EURUSD,Daily: Difference between your local time and GMT is: -120 minutes
2011.02.10 21:31:35 LocalTime EURUSD,Daily: Local time is: 2011.02.10 21:31:35:000
2011.02.10 21:31:35 LocalTime EURUSD,Daily: TimeLocal function returns 2011.02.10 21:31
2011.02.10 21:31:35 LocalTime EURUSD,Daily: System time is: 2011.02.10 19:31:35
Но это не сдвикает ни на шаг в первоначальном вопросе:
- как параметр бара котировки (Time[0], например) привязать к GMT, если получаемые от ДЦ тики идут в привязке к непонятно какому времени?
TimeCurrent()-(local_time+gmt_shift*60);Это, как несложно догадаться, смещение времени вашего ДЦ относительно gmt. +- сек., если время на сервере ДЦ не синхронизовано.
Все имхо.
#13
Отправлено 11 February 2011 - 01:53
Не могу сказать почему у вас отображается по-другому. Это на винде хр, может здесь "собака зарыта".
Я нашёл англоязычный форум и обсуждение, где впервые был приведен показанный вами скрипт (ссылку не показываю - их здесь затирают )
Но там же позже показано решение, которое мне кажется куда более совершенным, 2 функции:2007.12.19 17:08
#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); }- локальное время MT4 и то же время как GMT... но они вычислены уже в MT4 "размерностях" для времени, которые можно вычитать, складывать и т.д.
P.S. может кому-то пригодится.
Тогда весь скрипт вычисляющий метки времени котировок в локальном времени и в UTC - ... "простенько и со вкусом" :
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 ) ); }
И его результат:
- вот теперь всё ОК, ... даже в дате сутки перескочили , это ДЦ Alpari, а теперь InstaTrader: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
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
- независимо от времени, которое даёт ДЦ, последние котироки теперь совпадают и в локальном времени и в GMT.
- Necron и wasja это нравится
#14
Отправлено 14 February 2011 - 15:59
- независимо от времени, которое даёт ДЦ, последние котироки теперь совпадают и в локальном времени и в GMT.
Но и этого, показанного выше (и обсуждённого ещё выше) - мне мало.
По одной простой причине:
- сбейте существенно время-дату, установленные на вашем компьютере...
- и все измерения и отсчёты, пляшущие от GetSystemTime(...) - рассыпятся...
- и советники, например, прекращающие работу по пятницам вечером - прекратят это делать
Гораздо интереснее было бы для этого явно использовать для увязки времени разветвлённую мировую сеть серверов точного времени, протоколов NTP или SNTP... Т.е. идея бы в том, что запросить точное время с сервера точного времени, а потом к этой метке привязать все времена, ... главным образом метки времени сервера ДЦ.
Но как из программы запросить время по NTP мне, например, в UNIX-ах ... "как 2 пальца...", а вот как это сделать в Windows я как-то не соображу , давненько я в Windows не делал ничего...
#15
Отправлено 14 February 2011 - 16:09
а вот как это сделать в Windows я как-то не соображу ,
В любом случае, в Windows полезно и нужно синхронизировать время собственной системы с серверами NTP/SNTP.
Это может понадобиться многим, поэтому напишу "как" ... по крайней мере в Windows XP:
1. остановите сервис времени:
> net stop w32time
2. задайте адрес сервера NTP (или список адресов)
> net time /setsntp:ntp.vc.ukrtel.net3. можете проверить какой сервер NTP у вас заказан для синхронизации:
> net time /querysntp4. снова запустить службу времени Windows NT:
> net start w32time
- секунд через 25 после п.4 ваше GMT системное время будет установлено на точное мировой с рассогласованием всего в несколько миллисекунд! (убедиться, что всё это так и всё работает, можете грубо сбив-переустановить время своей системы).
После п.2 адрес NTP сервера (или список адресов) запомнится службой времени, и впредь можете его не устанавливать (пока не надумаете поменять).
P.S.#1 : уточнение: откуда взять адреса серверов точного времени (один из которых, Укртелеком, указан в п.2)?
Вот здесь:
https://support.ntp....mTwoTimeServers
- найдете добрую сотню официальных адресов, из них штук 40 - российских + 2 украинских, берите любые на вкус.
P.S.#2 : как указать список адресов (для страховки) в п.2? :
> net time /setsntp:"ntp.vc.ukrtel.net ntp21.vniiftri.ru"- кавычки обязательны, адреса (сколько угодно) разделяются пробелами.
P.S.#2 : а как относительно Windows Vista & Windows 7 ? :
Я, хоть и был уверен, специально всё перепроверил в Windows XP, прежде, чем писать. В обсуждениях (форумах) утверждается, что в Windows 7 служба времени управляется так же (не проверял). Относительно Windows Vista вообще ничего не могу сказать.