Ticker ZigZag





// Ticker ZigZag.mq4
// Èíäèêàòîð

#property copyright "mandorr@gmail.com"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Gray
#property indicator_width1 2
#property indicator_style1 0

extern int Stop=100;         // Îñòàíîâêà è ðàçâîðîò
extern int BarsCount=1000;   // Êîëè÷åñòâî îòîáðàæàåìûõ áàðîâ

double buffer0[];

int bar_size;
int bar_high[];
int bar_low [];
int bar_dir [];

int stop;
int price_prev;
int win_index;

string obj_name;
string win_name;

void init() {
   SetIndexBuffer(0,buffer0);
   SetIndexStyle (0,DRAW_LINE);
   SetIndexLabel(0,"ZigZag");
   SetIndexDrawBegin(0,0);
   SetIndexEmptyValue(0,0.0);
   bar_size=0;
   price_prev=0;
   stop=MathMax(1,Stop);
   win_name="Ticker ZigZag ("+stop+")";
}

void deinit() {
   ObjectsDeleteAll(win_index);
}

void start() {
   int i, price;
   bool reverse;

   price=MathRound(Bid/Point);
   if (price==0) {return;}
   if (price==price_prev) {return;}
   price_prev=price;

   if (bar_size==0) {
      Clean();
      Setup();
   }

   reverse=false;
   if ((price>bar_high[0]) && (bar_dir[0]>0)) {
      bar_high[0]=price;
   }
   if ((price<bar_low[0]) && (bar_dir[0]<0)) {
      bar_low[0]=price;
   }
   if ((price>bar_low[0]) && (bar_dir[0]<0)) {
      if (price>bar_low[0]+stop) {reverse=true;}
   }
   if ((price<bar_high[0]) && (bar_dir[0]>0)) {
      if (price<bar_high[0]-stop) {reverse=true;}
   }
   if (reverse) {
      bar_size++;
      if (bar_size>BarsCount) {bar_size=BarsCount;}
      else {
         ArrayResize(bar_high,bar_size);
         ArrayResize(bar_low ,bar_size);
         ArrayResize(bar_dir ,bar_size);
      }
      for (i=bar_size-1; i>0; i--) {
         bar_high[i]=bar_high[i-1];
         bar_low [i]=bar_low [i-1];
         bar_dir [i]=bar_dir [i-1];
      }
      if (bar_dir[1]<0) {
         bar_high[0]=price;
         bar_low [0]=bar_low[1];
         bar_dir [0]=1;
      }
      if (bar_dir[1]>0) {
         bar_high[0]=bar_high[1];
         bar_low [0]=price;
         bar_dir [0]=-1;
      }
   }

   IndicatorShortName(win_name);
   win_index=WindowFind(win_name);
   obj_name="Win"+win_index+"_Bid";
   if (ObjectFind(obj_name)!=win_index) {
      ObjectCreate(obj_name,OBJ_HLINE,win_index,Time[0],Bid);
   }
   ObjectSet(obj_name,OBJPROP_PRICE1,Bid);
   ObjectSet(obj_name,OBJPROP_STYLE,DRAW_LINE);
   ObjectSet(obj_name,OBJPROP_WIDTH,1);
   ObjectSet(obj_name,OBJPROP_COLOR,Silver);
}

// î÷èñòèòü ãðàôèê
void Clean() {
   for (int i=0; i<=BarsCount; i++) {
      buffer0[i]=0.0;
   }
   IndicatorShortName(win_name);
   win_index=WindowFind(win_name);
   ObjectsDeleteAll(win_index);
}

// Èñïîëüçîâàíèå ïîñëåäîâàòåëüíîñòè òèêîâ èç OHL ìèíóòíîãî ãðàôèêà
void Setup() {
   int i, j, k, total, value_prev, value[4], box_count;
   bool reverse;
   double open, high, low, median;
   // íà÷àëüíûé áàð
   bar_size=1;
   ArrayResize(bar_high,1);
   ArrayResize(bar_low ,1);
   ArrayResize(bar_dir, 1);
   total=stop*BarsCount; if (total>iBars(NULL,PERIOD_M1)) {total=iBars(NULL,PERIOD_M1);}
   open=iOpen(NULL,PERIOD_M1,total-1);
   value[0]=MathRound(open/Point);
   bar_high[0]=value[0];
   bar_low [0]=value[0];
   bar_dir [0]=1;
   // Ýìóëÿöèÿ ïîñëåäîâàòåëüíîñòè òèêîâ èç OHL ìèíóòíîãî ãðàôèêà
   for (i=total-1; i>=0; i--) {
      open=iOpen(NULL,PERIOD_M1,i);
      high=iHigh(NULL,PERIOD_M1,i);
      low =iLow (NULL,PERIOD_M1,i);
      median=0.5*(high+low);
      value[0]=MathRound(open/Point);
      value[1]=MathRound(high/Point);
      value[2]=MathRound(low /Point);
      value[3]=0;
      if (open<median) {
         // Ïîìåíÿòü ïîñëåäîâàòåëüíîñòü ñ OHL íà OLH
         value[3]=value[1];
         value[1]=value[2];
         value[2]=value[3];
      }
      for (k=0; k<=2; k++) {
         if (value[k]==value_prev) {continue;}
         value_prev=value[k];
         reverse=false;
         if ((value[k]>bar_high[0]) && (bar_dir[0]>0)) {
            bar_high[0]=value[k];
         }
         if ((value[k]<bar_low[0]) && (bar_dir[0]<0)) {
            bar_low[0]=value[k];
         }
         if ((value[k]>bar_low[0]) && (bar_dir[0]<0)) {
            if (value[k]>bar_low[0]+stop) {reverse=true;}
         }
         if ((value[k]<bar_high[0]) && (bar_dir[0]>0)) {
            if (value[k]<bar_high[0]-stop) {reverse=true;}
         }
         if (reverse) {
            bar_size++;
            if (bar_size>BarsCount) {bar_size=BarsCount;}
            else {
               ArrayResize(bar_high,bar_size);
               ArrayResize(bar_low ,bar_size);
               ArrayResize(bar_dir ,bar_size);
            }
            for (j=bar_size-1; j>0; j--) {
               bar_high[j]=bar_high[j-1];
               bar_low [j]=bar_low [j-1];
               bar_dir [j]=bar_dir [j-1];
            }
            if (bar_dir[1]<0) {
               bar_high[0]=value[k];
               bar_low [0]=bar_low[1];
               bar_dir [0]=1;
            }
            if (bar_dir[1]>0) {
               bar_high[0]=bar_high[1];
               bar_low [0]=value[k];
               bar_dir [0]=-1;
            }
         }
      }
   }
   for (i=0; i<bar_size; i++) {
      buffer0[i]=0.0;
      if (bar_dir[i]>0) {buffer0[i]=bar_high[i]*Point;}
      if (bar_dir[i]<0) {buffer0[i]=bar_low [i]*Point;}
   }
   buffer0[bar_size]=0.0;
   RefreshRates();
   price_prev=MathRound(Bid/Point);
}

// End



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:



Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: