ZigZagOnParabolic_Arrows

Author: Copyright © 2009, EarnForex
Indicators Used
Parabolic Stop and Reverse system
2 Views
0 Downloads
0 Favorites
ZigZagOnParabolic_Arrows
ÿþ//+------------------------------------------------------------------+

//|                                     ZigZagOnParabolic_Arrows.mq5 |

//|                                      Copyright © 2009, EarnForex |

//|                                        http://www.earnforex.com/ |

//+------------------------------------------------------------------+

//---- 02B>@AB2> 8=48:0B>@0

#property copyright "Copyright © 2009, EarnForex"

//---- AAK;:0 =0 A09B 02B>@0

#property link      "http://www.earnforex.com"

//---- =><5@ 25@A88 8=48:0B>@0

#property version   "1.01"

#property description "ZigZag on Parabolic" 

//---- >B@8A>2:0 8=48:0B>@0 2 3;02=>< >:=5

#property indicator_chart_window 

//---- 4;O @0AGQB0 8 >B@8A>2:8 8=48:0B>@0 8A?>;L7>20=> 3 1CD5@0

#property indicator_buffers 3

//---- 8A?>;L7>20=> 2A53> 420 3@0D8G5A:8E ?>AB@>5=8O

#property indicator_plots   2

//+----------------------------------------------+

//|  0@0<5B@K >B@8A>2:8 25@E=53> 8=48:0B>@0     |

//+----------------------------------------------+

//---- >B@8A>2:0 8=48:0B>@0 1 2 2845 A8<2>;0

#property indicator_type1   DRAW_ARROW

//---- 2 :0G5AB25 F25B0 8=48:0B>@0 8A?>;L7>20= clrDarkSalmon F25B

#property indicator_color1  clrDarkSalmon

//---- B>;I8=0 ;8=88 8=48:0B>@0 1 @02=0 4

#property indicator_width1  4

//---- >B>1@065=85 1KG59 <5B:8 8=48:0B>@0

#property indicator_label1  "Up ZigZagOnParabolic_Arrows"

//+----------------------------------------------+

//|  0@0<5B@K >B@8A>2:8 =86=53> 8=48:0B>@0      |

//+----------------------------------------------+

//---- >B@8A>2:0 8=48:0B>@0 2 2 2845 A8<2>;0

#property indicator_type2   DRAW_ARROW

//---- 2 :0G5AB25 F25B0 8=48:0B>@0 8A?>;L7>20= clrDodgerBlue F25B

#property indicator_color2  clrDodgerBlue

//---- B>;I8=0 ;8=88 8=48:0B>@0 2 @02=0 4

#property indicator_width2  4

//---- >B>1@065=85 <54256L59 <5B:8 8=48:0B>@0

#property indicator_label2 "Down ZigZagOnParabolic_Arrows"

//+----------------------------------------------+ 

//| E>4=K5 ?0@0<5B@K 8=48:0B>@0                 |

//+----------------------------------------------+ 

input double Step=0.02; //SAR H03

input double Maximum=0.2; //SAR <0:A8<C<

input bool ExtremumsShift=true; //D;03 A42830 25@H8=K

input uint  UpLable=217;//;5910 25@E=53> D@0:B0;0

input uint  DnLable=218;//;5910 =86=53> D@0:B0;0

//+----------------------------------------------+



//---- >1JO2;5=85 48=0<8G5A:8E <0AA82>2, :>B>@K5 1C4CB 2 

// 40;L=59H5< 8A?>;L7>20=K 2 :0G5AB25 8=48:0B>@=KE 1CD5@>2

double LowestBuffer[];

double HighestBuffer[];

double ColorBuffer[];



//---- 1JO2;5=85 F5;KE ?5@5<5==KE

int EShift;

//---- 1JO2;5=85 F5;KE ?5@5<5==KE =0G0;0 >BAGQB0 40==KE

int min_rates_total;

//---- 1JO2;5=85 F5;KE ?5@5<5==KE 4;O E5=4;>2 8=48:0B>@>2

int SAR_Handle;

//+------------------------------------------------------------------+ 

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+ 

void OnInit()

  {

//---- =8F80;870F8O ?5@5<5==KE =0G0;0 >BAGQB0 40==KE

   min_rates_total=1;



//---- =8F80;870F8O :>=AB0=B   

   if(ExtremumsShift) EShift=1;

   else               EShift=0;



//---- ?>;CG5=85 E5=4;0 8=48:0B>@0 SAR

   SAR_Handle=iSAR(NULL,0,Step,Maximum);

   if(SAR_Handle==INVALID_HANDLE)Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 SAR");



//---- ?@52@0I5=85 48=0<8G5A:8E <0AA82>2 2 8=48:0B>@=K5 1CD5@K

   SetIndexBuffer(0,LowestBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,HighestBuffer,INDICATOR_DATA);

   SetIndexBuffer(2,ColorBuffer,INDICATOR_COLOR_INDEX);

//---- 70?@5B =0 >B@8A>2:C 8=48:0B>@>< ?CABKE 7=0G5=89

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,NULL);

   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,NULL);

//---- A8<2>;K 4;O 8=48:0B>@0

   PlotIndexSetInteger(0,PLOT_ARROW,DnLable);

   PlotIndexSetInteger(1,PLOT_ARROW,UpLable);

//---- 8=45:A0F8O M;5<5=B>2 2 1CD5@0E :0: 2 B09<A5@8OE   

   ArraySetAsSeries(LowestBuffer,true);

   ArraySetAsSeries(HighestBuffer,true);

   ArraySetAsSeries(ColorBuffer,true);

