SpearmanRankCorrelation_Histogram

Author: Copyright © 2007, MetaQuotes Software Corp.
0 Views
0 Downloads
0 Favorites
SpearmanRankCorrelation_Histogram
ÿþ//+------------------------------------------------------------------+

//|                            SpearmanRankCorrelation_Histogram.mq5 |

//|                      Copyright © 2007, MetaQuotes Software Corp. |

//|                                        http://www.metaquotes.net |

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

// http://www.infamed.com/stat/s05.html

#property copyright "Copyright © 2007, MetaQuotes Software Corp."

#property link      "http://www.metaquotes.net"

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

#property version   "1.00"

//---- >B@8A>2:0 8=48:0B>@0 2 >B45;L=>< >:=5

#property indicator_separate_window

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

#property indicator_buffers 2 

//---- 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 G5BK@QEF25B=>9 38AB>3@0<<K

#property indicator_type1 DRAW_COLOR_HISTOGRAM

//---- 2 :0G5AB25 F25B>2 G5BK@QEF25B=>9 38AB>3@0<<K 8A?>;L7>20=K

#property indicator_color1 clrMagenta,clrPurple,clrGray,clrBlue,clrDodgerBlue

//---- ;8=8O 8=48:0B>@0 - A?;>H=0O

#property indicator_style1 STYLE_SOLID

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

#property indicator_width1 2

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

//---- ?0@0<5B@K <8=8<0;L=>3> 8 <0:A8<0;L=>3> 7=0G5=89 8=48:0B>@0

#property indicator_minimum -1.0

#property indicator_maximum +1.0

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

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

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

input int  rangeN=14;

input int  CalculatedBars=0;

input int  Maxrange=30;

input bool direction=true;

input double inHighLevel=+0.5;

input double inLowLevel=-0.5;

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

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

int min_rates_total;

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

double multiply;

double R2[],TrueRanks[];

int    PriceInt[],SortInt[],Maxrange_;

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

//| calculate  RSP  function                                         |

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

double SpearmanRankCorrelation(double &Ranks[],int N)

  {

//----

   double res,z2=0.0;



   for(int iii=0; iii<N; iii++) z2+=MathPow(Ranks[iii]-iii-1,2);

   res=1-6*z2/(MathPow(N,3)-N);

//----

   return(res);

  }

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

//| Ranking array of prices function                                 |

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

void RankPrices(double &TrueRanks_[],int &InitialArray[])

  {

//----

   int i,k,m,dublicat,counter,etalon;

   double dcounter,averageRank;



   ArrayCopy(SortInt,InitialArray,0,0,WHOLE_ARRAY);



   for(i=0; i<rangeN; i++) TrueRanks_[i]=i+1;

   

   ArraySort(SortInt);

   

   for(i=0; i<rangeN-1; i++)

     {

      if(SortInt[i]!=SortInt[i+1]) continue;



      dublicat=SortInt[i];

      k=i+1;

      counter=1;

      averageRank=i+1;



      while(k<rangeN)

        {

         if(SortInt[k]==dublicat)

           {

            counter++;

            averageRank+=k+1;

            k++;

           }

         else

            break;

        }

      dcounter=counter;

      averageRank=averageRank/dcounter;



      for(m=i; m<k; m++)

         TrueRanks_[m]=averageRank;

      i=k;

     }

   for(i=0; i<rangeN; i++)

     {

      etalon=InitialArray[i];

      k=0;

      while(k<rangeN)

        {

         if(etalon==SortInt[k])

           {

            R2[i]=TrueRanks_[k];

            break;

           }

         k++;

        }

     }

//----

   return;

  }

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

//| Custom indicator initialization function                         |

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

void OnInit()

  {

//---- @0A?@545;5=85 ?0<OB8 ?>4 <0AA82K ?5@5<5==KE   

   ArrayResize(R2,rangeN);

   ArrayResize(PriceInt,rangeN);

   ArrayResize(SortInt,rangeN);

//---- 87<5=5=85 8=45:A0F88 M;5<5=B>2 2 <0AA825 ?5@5<5==KE

   if(direction) ArraySetAsSeries(SortInt,true);

   ArrayResize(TrueRanks,rangeN);

//---- 8=8F80;870F8O ?5@5<5==KE

   if(Maxrange<=0)

      Maxrange_=10;

   else Maxrange_=Maxrange;

   multiply=MathPow(10,_Digits);

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

   SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);

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

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN);

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

//---- 70?@5B =0 >B>1@065=85 7=0G5=89 8=48:0B>@0 2 ;52>< 25@E=5< C3;C >:=0 8=48:0B>@0

   PlotIndexSetInteger(0,PLOT_SHOW_DATA,false);

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

   ArraySetAsSeries(IndBuffer,true);

//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 F25B>2>9, 8=45:A=K9 1CD5@   

   SetIndexBuffer(1,ColorIndBuffer,INDICATOR_COLOR_INDEX);

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

   ArraySetAsSeries(ColorIndBuffer,true);

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

   string shortname;

   if(rangeN>Maxrange_) shortname="Decrease rangeN input!";

   else StringConcatenate(shortname,"SpearmanRankCorrelation_Histogram(",rangeN,")");

//--- A>740=85 <5B:8 4;O >B>1@065=8O 2 DataWindow

   PlotIndexSetString(0,PLOT_LABEL,shortname);

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

//---- :>;8G5AB2>  3>@87>=B0;L=KE C@>2=59 8=48:0B>@0    

   IndicatorSetInteger(INDICATOR_LEVELS,3);

//---- 7=0G5=8O 3>@87>=B0;L=KE C@>2=59 8=48:0B>@0   

   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,inHighLevel);

   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,0);

   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,inLowLevel);

//---- 2 :0G5AB25 F25B>2 ;8=89 3>@87>=B0;L=KE C@>2=59 8A?>;L7>20= @>7>2K9 8 A8=89 F25B0  

   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrMagenta);

   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGray);

   IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrBlue);

//---- 2 ;8=88 3>@87>=B0;L=>3> C@>2=O 8A?>;L7>20= :>@>B:89 HB@8E-?C=:B8@  

   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASHDOTDOT);

   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASH);

   IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASHDOTDOT);

//----

  }

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

//| Custom indicator 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 int begin,          // =><5@ =0G0;0 4>AB>25@=>3> >BAG5B0 10@>2

                const double &price[]     // F5=>2>9 <0AA82 4;O @0AG5B0 8=48:0B>@0

                )

  {

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

   if(rates_total<rangeN+begin) return(0);

   if(rangeN>Maxrange_) return(0);



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

   int limit;



//---- @0AG5B AB0@B>2>3> =><5@0 limit 4;O F8:;0 ?5@5AG5B0 10@>2

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

     {

      limit=rates_total-2-rangeN-begin; // AB0@B>2K9 =><5@ 4;O @0AG5B0 2A5E 10@>2

      //--- C25;8G8< ?>78F8N =0G0;0 40==KE =0 begin 10@>2, 2A;54AB285 @0AG5B>2 =0 40==KE 4@C3>3> 8=48:0B>@0

      if(begin>0) PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN+begin);

     }

   else

     {

      if(!CalculatedBars) limit = rates_total - prev_calculated;

      else limit = CalculatedBars;

     }



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

   ArraySetAsSeries(price,true);



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

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

     {

      for(int k=0; k<rangeN; k++) PriceInt[k]=int(price[bar+k]*multiply);



      RankPrices(TrueRanks,PriceInt);

      IndBuffer[bar]=SpearmanRankCorrelation(R2,rangeN);

      

      int clr=2;

      double res=IndBuffer[bar];



      if(res>0)

        {

         if(res>inHighLevel) clr=4;

         else clr=3;

        }        

      if(res<0)

        {

         if(res<inLowLevel) clr=0;

         else clr=1;

        }        

      ColorIndBuffer[bar]=clr;

     }

//----     

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