Время открытия первого бара текущего ТФ в любом дне (сегодня - 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 и он всегда работал исправно.
Отдельные тики могут приходить и в неторговое время.
Забавно получается. Но возможно это из за того что рынок закрыт.
Код от 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 ?
Топикстартер чётко и я сно спрашивает " как узнать время первого часового бара сегодня?", про избавление от функций ни слова.
Ваше решение не учитывает предпраздничные дни в которых часовых баров меньше, чем в обычном дне.
Да, это должно сработать, бары на мосбирже строятся по цене ласт, первые инфо тики приходят в восемь с копейками,
а первый торговый тик в девять, соответственно в вашем коде нужно PeriodSeconds(PERIOD_H1) умножить на десять или больше,
а чтоб наверняка можно не умножать, а заменить PERIOD_H1 на PERIOD_D1.
Получаем:
2023.02.13 08:54:37.780 (BR Splice,M1) Первый тик был в 2023.02.10 09:00:00
Ооо, да! Это сработало)))
Теперь Ваш вариант мне нравится больше, чем тот, что я использовал ранее, так как код с iX дал прежний не верный результат.
Странно, я всегда использовал код, который представил 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, но работает по другому и результат выдаёт правильный.
Да, это должно сработать, бары на мосбирже строятся по цене ласт, первые инфо тики приходят в восемь с копейками,
а первый торговый тик в девять, соответственно в вашем коде нужно 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
О какой универсальности вы говорите?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет! Поделитесь, пожалуйста, опытом: как узнать время первого часового бара сегодня? На разных парах и у разных брокеров время открытия первого часового бара далеко не всегда 00:00:00. Как быть? Спасибо!
UPD: Вроде как можно использовать https://www.mql5.com/ru/docs/series/seriesinfointeger (SERIES_LASTBAR_DATE) на D1, но тогда вопрос: как узнать время первого часового бара для вчерашнего дня?