Itso, так не получится, если такого 15-минутного бара с открытием OpenTime нет, так как вторая строка вернет -1. Вполне обычная ситуация на золоте ночью...
Mathemat: Itso, так не получится, если такого 15-минутного бара с открытием OpenTime нет, так как вторая строка вернет -1.
Мне кажется, что время открытия D1 = время 1-вого тика, пришедшего после 00:00. И даже если тик пришел напр. в 00:20, то образуются новыми М1, М5, М15, М30, Н1, Н4 и D1 бары. И тогда обязательно будет такой М15.
Itso, у вас во-первых видимо опечатка вместо datetime OpenTime = iOpen(NULL,PERIOD_D1,0); должно быть OpenTime = iTime(NULL,PERIOD_D1,0); . Во-вторых вы определяете
момент, когда когда бар High и Low, которого нужно определить только
открылся. А следовательно результат не будет правильным.
Itso, если первый тик дня пришел в 00:21 (в 21 минуту первого), то первая минутка дня будет в 00:21, пятиминутка - в 00:20, 15-минутка - в 00:15, 30-минутка - в 00:00. Т.е. время открытия на каждом ТФ - ближайшее для этого ТФ перед приходом тика. Следовательно, пятиминутки с открытием 00:00 не будет.
Естественно, если i получается нулевое, значит этот самый первый пятнадцатиминутный бар еще только
формируется, если i больше нуля, то это и есть нужный бар и H и L содержат его High и Low соответственно. Вроде ничего не напутал, писал так навскидку.
Действительно, должно быть iTime. НО - ожидается, что сам код выполниться
после формирование 1-го бара М15. Вы можете сравнивать BarM15 с 0
- если будет не 0, то бар уже сформирован.
Вот и код:
boolGetHighLowM15(double& MyHigh, double& MyLow){datetimeOpenTime = iTime(NULL,PERIOD_D1,0);
if(OpenTime==0)return(false);//Still not D1 bar formed for new dayintBarM15 = iBarShift(NULL,PERIOD_M15,OpenTime,false);
if(BarM15!=0){MyHigh = iHigh(NULL,PERIOD_M15,BarM15);
MyLow = iLow(NULL,PERIOD_M15,BarM15);
return(true);
}else{return(false);
}}
При флаге true для последнего параметра, если первый тик придет позже 00:15 (15
минут первого), результат этой функции будет -1 (см. Помощь), так
как поиск идет от OpenTime вглубь истории, начиная с OpenTime.
А если будет false, как я предложил, вернется смещение 15-минутного бара, принадлежащего
предыдущим суткам (последнего в них).
P.S. Да, помощь по этой функции можно было бы сделать конкретнее.
..
Можно и попроще.
На всякий случай, вот: (в подробности про существование этого бара - я не вдаюсь).
Itso, так не получится, если такого 15-минутного бара с открытием OpenTime нет, так как вторая строка вернет -1.
Мне кажется, что время открытия D1 = время 1-вого тика, пришедшего после 00:00. И даже если тик пришел напр. в 00:20, то образуются новыми М1, М5, М15, М30, Н1, Н4 и D1 бары. И тогда обязательно будет такой М15.
Или я не прав?
Повесь на любой таймфрейм и посмотри.
Естественно, если i получается нулевое, значит этот самый первый пятнадцатиминутный бар еще только формируется, если i больше нуля, то это и есть нужный бар и H и L содержат его High и Low соответственно. Вроде ничего не напутал, писал так навскидку.
То khorosh :
Действительно, должно быть iTime. НО - ожидается, что сам код выполниться после формирование 1-го бара М15. Вы можете сравнивать BarM15 с 0 - если будет не 0, то бар уже сформирован.
Вот и код:
Если вернет false, то нужно подождать.
То Mathemat:
Да, вы абсолютно правы. В этом случае 1-вая 15 минутка будет 0:15 - функция вернет ее High и Low.
Все таки не так - OpenTime всегда будет > 0
При флаге true для последнего параметра, если первый тик придет позже 00:15 (15 минут первого), результат этой функции будет -1 (см. Помощь), так как поиск идет от OpenTime вглубь истории, начиная с OpenTime.
А если будет false, как я предложил, вернется смещение 15-минутного бара, принадлежащего предыдущим суткам (последнего в них).
P.S. Да, помощь по этой функции можно было бы сделать конкретнее. ..