0
Views
0
Downloads
0
Favorites
spearmanrankcorrelation_v3
//+------------------------------------------------------------------+
//| 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; 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()
{
//--- ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ
ArrayResize(R2,rangeN);
ArrayResize(PriceInt,rangeN);
ArrayResize(SortInt,rangeN);
//--- èçìåíåíèå èíäåêñàöèè ýëåìåíòîâ â ìàññèâå ïåðåìåííûõ
if(direction) ArraySetAsSeries(SortInt,true);
ArrayResize(TrueRanks,rangeN);
//--- èíèöèàëèçàöèÿ ïåðåìåííûõ
if(Maxrange<=0)
Maxrange_=10;
else Maxrange_=Maxrange;
multiply=MathPow(10,_Digits);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà ExtLineBuffer[] â èíäèêàòîðíûé áóôåð
SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(ExtLineBuffer,true);
//--- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
string shortname;
if(rangeN>Maxrange_)
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_total<rangeN+begin) return(0);
//---
if(rangeN>Maxrange_) 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<rangeN; k++) PriceInt[k]=int(price[bar+k]*multiply);
//---
RankPrices(TrueRanks,PriceInt);
ExtLineBuffer[bar]=SpearmanRankCorrelation(R2,rangeN);
}
//---
return(rates_total);
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---