SpearmanRankCorrS





//+------------------------------------------------------------------+
//|                                      SpearmenRankCorrelation.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
// http://www.improvedoutcomes.com/docs/WebSiteDocs/Clustering/
// Clustering_Parameters/Spearman_Rank_Correlation_Distance_Metric.htm
// http://www.infamed.com/stat/s05.html
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//----
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Yellow

#property indicator_level1 0.8
#property indicator_level2 -0.8
//---- input parameters
extern int  rangeN = 14;
extern int  CalculatedBars = 0;
extern int  Maxrange = 30;
extern bool direction = true;
extern int SM1=5;
extern int SM2=15;

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];

double R2[];
double multiply;
int    PriceInt[];
int    SortInt[];
//+------------------------------------------------------------------+
//| calculate  RSP  function                                         |
//+------------------------------------------------------------------+
double SpearmenRankCorrelation(double Ranks[], int N)
  {
//----
   double res,z2;
   int i;
   for(i = 0; i < N; i++)
     {
       z2 += MathPow(Ranks[i] - i - 1, 2);
     }
   res = 1 - 6*z2 / (MathPow(N,3) - N);
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| Ranking array of prices function                                 |
//+------------------------------------------------------------------+
void RankPrices(int InitialArray[])
  {
//----
   int i, k, m, dublicat, counter, etalon;
   double dcounter, averageRank;
   double TrueRanks[];
   ArrayResize(TrueRanks, rangeN);
   ArrayCopy(SortInt, InitialArray);
   for(i = 0; i < rangeN; i++)TrueRanks[i] = i + 1;
   if(direction)ArraySort(SortInt, 0, 0, MODE_DESCEND); else ArraySort(SortInt, 0, 0, MODE_ASCEND);
   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                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexBuffer(1, ExtMapBuffer2);   
   SetIndexStyle(2, DRAW_LINE);
   SetIndexBuffer(2, ExtMapBuffer3);   
   
   ArrayResize(R2, rangeN);
   ArrayResize(PriceInt, rangeN);
   ArrayResize(SortInt, rangeN);
   if(Maxrange <= 0) 
       Maxrange = 10;
   if(rangeN > Maxrange) 
       IndicatorShortName("Decrease rangeN input!");
   else 
       IndicatorShortName("Spearmen(" + rangeN + ")");
   if(CalculatedBars < 0) 
       CalculatedBars = 0;
   multiply = MathPow(10, Digits);
   
   SetIndexDrawBegin(0,rangeN+1);
   SetIndexDrawBegin(1,rangeN+SM1+1);   
   SetIndexDrawBegin(2,rangeN+SM1+SM2+1);   
   IndicatorDigits(2);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars = IndicatorCounted();
//----
   if(rangeN > Maxrange) 
       return(-1);
   int i, k, limit;
   if(counted_bars == 0){
       if(CalculatedBars == 0)limit = Bars - rangeN; else limit = CalculatedBars;
   }
   if(counted_bars > 0)limit = Bars - counted_bars;
   for(i = limit; i >= 0; i--){
       for(k = 0; k < rangeN; k++)PriceInt[k] = Close[i+k+1]*multiply;
       RankPrices(PriceInt);
       ExtMapBuffer1[i] = SpearmenRankCorrelation(R2,rangeN);
  }
  
  
   for(i = limit; i >= 0; i--){
      ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1,0,SM1,0,0,i);
   }  
   for(i = limit; i >= 0; i--){
      ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2,0,SM2,0,0,i);
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: