Mql4 代码
//+------------------------------------------------------------------+ //| SpearmanRankCorrelation_Histogram.mq4 //| 版权所有 © 2007, MetaQuotes Software Corp. //|http://www.metaquotes.net | //+------------------------------------------------------------------+ //http://www.infamed.com/stat/s05.html #property copyright "版权所有 © 2007 年,MetaQuotes 软件公司"。 #property link "http://www.metaquotes.net" //---- 指标版本号 #property version "1.00" //---- 在单独窗口中渲染指标 #property indicator_separate_window //---- 指示器缓冲区数量 1 #property indicator_buffers 1 //---- 只使用了一种图形结构 #property indicator_plots 1 //+----------------------------------------------+ //| 绘制指示器的参数 //+----------------------------------------------+ //---- 将指标绘制成柱状图 #property indicator_type1 DRAW_HISTOGRAM //---- 作为直方图的颜色使用 #property indicator_color1 clrViolet //---- 指示线为实线 #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_; //+------------------------------------------------------------------+ //| 计算 RSP 函数| //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| 排列价格数组函数| //+------------------------------------------------------------------+ 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; } //+------------------------------------------------------------------+ //| 自定义指示器初始化函数 //+------------------------------------------------------------------+ 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); //---- 将动态数组 IndBuffer 变成指示器缓冲区 SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); //---- 移位指示器绘图开始倒计时 PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rangeN); //---- 设置图表上不可见的指标值 PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- 禁止在指标窗口左上角显示指标值 PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); //---- 像时间序列一样对缓冲区中的项目进行索引 ArraySetAsSeries(IndBuffer,true); //---- 短指标名称变量的初始化 string shortname; if(rangeN>Maxrange_) shortname="Decrease rangeN input!"; else StringConcatenate(shortname,"SpearmanRankCorrelation_Histogram(",rangeN,")"); //--- 创建要在数据窗口中显示的标签 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); //---- } //+------------------------------------------------------------------+ //| 自定义指标迭代函数 //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // 当前刻度线的历史条数 const int prev_calculated,// 前一个刻度线的历史条数 const datetime &time[], const double &open[], const double& high[], // 用于指标计算的最大价格数组 const double& low[], // 用于指标计算的最小价格数组 const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- 检查计算所需的条数是否足够 if(rates_total<rangeN) return(0); if(rangeN>Maxrange_) return(0); //---- 本地变量声明 int limit; //---- 计算条形图重新计算周期的起始限值编号 if(prev_calculated>rates_total || prev_calculated<=0) // 检查指标计算是否首次开始 { limit=rates_total-2-rangeN; // 计算所有条形图的起始编号 } else { if(!CalculatedBars) limit = rates_total - prev_calculated; else limit = CalculatedBars; } //---- 像在时间序列中一样对数组中的元素进行索引 ArraySetAsSeries(close,true); //---- 主要指标计算周期 for(int bar=limit; bar>=0 && !IsStopped(); bar--) { for(int k=0; k<rangeN; k++) PriceInt[k]=int(close[bar+k]*multiply); RankPrices(TrueRanks,PriceInt); IndBuffer[bar]=SpearmanRankCorrelation(R2,rangeN); } //---- return(rates_total); } //+------------------------------------------------------------------+
附加的文件:
SpearmanRankCorrelation_Histogram:
以彩色柱形图形式实现的 SpearmanRankCorrelation 指标
作者: Nikolay Kositsin