ParabolicUsMoving

Author: Copyright © 2017, Nikolay Kositsin
Indicators Used
Moving average indicator
2 Views
0 Downloads
0 Favorites
ParabolicUsMoving
ÿþ//+---------------------------------------------------------------------+

//|                                               ParabolicUsMoving.mq5 | 

//|                                  Copyright © 2017, Nikolay Kositsin | 

//|                                 Khabarovsk,   farria@mail.redcom.ru | 

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

#property copyright "Copyright © 2017, Nikolay Kositsin"

#property link "farria@mail.redcom.ru"

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

#property version   "1.00"

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

#property indicator_buffers 6

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

#property indicator_plots   4

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

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

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

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

#property indicator_type1   DRAW_FILLING

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

#property indicator_color1  clrDeepSkyBlue,clrMagenta

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

#property indicator_label1  "Signal HTF"

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

//|  0@0<5B@K >B@8A>2:8 <54256L53> 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= Magenta F25B

#property indicator_color2  clrMagenta

//---- B>;I8=0 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  "Lower Parabolic"

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

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

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

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

#property indicator_type3   DRAW_ARROW

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

#property indicator_color3  clrDodgerBlue

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

#property indicator_width3  2

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

#property indicator_label3 "Upper Parabolic"

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

//|  0@0<5B@K >B@8A>2:8 <54256L53> 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= Magenta F25B

#property indicator_color4  clrMagenta

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

#property indicator_width4  4

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

#property indicator_label4  "Parabolic Sell"

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

//|  0@0<5B@K >B@8A>2:8 1KGL3> 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= DodgerBlue F25B

#property indicator_color5  clrDodgerBlue

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

#property indicator_width5  4

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

#property indicator_label5 "Parabolic Buy"

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

//|  >1JO2;5=85 :>=AB0=B                         |

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

#define RESET  0 // >=AB0=B0 4;O 2>72@0B0 B5@<8=0;C :><0=4K =0 ?5@5AGQB 8=48:0B>@0

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

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

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

//---- 0@0<5B@K 8=48:0B>@0 Parabolic

input int   MAPeriod=13;

input  ENUM_MA_METHOD   MAType=MODE_EMA;

input ENUM_APPLIED_PRICE   MAPrice=PRICE_CLOSE;

input double StepH_=0.02;//(03 4;O 25@E=8E B>G5:

input double MaximumH=0.5;//0:A8<C< 4;O 25@E=8E B>G5:

input double StepL_=0.02;//(03 4;O =86=8E B>G5:

input double MaximumL=0.5;//0:A8<C< 4;O =86=8E B>G5:

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



//---- >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 BuyBuffer[],SellBuffer[];

double UpSarBuffer[],DnSarBuffer[];

double SarBuffer[],LineBuffer[];

//---- 

bool dirlong_,first_;

double ep_,start_,last_high_,last_low_,prev_sar_;

double StepH,StepL;

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

int MA_Handle;

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

int min_rates_total;

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

//| Parabolic indicator initialization function                      | 

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

int OnInit()

  {

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

   min_rates_total=MAPeriod+2;

   StepH=MathMin(StepH_,MaximumH);

   StepL=MathMin(StepL_,MaximumL);

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

   MA_Handle=iMA(NULL,0,MAPeriod,0,MAType,MAPrice);

   if(MA_Handle==INVALID_HANDLE)

     {

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

      return(INIT_FAILED);

     }

//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 8=48:0B>@=K9 1CD5@

   SetIndexBuffer(0,SarBuffer,INDICATOR_DATA);

//---- >ACI5AB2;5=85 A42830 =0G0;0 >BAGQB0 >B@8A>2:8 8=48:0B>@0 1

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);

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

   PlotIndexSetInteger(0,PLOT_ARROW,158);

//---- CAB0=>2:0 7=0G5=89 8=48:0B>@0, :>B>@K5 =5 1C4CB 2848<K =0 3@0D8:5

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);



//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 8=48:0B>@=K9 1CD5@

   SetIndexBuffer(1,LineBuffer,INDICATOR_DATA);

   

//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 8=48:0B>@=K9 1CD5@

   SetIndexBuffer(2,UpSarBuffer,INDICATOR_DATA);

//---- >ACI5AB2;5=85 A42830 =0G0;0 >BAGQB0 >B@8A>2:8 8=48:0B>@0 1

   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);

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

   PlotIndexSetInteger(1,PLOT_ARROW,158);

//---- CAB0=>2:0 7=0G5=89 8=48:0B>@0, :>B>@K5 =5 1C4CB 2848<K =0 3@0D8:5

   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);



//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 8=48:0B>@=K9 1CD5@

   SetIndexBuffer(3,DnSarBuffer,INDICATOR_DATA);

//---- >ACI5AB2;5=85 A42830 =0G0;0 >BAGQB0 >B@8A>2:8 8=48:0B>@0 2

   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);

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

   PlotIndexSetInteger(2,PLOT_ARROW,158);

//---- CAB0=>2:0 7=0G5=89 8=48:0B>@0, :>B>@K5 =5 1C4CB 2848<K =0 3@0D8:5

   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);



//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 8=48:0B>@=K9 1CD5@

   SetIndexBuffer(4,SellBuffer,INDICATOR_DATA);

//---- >ACI5AB2;5=85 A42830 =0G0;0 >BAGQB0 >B@8A>2:8 8=48:0B>@0 3

   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);

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

   PlotIndexSetInteger(3,PLOT_ARROW,159);

//---- CAB0=>2:0 7=0G5=89 8=48:0B>@0, :>B>@K5 =5 1C4CB 2848<K =0 3@0D8:5

   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);



//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 8=48:0B>@=K9 1CD5@

   SetIndexBuffer(5,BuyBuffer,INDICATOR_DATA);

//---- >ACI5AB2;5=85 A42830 =0G0;0 >BAGQB0 >B@8A>2:8 8=48:0B>@0 4

   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);

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

   PlotIndexSetInteger(4,PLOT_ARROW,159);

//---- CAB0=>2:0 7=0G5=89 8=48:0B>@0, :>B>@K5 =5 1C4CB 2848<K =0 3@0D8:5

   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE);



//---- A>740=85 8<5=8 4;O >B>1@065=8O 2 >B45;L=>< ?>4>:=5 8 2> 2A?;K20NI59 ?>4A:07:5

   IndicatorSetString(INDICATOR_SHORTNAME,"ParabolicUsMoving");



//---- >?@545;5=85 B>G=>AB8 >B>1@065=8O 7=0G5=89 8=48:0B>@0

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);

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

   return(INIT_SUCCEEDED);

  }

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

//| Parabolic iteration function                                     | 

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

int OnCalculate(

                const int rates_total,    // :>;8G5AB2> 8AB>@88 2 10@0E =0 B5:CI5< B8:5

                const int prev_calculated,// :>;8G5AB2> 8AB>@88 2 10@0E =0 ?@54K4CI5< B8:5

                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(rates_total<min_rates_total || BarsCalculated(MA_Handle)<rates_total)  return(RESET);



//---- 1JO2;5=85 ?5@5<5==KE A ?;020NI59 B>G:>9

   double price_low,price_high,sar;

   double ep,start,last_high,last_low,prev_sar;

//---- 1JO2;5=85 F5;KE ?5@5<5==KE 8 ?>;CG5=85 C65 ?>AG8B0==KE 10@>2

   int gfirst,bar,to_copy;

   bool dirlong,first;



//---- @0AGQB AB0@B>2>3> =><5@0 first 4;O F8:;0 ?5@5AGQB0 10@>2

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

     {

      gfirst=min_rates_total; // AB0@B>2K9 =><5@ 4;O @0AGQB0 2A5E 10@>2

      to_copy=rates_total-gfirst+1;

      first_=false;

      dirlong_=false;

      last_high_=0.0;

      last_low_=999999999.0;

      ep_=PriceSeries(MAPrice,min_rates_total-1,open,low,high,close);

      prev_sar_=ep_;

      start_=NULL;

     }

   else 

    {

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

    to_copy=rates_total-prev_calculated+1;

    }

   

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

   if(CopyBuffer(MA_Handle,0,0,to_copy,LineBuffer)<=0) return(RESET);



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

   ep=ep_;

   start=start_;

   last_high=last_high_;

   last_low=last_low_;

   dirlong=dirlong_;

   first=first_;

   prev_sar=prev_sar_;



//---- A=>2=>9 F8:; @0AGQB0 8=48:0B>@0 Parabolic

   for(bar=gfirst; bar<rates_total; bar++)

     {

      price_low=PriceSeries(MAPrice,bar,open,low,high,close);

      price_high=PriceSeries(MAPrice,bar,open,low,high,close);

      sar=prev_sar+start*(ep-prev_sar);

      //----

      if(dirlong)

        {

         if(ep<price_high && start+StepL<=MaximumL) start+=StepL;

         if(sar>=price_low)

           {

            start=StepL;

            dirlong=false;

            ep=price_low;

            last_low=price_low;



            if(price_high<last_high) sar=last_high;

            else sar=price_high;

           }

         else

           {

            if(ep<price_low && start+StepL<=MaximumL) start+=StepL;



            if(ep<price_high)

              {

               last_high=price_high;

               ep=price_high;

              }

           }

        }

      //----

      else

        {

         if(ep>price_low && start+StepH<=MaximumH) start+=StepH;

         if(sar<=price_high)

           {

            start=StepH;

            dirlong=true;

            ep=price_high;

            last_high=price_high;

            if(price_low>last_low) sar=last_low;

            else sar=price_low;

           }

         else

           {

            if(ep>price_high && start+StepH<=MaximumH) start+=StepH;



            if(ep>price_low)

              {

               last_low=price_low;

               ep=price_low;

              }

           }

        }

      

      SarBuffer[bar]=sar;

      //---- >1=C;8< A>45@68<>5 8=48:0B>@=KE 1CD5@>2 4> @0AGQB0

      DnSarBuffer[bar]=EMPTY_VALUE;

      UpSarBuffer[bar]=EMPTY_VALUE;



      if(PriceSeries(MAPrice,bar,open,low,high,close)<sar) UpSarBuffer[bar]=sar;

      else DnSarBuffer[bar]=sar;



      //---- A>E@0=8< 7=0G5=8O ?5@5<5==KE

      if(bar==rates_total-2)

        {

         ep_=ep;

         start_=start;

         last_high_=last_high;

         last_low_=last_low;

         dirlong_=dirlong;

         first_=first;

         prev_sar_=sar;

        }

        

        if(bar<rates_total-1) prev_sar=sar;

     }



//---- ?5@5AGQB AB0@B>2>3> =><5@0 4;O @0AGQB0 2A5E 10@>2

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

      gfirst++;



//---- 2B>@>9 F8:; @0AGQB0 Parabolic

   for(bar=gfirst; bar<rates_total; bar++)

     {

      //---- >1=C;8< A>45@68<>5 8=48:0B>@=KE 1CD5@>2 4> @0AGQB0

      BuyBuffer[bar]=EMPTY_VALUE;

      SellBuffer[bar]=EMPTY_VALUE;

      

      if(UpSarBuffer[bar-1]==EMPTY_VALUE&&UpSarBuffer[bar]!=EMPTY_VALUE) SellBuffer[bar]=UpSarBuffer[bar];

      if(DnSarBuffer[bar-1]==EMPTY_VALUE&&DnSarBuffer[bar]!=EMPTY_VALUE) BuyBuffer[bar]=DnSarBuffer[bar];

     }

//----      

   return(rates_total);

  }

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

