Прошу помощи с iSAR

 

Доброе время суток!

Я начинаю программировать на MQL. Моя текущая задача - отловить кодом момент переворота Parabolic SAR (далее - SAR). Задача свелась к выводу значений iSAR при формировании нового бара. Для этого был написан простой советник, его код ниже. Но! при тестировании его на USDJPY M1 я обнаружил странную вещь: как только SAR переворачивается, первое значение перевернутого ряда в iSAR выдается отличное от графика. Например: идут свечи, у все SAR выше, затем рисуется свеча, где SAR ниже, при этом iSAR выводит значение выше. Я добавил ожидание 20 секунд, но это не помогло. Скриншот прилагаю. Там 4 пометки: 1 - та точка, которую я хочу поймать и на которую наведен курсор; 2 - видимое значение индикатора SAR в этой точке, 3 - значение функции iSAR, отрисованной на следующей свече с шагом назад (предыдущий SAR), 4 - собственно значение iSAR в момент открытия свечи. Именно оно получается отличным от того, что я вижу на графике. Самое важное то, что это не совпадающее с графиком значение не совпадает настолько, что от этого зависит ориентация ISAR относительно цены открытия текущего бара и, соответственно, результат дальнейшего автоматического анализа. Пока переходить на анализ iSAR на свечу назад не хочу, хочу именно работать с максимально свежими данными. Вопрос: почему в автоматическом режиме iSAR[0] выдает некорректные данные, которые затем изменяются?

int init()
{
   barOpenTime = Time[0];
   return(0);
}

int deinit()
{
   return(0);
}

int start()
{
   //trailingStop(20);
   if (isNewBar())
   {
      Sleep(20000);

         Alert("iSAR[0] = ", iSAR(NULL, 0, 0.02, 0.2, 0), ". Close[1] = ", Close[1]);

         Alert("Prev iSAR[1] = ", iSAR(NULL, 0, 0.02, 0.2, 1));


   }
   return(0);
}
//+------------------------------------------------------------------+

bool isNewBar()
{
   if (Time[0] != barOpenTime)
   {
      barOpenTime = Time[0];
      return(true);
   }
   else
   {  
      return(false);
   }
}


 
double SAR(int shift)
{
   return(iSAR(NULL,0,0.02,0.2,shift));
}

double H(int shift)
{
   return(iHigh(NULL,0,shift));
}

double L(int shift)
{
   return(iLow(NULL,0,shift));
}

int GAP(double P1,double P2)
{
   if(P1>P2) return(+1);
   if(P1<P2) return(-1);
   return(0);
}

int WAVE(int shift)
{
   double S1=SAR(shift);
   int H1=GAP(H(shift),S1);
   int L1=GAP(L(shift),S1);
   shift++;
   double S2=SAR(shift);
   int H2=GAP(H(shift),S2);
   int L2=GAP(L(shift),S2);
   if(L1>0)
   if(H2<0) return(+1);
   if(H1<0)
   if(L2>0) return(-1);
   return(0);
}
 

K2_:

Вопрос: почему в автоматическом режиме iSAR[0] выдает некорректные данные, которые затем изменяются?


Ответ здесь прост: iSAR[0] зависит от цены закрытия 0 бара Close[0], а также от High[0] и Low[0], вы же измеряете SAR на момент открытия бара, когда эти три цены еще не сформировались. Отсюда и некорректные значения.

переходить на анализ iSAR на свечу назад не хочу, хочу именно работать с максимально свежими данными

Вас посетила совершенно верная идея: пользоваться на момент открытия 0 бара значением iSAR[1], это и есть свежайшее значение индикатора, которое впоследствии уже не изменится.

 
alsu:

Ответ здесь прост: iSAR[0] зависит от цены закрытия 0 бара Close[0], а также от High[0] и Low[0], вы же измеряете SAR на момент открытия бара, когда эти три цены еще не сформировались. Отсюда и некорректные значения.

Вас посетила совершенно верная идея: пользоваться на момент открытия 0 бара значением iSAR[1], это и есть свежайшее значение индикатора, которое впоследствии уже не изменится.


Огромное спасибо! Тем более те индикаторы, с которыми придется сочетать iSAR, тоже имеют свежайшее значение с шагом 1.

Единственное что непонятно: в моменты, когда мой советник, тестирующий индикаторы, который просто каждый новый тик Алертит значение iSAR[0] при всех моих тестах всегда показывал одно и тоже значение, поэтому пришла идея анализировать 0-ой iSAR

 
      if(iSAR(NULL,TfIndicator,step,maximum,0)<Close[0])trand++;
      if(iSAR(NULL,TfIndicator,step,maximum,0)>Close[0])trand--;
где-то так
Причина обращения: