Лондонский отрыв

 

Уважаемые форумчане,

С нескольких недель я пытаюсь освоить MQL4, но что за трудность!!! Я надеялся, что я уже эксперт, но это не так, и я надеюсь получить немного помощи.

Я пытаюсь построить пробойный советник для открытия Лондонской сессии. Я хочу, чтобы мой советник вычислял максимум и минимум 5 баров до открытия Лондона, а затем вычислял максимум и минимум.

Я предполагаю, что для этой функции мне нужно использовать максимум функции iHigh и минимум функции iLow для расчета диапазона. Но этот диапазон будет меняться в течение дня. Я хочу, чтобы максимум и минимум этого диапазона были статичными, а не переменными.

Есть ли у кого-нибудь идеи?

Заранее спасибо!

 
Nour:

Уважаемые форумчане,

С нескольких недель я пытаюсь освоить MQL4, но что за трудность!!! Я надеялся, что я уже эксперт, но это не так, и я надеюсь получить немного помощи.

Я пытаюсь построить пробойный советник для открытия Лондонской сессии. Я хочу, чтобы мой советник вычислял максимум и минимум 5 баров до открытия Лондона, а затем вычислял максимум и минимум.

Я предполагаю, что для этой функции мне нужно использовать максимум функции iHigh и минимум функции iLow для расчета диапазона. Но этот диапазон будет меняться в течение дня. Я хочу, чтобы максимум и минимум этого диапазона были статичными, а не переменными.

Есть ли у кого-нибудь идеи?

Заранее спасибо!


как найти бар, где начинается лондонский open...

покажите, как вы это делаете

 

Это еще одна проблема deVries, я не знаю, как найти бар, где открывается Лондон...

Я все еще довольно новичок в MQL4

 

... Я что-то упускаю, или функции даты/времени, встроенные в MQL4, все еще недостаточны для такого рода вещей?

Две проблемы:

* Вы не можете надежно получить смещение между сервером брокера и GMT, потому что (а) оно может меняться при переходе на летнее время, и (б) любое сравнение TimeCurrent() с TimeGMT() для расчета смещения не работает в выходные дни.

* Даже если вы можете получить текущее смещение, пока рынок открыт, нет встроенного способа перевода времени GMT в другой часовой пояс, например, в Лондон.

Другими словами: нет встроенного способа определить, что (а) сервер брокера работает в CET, и поэтому (б) лондонское время для каждого бара на 1 час отстает от времени, сообщаемого MT4.

 

Nour:

Это еще одна проблема deVries, я не знаю, как найти бар, где открывается Лондон...

Я все еще довольно новичок в MQL4

https://docs.mql4.com/series/ibarshift
 
gchrmt4:

... Я что-то упускаю, или функции даты/времени, встроенные в MQL4, все еще недостаточны для такого рода вещей?

Две проблемы:

* Вы не можете надежно получить смещение между сервером брокера и GMT, потому что (а) оно может меняться при переходе на летнее время, и (б) любое сравнение TimeCurrent() с TimeGMT() для расчета смещения не работает в выходные дни.

* Даже если вы можете получить текущее смещение, пока рынок открыт, нет встроенного способа перевода времени GMT в другой часовой пояс, например, в Лондон.

Другими словами: нет встроенного способа определить (а) сервер брокера работает в CET, и поэтому (б) лондонское время для каждого бара на 1 час отстает от времени, сообщаемого MT4.


Оказывается, что TimeGMT() не изменяется при переходе на летнее время. Например, я живу в США, поэтому в настоящее время мой местный часовой пояс - EDT. На сервере MT4 моего брокера сейчас EEST. Теперь рассмотрим следующий код и его вывод:

   Print ("1. GMT = ", TimeToString(TimeGMT()));
   Print ("2. Local Time (EDT) = ", TimeToString(TimeLocal()));
   Print ("3. Daylight Saving Adjustment: ", TimeDaylightSavings()/3600);
   Print ("4. GMTOffset for TimeLocal = ", TimeGMTOffset()/3600);
   Print ("5. Server Time (EEST) = ", TimeToString(TimeCurrent()));
   
   int local = (TimeLocal() - TimeGMT()) / 3600;
   int server = MathRound((TimeCurrent() - TimeGMT()) / 3600.0);
   string prt = "TimeLocal is ";
   if (local > 0)
      prt = StringConcatenate(prt, "GMT+", MathAbs(local));
   else if (local < 0)
      prt = StringConcatenate(prt, "GMT-", MathAbs(local));
   else
      prt = StringConcatenate(prt, "GMT");
      
   prt = StringConcatenate(prt, " and TimeCurrent is ");
   if (server > 0)
      prt = StringConcatenate(prt, "GMT+", MathAbs(server));
   else if (local < 0)
      prt = StringConcatenate(prt, "GMT-", MathAbs(server));
   else
      prt = StringConcatenate(prt, "GMT");
    
   Print (prt);

17:52:28 Эксперт TestEA-1 EURUSD,H1: успешно загружен

17:52:28 TestEA-1 EURUSD,H1: 1. GMT = 2014.03.11 21:52

17:52:28 TestEA-1 EURUSD,H1: 2. Местное время (EDT) = 2014.03.11 17:52

17:52:28 TestEA-1 EURUSD,H1: 3. Переход на летнее время: -1

17:52:28 TestEA-1 EURUSD,H1: 4. GMTOffset для TimeLocal = 4

17:52:28 TestEA-1 EURUSD,H1: 5. Время сервера (EEST) = 2014.03.12 00:52

17:52:28 TestEA-1 EURUSD,H1: TimeLocal - GMT-4, TimeCurrent - GMT+3

Я проверил время GMT выше с временем Лондона, и они совпали (Лондон не переходит на BST до конца марта). Поэтому я считаю, что TimeGMT() возвращает время по Гринвичу без добавления местной поправки на переход на летнее время. EDT определяется как UTC-4, а EEST - как UTC+3.

Также, если вам нужно определить, когда начинается и заканчивается переход на летнее время для США или ЕС, смотрите эти функции.

 
Thirteen:

Я сверил время по Гринвичу с временем в Лондоне [...].

Как вы почти наверняка знаете... одна из проблем заключается в том, что смещение между временем брокера и GMT (а) может меняться или не меняться в зависимости от перехода на летнее время и (б) не может быть определено на основе информации, которую предоставляет MT4. Я не рассматривал эти функции подробно, но думаю, что мы согласны с тем, что вы не можете сделать такой расчет, основываясь только на информации, которую предоставляет МТ4.

Насколько я могу судить, в начале апреля приведенный выше код начнет говорить, что брокер находится в GMT+4. Я имею в виду, что нет никакого способа узнать из того, что MT4 сообщает вам, что на предыдущей неделе брокер был в GMT+3, и что использование, например, iBarShift() может потребовать соответствующей корректировки, если вы хотите определить ценовую активность в определенное время GMT или смещение времени GMT.

BTW, если вы запустили приведенный выше код сегодня, то ваш брокер почти наверняка не может быть на EEST. Они должны быть на EET до 30 марта. Если в настоящее время они находятся на GMT+3, значит, они используют что-то другое, чем EEST. (На странице, на которую вы ссылаетесь, говорится: "В это время года места, находящиеся на EEST, сейчас находятся на EET").

 

gchrmt4:

. . .

BTW, если вы запустили вышеуказанный код сегодня, то ваш брокер почти наверняка не может быть на EEST. Они должны быть на EET до 30 марта. Если в настоящее время они находятся на GMT+3, значит, они используют что-то другое, чем EEST. (На странице, на которую вы ссылаетесь, говорится: "В это время года места, находящиеся на EEST, сейчас находятся на EET").

Мой брокер меняет часовой пояс на своем сервере MT4 с GMT+2 на GMT+3, чтобы соответствовать закрытию Нью-Йорка в 17:00, и делает это в то же время, когда США переходят на летнее время, что произошло 09 марта 2014 года. В Европе GMT+2 примерно соответствует EET для стандартного времени, а GMT+3 соответствует EEST для летнего времени. См. например, " Часовые пояса Европы". Итак, как вы можете видеть, нет никаких сомнений в том, что я запустил код сегодня, когда мой местный часовой пояс EDT, а часовой пояс моего брокера соответствует EEST.

[1] Насколько я могу судить, в начале апреля приведенный выше код начнет говорить, что брокер находится в GMT+4.

[2] Я хочу сказать, что нет никакого способа узнать из того, что MT4 сообщает вам, что на предыдущей неделе брокер был в GMT+3, и что использование, например, iBarShift() может потребовать соответствующей корректировки, если вы хотите определить активность цены в определенное время GMT или смещение времени GMT.

1. Зачем возвращать GMT+4 в апреле? Время на моем локальном компьютере уже переведено на летнее время, и мой брокер уже перевел свой сервер на летнее время, так что же изменится в апреле?

2. Брокер может изменить свое время, чтобы отразить переход на летнее время, что изменит его смещение к GMT. Но вы можете предсказать это изменение. Например, хотя даты/время начала и окончания перехода на летнее время меняются из года в год, эти изменения предсказуемы - и поэтому программируемы. Просто закодируйте правило. Но TimeGMT() должна возвращать GMT независимо от местного часового пояса, часового пояса брокера или смещения перехода на летнее время.

Как вы почти наверняка знаете... одна из проблем заключается в том, что смещение между временем брокера и GMT (а) может меняться или не меняться в зависимости от перехода на летнее время и (б) не может быть определено на основе информации, которую предоставляет MT4. Я не рассматривал эти функции подробно, но думаю, что мы согласны с тем, что вы не можете сделать такой расчет, основываясь только на информации, которую предоставляет МТ4.

Если брокер переходит на летнее время, то эта корректировка изменит его смещение относительно GMT, но, как я уже говорил выше, вы можете предсказать эти изменения и скорректировать их. Или если какое-то место (например, Лондон) переходит на летнее время, вы можете закодировать местное правило и таким образом предсказать это изменение и скорректировать его.

 
Thirteen:

Если брокер переходит на летнее время, то это изменение изменит его смещение относительно GMT, но, как я уже говорил выше, вы можете предсказать эти изменения и подстроиться под них. Или если какое-то место (например, Лондон) переходит на летнее время, вы можете закодировать местное правило и таким образом предсказать это изменение и подстроиться под него.

Я по-прежнему в основном согласен с вами, что изменения можно предсказать и закодировать... но не только используя информацию, которую предоставляет сам MT4. Вы должны "закодировать местное правило" для лондонского GMT, а не говорить MT4 "дайте мне эквивалентное время для x в Лондоне".

Время вашего сервера GMT+3 может соответствовать EEST в том смысле, что EEST - это GMT+3, но, согласно Википедии и worldclock.com, нигде пока не должно быть EEST. Это изменение должно произойти не раньше 30 марта. Текущее время на Кипре, в Греции, Израиле и т.д. - GMT+2.

Поэтому, скорее всего, у вас брокер работает на своих серверах по GMT+2, но переходит на летнее время в США, а не в Европе. Это не то же самое, что EET/EEST. (И это еще менее предсказуемо с точки зрения возможности написания кода, который автоматически корректирует время и даты без необходимости запрашивать у пользователя какие-то данные о том, какие настройки времени использует брокер).

Если, таким образом, брокер недавно перешел с GMT+2 на GMT+3, а не собирается перейти с GMT+3 на GMT+4, это означает, что текущее смещение между временем брокера и GMT было бы неверным, если бы вы попытались применить его к барам на прошлой неделе, до перевода часов в США. На этой неделе бары брокера опережают Лондон на 3 часа. На прошлой неделе они были на 2 часа впереди. (А с 30 марта они снова будут опережать на 2 часа). Если вы возьмете текущее смещение на 3 часа и попытаетесь с его помощью получить цену в 8 утра по лондонскому времени в день на прошлой неделе, вы получите неверный ответ.

Я хочу сказать, что информация, которую можно получить только из самого MT4 - текущее смещение между временем брокера и GMT - неадекватна на практике для выполнения таких задач, как "определить цену открытия в Лондоне в прошлую среду".

 

Как можно сделать MT4 более подходящим для этого? Не знаю, как вы, но я бы точно не радовался задаче создания регионального исторического калькулятора смещения GMT. Вы только представьте? Если я когда-нибудь сделаю это, я выложу его на рынок, вам всем лучше иметь большую толстую чековую книжку ;)

Я просто шучу, я ни за что не попытаюсь это закодировать. Хотя WHR мог бы это сделать, я уверен, он уже сделал.

Причина обращения: