Как вычислить High и Low первого, сформировавшегося в начале суток 15-минутного бара?

 
Будте добры, подскажите, кто сможет! Как вычислить High и Low первого, сформировавшегося в начале суток 15-минутного бара?
 
int iBarShift( string symbol, int timeframe, datetime time, bool exact=false) 
Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, -1 или смещение ближайшего бара.
 
Параметры:
symbol   -   Символьное имя инструмента. NULL означает текущий символ. 
timeframe   -   Период. Может быть одним из периодов графика. 0 означает период текущего графика. 
time   -   Значение времени для поиска. 
exact   -   Возвращаемое значение если бар не найден. FALSE - iBarShift возвращает ближайший. TRUE - iBarShift возвращает -1. 
 
Пример:
  datetime some_time=D'2004.03.21 12:00';
  int      shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
  Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
 

Грубо говоря - я знаю так:

1. Определяешь datetime начала суток на дневках. Пусть это DT.
2. Вызываешь iBarShift(), указывая PERIOD_M15, DT и последний параметр false.
3. Проверяешь, входит ли найденный бар в твои сутки. Если да - нужный бар найден, и затем ищешь внутри него свои экстремумы.
4. Если нет, то, значит, первый тик поступил поздне чем в 00:15, и "первой" 15-минутки с открытием в 00:00 нет. Значит, тебе вернулась последняя 15-минутка предыдущих суток. Вычитаешь из полученного индекса единицу, получаешь искомый первый 15-минутный внутри твоих суток (у него время открытия больше 00:00). А дальше ищешь внутри него экстремумы.

Если кто подскажет способ попроще, буду рад.

P.S. Можно и попроще - просто тупо сделать цикл с добавлением 15*60 к DT и проверять существование 15-минутного бара с таким временем открытия. Концептуально это уже не так навороченно. Тут уже в iBarShift() последний параметр true.

 
А почему не работает такая конструкция? Или может она не работает только в тестере? if(Hour()==0 && Minute()>15 && Minute()16) { double High15_1 = iHigh(NULL, 15, 1); double Low15_1 = iLow(NULL,15,1); } Мне нужно определять High и Low первого 15-бара не в истории, а каждые сутки в реальном времени и установливать отложенные ордера BuyStop и SellStop в момент открытия второго с начала суток 15-минутного бара.
 
khorosh:
А почему не работает такая конструкция? Или может она не работает только в тестере? if(Hour()==0 && Minute()>15 && Minute()16) { double High15_1 = iHigh(NULL,15,1); double Low15_1 = iLow(NULL,15,1); } Мне нужно определять High и Low первого 15-бара не в истории, а каждые сутки в реальном времени и установливать отложенные ордера BuyStop и SellStop в момент открытия второго с начала суток 15-минутного бара.
А что значит "Minute()16"? Просто пропустили знак?
А объявлять переменные надо вне условия.
 
Это знак "меньше" почему то на сайт не проходит, я два раза пробовал-не получается. Проверил, объявил переменные вне условия if, однако такой код не работает.
 
khorosh:
Это знак "меньше" почему то на сайт не проходит, я два раза пробовал-не получается. Проверил, объявил переменные вне условия if, однако такой код не работает.
Не каждый день бывает тик в промежуток с 00:15 до 00:16...
 
А как вообще может выполниться условие: больше 15 и меньше 16 ???
Сделайте Minute()==15 и всё заработает.
 

Можно и попроще.

   datetime OpenTime = iOpen(NULL,PERIOD_D1,0);
   int BarM15 = iBarShift(NULL,PERIOD_M15,OpenTime,true);
   double MyHigh = iHigh(NULL,PERIOD_M15,BarM15);
   double MyLow = iLow(NULL,PERIOD_M15,BarM15);
 
Увеличил интервал для срабатывания до трёх минут, сделал для опыта советник с Comment() и посадил его на график реального счёта. Срабатывает. Но вот в тестере в визуальном режиме не работает. Видимо это связано с особенностями моделирования серверного времени в тестере. Спасибо всем кто откликнулся на мой вопрос!
 
khorosh:
Увеличил интервал для срабатывания до трёх минут, сделал для опыта советник с Comment() и посадил его на график реального счёта. Срабатывает. Но вот в тестере в визуальном режиме не работает. Видимо это связано с особенностями моделирования серверного времени в тестере. Спасибо всем кто откликнулся на мой вопрос!
Что то вы опять с условиями напутали. И в тестере и на визуализаторе всё работает.
Причина обращения: