//+------------------------------------------------------------------+ //| 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" //--- номер версии индикатора #property version "1.00" //--- отрисовка индикатора в отдельном окне #property indicator_separate_window //--- для расчета и отрисовки индикатора использован один буфер #property indicator_buffers 1 //--- использовано всего одно графическое построение #property indicator_plots 1 //--- отрисовка индикатора в виде линии #property indicator_type1 DRAW_LINE //--- в качестве цвета линии индикатора использован цвет Magenta #property indicator_color1 Magenta //--- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //--- толщина линии индикатора равна 2 #property indicator_width1 2 //--- параметры минимального и максимального значений индикатора #property indicator_minimum -1 #property indicator_maximum +1 //--- параметры горизонтальных уровней индикатора #property indicator_level1 +0.50 #property indicator_level2 0 #property indicator_level3 -0.50 #property indicator_levelcolor Blue #property indicator_levelstyle STYLE_DASHDOTDOT //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input int rangeN=14; input int CalculatedBars=0; input int Maxrange=30; input bool direction=true; //+----------------------------------------------+ //--- объявление динамического массива, который в дальнейшем //--- будет использован в качестве индикаторного буфера double ExtLineBuffer[]; //--- double multiply; double R2[],TrueRanks[]; int PriceInt[],SortInt[],Maxrange_; //+------------------------------------------------------------------+ //| Сalculate 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,")"); //--- создание метки для отображения в DataWindow PlotIndexSetString(0,PLOT_LABEL,shortname); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,2); //--- запрет на отрисовку индикатором пустых значений PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const int begin, // номер начала достоверного отсчета баров const double &price[]) // ценовой массив для расчета индикатора { //--- проверка количества баров на достаточность для расчета if(rates_totalMaxrange_) return(0); //--- объявления локальных переменных int limit; //--- расчет стартового номера first для цикла пересчета баров if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора { limit=rates_total-2-rangeN-begin; // стартовый номер для расчета всех баров //--- увеличим позицию начала данных на begin баров, вследствие расчетов на данных другого индикатора if(begin>0) PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN+begin); } else { if(CalculatedBars==0) limit=rates_total-prev_calculated; else limit=CalculatedBars; } //--- индексация элементов в массивах как в таймсериях ArraySetAsSeries(price,true); //--- основной цикл расчета индикатора for(int bar=limit; bar>=0; bar--) { for(int k=0; k