//---- CAB0=>2:0 ?>78F88, A :>B>@>9 =0G8=05BAO >B@8A>2:0

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);

   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);

//---- #AB0=>2:0 D>@<0B0 B>G=>AB8 >B>1@065=8O 8=48:0B>@0

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//---- 8<O 4;O >:>= 40==KE 8 ;M910 4;O AC1J>:>= 

   string shortname;

   StringConcatenate(shortname,"ZigZagOnParabolic_Arrows(",double(Step), ", ", double(Maximum), ", ", bool(ExtremumsShift), ")");

   IndicatorSetString(INDICATOR_SHORTNAME,shortname);

//----   

  }

//+------------------------------------------------------------------+ 

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+ 

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//---- ?@>25@:0 :>;8G5AB20 10@>2 =0 4>AB0B>G=>ABL 4;O @0AGQB0

   if(BarsCalculated(SAR_Handle)<rates_total || rates_total<min_rates_total)return(0);



//---- >1JO2;5=8O ;>:0;L=KE ?5@5<5==KE 

   static int j_,lastcolor_;

   static bool dir_;

   static double h_,l_;

   int j,limit,climit,to_copy,bar,shift,NewBar,lastcolor;

   double h,l,mid0,mid1,SAR[];

   bool dir;



//---- @0AGQB AB0@B>2>3> =><5@0 limit 4;O F8:;0 ?5@5AGQB0 10@>2 8 AB0@B>20O 8=8F80;870F8O ?5@5<5==KE

   if(prev_calculated>rates_total || prev_calculated<=0)// ?@>25@:0 =0 ?5@2K9 AB0@B @0AGQB0 8=48:0B>@0

     {

      limit=rates_total-1-min_rates_total; // AB0@B>2K9 =><5@ 4;O @0AGQB0 2A5E 10@>2



      h_=0.0;

      l_=999999999;

      dir_=false;

      j_=0;

      lastcolor_=0;

     }

   else

     {

      limit=rates_total-prev_calculated; // AB0@B>2K9 =><5@ 4;O @0AGQB0 =>2KE 10@>2

     }

     

   climit=limit; // AB0@B>2K9 =><5@ 4;O @0A:@0A:8 8=48:0B>@0



   to_copy=limit+2;

   if(limit==0) NewBar=1;

   else         NewBar=0;



//---- 8=45:A0F8O M;5<5=B>2 2 <0AA820E :0: 2 B09<A5@8OE 

   ArraySetAsSeries(SAR,true);

   ArraySetAsSeries(high,true);

   ArraySetAsSeries(low,true);

   

//---- :>?8@C5< 2=>2L ?>O282H85AO 40==K5 2 <0AA82

   if(CopyBuffer(SAR_Handle,0,0,to_copy,SAR)<=0) return(0);



//---- 2>AAB0=02;8205< 7=0G5=8O ?5@5<5==KE

   j=j_;

   dir=dir_;

   h=h_;

   l=l_;

   lastcolor=lastcolor_;



//---- 5@2K9 1>;LH>9 F8:; @0AGQB0 8=48:0B>@0

   for(bar=limit; bar>=0 && !IsStopped(); bar--)

     {

      //---- 70?><8=05< 7=0G5=8O ?5@5<5==KE ?5@54 ?@>3>=0<8 =0 B5:CI5< 10@5

      if(rates_total!=prev_calculated && bar==0)

        {

         j_=j;

         dir_=dir;

         h_=h;

         l_=l;

        }



      mid0=(high[bar]+low[bar])/2;

      mid1=(high[bar+1]+low[bar+1])/2;

      

      HighestBuffer[bar]=NULL;

      LowestBuffer[bar]=NULL;



      if(bar>0) j++;



      if(dir)

        {

         if(h<high[bar])

           {

            h=high[bar];

            j=NewBar;

           }

         if(SAR[bar+1]<=mid1 && SAR[bar]>mid0)

           {

            shift=bar+EShift *(j+NewBar);

            if(shift>rates_total-1) shift=rates_total-1;

            HighestBuffer[shift]=h;

            dir=false;

            l=low[bar];

            j=0;

            if(shift>climit) climit=shift;

           }

        }

      else

        {

         if(l>low[bar])

           {

            l=low[bar];

            j=NewBar;

           }

         if(SAR[bar+1]>=mid1 && SAR[bar]<mid0)

           {

            shift=bar+EShift *(j+NewBar);

            if(shift>rates_total-1) shift=rates_total-1;

            LowestBuffer[shift]=l;

            dir=true;

            h=high[bar];

            j=0;

            if(shift>climit) climit=shift;

           }

        }

     }



//---- "@5B89 1>;LH>9 F8:; @0A:@0A:8 8=48:0B>@0

   for(bar=climit; bar>=0 && !IsStopped(); bar--)

     {

      if(rates_total!=prev_calculated && !bar) lastcolor_=lastcolor;



      if(!HighestBuffer[bar] || !LowestBuffer[bar]) ColorBuffer[bar]=lastcolor;



      if(HighestBuffer[bar] || LowestBuffer[bar])

        {

         if(lastcolor==0)

           {

            ColorBuffer[bar]=1;

            lastcolor=1;

           }

         else

           {

            ColorBuffer[bar]=0;

            lastcolor=0;

           }

        }



      if(!HighestBuffer[bar] || !LowestBuffer[bar])

        {

         ColorBuffer[bar]=1;

         lastcolor=1;

        }



      if(HighestBuffer[bar] || LowestBuffer[bar])

        {

         ColorBuffer[bar]=0;

         lastcolor=0;

        }

     }

//----     

   return(rates_total);

  }

//+------------------------------------------------------------------+

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 ---