Зигзаг - считаем расстояние...

 

Есть вопрос.


Когда использую вот такой кусок кода:

int counted_bars=IndicatorCounted();
if (counted_bars>0) counted_bars--;
if (counted_bars<0) return(-1);
int limit=Bars-counted_bars;

возникают проблемы с последней секцией - не учитывается значение реверса и вообще странно себя ведёт.


Если же в цикле прописать просто for (int i=Bars-1; ... ), последняя секция ведёт себя нормально, но возникает другая неполадка - сам индикатор ведёт себя стабильно,

но вот значения пипсов и кол-ва баров над/под экстремумами начинают накладываться друг на друга (последующее значение накладывается на предыдущее - причём не на

всех экстремумах, а только на некоторых). Если вызвать индикатор - свойства - ок, всё становится на свои места, но затем история повторяется.

Код ф-ции старт выглядит вот так:

int start()
   {
   int counted_bars=IndicatorCounted();
   if (counted_bars>0) counted_bars--;
   if (counted_bars<0) return(-1);
   int limit=Bars-counted_bars;
   
   double reverse, prev, dPipsValue;
   bool bUp=true;
   int last, prevLast, nBarsInZ;
   string sPipsValue, sData;
   
   for (int i=Bars-1; i>=0; i--)
      {
      if (UseReversalPips) reverse=ReversalPips*Point;
      else reverse = NormalizeDouble(ReversalPercent*Close[i]/100,Digits);
      
      // если вверх
      if (bUp)
         {
         // продолжаем идти вверх
         if (High[i]>prev)
            {
            zz[i]=High[i]; prev=High[i];
            zz[last]=EMPTY_VALUE; last=i; 
            }
         else
            {
            // если разворачиваемся вниз
            if (Low[i]<prev-reverse)
               {
               bUp=false;
               zz[i]=Low[i]; prev=Low[i];
               if (ShowPipsValue)
                  {
                  dPipsValue=(High[last]-Low[prevLast])/Point; // расстояние в пипсах в секции
                  nBarsInZ=prevLast-last; // кол-во баров в секции
                  sPipsValue=DoubleToStr(dPipsValue,0);
                  sData=StringConcatenate(sPipsValue," (",nBarsInZ,")");
                  // выводим данные над разворотным хаем
                  ObjectCreate("exm"+prevLast,OBJ_TEXT,0,Time[last],High[last]+TextIndent*Point);
                  ObjectSetText("exm"+prevLast,sData,FontSize,FontName,FontColor);
                  }
               prevLast=last; last=i;
               }
            // стоим на месте 
            else
               {
               zz[i]=EMPTY_VALUE;
               }
            }
         }
      // если вниз
      else
         {
         // продолжаем идти вниз
         if (Low[i]<prev)
            {
            zz[i]=Low[i]; prev=Low[i];
            zz[last]=EMPTY_VALUE; last=i;
            }
         else
            {
            // если разворот вверх
            if (High[i]>prev+reverse)
               {
               bUp=true;
               zz[i]=High[i]; prev=High[i];
               if (ShowPipsValue)
                  {
                  dPipsValue=(High[prevLast]-Low[last])/Point; // расстояние в пипсах в секции
                  nBarsInZ = prevLast-last; // кол-во баров в секции
                  sPipsValue=DoubleToStr(dPipsValue,0);
                  sData=StringConcatenate(sPipsValue," (",nBarsInZ,")");
                  // выводим данные под разворотным лоу
                  ObjectCreate("exm"+prevLast,OBJ_TEXT,0,Time[last],Low[last]-TextIndent*Point);
                  ObjectSetText("exm"+prevLast,sData,FontSize,FontName,FontColor);
                  }
               prevLast=last; last=i;
               }
            // стоим на месте
            else
               {
               zz[i]=EMPTY_VALUE;
               }
            }
         }
      }
   return(0);
   }   


Подскажите, пожалуйста как решить эту проблему.

ЗЫ. Задумка была следующая - запоминаем координаты двух последних экстремумов, а когда происходит очередной перелом - выводим текст

Причина обращения: