Ticker ZigZag

Author: mandorr@gmail.com
Ticker ZigZag
Price Data Components
Series array that contains open prices of each barSeries array that contains the highest prices of each bar
0 Views
0 Downloads
0 Favorites
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

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---