Дискретная отрисовка индикатора в стиле DRAW_SECTION - страница 2

 
Кстати, компилер пропускает такую запись без ошибок:
int init()
  {
//---- indicators
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexBuffer(0,SwingsBuffer);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(1,HighsBuffer);
   SetIndexBuffer(2,LowsBuffer);
   SetIndexBuffer(3,TrendBuffer);


То есть стиль реально в компилято встроен.

 
Но если стиль DRAW_SECTION что то рисует



то замена стиля на DRAW_ZIGZAG ничего не рисует, хотя в "Окне данных" значения есть:
//+------------------------------------------------------------------+
//|                                               GannSwingsVIII.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 White
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 Aqua
#property indicator_color5 HotPink

extern int kind=1;// тип тенденции, 1- малая, 2 - промежуточная, 3 - основная
extern bool MoveLastSwing=false; // если равно true, то кончик хвоста будет сдвигаться ближе к нулевому бару для двух одинаковых баров по High или Low
//---- buffers
double SwingsBuffer[];
double HighsBuffer[];
double LowsBuffer[];
double TrendBuffer[];
double UpCloseOutSideBuffers[];
double DownCloseOutSideBuffers[];
double SwingHigh,SwingLow;
int prevSwing,LastSwing,myBars,lowCounter,highCounter;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexBuffer(0,SwingsBuffer);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(1,HighsBuffer);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexBuffer(2,LowsBuffer);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,159);
   SetIndexBuffer(3,UpCloseOutSideBuffers);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,108);
   SetIndexBuffer(4,DownCloseOutSideBuffers);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,108);
   SetIndexBuffer(5,TrendBuffer);
   for (int i=Bars-1; i>=0; i--)
      {
      SwingsBuffer[i]=0.0;
      HighsBuffer[i]=0.0;
      LowsBuffer[i]=0.0;
      TrendBuffer[i]=0.0;
      UpCloseOutSideBuffers[i]=0.0;
      DownCloseOutSideBuffers[i]=0.0;
      }
   SwingHigh=0.0;
   SwingLow=0.0;
   prevSwing=0;
   LastSwing=0.0;
   myBars=0;
   lowCounter=0;
   highCounter=0;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| return shift of last swing                                       |
//+------------------------------------------------------------------+
int GetLastSwing()
  {
//---- 
  int point=1;
  while (SwingsBuffer[point]==0.0 && point<Bars) point++;
    
//----
   return(point);
  }  
//+------------------------------------------------------------------+
//| Check prev swing                                                 |
//+------------------------------------------------------------------+
void SetPrevSwing()
  {
//---- 
   int LastPoint;
   LastPoint=GetLastSwing();
   SwingsBuffer[0]=0.0;
   SwingHigh=High[LastPoint];
   SwingLow=Low[LastPoint];
   LastSwing=LastPoint;
//----
   return;
  }



//+------------------------------------------------------------------+
//| check Out side bar                                               |
//+------------------------------------------------------------------+
bool isOutSideSwingBar(int shift)
  {
   bool res=false;
//---- 
   res=((High[shift]>High[shift+1])&&(Low[shift]<Low[shift+1]));
   if (res) 
      {
      if (Close[shift]>Open[shift]) UpCloseOutSideBuffers[shift]=(High[shift]+Low[shift])/2.0;
      else DownCloseOutSideBuffers[shift]=(High[shift]+Low[shift])/2.0;
      }
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| Check new low                                                   |
//+------------------------------------------------------------------+
void SetSwings(int shift)
  {
//---- 

//----
   return;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit;
   bool nonOutSide;
   if (counted_bars==0) 
      {
      limit=Bars-1;
      LowsBuffer[limit]=Low[limit];
      SwingsBuffer[limit]=Low[limit];
      SwingHigh=High[limit];
      SwingLow=Low[limit];
      LastSwing=limit;
      TrendBuffer[limit]=-1.0;
      }
   if (counted_bars>0) limit=Bars-counted_bars;  
   if ( (counted_bars<0)|| ((counted_bars>0)&&(Bars-myBars>1)) ) init();
   limit--;
   //Print("Bars=",Bars," counted_bars=",counted_bars,);
//---- 
   for (int cnt=limit;cnt>=0;cnt--)
      {
      if (limit<3)Print("cnt=",cnt,"  myBars=",myBars,"  LastSwing=",LastSwing);
      //if (cnt==0) SetPrevSwing();
      nonOutSide=!isOutSideSwingBar(cnt);
      if (High[cnt]>SwingHigh) {highCounter++;SwingHigh=High[cnt];HighsBuffer[cnt]=SwingHigh;}
      if (Low[cnt]<SwingLow) {lowCounter++;SwingLow=Low[cnt];LowsBuffer[cnt]=SwingLow;}
      //isOutSideSwingBar(cnt);
      TrendBuffer[cnt]=TrendBuffer[cnt+1];// если не будут изменений - тренд сохранится
      if ((TrendBuffer[cnt+1]==-1.0) && (lowCounter==1))// && nonOutSide) 
         {
         //if (LastSwing=!cnt) 
         if (LastSwing!=Bars-1) SwingsBuffer[LastSwing]=0.0; // затрем предыдущий свинг
         LastSwing=cnt;
         SwingHigh=High[cnt];
         SwingLow=Low[cnt];
         //TrendBuffer[cnt]=-1.0;
         highCounter=0;
         lowCounter=0;
         SwingsBuffer[cnt]=Low[cnt];
         HighsBuffer[cnt]=SwingHigh;
         //Print("продолжение даунтренда");
         }
      else
         {
         if (TrendBuffer[cnt+1]==-1.0 &&highCounter==kind)
            {
            //if (LastSwing=!cnt) 
            LastSwing=cnt;
            SwingHigh=High[cnt];
            SwingLow=Low[cnt];
            TrendBuffer[cnt]=1.0;
            highCounter=0;
            lowCounter=0;
            SwingsBuffer[cnt]=High[cnt];
            LowsBuffer[cnt]=SwingLow;
            //Print("разворот даунтренда");
            }
         else
            {
            if (TrendBuffer[cnt+1]==-1.0 && Low[cnt]==SwingLow && MoveLastSwing)
               {
               SwingsBuffer[LastSwing]=0.0;
               LastSwing=cnt;
/*               SwingLow=Low[cnt];
               SwingHigh=High[cnt];
               highCounter=0;
               lowCounter=0;
*/               SwingsBuffer[cnt]=Low[cnt];
               }
            }
               
         } 
      if ((TrendBuffer[cnt+1]==1.0) && (highCounter==1))// && nonOutSide) 
         {
         //if (LastSwing=!cnt) 
         if (LastSwing!=Bars-1) SwingsBuffer[LastSwing]=0.0; // затрем предыдущий свинг
         LastSwing=cnt;
         SwingHigh=High[cnt];
         SwingLow=Low[cnt];
         //TrendBuffer[cnt]=1.0;
         highCounter=0;
         lowCounter=0;
         SwingsBuffer[cnt]=High[cnt];
         LowsBuffer[cnt]=SwingLow;
         //Print("продолжение аптренда");
         }
      else
         {
         if (TrendBuffer[cnt+1]==1.0 &&lowCounter==kind)
            {
            //if (LastSwing=!cnt) 
            LastSwing=cnt;
            SwingHigh=High[cnt];
            SwingLow=Low[cnt];
            TrendBuffer[cnt]=-1.0;
            highCounter=0;
            lowCounter=0;
            SwingsBuffer[cnt]=Low[cnt];
            HighsBuffer[cnt]=SwingHigh;
            //Print("разворот аптренда");
            }
         else
            {
            if (TrendBuffer[cnt+1]==1.0 && High[cnt]==SwingHigh && MoveLastSwing)
               {
               SwingsBuffer[LastSwing]=0.0;
               LastSwing=cnt;
/*               SwingLow=Low[cnt];
               SwingHigh=High[cnt];
               highCounter=0;
               lowCounter=0;
*/               SwingsBuffer[cnt]=High[cnt];
               }
            }   

         } 
      }
   myBars=Bars;   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

то замена стиля на DRAW_ZIGZAG ничего не рисует, хотя в "Окне данных" значения есть:

зигзаг рисуется между 2-мя буферами - чётным и нечётным
 
Удалил пока.
 
Переделал, вроде работает:



Код :

//+------------------------------------------------------------------+
//|                                            GannSwings8Zigzag.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 White
#property indicator_color2 Aqua
#property indicator_color3 White
#property indicator_color4 Yellow
#property indicator_color5 HotPink

extern int kind=1;// тип тенденции, 1- малая, 2 - промежуточная, 3 - основная
extern bool MoveLastSwing=false; // если равно true, то кончик хвоста будет сдвигаться ближе к нулевому бару для двух одинаковых баров по High или Low
//---- buffers
double SwingsBuffer[];
double HighsBuffer[];
double LowsBuffer[];
double TrendBuffer[];
double UpCloseOutSideBuffers[];
double DownCloseOutSideBuffers[];
double SwingHigh,SwingLow;
int prevSwing,LastSwing,myBars,lowCounter,highCounter;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_NONE);
   SetIndexBuffer(0,SwingsBuffer);
   SetIndexLabel(0,"Swings");
   SetIndexEmptyValue(0,0.0);

   SetIndexBuffer(1,UpCloseOutSideBuffers);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexLabel(1,"UpClose");
   SetIndexArrow(1,108);

   SetIndexBuffer(2,LowsBuffer);
   SetIndexStyle(2,DRAW_ZIGZAG);
   SetIndexLabel(2,"Lows");
//   SetIndexArrow(2,159);

   SetIndexBuffer(3,HighsBuffer);
   SetIndexStyle(3,DRAW_ZIGZAG);
   SetIndexLabel(3,"Highs");
//   SetIndexArrow(3,159);

   SetIndexBuffer(4,DownCloseOutSideBuffers);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexLabel(4,"DownClose");
   SetIndexArrow(4,108);
   SetIndexBuffer(5,TrendBuffer);
   for (int i=Bars-1; i>=0; i--)
      {
      SwingsBuffer[i]=0.0;
      HighsBuffer[i]=0.0;
      LowsBuffer[i]=0.0;
      TrendBuffer[i]=0.0;
      UpCloseOutSideBuffers[i]=0.0;
      DownCloseOutSideBuffers[i]=0.0;
      }
   SwingHigh=0.0;
   SwingLow=0.0;
   prevSwing=0;
   LastSwing=0.0;
   myBars=0;
   lowCounter=0;
   highCounter=0;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| return shift of last swing                                       |
//+------------------------------------------------------------------+
int GetLastSwing()
  {
//---- 
  int point=1;
  while (SwingsBuffer[point]==0.0 && point<Bars) point++;
    
//----
   return(point);
  }  
//+------------------------------------------------------------------+
//| Check prev swing                                                 |
//+------------------------------------------------------------------+
void SetPrevSwing()
  {
//---- 
   int LastPoint;
   LastPoint=GetLastSwing();
   SwingsBuffer[0]=0.0;
   SwingHigh=High[LastPoint];
   SwingLow=Low[LastPoint];
   LastSwing=LastPoint;
//----
   return;
  }



//+------------------------------------------------------------------+
//| check Out side bar                                               |
//+------------------------------------------------------------------+
bool isOutSideSwingBar(int shift)
  {
   bool res=false;
//---- 
   res=((High[shift]>High[shift+1])&&(Low[shift]<Low[shift+1]));
   if (res) 
      {
      if (Close[shift]>Open[shift]) UpCloseOutSideBuffers[shift]=(High[shift]+Low[shift])/2.0;
      else DownCloseOutSideBuffers[shift]=(High[shift]+Low[shift])/2.0;
      }
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| Check new low                                                   |
//+------------------------------------------------------------------+
void SetSwings(int shift)
  {
//---- 

//----
   return;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit;
   bool nonOutSide;
   if (counted_bars==0) 
      {
      limit=Bars-1;
      LowsBuffer[limit]=Low[limit];
      SwingsBuffer[limit]=Low[limit];
      SwingHigh=High[limit];
      SwingLow=Low[limit];
      LastSwing=limit;
      TrendBuffer[limit]=-1.0;
      }
   if (counted_bars>0) limit=Bars-counted_bars;  
   if ( (counted_bars<0)|| ((counted_bars>0)&&(Bars-myBars>1)) ) init();
   limit--;
   //Print("Bars=",Bars," counted_bars=",counted_bars,);
//---- 
   for (int cnt=limit;cnt>=0;cnt--)
      {
      if (limit<3)Print("cnt=",cnt,"  myBars=",myBars,"  LastSwing=",LastSwing);
      //if (cnt==0) SetPrevSwing();
      nonOutSide=!isOutSideSwingBar(cnt);
      if (High[cnt]>SwingHigh) {highCounter++;SwingHigh=High[cnt];HighsBuffer[cnt]=SwingHigh;}
      if (Low[cnt]<SwingLow) {lowCounter++;SwingLow=Low[cnt];LowsBuffer[cnt]=SwingLow;}
      //isOutSideSwingBar(cnt);
      TrendBuffer[cnt]=TrendBuffer[cnt+1];// если не будут изменений - тренд сохранится
      if ((TrendBuffer[cnt+1]==-1.0) && (lowCounter==1))// && nonOutSide) 
         {
         //if (LastSwing=!cnt) 
         if (LastSwing!=Bars-1) SwingsBuffer[LastSwing]=0.0; // затрем предыдущий свинг
         LastSwing=cnt;
         SwingHigh=High[cnt];
         SwingLow=Low[cnt];
         //TrendBuffer[cnt]=-1.0;
         highCounter=0;
         lowCounter=0;
         SwingsBuffer[cnt]=Low[cnt];
         HighsBuffer[cnt]=SwingHigh;
         //Print("продолжение даунтренда");
         }
      else
         {
         if (TrendBuffer[cnt+1]==-1.0 &&highCounter==kind)
            {
            //if (LastSwing=!cnt) 
            LastSwing=cnt;
            SwingHigh=High[cnt];
            SwingLow=Low[cnt];
            TrendBuffer[cnt]=1.0;
            highCounter=0;
            lowCounter=0;
            SwingsBuffer[cnt]=High[cnt];
            LowsBuffer[cnt]=SwingLow;
            //Print("разворот даунтренда");
            }
         else
            {
            if (TrendBuffer[cnt+1]==-1.0 && Low[cnt]==SwingLow && MoveLastSwing)
               {
               SwingsBuffer[LastSwing]=0.0;
               LastSwing=cnt;
/*               SwingLow=Low[cnt];
               SwingHigh=High[cnt];
               highCounter=0;
               lowCounter=0;
*/               SwingsBuffer[cnt]=Low[cnt];
               }
            }
               
         } 
      if ((TrendBuffer[cnt+1]==1.0) && (highCounter==1))// && nonOutSide) 
         {
         //if (LastSwing=!cnt) 
         if (LastSwing!=Bars-1) SwingsBuffer[LastSwing]=0.0; // затрем предыдущий свинг
         LastSwing=cnt;
         SwingHigh=High[cnt];
         SwingLow=Low[cnt];
         //TrendBuffer[cnt]=1.0;
         highCounter=0;
         lowCounter=0;
         SwingsBuffer[cnt]=High[cnt];
         LowsBuffer[cnt]=SwingLow;
         //Print("продолжение аптренда");
         }
      else
         {
         if (TrendBuffer[cnt+1]==1.0 &&lowCounter==kind)
            {
            //if (LastSwing=!cnt) 
            LastSwing=cnt;
            SwingHigh=High[cnt];
            SwingLow=Low[cnt];
            TrendBuffer[cnt]=-1.0;
            highCounter=0;
            lowCounter=0;
            SwingsBuffer[cnt]=Low[cnt];
            HighsBuffer[cnt]=SwingHigh;
            //Print("разворот аптренда");
            }
         else
            {
            if (TrendBuffer[cnt+1]==1.0 && High[cnt]==SwingHigh && MoveLastSwing)
               {
               SwingsBuffer[LastSwing]=0.0;
               LastSwing=cnt;
/*               SwingLow=Low[cnt];
               SwingHigh=High[cnt];
               highCounter=0;
               lowCounter=0;
*/               SwingsBuffer[cnt]=High[cnt];
               }
            }   

         } 
      }
   myBars=Bars;   
//----
   return(0);
  }
//+------------------------------------------------------------------+



Всегда один и тот же наклон, надо разбираться - мешает это или нет. Второй цвет тоже заявлен для проформы похоже, ну да ладно.
Но если я пробую изменить свойства индиатора (в данном случае цвет змгзага) , то получаю некрасивость.





PS Похоже, кириллические названия рисунков не проходят на www.mql4.com

 
В общем, рисунки здесь:
"MQL4: Вопросы по MQL4."
 
Где-то год назад я делал индикатор ("Ergodic Signals" кажется) и при этом упорно отказывался занулять пустые значения в индикаторных буферах. При расчетах он рисовал правильно, но при переключении между тайм-фреймами получалась пачкотня. Помнится, тогда Slawa пообещал что при инициализации любых индикаторов все буфера будут зачищаться, чтобы защититься от действий таких юзеров. Может концепция изменилась или еще чего то меняли. Вот накидываю GanSwingsVIII - красиво получается. Переключаюсь на другой счет - не очень. Скинуть/накинуть индикатор не проблема, просто на всякий случай решил показать.
 
DRAW_ZIGZAG таки работает. Он умеет отрисовывать в любую сторону, а не только в одну, как я думал. Осталось только стабилизировать поведение при смене параметров.
 
Profi_R

Почитай, если не видел - "Исчезает индикатор на графике"
Возможно, не надо будет биться с двуся буферами в стиле draw_section, тем более что битва заведомо проигрышная.

PS Имеется ввиду draw_zigzag, только я могу догадываться о механизме реализации этого стиля( хелпа и примеров нет).


ага, спасибо за наводку, что-то я совсем из виду выпустил, и в справку давненько не заглядывал, да и твой код к сожалению посмотреть не удосужился (чуть голову не сломал). теперь нужно будет знакомиться с особенностями этого стиля, в справке инфы - кот наплакал :(

дописка: но похоже одним зигзагом для малой тенденции не обойтись :(
#97554 - 30/11/2005 21:33
http://forex.kbpauk.ru/showflat.php?Cat=0&Number=97554&page=0&vc=1&PHPSESSID=#Post97554
 
Добил я малую (а до кучи и все остальные) тенденции по Ганну (по коду из Омеги в моем понимании).
//+------------------------------------------------------------------+
//|                                                   GannSwingsX.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 White
#property indicator_color2 Yellow
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Aqua
#property indicator_color6 HotPink

extern int kind=1;// тип тенденции, 1- малая, 2 - промежуточная, 3 - основная
extern int drawBars=30;// сколько всего баров считаем от конца 
extern bool MoveLastSwing=false; // если равно true, то кончик хвоста будет сдвигаться ближе к нулевому бару для двух одинаковых баров по High или Low
//---- buffers
double HighSwings[];
double LowSwings[];
double HighsBuffer[];
double LowsBuffer[];
double TrendBuffer[];
double UpCloseOutSideBuffers[];
double DownCloseOutSideBuffers[];
double SwingHigh,SwingLow;
int prevSwing,LastSwing,myBars,lowCounter,highCounter;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(7);

   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexBuffer(0,HighSwings);
   SetIndexEmptyValue(0,0.0);
   SetIndexLabel(0,"HighSwing");

   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexBuffer(1,LowSwings);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(1,"LowSwing");

   SetIndexBuffer(2,HighsBuffer);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,159);
   SetIndexLabel(2,"HighActive");

   SetIndexBuffer(3,LowsBuffer);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,159);
   SetIndexLabel(3,"LowActive");

   SetIndexBuffer(4,UpCloseOutSideBuffers);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,108);
   SetIndexLabel(4,"UpClose");

   SetIndexBuffer(5,DownCloseOutSideBuffers);
   SetIndexStyle(5,DRAW_ARROW);
   SetIndexArrow(5,108);
   SetIndexLabel(5,"DownClose");

   SetIndexBuffer(6,TrendBuffer);

   for (int i=Bars-1; i>=0; i--)
      {
      HighSwings[i]=0.0;
      LowSwings[i]=0.0;
      HighsBuffer[i]=0.0;
      LowsBuffer[i]=0.0;
      TrendBuffer[i]=0.0;
      UpCloseOutSideBuffers[i]=0.0;
      DownCloseOutSideBuffers[i]=0.0;
      }
   SwingHigh=0.0;
   SwingLow=0.0;
   prevSwing=0;
   LastSwing=0.0;
   myBars=0;
   lowCounter=0;
   highCounter=0;
   //Comment("Считаем ",drawBars," баров");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| return shift of last swing                                       |
//+------------------------------------------------------------------+
int GetLastSwing()
  {
//---- 
  int point=1;
  while (HighSwings[point]==0.0 && LowSwings[point]==0.0 && point<Bars) point++;
    
//----
   return(point);
  }  
//+------------------------------------------------------------------+
//| Check prev swing                                                 |
//+------------------------------------------------------------------+
void SetPrevSwing()
  {
//---- 
   int LastPoint;
   LastPoint=GetLastSwing();
   HighSwings[0]=0.0;
   SwingHigh=High[LastPoint];
   SwingLow=Low[LastPoint];
   LastSwing=LastPoint;
//----
   return;
  }



//+------------------------------------------------------------------+
//| check Out side bar                                               |
//+------------------------------------------------------------------+
bool isOutSideSwingBar(int shift)
  {
   bool res=false;
//---- 
   res=((High[shift]>High[shift+1])&&(Low[shift]<Low[shift+1]));
   if (res) 
      {
      if (Close[shift]>Open[shift]) UpCloseOutSideBuffers[shift]=(High[shift]+Low[shift])/2.0;
      else DownCloseOutSideBuffers[shift]=(High[shift]+Low[shift])/2.0;
      }
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| Check new low                                                   |
//+------------------------------------------------------------------+
void SetSwings(int shift)
  {
//---- 

//----
   return;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit;
   bool nonOutSide;
   if (counted_bars==0) 
      {
      limit=Bars-1;
      LowsBuffer[limit]=Low[limit];
      LowSwings[limit]=Low[limit];
      SwingHigh=High[limit];
      SwingLow=Low[limit];
      LastSwing=limit;
      TrendBuffer[limit]=-1.0;
      }
   if (counted_bars>0) limit=Bars-counted_bars;  
   if ( (counted_bars<0)|| ((counted_bars>0)&&(Bars-myBars>1)) ) init();
   limit--;
   //Print("Bars=",Bars," counted_bars=",counted_bars,);
//---- 
//   for (int cnt=limit;cnt>=Bars-drawBars;cnt--)
   for (int cnt=limit;cnt>0;cnt--)
      {
      //Print("Bar=",Bars-cnt,"  Time=",TimeToStr(Time[cnt]));
      //if (limit<3)Print("cnt=",cnt,"  myBars=",myBars,"  LastSwing=",LastSwing);
      //if (cnt==0) SetPrevSwing();
      nonOutSide=!isOutSideSwingBar(cnt);
      if (High[cnt]>SwingHigh) {highCounter++;SwingHigh=High[cnt];HighsBuffer[cnt]=SwingHigh;}
      if (Low[cnt]<SwingLow) {lowCounter++;SwingLow=Low[cnt];LowsBuffer[cnt]=SwingLow;}
      //isOutSideSwingBar(cnt);
      TrendBuffer[cnt]=TrendBuffer[cnt+1];// если не будут изменений - тренд сохранится
      if (nonOutSide)
         {
         if ((TrendBuffer[cnt+1]==-1.0) && (lowCounter==1) ) 
            {
            //if (LastSwing=!cnt) 
            if (LastSwing!=Bars-1) LowSwings[LastSwing]=0.0; // затрем предыдущий свинг
            //Print("затрем предыдущий Down свинг");
            LastSwing=cnt;
            SwingHigh=High[cnt];
            SwingLow=Low[cnt];
            //TrendBuffer[cnt]=-1.0;
            highCounter=0;
            lowCounter=0;
            LowSwings[cnt]=Low[cnt];
            HighsBuffer[cnt]=SwingHigh;
            //Print("продолжение даунтренда");
            }
         else
            {
            if (TrendBuffer[cnt+1]==-1.0 &&highCounter==kind)
               {
               //if (LastSwing=!cnt) 
               LastSwing=cnt;
               SwingHigh=High[cnt];
               SwingLow=Low[cnt];
               TrendBuffer[cnt]=1.0;
               highCounter=0;
               lowCounter=0;
               HighSwings[cnt]=High[cnt];
               LowsBuffer[cnt]=SwingLow;
               //Print("разворот даунтренда");
               }
            else
               {
               if (TrendBuffer[cnt+1]==-1.0 && Low[cnt]==SwingLow && MoveLastSwing)
                  {
                  LowSwings[LastSwing]=0.0;
                  LastSwing=cnt;
   /*               SwingLow=Low[cnt];
                  SwingHigh=High[cnt];
                  highCounter=0;
                  lowCounter=0;
   */               LowSwings[cnt]=Low[cnt];
                  }
               }
               
            } 
         if ((TrendBuffer[cnt+1]==1.0) && (highCounter==1)) 
            {
            //if (LastSwing=!cnt) 
            if (LastSwing!=Bars-1) HighSwings[LastSwing]=0.0; // затрем предыдущий свинг
            //Print("затрем предыдущий UP свинг");
            LastSwing=cnt;
            SwingHigh=High[cnt];
            SwingLow=Low[cnt];
            //TrendBuffer[cnt]=1.0;
            highCounter=0;
            lowCounter=0;
            HighSwings[cnt]=High[cnt];
            HighsBuffer[cnt]=SwingHigh;
            LowsBuffer[cnt]=SwingLow;
            //Print("продолжение аптренда");
            }
         else
            {
            if (TrendBuffer[cnt+1]==1.0 &&lowCounter==kind)
               {
               //if (LastSwing=!cnt) 
               LastSwing=cnt;
               SwingHigh=High[cnt];
               SwingLow=Low[cnt];
               TrendBuffer[cnt]=-1.0;
               highCounter=0;
               lowCounter=0;
               LowSwings[cnt]=Low[cnt];
               HighsBuffer[cnt]=SwingHigh;
               LowsBuffer[cnt]=SwingLow;
               //Print("разворот аптренда");
               }
            else
               {
               if (TrendBuffer[cnt+1]==1.0 && High[cnt]==SwingHigh && MoveLastSwing)
                  {
                  HighSwings[LastSwing]=0.0;
                  LastSwing=cnt;
   /*               SwingLow=Low[cnt];
                  SwingHigh=High[cnt];
                  highCounter=0;
                  lowCounter=0;
   */               HighSwings[cnt]=High[cnt];
                  }
               }   

            }//TrendBuffer[cnt+1]==1.0
         }// if (nonOutSide_         
      else // outSideBars
         if (isOutSideSwingBar(cnt))
         {
         if (TrendBuffer[cnt+1]==1.0 && Close[cnt]>Open[cnt] && highCounter==1)
            {
            SwingLow=Low[cnt];
            SwingHigh=High[cnt];
            LowSwings[cnt]=Low[cnt];
            HighSwings[cnt]=High[cnt];
            highCounter=0;
            lowCounter=0;
            LastSwing=cnt;
            //Print("Продолжение аптренд через внешний бар");
            //SwingsBuffer[cnt]=SwingLow;
            }
         if (TrendBuffer[cnt+1]==1.0 && Close[cnt]<Open[cnt])   
            {
            SwingLow=Low[cnt];
            SwingHigh=High[cnt];
            if (High[cnt]>HighSwings[LastSwing]) 
               {
               HighSwings[LastSwing]=0.0;
               HighSwings[cnt]=High[cnt];
               }
            LowSwings[cnt]=Low[cnt];
            highCounter=0;
            lowCounter=0;
            LastSwing=cnt;
            //Print("Разворот аптренда через внешний бар");
            //SwingsBuffer[cnt]=SwingHigh;
            TrendBuffer[cnt]=-1.0;
            }
         if (TrendBuffer[cnt+1]==-1.0 && Close[cnt]<Open[cnt] && lowCounter==1)
            {
            SwingLow=Low[cnt];
            SwingHigh=High[cnt];
            HighSwings[cnt]=High[cnt];
            LowSwings[cnt]=Low[cnt];
            highCounter=0;
            lowCounter=0;
            LastSwing=cnt;
            //Print("Продолжение даунтренд через внешний бар");
            //SwingsBuffer[cnt]=SwingHigh;
            }
         if (TrendBuffer[cnt+1]==-1.0 && Close[cnt]>Open[cnt])   
            {
            SwingLow=Low[cnt];
            SwingHigh=High[cnt];
            if (Low[cnt]<LowSwings[LastSwing]) 
               {
               LowSwings[LastSwing]=0.0;
               LowSwings[cnt]=Low[cnt];
               }
            HighSwings[cnt]=High[cnt];
            highCounter=0;
            lowCounter=0;
            LastSwing=cnt;
            //Print("Разворот даунтренда через внешний бар");
            //SwingsBuffer[cnt]=SwingLow;
            TrendBuffer[cnt]=1.0;
            }

         }          
      }
   myBars=Bars;   
//----
   return(0);
  }
//+------------------------------------------------------------------+






Самый прикол в том, что стиль DRAW_ZIGZAG я по отрывкам собрал :) Надеюсь, он не изменится уже.

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