//+------------------------------------------------------------------+ //| SpearmanRankCorrelation.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" //---- indicator version number #property version "1.00" //---- drawing indicator in a separate window #property indicator_separate_window //---- one buffer is used for the indicator calculation and drawing #property indicator_buffers 1 //---- only one plot is used #property indicator_plots 1 //---- drawing the indicator as a line #property indicator_type1 DRAW_LINE //---- Magenta is used as the indicator line color #property indicator_color1 Magenta //---- the indicator line is a continuous curve #property indicator_style1 STYLE_SOLID //---- indicator line width is 2 #property indicator_width1 2 //---- parameters of the minimum and maximum indicator values #property indicator_minimum -1 #property indicator_maximum +1 //---- parameters of horizontal levels of the indicator #property indicator_level1 +0.50 #property indicator_level2 0 #property indicator_level3 -0.50 #property indicator_levelcolor Blue #property indicator_levelstyle STYLE_DASHDOTDOT //+----------------------------------------------+ //| Indicator input parameters | //+----------------------------------------------+ input int rangeN=14; input int CalculatedBars=0; input int Maxrange=30; input bool direction=true; //+----------------------------------------------+ //---- declaration of a dynamic array that will further be //---- used as an indicator buffer double ExtLineBuffer[]; //---- 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; iiiMaxrange_) shortname="Decrease rangeN input!"; else StringConcatenate(shortname,"Spearman(",rangeN,")"); //--- creating a label to display in DataWindow PlotIndexSetString(0,PLOT_LABEL,shortname); //--- creating a name to be displayed in a separate subwindow and in a tooltip IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- determining the accuracy of displaying the indicator values IndicatorSetInteger(INDICATOR_DIGITS,2); //--- restriction on drawing empty values by the indicator PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // history in bars at the current tick const int prev_calculated,// history in bars at the previous tick const int begin, // number of beginning of reliable counting of bars const double &price[] // price array for the indicator calculation ) { //---- checking for the sufficiency of bars for the calculation if(rates_totalMaxrange_) return(0); //---- declaring local variables int limit; //---- calculation of the starting number 'limit' for the bars recalculation loop if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of the indicator calculation { limit=rates_total-2-rangeN-begin; // starting index for the calculation of all bars //--- increase the position of the data start by 'begin' bars as a result of the calculation using data of another indicator if(begin>0) PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN+begin); } else { if(CalculatedBars==0) limit = rates_total - prev_calculated; else limit = CalculatedBars; } //---- indexing array elements as time series ArraySetAsSeries(price,true); //---- main indicator calculation loop for(int bar=limit; bar>=0; bar--) { for(int k=0; k