Время первого бара дня

 
Знатоки, подскажите, как проще узнать время открытия первого бара дня?
Вопрос актуален для торговли CFD. Бывают дни, когда сессия начинается в нестандартное время (месяц при переходе на летнее/зимнее время, праздники и т.п.).

Я придумал следующий способ:
iTime(Symbol(),PERIOD_M1,
  iBarShift(Symbol(),PERIOD_M1,
    StrToTime(TimeToStr(TimeIn_,TIME_DATE)),false));


Но, по-моему, это либо слишком круто, либо слишком криво. Все-таки ЧЕТЫРЕ (!) преобразования... :-)


 
Пардон посмотрел на время открытия и понял.
 

Пардон посмотрел на время открытия и понял.


Юмор оценил... :-)
 
Я обычно так делаю:
for (cnt=0;cnt<1440/Period();cnt++)	 
{
   if (TimeHour(Time[cnt+1])==StartHour-1 && TimeHour(Time[cnt])==StartHour) break;
} 
OurHourTime=Time[cnt];


 
Можно сделать по-другому, если знать дату :

ТекущаяДата=StrToTime(TimeToStr(CurTime(),TIME_DATE));
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
if (НачБар = -1) НачБар =iBarShift( NULL , 0, ТекущаяДата)-1;

Меня больше волнует вопрос как отнимать от даты по одному дню ?
Да так, чтобы идти только по рабочим дням - биржевым.
Тоесть, чтобы после воскресенья (у меня воскресенье есть сессия) шла пятница.
Вот как это сделать лучше всего ?
 
И еще - а как вы находите последний бар дня ?
Допустим, что его время тоже неизвестно : чужая история, дыры в истории и т.д.
Вопрос, конечно риторический - можно вышепоказанным способом, только надо от даты отнять один день, найти первый бар и сместиться на один бар.
Вот здесь все и упирается в дату - как от даты отнять один день.
Учтите, что после 15 числа не всегда идет 16 - может идти 18.
 
Можно сделать по-другому, если знать дату :

ТекущаяДата=StrToTime(TimeToStr(CurTime(),TIME_DATE));
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
if (НачБар = -1) НачБар =iBarShift( NULL , 0, ТекущаяДата)-1;



Да, это симпатично... Над остальным надо подумать...
 
Можно сделать по-другому, если знать дату :
...
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
...


Вот только есть вопрос... Как известно, если iBarShift( NULL , 0, Дата, false) не находит бара с нужным временем, то он возвращает номер ближайшего бара, но следующего или предыдущего (если они равноудалены)???
 
И еще - а как вы находите последний бар дня ?
Допустим, что его время тоже неизвестно : чужая история, дыры в истории и т.д.
Вопрос, конечно риторический - можно вышепоказанным способом, только надо от даты отнять один день, найти первый бар и сместиться на один бар.
Вот здесь все и упирается в дату - как от даты отнять один день.
Учтите, что после 15 числа не всегда идет 16 - может идти 18.


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

datetime ОтнятьОтДаты(datetime ВыбДата,int КвоДней)
{
datetime ВремДата,Дата;
int i,j,x;
int НачБар,КонБар;
datetime ИскДата;

x = КвоДней;
НачБар = iBarShift( NULL , 0, ВыбДата,true);
if (НачБар = -1) НачБар =iBarShift( NULL , 0, ВыбДата)-1;

//Comment("Для Даты =",ВыбДата, " Смещение равно = ",НачБар);
for(j=НачБар;j<Bars;j++)
{
ВремДата = StrToTime(TimeToStr(Time[j],TIME_DATE));
if (ВремДата!=ВыбДата)
{
x = x - 1;
ВыбДата = ВремДата;
}
if (x == 0) break;
}

return(ВремДата);
}


Но по барам я не хочу лазить - слишком долго. А разработчики с датой не включили почти никаких функций.
Например, в 1С я просто отнимаю от даты 1 или прибавляю.
В МТ4 таких функций нет.
 
Причина обращения: