ZigZag指标,即之字转向指标,不是一个主流指标,叠加在超级图表上,勾画出交易商品趋势的大致轮廓。ZigZag连续的折线,可以辅助我们判断出交易商品的多空趋势,当然再加上自己画的阻力支撑位,可能更完美一些。这个指标的算法怎么说呢,很麻烦,我查了一下,看得我也头疼。简略来说吧,分三步:
1、求波峰;
2、求波谷;
3、对波峰波谷的处理判断,从而进行判断画线。
大概就这三步,具体算法,感兴趣的自己百度去看了,这一大段的,我复制过来,解释也挺费劲的。我直接一步步解读代码好了。
先看第一个如何求转折函数Pivot,代码如下:
Params
NumericSeries Price(1);//声明数值序列参数Price,初值为1.//
Numeric Length(10); //声明数值参数Length,初值为10,即周期。//
Numeric LeftStrength(1); // 声明数值参数LeftStrength,初值为1.//
Numeric RightStrength(1); //声明数值参数RightStrength,初值为1.//
Numeric Instance(1); //声明数值参数Instance,初值为1.//
Numeric HiLo(1); //声明数值参数HiLo,初值为1.//
NumericRef PivotPrice; //声明数值引用参数PivotPrice,这个新出现的NumericRef,引用参数的意思,具体吗,就是这个引用参数返回值根据你代码表达是可以多个数值的,待会看例子吧。//
NumericRef PivotBar; //声明数值引用参数PivotBar。//
Vars
Numeric CandidatePrice( 0 );//声明数值变量CandidatePrice,初值为0.//
Numeric LengthCntr( 0 ); //声明数值变量LengthCntr,初值为0.//
Numeric StrengthCntr( 0 ); //声明数值变量StrengthCntr,初值为0.//
Numeric InstanceCntr( 0 ); //声明数值变量InstanceCntr,初值为0.//
Bool PivotTest( False); //声明布尔型变量PivotTest,初值为假。//
Bool InstanceTest( False ) ;//声明布尔型变量InstanceTest,初值为假。//
Begin
InstanceCntr = 0 ; //变量InstanceCntr,赋值为0.//
InstanceTest = False ; //布尔型变量InstanceTest,初始判断为假。//
LengthCntr = RightStrength ; //变量LengthCntr 等于变量RightStrength了。//
While (LengthCntr < Length && (!InstanceTest ))//循环语句,当变量LengthCntr(初值0)小于参数Length(初值10)时,并且InstanceTest为真。!InstanceTest这个连着感叹号意思是非假,即为真了。//
{
CandidatePrice = Price[LengthCntr] ;//价格Price随变量LengthCntr值索引回到相应k线数位,把相应price值赋值给变量CandidatePrice。//
PivotTest = True ; //布尔型PivotTest,判断为真了。//
StrengthCntr = LengthCntr + 1 ; //变量StrengthCntr值 = 变量LengthCntr值 + 1.//
While (PivotTest && StrengthCntr - LengthCntr <= LeftStrength )//嵌套循环,当布尔型变量PivotTest为真,并且(把相应具体初始值代进公式吧)1-0 <= 1,这判断是真的,继续执行下列代码。//
{
If (( HiLo == 1 And CandidatePrice < Price[StrengthCntr] ) or ( HiLo == -1 And CandidatePrice > Price[StrengthCntr] )) //假如里边有两括号,分开来看,第一个,参数HiLo等于1,并且变量CandidatePrice值(初值为0)小于Price[1],这里的StrengthCntr,根据上面公式算得值为1了。第二个括号,参数HiLo等于-1,并且变量CandidatePrice值大于Price[1]的。这两括号用逻辑判断or来连接,意思是这两括号只要有一个是正确的,就可以继续执行下列代码。//
PivotTest = False; //执行的是布尔型变量PivotTest为假了。//
Else // 就是两括号都是假的时候,执行下列语句。//
StrengthCntr = StrengthCntr + 1 ; //变量StrengthCntr自加1了。//
}
StrengthCntr = LengthCntr - 1 ;//变量StrengthCntr值 = 参数LengthCntr - 1了。//
While (PivotTest && (LengthCntr - StrengthCntr) <= RightStrength ) //也是嵌套循环的,当布尔型变量PivotTest为真,(把初值都代进公式了)并且(0-1)<= 1.可以看出这是真的。//
{
If (( HiLo == 1 And CandidatePrice <= Price[StrengthCntr] ) or ( HiLo == -1 And CandidatePrice >= Price[StrengthCntr] )) //解读同上面的一样了。//
PivotTest = False; // 布尔型PivotTest变为假了。//
Else//还是意思假如条件都不满足两括号的条件。//
StrengthCntr = StrengthCntr - 1 ;//执行变量StrengthCntr自减1.//
}
If (PivotTest) //假如布尔型PivotTest为真的。//
InstanceCntr = InstanceCntr + 1 ; //变量InstanceCntr自加1了。//
If (InstanceCntr == Instance) //假如变量InstanceCntr等于参数Instance(初值为1.)//
InstanceTest = True; // 布尔型变量InstanceTest为真了。//
Else //变量InstanceCntr不等于参数Instance的情况。//
LengthCntr = LengthCntr + 1 ; //变量LengthCntr自加1了。//
}
If (InstanceTest ) //假如布尔型InstanceTest为真。//
{
PivotPrice = CandidatePrice ; //引用参数PivotPrice = 变量CandidatePrice值。这个CandidatePrice值是根据这个代码CandidatePrice = Price[LengthCntr]求得的了。//
PivotBar = LengthCntr ;//引用参数PivotBar = 变量LengthCntr值了。//
Return True;//把这两值返回给主函数了。//
}Else//布尔型InstanceTest假的情况。//
{
PivotPrice = -1 ;//引用参数PivotPrice = -1.//
PivotBar = -1 ; //引用参数PivotBar = -1.//
Return False; //返回的两值是假的。//
}
End
看着这么一堆代码下来,有的人可能觉得头晕了,但这一步步把初值代入公式,计算得了一个,你就发现,其实也就那样,第二个循环也是继续代值进去求就得了。
我们再看这求波峰函数SwingHigh,代码如下:
Params
Numeric Instance(1);
NumericSeries Price(1);
Numeric Strength(1);
Numeric Length(10);
Vars
Numeric PivotPrice;
Numeric PivotBar;
Begin
Pivot(Price,Length,Strength,Strength,Instance,1,PivotPrice,PivotBar);//看到了吧,我们在求转折的时候,定义了8个参数,这边调用Pivot时,也得用相应8个数值返回去求值,再反馈回来PivotPrice值与PivotBar值。//
Return PivotPrice;//这边只把PivotPrice值返回给主函数就行。//
End
接下来就是求波谷函数SwingLow了,代码跟波峰差不多,如下:
Params
Numeric Instance(1);
NumericSeries Price(1);
Numeric Strength(1);
Numeric Length(10);
Vars
Numeric PivotPrice;
Numeric PivotBar;
Begin
Pivot(Price,Length,Strength,Strength,Instance,-1,PivotPrice,PivotBar);//数数也是8个参数吧,这里改的是-1,至于这1跟-1返回对应的函数就是替代HoLi了。//
Return PivotPrice;//这边只把PivotPrice值返回给主函数就行。//
End
真正求ZigZag指标的代码,如下了:
Params
Numeric RetracePct(2);//声明参数RetracePct,初值为2.//
Vars
NumericSeries SwingPrice;//声明序列变量SwingPrice。//
Numeric SwingHighPrice;//声明变量SwingHighPrice。//
Numeric SwingLowPrice; //声明变量SwingLowPrice。//
NumericSeries PreBar(0); //声明序列变量PreBar,初值为0.//
NumericSeries UpDn(0);//声明序列变量UpDn,初值为0.//
Bool SaveSwing(False);//声明布尔型变量SaveSwing,初值为假。//
Bool NewTL(False); //声明布尔型变量NewTL,初值为假。//
Bool UpdateTL(False);//声明布尔型变量UpdateTL,初值为假。//
begin
If(CurrentBar == 0)//假如为第一根k线的。//
SwingPrice = Close;//变量SwingPrice = 收盘价。//
SwingHighPrice = SwingHigh( 1, Close, 1,2); //变量SwingHighPrice值就是把这四个参数值返回函数SwingHigh求波峰了。//
SwingLowPrice = SwingLow( 1, Close, 1, 2 );//同理的,SwingLowPrice值即为求波谷了。//
If (SwingHighPrice <> -1) //假如波峰值不等于-1.下列代码是处理波峰情况的。//
{
If(UpDn <=0 && SwingHighPrice >= SwingPrice * (1+RetracePct*0.01)) //假如变量UpDn小于等于0,并且波峰SwingHighPrice <= 变量SwingPrice * 固定系数(1+2*0.01)。//
{
UpDn = 1; //变量UpDn = 1.//
NewTL = True; //布尔型变量NewTL为真。//
SaveSwing = True;//布尔型SaveSwing为真。//
}
Else If(UpDn == 1 && SwingHighPrice >= SwingPrice) //假如变量UpDn等于1,并且波峰SwingHighPrice >= 变量SwingPrice值。//
{
UpdateTL = True;//布尔型变量UpdateTL为真。//
SaveSwing = True; //布尔型变量SaveSwing为真。//
}
If(SaveSwing)//假如布尔型SaveSwing为真。//
{
SwingPrice = SwingHighPrice;//变量SwingPrice = 波峰SwingHighPrice。//
PreBar = CurrentBar;//序列变量PreBar = 当前k线数位值。//
}
}
Else If(SwingLowPrice <> -1)//假如波谷SwingLowPrice不等于-1.下列代码是处理波谷情况的,跟波峰反过来。//
{
If(UpDn >=0 && SwingLowPrice <= SwingPrice * (1-RetracePct*0.01)) // 假如变量UpDn>= 0,并且波谷SwingLowPrice <= 变量SwingPrice * 系数(1-2*0.01).//
{
UpDn = -1; //变量UpDn = -1.//
NewTL = True; //布尔型NewTL为真。//
SaveSwing = True; //布尔型SaveSwing为真。//
}
Else If(UpDn == -1 && SwingLowPrice <= SwingPrice)//假如变量UpDn等于-1,并且波谷SwingLowPrice <=变量SwingPrice值。//
{
UpdateTL = True;//布尔型UpdateTL 为真。//
SaveSwing = True;//布尔型SaveSwing为真。//
}
If(SaveSwing )//假如SaveSwing为真。//
{
SwingPrice = SwingLowPrice; //变量SwingPrice = 波谷SwingLowPrice值。//
PreBar = CurrentBar; // 序列变量PreBar = 当前K线索引值。//
}
}
If( NewTL)//假如布尔型NewTL为真。//
{
PlotNumeric("ZigZag",SwingPrice,0,-1,1); //画线ZigZag线,值为SwingPrice值了。至于后边的0,-1,1,分别对应着输出值的定位点,颜色,返回k线索引值。//
}
Else If(UpdateTL) //假如布尔型UpdateTL为真。//
{
If (UpDn == UpDn[1]) //假如当前变量UpDn等于前一个变量UpDn。//
{
Unplot("ZigZag",PreBar - PreBar[1]+1); //函数Unplot意思删除曾经输出的值,这里就是删除ZigZag值,其值为当前PreBar减去前一个PreBar值,再加上1.//
PlotNumeric("ZigZag",SwingPrice,0,-1,1);//重新画线ZigZag线。//
}
Else//除了上边当前变量UpDn等于前一个变量UpDn情况之外的,直接用下列代码处理。//
{
PlotNumeric("ZigZag",SwingPrice,0,-1,1);//直接画线ZigZag,值为变量SwingPrice值了。//
}
}
End
这四段代码没点耐心还真不好读下来,而且不仔细书写一下各个计算得到的值的意思,还容易让人迷糊,所以,我也暂时不再举例用它做成程序化的代码是如何写的了,明天看看再说吧。