//| >;CG5=85 7=0G5=8O F5=>2>9 B09<A5@88                             |

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

double PriceSeries

(

 uint applied_price,// &5=>20O :>=AB0=B0

 uint   bar,// =45:A A42830 >B=>A8B5;L=> B5:CI53> 10@0 =0 C:070==>5 :>;8G5AB2> ?5@8>4>2 =0704 8;8 2?5@Q4).

 const double &Open[],

 const double &Low[],

 const double &High[],

 const double &Close[]

 )

//PriceSeries(applied_price, bar, open, low, high, close)

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

  {

//----

   switch(applied_price)

     {

      //---- &5=>2K5 :>=AB0=BK 87 ?5@5G8A;5=8O ENUM_APPLIED_PRICE

      case  PRICE_CLOSE: return(Close[bar]);

      case  PRICE_OPEN: return(Open [bar]);

      case  PRICE_HIGH: return(High [bar]);

      case  PRICE_LOW: return(Low[bar]);

      case  PRICE_MEDIAN: return((High[bar]+Low[bar])/2.0);

      case  PRICE_TYPICAL: return((Close[bar]+High[bar]+Low[bar])/3.0);

      case  PRICE_WEIGHTED: return((2*Close[bar]+High[bar]+Low[bar])/4.0);



      //----                            

      case  8: return((Open[bar] + Close[bar])/2.0);

      case  9: return((Open[bar] + Close[bar] + High[bar] + Low[bar])/4.0);

      //----                                

      case 10:

        {

         if(Close[bar]>Open[bar])return(High[bar]);

         else

           {

            if(Close[bar]<Open[bar])

               return(Low[bar]);

            else return(Close[bar]);

           }

        }

      //----         

      case 11:

        {

         if(Close[bar]>Open[bar])return((High[bar]+Close[bar])/2.0);

         else

           {

            if(Close[bar]<Open[bar])

               return((Low[bar]+Close[bar])/2.0);

            else return(Close[bar]);

           }

         break;

        }

      //----         

      case 12:

        {

         double res=High[bar]+Low[bar]+Close[bar];

         if(Close[bar]<Open[bar]) res=(res+Low[bar])/2;

         if(Close[bar]>Open[bar]) res=(res+High[bar])/2;

         if(Close[bar]==Open[bar]) res=(res+Close[bar])/2;

         return(((res-Low[bar])+(res-High[bar]))/2);

        }

      //----

      default: return(Close[bar]);

     }

//----

//return(0);

  }

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

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