Перейти к содержимому

Theme© by Fisana
 

Фотография
* * * * * 1 Голосов

Что за время?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 17

#1 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 09 February 2011 - 23:32

На моём компьютере локальное время ~22:00 (+ малые минуты я устраняю для ясности вопроса)...

Открываю 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 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 09 February 2011 - 23:40

т.е., когда говорят:

Про сессии можно почитать по этой ссылке:
/*ссылки на сторонние ресурсы запрещены правилами форума*/

Но если короче то европейская сессия с 11:00 до 15:00 по Москве, американская сессия с 16:00 до 20:00 по Москве.


То как это время сессий: Европа, Азия, USA... - соотнести с временем, показываемым MT4, да ещё и с разным временм от разных ДЦ? :)

Сообщение отредактировал Necron: 09 February 2011 - 23:51


#3 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 10 February 2011 - 02:23

- но, самое противное, что за сдвиг на 1 час между Alpari и InstaTrader ???


Это время (на графике) - в точности соответствует тому, что покажет:
TimeToStr( TimeCurrent(), TIME_SECONDS )
т.е. по описанию языка:

datetime TimeCurrent( ) Возвращает последнее известное время сервера (время прихода последней котировки)

вот только почему это время сервера различается, и как (по каким правилам) оно определяется каждым ДЦ для своих серверов?

#4 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 10 February 2011 - 13:50

Разные ДЦ дают свое время. Не знаю от чего зависит, может от места регистрации ДЦ, может от расположения сервера или еще от чего-либо. :)
Если хотите узнать gmt время например, можно использовать прикрепленный скрипт. Думаю, разобраться несложно будет.

Прикрепленные файлы


Каждый сам кузнец своей судьбы.

#5 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 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 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 10 February 2011 - 20:14

Нигде в справочнике и описаниях MQL4 не всетречал такого ... int& - это ... по аналогии с С++ нужно думать "передача параметра по ссылке"?


И для того, чтобы проверить, создаётся ли копия (дубликат) параметра при вызове без ссылки, переписал:
void IncArray( int& Array[] ) {
как :
 void IncArray( int Array[] ) {

И получаю ошибку компиляции:

'Array' - array item cannot be assigned C:\Program Files\MetaTrader - Alpari\experts\@parm.mq4 (26, 33)

- т.е. контроль L-value делается ещё компилятором!

#7 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 10 February 2011 - 20:44

А вот переписать
  void IncBars( int& n ) { n++; }
в
  void IncBars( int n ) { n++; }
- вполне даже возможно :scratch_head: , и, естественно, значение вне функции не изменяется (нет побочного эффекта), т.е. для параметра явно создаётся дубликат, и предыдущий пример поменяет свой результат на примерно так:

2011.02.10 19:43:09 @parm EURUSD,M1: alert: вход № 0 : 7 , 8 , 9 , 10 , 11 , 12 , 13



#8 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 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 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 10 February 2011 - 21:20

Если хотите узнать gmt время например, можно использовать прикрепленный скрипт. Думаю, разобраться несложно будет.


Разобраться несложно было...
А вот посмотреть его вживую в работе - посложнее оказалось :scratch_head:

2011.02.10 20:17:46 LocalTime EURUSD,M1: dll calls are not allowed; 'kernel32.dll'-'GetSystemTime'


Или это Wine+Linux ? ... или "лыжи не едут"(с) ?

#10 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 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 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 10 February 2011 - 21:49

Разные ДЦ дают свое время. Не знаю от чего зависит, может от места регистрации ДЦ, может от расположения сервера или еще от чего-либо. :scratch_head:
Если хотите узнать 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? :acute:

#12 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 10 February 2011 - 22:40

За пример спасибо, хоть это я и сам могу сделать...
Но меня интересует разные временные шкалы от ДЦ - для начала это означает, что результаты тестирования советников на MT4 от разных ДЦ будут принципиально отличаться!

Верно. На MT от разных ДЦ будут отличаться графики, поэтому смысла анализировать свечные паттерны, к примеру, не вижу абсолютно никакого: графики будут разные, притом иногда значительно. Будь то H4 или W1, все равно будут отличаться. Единственное решение - использовать таймфреймы до H1. Это имхо.

Нигде в справочнике и описаниях MQL4 не всетречал такого ... int& - это ... по аналогии с С++ нужно думать "передача параметра по ссылке"?

Я учебник никогда не читал. Когда учился (давно это было :scratch_head: ) - изучал коды других программистов, что не понимал - спрашивал у гугла :acute:

По смещению - я проверил на альпари-демке:

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 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 11 February 2011 - 01:53

Не могу сказать почему у вас отображается по-другому. Это на винде хр, может здесь "собака зарыта".


Я нашёл англоязычный форум и обсуждение, где впервые был приведен показанный вами скрипт (ссылку не показываю - их здесь затирают :scratch_head: )

2007.12.19 17:08

Но там же позже показано решение, которое мне кажется куда более совершенным, 2 функции:
  #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 )
          );
  }

И его результат:

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

- вот теперь всё ОК, ... даже в дате сутки перескочили :acute: , это ДЦ Alpari, а теперь InstaTrader:

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 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 14 February 2011 - 15:59

- независимо от времени, которое даёт ДЦ, последние котироки теперь совпадают и в локальном времени и в GMT.


Но и этого, показанного выше (и обсуждённого ещё выше) - мне мало.
По одной простой причине:
- сбейте существенно время-дату, установленные на вашем компьютере...
- и все измерения и отсчёты, пляшущие от GetSystemTime(...) - рассыпятся...
- и советники, например, прекращающие работу по пятницам вечером - прекратят это делать :(

Гораздо интереснее было бы для этого явно использовать для увязки времени разветвлённую мировую сеть серверов точного времени, протоколов NTP или SNTP... Т.е. идея бы в том, что запросить точное время с сервера точного времени, а потом к этой метке привязать все времена, ... главным образом метки времени сервера ДЦ.
Но как из программы запросить время по NTP мне, например, в UNIX-ах ... "как 2 пальца...", а вот как это сделать в Windows я как-то не соображу :) , давненько я в Windows не делал ничего...

#15 Olej

Olej

    Почётный житель форума

  • Свой человек
  • PipPipPipPipPipPipPipPipPipPip
  • 411 сообщений

Отправлено 14 February 2011 - 16:09

а вот как это сделать в Windows я как-то не соображу :) ,


В любом случае, в 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 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 вообще ничего не могу сказать.



Copyright © 2024 Your Company Name