作者:
Witold Wozniak
CyclePeriod指的是用于测量金融资产价格变化周期性的指标。这个指标能够在其缓冲区中存储当前市场周期的值,而这些值因市场波动而时刻变化,因此并不稳定。CyclePeriod的设计初衷是与振荡器配合使用,以便使其适应不断变化的市场周期。
该指标的灵感来源于约翰·埃勒斯(John Ehlers)在2002年11月发表的文章《使用费舍尔变换》,该文章刊登在《技术分析股票与商品》杂志上。

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振荡器:


评论 0