//+------------------------------------------------------------------+ //| 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" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буферов 2 #property indicator_buffers 2 //---- использовано всего одно графическое построение #property indicator_plots 1 //+----------------------------------------------+ //| Параметры отрисовки индикатора | //+----------------------------------------------+ //---- отрисовка индикатора в виде четырёхцветной гистограммы #property indicator_type1 DRAW_COLOR_HISTOGRAM //---- в качестве цветов четырёхцветной гистограммы использованы #property indicator_color1 clrMagenta,clrPurple,clrGray,clrBlue,clrDodgerBlue //---- линия индикатора - сплошная #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 2 #property indicator_width1 2 //+----------------------------------------------+ //---- параметры минимального и максимального значений индикатора #property indicator_minimum -1.0 #property indicator_maximum +1.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; //+----------------------------------------------+ //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов 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; iiiMaxrange_) shortname="Decrease rangeN input!"; else StringConcatenate(shortname,"SpearmanRankCorrelation_Histogram(",rangeN,")"); //--- создание метки для отображения в DataWindow PlotIndexSetString(0,PLOT_LABEL,shortname); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,2); //---- количество горизонтальных уровней индикатора IndicatorSetInteger(INDICATOR_LEVELS,3); //---- значения горизонтальных уровней индикатора IndicatorSetDouble(INDICATOR_LEVELVALUE,0,inHighLevel); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,0); IndicatorSetDouble(INDICATOR_LEVELVALUE,2,inLowLevel); //---- в качестве цветов линий горизонтальных уровней использован розовый и синий цвета IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrMagenta); IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGray); IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrBlue); //---- в линии горизонтального уровня использован короткий штрих-пунктир 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, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const int begin, // номер начала достоверного отсчета баров const double &price[] // ценовой массив для расчета индикатора ) { //---- проверка количества баров на достаточность для расчета if(rates_totalMaxrange_) return(0); //---- объявления локальных переменных int limit; //---- расчет стартового номера limit для цикла пересчета баров 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) limit = rates_total - prev_calculated; else limit = CalculatedBars; } //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(price,true); //---- основной цикл расчета индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { for(int k=0; k0) { if(res>inHighLevel) clr=4; else clr=3; } if(res<0) { if(res