ZigZagOnParabolic_channel

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

//|                                    ZigZagOnParabolic_channel.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.00"

#property description "ZigZag on Parabolic 2 2845 :0=0;0" 

//---- >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=> 2>A5<L 1CD5@>2

#property indicator_buffers 8

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

#property indicator_plots   5

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

//|  0@0<5B@K >B@8A>2:8 8=48:0B>@0 >1;0:0       |

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

//---- >B@8A>2:0 8=48:0B>@0 2 2845 F25B=>3> >1;0:0

#property indicator_type1   DRAW_FILLING

//---- 2 :0G5AB25 F25B0 >1;0:0 8A?>;L7>20=

#property indicator_color1  clrLavender

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

#property indicator_label1  "ZigZagOnParabolic_channel Cloud"

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

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

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

//---- >B@8A>2:0 8=48:0B>@0 2 2 2845 <=>3>F25B=>9 ;8=88

#property indicator_type2   DRAW_COLOR_LINE

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

#property indicator_color2  clrTeal,clrPurple

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

#property indicator_width2  2

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

#property indicator_label2  "Up ZigZagOnParabolic_channel"

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

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

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

//---- >B@8A>2:0 8=48:0B>@0 3 2 2845 <=>3>F25B=>9 ;8=88

#property indicator_type3   DRAW_COLOR_LINE

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

#property indicator_color3  clrTeal,clrPurple

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

#property indicator_width3  2

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

#property indicator_label3 "Down ZigZagOnParabolic_channel"

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

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

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

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

#property indicator_type4   DRAW_ARROW

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

#property indicator_color4  clrDodgerBlue

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

#property indicator_width4  1

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

#property indicator_label4  "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 5 2 2845 A8<2>;0

#property indicator_type5   DRAW_ARROW

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

#property indicator_color5  clrDeepPink

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

#property indicator_width5  1

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

#property indicator_label5 "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=163;//;5910 25@E=53> D@0:B0;0

input uint  DnLable=163;//;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 UpBuffer[],DnBuffer[];

double UpperBuffer[],LowerBuffer[];

double ColorUpperBuffer[],ColorLowerBuffer[];

double LowestBuffer[],HighestBuffer[];

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

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

int 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");

      return(INIT_FAILED);

     }



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

   SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,DnBuffer,INDICATOR_DATA);

   SetIndexBuffer(2,UpperBuffer,INDICATOR_DATA);

   SetIndexBuffer(3,ColorUpperBuffer,INDICATOR_COLOR_INDEX);

   SetIndexBuffer(4,LowerBuffer,INDICATOR_DATA);

   SetIndexBuffer(5,ColorLowerBuffer,INDICATOR_COLOR_INDEX);

   SetIndexBuffer(6,HighestBuffer,INDICATOR_DATA);

   SetIndexBuffer(7,LowestBuffer,INDICATOR_DATA);

//---- 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);

   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,NULL);

   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,NULL);

   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,NULL);

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

   ArraySetAsSeries(UpBuffer,true);

   ArraySetAsSeries(DnBuffer,true);

   ArraySetAsSeries(UpperBuffer,true);

   ArraySetAsSeries(LowerBuffer,true);

   ArraySetAsSeries(ColorUpperBuffer,true);

   ArraySetAsSeries(ColorLowerBuffer,true);

   ArraySetAsSeries(LowestBuffer,true);

   ArraySetAsSeries(HighestBuffer,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);

   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);

   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);

   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);

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

   PlotIndexSetInteger(3,PLOT_ARROW,DnLable);

   PlotIndexSetInteger(4,PLOT_ARROW,UpLable);

//---- #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>:>= 

   IndicatorSetString(INDICATOR_SHORTNAME,"ZigZagOnParabolic_channel");

//--- 7025@H5=85 8=8F80;870F88

   return(INIT_SUCCEEDED);

  }

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

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

   int barHH,barLL,barHH1,barLL1;

   double h,l,mid0,mid1,SAR[],HH,LL,HH1,LL1;

   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;



      for(int index=rates_total-1; index>=limit && !IsStopped(); index--)

        {

         UpBuffer[index]=NULL;

         UpperBuffer[index]=NULL;

         HighestBuffer[index]=NULL;



         DnBuffer[index]=NULL;

         LowerBuffer[index]=NULL;

         LowestBuffer[index]=NULL;

        }

     }

   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]=0.0;

      LowestBuffer[bar]=0.0;



      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:; @0AGQB0 8=48:0B>@0

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

     {

      barHH=FindFirstExtremum(bar,rates_total,HighestBuffer,HH);

      barHH1=FindFirstExtremum(barHH+1,rates_total,HighestBuffer,HH1);



      if(barHH>=0 && barHH1>=0)

        {

         for(int index=barHH1-1; index>barHH && !IsStopped(); index--)

           {

            UpBuffer[index]=HH1;

            UpperBuffer[index]=HH1;

            ColorUpperBuffer[index]=ColorUpperBuffer[index+1];

           }



         for(int index=barHH; index>=bar && !IsStopped(); index--)

           {

            UpBuffer[index]=HH;

            UpperBuffer[index]=HH;

            if(HH>HH1) ColorUpperBuffer[index]=0;

            else if(HH<HH1) ColorUpperBuffer[index]=1;

            else ColorUpperBuffer[index]=ColorUpperBuffer[index+1];

           }

        }



      barLL=FindFirstExtremum(bar,rates_total,LowestBuffer,LL);

      barLL1=FindFirstExtremum(barLL+1,rates_total,LowestBuffer,LL1);



      if(barLL>=0 && barLL1>=0)

        {

         for(int index=barLL1-1; index>barLL && !IsStopped(); index--)

           {

            DnBuffer[index]=LL1;

            LowerBuffer[index]=LL1;

            ColorLowerBuffer[index]=ColorLowerBuffer[index+1];

           }



         for(int index=barLL; index>=bar && !IsStopped(); index--)

           {

            DnBuffer[index]=LL;

            LowerBuffer[index]=LL;

            if(LL>LL1) ColorLowerBuffer[index]=0;

            else if(LL<LL1) ColorLowerBuffer[index]=1;

            else ColorLowerBuffer[index]=ColorLowerBuffer[index+1];

           }

        }

     }

//----     

   return(rates_total);

  }

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

//| >8A: A0<>9 ?5@2>9 25@H8=K 837030 2 1CD5@0E B09<A5@8OE          |

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

int FindFirstExtremum(int StartPos,int Rates_total,double &Array[],double &Extremum)

  {

//----

   for(int bar=StartPos; bar<Rates_total; bar++)

     {

      if(Array[bar] && Array[bar]!=EMPTY_VALUE)

        {

         Extremum=Array[bar];

         return(bar);

         break;

        }

     }

//----

   Extremum=NULL;

   return(-1);

  }

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

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