期货软件TB系统源代码解读系列22-ZigZag

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

这四段代码没点耐心还真不好读下来,而且不仔细书写一下各个计算得到的值的意思,还容易让人迷糊,所以,我也暂时不再举例用它做成程序化的代码是如何写的了,明天看看再说吧。

你可能感兴趣的:(期货软件TB系统源代码解读系列22-ZigZag)