CyclePeriod指标:为MetaTrader 5提供市场周期分析

Mike 2011.11.23 04:30 74 0 0
附件

作者:

Witold Wozniak

CyclePeriod指的是用于测量金融资产价格变化周期性的指标。这个指标能够在其缓冲区中存储当前市场周期的值,而这些值因市场波动而时刻变化,因此并不稳定。CyclePeriod的设计初衷是与振荡器配合使用,以便使其适应不断变化的市场周期。

该指标的灵感来源于约翰·埃勒斯(John Ehlers)在2002年11月发表的文章《使用费舍尔变换》,该文章刊登在《技术分析股票与商品》杂志上。

Cycle Period

CyclePeriod指标的句柄需要在全局级别声明,以便在其他指标的代码中使用,例如在RVI振荡器中:

//---- 声明指标句柄的整型变量int CP_Handle;

接下来,需要在RVI指标的初始化块中获取CyclePeriod指标句柄:

//---- 获取CyclePeriod指标句柄
   CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha);
   if(CP_Handle==INVALID_HANDLE)
     {
      Print("获取CyclePeriod指标句柄失败");
      return(1);
     }

现在,我们引入一个新的Alpha变量,它是所用指标的输入参数和周期平均比例。这个变量需要转变为开发的指标输入变量:

//+----------------------------------------------+//| 指标输入参数                                    |//+----------------------------------------------+inputdouble Alpha=0.07; // 指标平滑比例 

之前的Length输入变量需要从输入参数列表中移除,转变为OnCalculate()函数内的局部变量。

用于指标平滑的数组大小由Length参数值决定:

//---- 为变量数组分配内存  
   ArrayResize(Count,Length);
   ArrayResize(Value1,Length);
   ArrayResize(Value2,Length);

这个参数的值现在在变化。因此,最好将这些数组的大小设置为不小于该变量的假定最大值。

在分析指标图表时,可以看到这个值不会超过100。因此,数组的大小将设置为相同的值:

//---- 为变量数组分配内存  
   ArrayResize(Count,MAXPERIOD);
   ArrayResize(Value1,MAXPERIOD);
   ArrayResize(Value2,MAXPERIOD);

接下来,在OnCalculate()块中,当前柱的周期值必须从CyclePeriod自定义指标缓冲区中获取,以便使用,而不是使用Length这个以前的输入参数的值。

//---- 主指标计算循环
   for(bar=first; bar<rates_total && !IsStopped(); bar++)
     {
      //---- 将新出现的数据复制到数组中
      if(CopyBuffer(CP_Handle,0,rates_total-1-bar,4,period)<=0) return(RESET);

      Length=int(MathFloor((4.0*period[0]+3.0*period[1]+2.0*period[2]+period[3])/20.0));
      if(bar<Length) Length=bar; // 将平滑调整为实际的柱数

在这种情况下,从CyclePeriod指标缓冲区中获取四个最后的值,并进行线性加权平滑,之后获得的值将用作Length平滑周期。最后,在指标代码的末尾需要修改如下行:

      if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);

最终,我们得到了自适应RVI振荡器:

RVI和自适应RVI指标

列表
评论 0