Пардон посмотрел на время открытия и понял.
Пардон посмотрел на время открытия и понял.
Юмор оценил... :-)
Я обычно так делаю:
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;
Меня больше волнует вопрос как отнимать от даты по одному дню ?
Да так, чтобы идти только по рабочим дням - биржевым.
Тоесть, чтобы после воскресенья (у меня воскресенье есть сессия) шла пятница.
Вот как это сделать лучше всего ?
ТекущаяДата=StrToTime(TimeToStr(CurTime(),TIME_DATE));
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
if (НачБар = -1) НачБар =iBarShift( NULL , 0, ТекущаяДата)-1;
Меня больше волнует вопрос как отнимать от даты по одному дню ?
Да так, чтобы идти только по рабочим дням - биржевым.
Тоесть, чтобы после воскресенья (у меня воскресенье есть сессия) шла пятница.
Вот как это сделать лучше всего ?
И еще - а как вы находите последний бар дня ?
Допустим, что его время тоже неизвестно : чужая история, дыры в истории и т.д.
Вопрос, конечно риторический - можно вышепоказанным способом, только надо от даты отнять один день, найти первый бар и сместиться на один бар.
Вот здесь все и упирается в дату - как от даты отнять один день.
Учтите, что после 15 числа не всегда идет 16 - может идти 18.
Допустим, что его время тоже неизвестно : чужая история, дыры в истории и т.д.
Вопрос, конечно риторический - можно вышепоказанным способом, только надо от даты отнять один день, найти первый бар и сместиться на один бар.
Вот здесь все и упирается в дату - как от даты отнять один день.
Учтите, что после 15 числа не всегда идет 16 - может идти 18.
Можно сделать по-другому, если знать дату :
ТекущаяДата=StrToTime(TimeToStr(CurTime(),TIME_DATE));
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
if (НачБар = -1) НачБар =iBarShift( NULL , 0, ТекущаяДата)-1;
ТекущаяДата=StrToTime(TimeToStr(CurTime(),TIME_DATE));
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
if (НачБар = -1) НачБар =iBarShift( NULL , 0, ТекущаяДата)-1;
Да, это симпатично... Над остальным надо подумать...
Можно сделать по-другому, если знать дату :
...
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
...
...
НачБар = iBarShift( NULL , 0, ТекущаяДата, true);
...
Вот только есть вопрос... Как известно, если iBarShift( NULL , 0, Дата, false) не находит бара с нужным временем, то он возвращает номер ближайшего бара, но следующего или предыдущего (если они равноудалены)???
И еще - а как вы находите последний бар дня ?
Допустим, что его время тоже неизвестно : чужая история, дыры в истории и т.д.
Вопрос, конечно риторический - можно вышепоказанным способом, только надо от даты отнять один день, найти первый бар и сместиться на один бар.
Вот здесь все и упирается в дату - как от даты отнять один день.
Учтите, что после 15 числа не всегда идет 16 - может идти 18.
Допустим, что его время тоже неизвестно : чужая история, дыры в истории и т.д.
Вопрос, конечно риторический - можно вышепоказанным способом, только надо от даты отнять один день, найти первый бар и сместиться на один бар.
Вот здесь все и упирается в дату - как от даты отнять один день.
Учтите, что после 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 таких функций нет.
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 таких функций нет.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вопрос актуален для торговли CFD. Бывают дни, когда сессия начинается в нестандартное время (месяц при переходе на летнее/зимнее время, праздники и т.п.).
Я придумал следующий способ:
Но, по-моему, это либо слишком круто, либо слишком криво. Все-таки ЧЕТЫРЕ (!) преобразования... :-)