Author: Copyright © 2010, Nikolay Kositsin
0 Views
0 Downloads
0 Favorites
JMA_v3
ÿþ//+------------------------------------------------------------------+ 

//|                                                          JMA.mq5 | 

//|                    MQL5 code: Copyright © 2010, Nikolay Kositsin |

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

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

#property copyright "Copyright © 2010, Nikolay Kositsin"

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

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

#property version   "1.02"

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

#property indicator_chart_window 

//---- :>;8G5AB2> 8=48:0B>@=KE 1CD5@>2

#property indicator_buffers 1 

//---- 8A?>;L7>20=> 2A53> >4=> 3@0D8G5A:>5 ?>AB@>5=85

#property indicator_plots   1

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

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

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

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

#property indicator_type1   DRAW_LINE

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

#property indicator_color1 clrRed

//---- ;8=8O 8=48:0B>@0 - =5?@5@K2=0O :@820O

#property indicator_style1  STYLE_SOLID

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

#property indicator_width1  1

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

#property indicator_label1  "JMA"

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

//|  >1JO2;5=85 ?5@5G8A;5=89                     |

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

enum ENUM_APPLIED_PRICE_ //"8? :>=AB0=BK

  {

   PRICE_CLOSE_ = 1,     //PRICE_CLOSE

   PRICE_OPEN_,          //PRICE_OPEN

   PRICE_HIGH_,          //PRICE_HIGH

   PRICE_LOW_,           //PRICE_LOW

   PRICE_MEDIAN_,        //PRICE_MEDIAN

   PRICE_TYPICAL_,       //PRICE_TYPICAL

   PRICE_WEIGHTED_,      //PRICE_WEIGHTED

   PRICE_SIMPL_,         //PRICE_SIMPL_

   PRICE_QUARTER_,       //PRICE_QUARTER_

   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_

   PRICE_TRENDFOLLOW1_,  // TrendFollow_2 Price 

   PRICE_DEMARK_         // Demark Price 

  };

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

//|  %+  " + "                 |

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

input int Length_=7;                              // 3;C18=0 A3;06820=8O                   

input int Phase_=100;                             // ?0@0<5B@ A3;06820=8O,

//---- 87<5=ONI89AO 2 ?@545;0E -100 ... +100,

//---- 2;8O5B =0 :0G5AB2> ?5@5E>4=>3> ?@>F5AA0;

input ENUM_APPLIED_PRICE_ IPC=PRICE_CLOSE_;       // F5=>20O :>=AB0=B0

input int Shift=0;                                // A4283 8=48:0B>@0 ?> 3>@87>=B0;8 2 10@0E

input int PriceShift=0;                           // c4283 8=48:0B>@0 ?> 25@B8:0;8 2 ?C=:B0E

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

//---- >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 IndBuffer[];

//----  1JO2;5=85 3;>10;L=KE ?5@5<5==KE

double dPriceShift;

int min_rates_total;

//----

bool m_start;

//----

double m_array[62];

//----

double m_degree,m_Phase,m_sense;

double m_Krx,m_Kfd,m_Krj,m_Kct;

double m_var1,m_var2;

//----

int m_pos2,m_pos1;

int m_Loop1,m_Loop2;

int m_midd1,m_midd2;

int m_count1,m_count2,m_count3;

//----

double m_ser1,m_ser2;

double m_Sum1,m_Sum2,m_JMA;

double m_storage1,m_storage2,m_djma;

double m_hoop1[128],m_hoop2[11],m_data[128];

//---- 5@5<5==K5 4;O 2>AAB0=>2;5=8O @0AGQB>2 =0 =570:@KB>< 10@5

int m_pos2_,m_pos1_;

int m_Loop1_,m_Loop2_;

int m_midd1_,m_midd2_;

int m_count1_,m_count2_,m_count3_;

//----

double m_ser1_,m_ser2_;

double m_Sum1_,m_Sum2_,m_JMA_;

double m_storage1_,m_storage2_,m_djma_;

double m_hoop1_[128],m_hoop2_[11],m_data_[128];

//----

bool m_bhoop1[128],m_bhoop2[11],m_bdata[128];

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

//| JMA indicator initialization function                            | 

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

void OnInit()

  {

//---- 8=8F80;870F8O 3;>10;L=KE ?5@5<5==KE 

   min_rates_total=30+1;

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

   SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);

//---- >ACI5AB2;5=85 A42830 8=48:0B>@0 ?> 3>@87>=B0;8 =0 Shift

   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);

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

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);

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

//---- 8=8F80;870F88 ?5@5<5==>9 4;O :>@>B:>3> 8<5=8 8=48:0B>@0

   string shortname;

   StringConcatenate(shortname,"JMA( Length = ",Length_,", Phase = ",Phase_,")");

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

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

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);

//---- =8F80;870F8O A42830 ?> 25@B8:0;8

   dPriceShift=_Point*PriceShift;

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

  }

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

//| JMA 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[],     // F5=>2>9 <0AA82 <0:A8<C<>2 F5=K 4;O @0AGQB0 8=48:0B>@0

                const double& low[],      // F5=>2>9 <0AA82 <8=8<C<>2 F5=K  4;O @0AGQB0 8=48:0B>@0

                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)return(0);



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

   int posA,posB,back,first,bar;

   int shift2,shift1,numb;

//----

   double Res,ResPow;

   double dser3,dser4,jjma,series;

   double ratio,Extr,ser0,resalt;

   double newvel,dSupr,Pow1,hoop1,SmVel;

   double Pow2,Pow2x2,Suprem1,Suprem2;

   double dser1,dser2,extent=0,factor;



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

     {

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

      //---- =8F80;870F8O :>MDD8F85=B>2

      JJMAInit(Phase_,Length_,PriceSeries(IPC,0,open,low,high,close));

     }

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



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

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

     {

      //---- 1@0I5=85 : DC=:F88 PriceSeries 4;O ?>;CG5=8O 2E>4=>9 F5=K Series

      series=PriceSeries(IPC,bar,open,low,high,close);



      //----

      if(m_Loop1<61)

        {

         m_Loop1++;

         m_array[m_Loop1]=series;

        }

      //-x-x-x-x-x-x-x-+      <<<  0AGQB DC=:F88 JMASeries() >>> 

      if(m_Loop1>30)

        {

         if(!m_start)

           {

            m_start= true;

            shift1 = 1;

            back=29;

            //----

            m_ser2 = m_array[1];

            m_ser1 = m_ser2;

           }

         else back=0;

         //-S-S-S-S-+

         for(int rrr=back; rrr>=0; rrr--)

           {

            if(rrr==0)

               ser0=series;

            else ser0=m_array[31-rrr];

            //----

            dser1 = ser0 - m_ser1;

            dser2 = ser0 - m_ser2;

            //----

            if(MathAbs(dser1)>MathAbs(dser2))

               m_var2=MathAbs(dser1);

            else m_var2=MathAbs(dser2);

            //----

            Res=m_var2;

            newvel=Res+0.0000000001;



            if(m_count1<=1)

               m_count1=127;

            else m_count1--;

            //----

            if(m_count2<=1)

               m_count2=10;

            else m_count2--;

            //----

            if(m_count3<128) m_count3++;

            //----          

            m_Sum1+=newvel-m_hoop2[m_count2];

            //----

            m_hoop2[m_count2]=newvel;

            m_bhoop2[m_count2]=true;

            //----

            if(m_count3>10)

               SmVel=m_Sum1/10.0;

            else SmVel=m_Sum1/m_count3;

            //----

            if(m_count3>127)

              {

               hoop1=m_hoop1[m_count1];

               m_hoop1[m_count1]=SmVel;

               m_bhoop1[m_count1]=true;

               numb = 64;

               posB = numb;

               //----

               while(numb>1)

                 {

                  if(m_data[posB]<hoop1)

                    {

                     numb /= 2.0;

                     posB += numb;

                    }

                  else

                     if(m_data[posB]<=hoop1) numb=1;

                  else

                    {

                     numb /= 2.0;

                     posB -= numb;

                    }

                 }

              }

            else

              {

               m_hoop1[m_count1]=SmVel;

               m_bhoop1[m_count1]=true;

               //----

               if(m_midd1+m_midd2>127)

                 {

                  m_midd2--;

                  posB=m_midd2;

                 }

               else

                 {

                  m_midd1++;

                  posB=m_midd1;

                 }

               //----

               if(m_midd1>96)

                  m_pos2=96;

               else m_pos2=m_midd1;

               //----

               if(m_midd2<32)

                  m_pos1=32;

               else m_pos1=m_midd2;

              }

            //----

            numb = 64;

            posA = numb;

            //----

            while(numb>1)

              {

               if(m_data[posA]>=SmVel)

                 {

                  if(m_data[posA-1]<=SmVel) numb=1;

                  else

                    {

                     numb /= 2.0;

                     posA -= numb;

                    }

                 }

               else

                 {

                  numb /= 2.0;

                  posA += numb;

                 }

               //----

               if(posA==127)

                  if(SmVel>m_data[127]) posA=128;

              }

            //----

            if(m_count3>127)

              {

               if(posB>=posA)

                 {

                  if(m_pos2+1>posA)

                     if(m_pos1-1<posA) m_Sum2+=SmVel;

                  //----         

                  else if(m_pos1+0>posA)

                  if(m_pos1-1<posB)

                     m_Sum2+=m_data[m_pos1-1];

                 }

               else

               if(m_pos1>=posA)

                 {

                  if(m_pos2+1<posA)

                     if(m_pos2+1>posB)

                        m_Sum2+=m_data[m_pos2+1];

                 }

               else if(m_pos2+2>posA) m_Sum2+=SmVel;

               //----               

               else if(m_pos2+1<posA)

               if(m_pos2+1>posB)

                  m_Sum2+=m_data[m_pos2+1];

               //----        

               if(posB>posA)

                 {

                  if(m_pos1-1<posB)

                     if(m_pos2+1>posB)

                        m_Sum2-=m_data[posB];

                  //----

                  else if(m_pos2<posB)

                  if(m_pos2+1>posA)

                     m_Sum2-=m_data[m_pos2];

                 }

               else

                 {

                  if(m_pos2+1>posB && m_pos1-1<posB)

                     m_Sum2-=m_data[posB];

                  //----                    

                  else if(m_pos1+0>posB)

                  if(m_pos1-0<posA)

                     m_Sum2-=m_data[m_pos1];

                 }

              }

            //----

            if(posB<=posA)

              {

               if(posB==posA)

                 {

                  m_data[posA]=SmVel;

                  m_bdata[posA]=true;

                 }

               else

                 {

                  for(numb=posB+1; numb<=posA-1; numb++)

                    {

                     m_data[numb-1]=m_data[numb];

                     m_bdata[numb-1]=true;

                    }

                  //----                 

                  m_data[posA-1]=SmVel;

                  m_bdata[posA-1]=true;

                 }

              }

            else

              {

               for(numb=posB-1; numb>=posA; numb--)

                 {

                  m_data[numb+1]=m_data[numb];

                  m_bdata[numb+1]=true;

                 }

               //----                    

               m_data[posA]=SmVel;

               m_bdata[posA]=true;

              }

            //---- 

            if(m_count3<=127)

              {

               m_Sum2=0;

               for(numb=m_pos1; numb<=m_pos2; numb++)

                  m_Sum2+=m_data[numb];

              }

            //---- 

            resalt=m_Sum2/(m_pos2-m_pos1+1.0);

            //----

            if(m_Loop2>30)

               m_Loop2=31;

            else m_Loop2++;

            //----

            if(m_Loop2<=30)

              {

               if(dser1>0.0)

                  m_ser1=ser0;

               else m_ser1=ser0-dser1*m_Kct;

               //----

               if(dser2<0.0)

                  m_ser2=ser0;

               else m_ser2=ser0-dser2*m_Kct;

               //----

               m_JMA=series;

               //----

               if(m_Loop2!=30) continue;

               else

                 {

                  m_storage1=series;

                  if(MathCeil(m_Krx)>=1)

                     dSupr=MathCeil(m_Krx);

                  else dSupr=1.0;

                  //----

                  if(dSupr>0) Suprem2=MathFloor(dSupr);

                  else

                    {

                     if(dSupr<0)

                        Suprem2=MathCeil(dSupr);

                     else Suprem2=0.0;

                    }

                  //----

                  if(MathFloor(m_Krx)>=1)

                     m_var2=MathFloor(m_Krx);

                  else m_var2=1.0;

                  //----

                  if(m_var2>0) Suprem1=MathFloor(m_var2);

                  else

                    {

                     if(m_var2<0)

                        Suprem1=MathCeil(m_var2);

                     else Suprem1=0.0;

                    }

                  //----

                  if(Suprem2==Suprem1) factor=1.0;

                  else

                    {

                     dSupr=Suprem2-Suprem1;

                     factor=(m_Krx-Suprem1)/dSupr;

                    }

                  //---- 

                  if(Suprem1<=29)

                     shift1=(int)Suprem1;

                  else shift1=29;

                  //----

                  if(Suprem2<=29)

                     shift2=(int)Suprem2;

                  else shift2=29;



                  dser3 = series - m_array[m_Loop1 - shift1];

                  dser4 = series - m_array[m_Loop1 - shift2];

                  //----

                  m_djma=dser3 *(1.0-factor)/Suprem1+dser4*factor/Suprem2;

                 }

              }

            else

              {

               ResPow=MathPow(Res/resalt,m_degree);

               //----

               if(m_Kfd>=ResPow)

                  m_var1= ResPow;

               else m_var1=m_Kfd;

               //----

               if(m_var1<1.0)m_var2=1.0;

               else

                 {

                  if(m_Kfd>=ResPow)

                     m_sense=ResPow;

                  else m_sense=m_Kfd;



                  m_var2=m_sense;

                 }

               //---- 

               extent=m_var2;

               Pow1=MathPow(m_Kct,MathSqrt(extent));

               //----

               if(dser1>0.0)

                  m_ser1=ser0;

               else m_ser1=ser0-dser1*Pow1;

               //----

               if(dser2<0.0)

                  m_ser2=ser0;

               else m_ser2=ser0-dser2*Pow1;

              }

           }

         //---- 

         if(m_Loop2>30)

           {

            Pow2=MathPow(m_Krj,extent);

            //----

            m_storage1 *= Pow2;

            m_storage1 += (1.0 - Pow2) * series;

            m_storage2 *= m_Krj;

            m_storage2 += (series - m_storage1) * (1.0 - m_Krj);

            //----

            Extr=m_Phase*m_storage2+m_storage1;

            //----

            Pow2x2= Pow2 * Pow2;

            ratio = Pow2x2-2.0 * Pow2+1.0;

            m_djma *= Pow2x2;

            m_djma += (Extr - m_JMA) * ratio;

            //----

            m_JMA+=m_djma;

           }

        }

      //-x-x-x-x-x-x-x-+



      if(m_Loop1<=30) continue;

      jjma=m_JMA;



      //---- >AAB0=>2;5=85 7=0G5=89 ?5@5<5==KE

      if(bar==rates_total-1)

        {

         //---- >AAB0=>2;5=85 87<5=Q==KE OG55: <0AA82>2 87 ?O<OB8

         for(numb = 0; numb < 128; numb++) if(m_bhoop1[numb]) m_hoop1[numb] = m_hoop1_[numb];

         for(numb = 0; numb < 11;  numb++) if(m_bhoop2[numb]) m_hoop2[numb] = m_hoop2_[numb];

         for(numb = 0; numb < 128; numb++) if(m_bdata [numb]) m_data [numb] = m_data_ [numb];



         //---- 1=C;5=85 =><5@>2 87<5=Q==KE OG55: <0AA82>2

         ArrayInitialize(m_bhoop1,false);

         ArrayInitialize(m_bhoop2,false);

         ArrayInitialize(m_bdata,false);



         //---- 70?8AL 7=0G5=89 ?5@5<5==KE 87 ?O<OB8 

         m_JMA=m_JMA_;

         m_djma = m_djma_;

         m_ser1 = m_ser1_;

         m_ser2 = m_ser2_;

         m_Sum2 = m_Sum2_;

         m_pos1 = m_pos1_;

         m_pos2 = m_pos2_;

         m_Sum1 = m_Sum1_;

         m_Loop1 = m_Loop1_;

         m_Loop2 = m_Loop2_;

         m_count1 = m_count1_;

         m_count2 = m_count2_;

         m_count3 = m_count3_;

         m_storage1 = m_storage1_;

         m_storage2 = m_storage2_;

         m_midd1 = m_midd1_;

         m_midd2 = m_midd2_;

        }



      //---- !>E@0=5=85 7=0G5=89 ?5@5<5==KE

      if(bar==rates_total-2)

        {

         //---- 70?8AL 87<5=Q==KE OG55: <0AA82>2 2 ?O<OBL

         for(numb = 0; numb < 128; numb++) if(m_bhoop1[numb]) m_hoop1_[numb] = m_hoop1[numb];

         for(numb = 0; numb < 11;  numb++) if(m_bhoop2[numb]) m_hoop2_[numb] = m_hoop2[numb];

         for(numb = 0; numb < 128; numb++) if(m_bdata [numb]) m_data_ [numb] = m_data [numb];



         //---- 1=C;5=85 =><5@>2 87<5=Q==KE OG55: <0AA82>2

         ArrayInitialize(m_bhoop1,false);

         ArrayInitialize(m_bhoop2,false);

         ArrayInitialize(m_bdata,false);



         //---- 70?8AL 7=0G5=89 ?5@5<5==KE 2 ?O<OBL

         m_JMA_=m_JMA;

         m_djma_ = m_djma;

         m_Sum2_ = m_Sum2;

         m_ser1_ = m_ser1;

         m_ser2_ = m_ser2;

         m_pos1_ = m_pos1;

         m_pos2_ = m_pos2;

         m_Sum1_ = m_Sum1;

         m_Loop1_ = m_Loop1;

         m_Loop2_ = m_Loop2;

         m_count1_ = m_count1;

         m_count2_ = m_count2;

         m_count3_ = m_count3;

         m_storage1_ = m_storage1;

         m_storage2_ = m_storage2;

         m_midd1_ = m_midd1;

         m_midd2_ = m_midd2;

        }

      //----       

      IndBuffer[bar]=jjma+dPriceShift;

     }

//----     

   return(rates_total);

  }

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

//|  =8F80;870F8O ?5@5<5==KE 0;3>@8B<0 JMA                          |

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

void JJMAInit(double Phase,double Length,double series)

// JMAInit(Phase, Length, series) 

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

  {

//----  

//---- <<<  0AGQB :>MDD8F85=B>2  >>> 

   m_midd1 = 63;

   m_midd2 = 64;

   m_start = false;



//----

   for(int numb = 0;   numb <= m_midd1; numb++) m_data[numb] = -1000000.0;

   for(int numb = m_midd2; numb <= 127;   numb++) m_data[numb] = +1000000.0;



//---- A5 OG59:8 <0AA82>2 4>;6=K 1KBL ?5@5?8A0=K

   ArrayInitialize(m_bhoop1,true);

   ArrayInitialize(m_bhoop2,true);

   ArrayInitialize(m_bdata,true);



//---- #40;5=85 <CA>@0 87 <0AA82>2 ?@8 ?>2B>@=KE 8=8F80;870F8OE 

   ArrayInitialize(m_hoop1_, 0.0);

   ArrayInitialize(m_hoop2_, 0.0);

   ArrayInitialize(m_hoop1,  0.0);

   ArrayInitialize(m_hoop2,  0.0);

   ArrayInitialize(m_array,  0.0);

//----

   m_djma = 0.0;

   m_Sum1 = 0.0;

   m_Sum2 = 0.0;

   m_ser1 = 0.0;

   m_ser2 = 0.0;

   m_pos1 = 0.0;

   m_pos2 = 0.0;

   m_Loop1 = 0.0;

   m_Loop2 = 0.0;

   m_count1 = 0.0;

   m_count2 = 0.0;

   m_count3 = 0.0;

   m_storage1 = 0.0;

   m_storage2 = 0.0;

   m_JMA=series;



   if(Phase>=-100 && Phase<=100)

      m_Phase=Phase/100.0+1.5;

//----  

   if(Phase > +100) m_Phase = 2.5;

   if(Phase < -100) m_Phase = 0.5;

//----

   double velA,velB,velC,velD;

//----

   if(Length>=1.0000000002)

      velA=(Length-1.0)/2.0;

   else velA=0.0000000001;

//----

   velA *= 0.9;

   m_Krj = velA / (velA + 2.0);

   velC = MathSqrt(velA);

   velD = MathLog(velC);

   m_var1= velD;

   m_var2= m_var1;

//----

   velB=MathLog(2.0);

   m_sense=(m_var2/velB)+2.0;

   if(m_sense<0.0) m_sense=0.0;

   m_Kfd=m_sense;

//----

   if(m_Kfd>=2.5)

      m_degree=m_Kfd-2.0;

   else m_degree=0.5;

//----

   m_Krx = velC * m_Kfd;

   m_Kct = m_Krx / (m_Krx + 1.0);

//----

  }

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

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