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

 
Itso:

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

   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);
Itso, так не получится, если такого 15-минутного бара с открытием OpenTime нет, так как вторая строка вернет -1. Вполне обычная ситуация на золоте ночью...
 
2 khorosh.    Ваш код нормально работает.
На всякий случай, вот: (в подробности про существование этого бара - я не вдаюсь).
//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//+------------------------------------------------------------------+
extern bool Comments = true;   // Комменты
 
int PrevDay;
//+------------------------------------------------------------------+
void deinit() { if(Comments) Comment(""); }
//+------------------------------------------------------------------+
int start() {
//----
   if(PrevDay != Day() && Hour() == 0 && Minute() >= 15) {
   double High15_1 = iHigh(NULL,15,1); double Low15_1 = iLow(NULL,15,1);
   Print("High15_1 = ",High15_1,"   Low15_1 = ",Low15_1); PrevDay = Day();
   if(Comments) Comment("\nHigh15_1 = ",High15_1,"   Low15_1 = ",Low15_1); }
//----
   return(0); }
//+------------------------------------------------------------------+
 
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 не будет.
 
Moriarty, да я перепроверил в тестере тоже работает. Не понял даже где я ошибся при запуске теста. Спасибо!
 
Ну можно как-то вот так:
void start()
  {
   int i=0; while(TimeDay(iTime(NULL,PERIOD_M15,i+1))==Day()) i++;
   double H=iHigh(NULL,PERIOD_M15,i), L=iLow(NULL,PERIOD_M15,i);
   Comment("[",i,"] = H: ",H,"  L: ",L);
  }
Повесь на любой таймфрейм и посмотри.

Естественно, если i получается нулевое, значит этот самый первый пятнадцатиминутный бар еще только формируется, если i больше нуля, то это и есть нужный бар и H и L содержат его High и Low соответственно. Вроде ничего не напутал, писал так навскидку.
 

То khorosh :

Действительно, должно быть iTime. НО - ожидается, что сам код выполниться после формирование 1-го бара М15. Вы можете сравнивать BarM15 с 0 - если будет не 0, то бар уже сформирован.

Вот и код:

bool GetHighLowM15(double& MyHigh, double& MyLow)
{
   datetime OpenTime = iTime(NULL,PERIOD_D1,0);
   if (OpenTime==0) return(false);//Still not D1 bar formed for new day
   int BarM15 = 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);
   }
} 

Если вернет false, то нужно подождать.

То Mathemat:

Да, вы абсолютно правы. В этом случае 1-вая 15 минутка будет 0:15 - функция вернет ее High и Low.

 

Все таки не так - OpenTime всегда будет > 0

 
А никто и не спорит, Itso. Я-то говорю о второй строчке твоего кода:
int BarM15 = iBarShift(NULL,PERIOD_M15,OpenTime,true);
При флаге true для последнего параметра, если первый тик придет позже 00:15 (15 минут первого), результат этой функции будет -1 (см. Помощь), так как поиск идет от OpenTime вглубь истории, начиная с OpenTime.

А если будет false, как я предложил, вернется смещение 15-минутного бара, принадлежащего предыдущим суткам (последнего в них).

P.S. Да, помощь по этой функции можно было бы сделать конкретнее. ..
Причина обращения: