Узнать время первого часового бара дня

 

Всем привет! Поделитесь, пожалуйста, опытом: как узнать время первого часового бара сегодня? На разных парах и у разных брокеров время открытия первого часового бара далеко не всегда 00:00:00. Как быть? Спасибо!


datetime arrTimeToday[1];
CopyTime(_Symbol, PERIOD_D1, 0, 1, arrTimeToday);

Comment("Day bar open time: " + arrTimeToday[0]);

UPD: Вроде как можно использовать https://www.mql5.com/ru/docs/series/seriesinfointeger (SERIES_LASTBAR_DATE) на D1, но тогда вопрос: как узнать время первого часового бара для вчерашнего дня?

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Время открытия первого бара текущего ТФ в любом дне (сегодня - 0, вчера - 1, позавчера - 2 и т. д.):

datetime dtFirstDayBar = iTime(NULL, PERIOD_CURRENT, iBarShift(NULL, PERIOD_CURRENT, iTime(NULL, PERIOD_D1, 0)));

В идеале так делать нельзя. Потребуется разнесение каждой из трех функций по строкам с целью проверки на ошибки при получении результата. Но общий смысл таков.

 

Если я правильно понял задачу, то так

/********************Script program start function*******************/
void OnStart()
 {
  datetime timeDay = iTime(_Symbol, PERIOD_D1, 0); // 0 — сегодня, 1 — вчера и т.д.
  MqlTick tick[];
  int ticks = CopyTicksRange(_Symbol, tick, COPY_TICKS_ALL, timeDay*1000, (timeDay+PeriodSeconds(PERIOD_H1))*1000);
  Comment("Первый тик был в ", tick[0].time, "\n"
         );
 }/******************************************************************/
 

Забавно получается. Но возможно это из за того что рынок закрыт.

Код от  Ihor Herasko говорит, что рынок открывается 

2023.02.12 22:34:22.293  (BR Splice,M1) 2023.02.09 23:49:00

Код от  Alexey Viktorov  говорит, что рынок открывается 

2023.02.12 22:34:22.293  (BR Splice,M1) Первый тик был в 2023.02.10 00:04:38

А рынок последний раз открывался   2023.02.10  09:00:00

О как! Открывашка чудит)

Странно, я всегда использовал код, который представил  Ihor Herasko и он всегда работал исправно.

 

Отдельные тики могут приходить и в неторговое время.

 
Aleksandr Slavskii #:

Забавно получается. Но возможно это из за того что рынок закрыт.

Код от  Ihor Herasko говорит, что рынок открывается 

Код от  Alexey Viktorov  говорит, что рынок открывается 

А рынок последний раз открывался   2023.02.10  09:00:00

О как! Открывашка чудит)

Странно, я всегда использовал код, который представил  Ihor Herasko и он всегда работал исправно.

Я руководствовался этими словами

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Узнать время первого часового бара дня

multiwins, 2023.02.12 13:46

Всем привет! Поделитесь, пожалуйста, опытом: как узнать время первого часового бара сегодня? На разных парах и у разных брокеров время открытия первого часового бара далеко не всегда 00:00:00. Как быть? Спасибо!


datetime arrTimeToday[1];
CopyTime(_Symbol, PERIOD_D1, 0, 1, arrTimeToday);

Comment("Day bar open time: " + arrTimeToday[0]);

UPD: Вроде как можно использовать https://www.mql5.com/ru/docs/series/seriesinfointeger (SERIES_LASTBAR_DATE) на D1, но тогда вопрос: как узнать время первого часового бара для вчерашнего дня?

И нигде не сказано, что надо определить это время ДО первого тика.

Возможно я не правильно понял задачу… Но представленный ниже код как раз определяет время 00:00:00, а не первого тика в часе…

В общем надо дождаться уточнения, чего надо было получить…

Возможно надо поменять «все тики» на «торговые тики»
 
В силу того, что общее направление в работе - избавляться от функций iX, перевожу работу на функции CopyX. Тогда первый часовой бар на дневном диапазоне будет найден таким образом : получить количество баров на часовом периоде за промежуток времени : текущий момент - время начала дня по дневному периоду. т.е. будет получено количество баров на часовом периоде. Этот бар будет иметь номер и время на часовом периоде. 
 
DDFedor #:
В силу того, что общее направление в работе - избавляться от функций iX, перевожу работу на функции CopyX. Тогда первый часовой бар на дневном диапазоне будет найден таким образом : получить количество баров на часовом периоде за промежуток времени : текущий момент - время начала дня по дневному периоду. т.е. будет получено количество баров на часовом периоде. Этот бар будет иметь номер и время на часовом периоде. 

У кого общее направление в работе избавиться от функций  iX ?

Топикстартер чётко и я сно спрашивает "  как узнать время первого часового бара сегодня?", про избавление от функций ни слова.

Ваше решение не учитывает предпраздничные дни в которых часовых баров меньше, чем в обычном дне.

 
Alexey Viktorov #:
Возможно надо поменять «все тики» на «торговые тики»

Да, это должно сработать, бары на мосбирже строятся по цене ласт, первые инфо тики приходят в восемь с копейками,

а первый торговый тик в девять, соответственно в вашем коде нужно PeriodSeconds(PERIOD_H1) умножить на десять или больше,

а чтоб наверняка можно не умножать, а заменить PERIOD_H1 на PERIOD_D1.

Получаем:

2023.02.13 08:54:37.780   (BR Splice,M1) Первый тик был в 2023.02.10 09:00:00

Ооо, да! Это сработало)))

Теперь Ваш вариант мне нравится больше, чем тот, что я использовал ранее, так как  код с iX дал прежний не верный результат.

Но блин, используя торговые тики вместо всех тиков, мы теряем универсальность.
 
Aleksandr Slavskii #:

Странно, я всегда использовал код, который представил  Ihor Herasko и он всегда работал исправно.

Блин, наврал.

Вот такой код я всегда использовал, для нахождения времени открытия дня.

   datetime time[];
   datetime TimeOpenDay = iTime(_Symbol, PERIOD_D1, 0);
   CopyTime(_Symbol, PERIOD_CURRENT, TimeOpenDay, TimeCurrent(), time);
   TimeOpenDay = time[0];
   Print(TimeOpenDay);

Визуально похоже на то, что написал  Ihor Herasko, но работает по другому и результат выдаёт правильный.

 
Aleksandr Slavskii #:

Да, это должно сработать, бары на мосбирже строятся по цене ласт, первые инфо тики приходят в восемь с копейками,

а первый торговый тик в девять, соответственно в вашем коде нужно PeriodSeconds(PERIOD_H1) умножить на десять или больше,

а чтоб наверняка можно не умножать, а заменить PERIOD_H1 на PERIOD_D1.

Получаем:

2023.02.13 08:54:37.780   (BR Splice,M1) Первый тик был в 2023.02.10 09:00:00

Ооо, да! Это сработало)))

Теперь Ваш вариант мне нравится больше, чем тот, что я использовал ранее, так как  код с iX дал прежний не верный результат.

Но блин, используя торговые тики вместо всех тиков, мы теряем универсальность.

PeriodSeconds(PERIOD_H1) я взял для уменьшения объёма полученных тиков. Да и тема размещена там, где нет гарантий, что это касается мосбиржи. Так-что можно заменить (timeDay+PeriodSeconds(PERIOD_H1))*1000 даже на TimeCurrent()*1000

О какой универсальности вы говорите?