期货软件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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容