期貨軟件TB系統(tǒng)源代碼解讀系列22-ZigZag

ZigZag指標(biāo),即之字轉(zhuǎn)向指標(biāo)锅论,不是一個(gè)主流指標(biāo)楣号,疊加在超級(jí)圖表上,勾畫出交易商品趨勢(shì)的大致輪廓藻懒。ZigZag連續(xù)的折線视译,可以輔助我們判斷出交易商品的多空趨勢(shì)酷含,當(dāng)然再加上自己畫的阻力支撐位,可能更完美一些椅亚。這個(gè)指標(biāo)的算法怎么說呢什往,很麻煩,我查了一下别威,看得我也頭疼省古。簡(jiǎn)略來說吧,分三步:

1惜互、求波峰琳拭;

2、求波谷坑鱼;

3絮缅、對(duì)波峰波谷的處理判斷呼股,從而進(jìn)行判斷畫線画恰。

大概就這三步允扇,具體算法,感興趣的自己百度去看了甩鳄,這一大段的额划,我復(fù)制過來档泽,解釋也挺費(fèi)勁的。我直接一步步解讀代碼好了抑胎。

先看第一個(gè)如何求轉(zhuǎn)折函數(shù)Pivot渐北,代碼如下:

Params

NumericSeries Price(1);//聲明數(shù)值序列參數(shù)Price赃蛛,初值為1.//

Numeric Length(10); //聲明數(shù)值參數(shù)Length,初值為10破托,即周期歧蒋。//

Numeric LeftStrength(1); // 聲明數(shù)值參數(shù)LeftStrength,初值為1.//

Numeric RightStrength(1); //聲明數(shù)值參數(shù)RightStrength萝映,初值為1.//

Numeric Instance(1); //聲明數(shù)值參數(shù)Instance阐虚,初值為1.//

Numeric HiLo(1); //聲明數(shù)值參數(shù)HiLo敌呈,初值為1.//

NumericRef PivotPrice; //聲明數(shù)值引用參數(shù)PivotPrice造寝,這個(gè)新出現(xiàn)的NumericRef吭练,引用參數(shù)的意思,具體嗎签赃,就是這個(gè)引用參數(shù)返回值根據(jù)你代碼表達(dá)是可以多個(gè)數(shù)值的分尸,待會(huì)看例子吧箩绍。//

NumericRef PivotBar; //聲明數(shù)值引用參數(shù)PivotBar。//

Vars

Numeric CandidatePrice( 0 );//聲明數(shù)值變量CandidatePrice圆到,初值為0.//

Numeric LengthCntr( 0 ); //聲明數(shù)值變量LengthCntr卑吭,初值為0.//

Numeric StrengthCntr( 0 ); //聲明數(shù)值變量StrengthCntr,初值為0.//

Numeric InstanceCntr( 0 ); //聲明數(shù)值變量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 ))//循環(huán)語(yǔ)句鸠姨,當(dāng)變量LengthCntr(初值0)小于參數(shù)Length(初值10)時(shí)淹真,并且InstanceTest為真核蘸。!InstanceTest這個(gè)連著感嘆號(hào)意思是非假,即為真了祟峦。//

{

CandidatePrice = Price[LengthCntr] ;//價(jià)格Price隨變量LengthCntr值索引回到相應(yīng)k線數(shù)位徙鱼,把相應(yīng)price值賦值給變量CandidatePrice疆偿。//

PivotTest = True ; //布爾型PivotTest,判斷為真了。//

StrengthCntr = LengthCntr + 1 ; //變量StrengthCntr值 = 變量LengthCntr值 + 1.//

While (PivotTest && StrengthCntr - LengthCntr <= LeftStrength )//嵌套循環(huán)溉愁,當(dāng)布爾型變量PivotTest為真拐揭,并且(把相應(yīng)具體初始值代進(jìn)公式吧)1-0 <= 1,這判斷是真的家肯,繼續(xù)執(zhí)行下列代碼盟猖。//

{

If (( HiLo == 1 And CandidatePrice < Price[StrengthCntr] ) or ( HiLo == -1 And CandidatePrice > Price[StrengthCntr] )) //假如里邊有兩括號(hào)式镐,分開來看,第一個(gè)娘汞,參數(shù)HiLo等于1,并且變量CandidatePrice值(初值為0)小于Price[1]燎孟,這里的StrengthCntr尸昧,根據(jù)上面公式算得值為1了。第二個(gè)括號(hào)碍沐,參數(shù)HiLo等于-1衷蜓,并且變量CandidatePrice值大于Price[1]的磁浇。這兩括號(hào)用邏輯判斷or來連接,意思是這兩括號(hào)只要有一個(gè)是正確的无虚,就可以繼續(xù)執(zhí)行下列代碼衍锚。//

PivotTest = False; //執(zhí)行的是布爾型變量PivotTest為假了。//

Else // 就是兩括號(hào)都是假的時(shí)候戴质,執(zhí)行下列語(yǔ)句告匠。//

StrengthCntr = StrengthCntr + 1 ; //變量StrengthCntr自加1了。//

}

StrengthCntr = LengthCntr - 1 ;//變量StrengthCntr值 = 參數(shù)LengthCntr - 1了划鸽。//

While (PivotTest && (LengthCntr - StrengthCntr) <= RightStrength ) //也是嵌套循環(huán)的戚哎,當(dāng)布爾型變量PivotTest為真,(把初值都代進(jìn)公式了)并且(0-1)<= 1.可以看出這是真的崭捍。//

{

If (( HiLo == 1 And CandidatePrice <= Price[StrengthCntr] ) or ( HiLo == -1 And CandidatePrice >= Price[StrengthCntr] )) //解讀同上面的一樣了殷蛇。//

PivotTest = False; // 布爾型PivotTest變?yōu)榧倭恕?/

Else//還是意思假如條件都不滿足兩括號(hào)的條件。//

StrengthCntr = StrengthCntr - 1 ;//執(zhí)行變量StrengthCntr自減1.//

}

If (PivotTest) //假如布爾型PivotTest為真的亮航。//

InstanceCntr = InstanceCntr + 1 ; //變量InstanceCntr自加1了匀们。//

If (InstanceCntr == Instance) //假如變量InstanceCntr等于參數(shù)Instance(初值為1.)//

InstanceTest = True; // 布爾型變量InstanceTest為真了泄朴。//

Else //變量InstanceCntr不等于參數(shù)Instance的情況。//

LengthCntr = LengthCntr + 1 ; //變量LengthCntr自加1了钟沛。//

}

If (InstanceTest ) //假如布爾型InstanceTest為真局扶。//

{

PivotPrice = CandidatePrice ; //引用參數(shù)PivotPrice = 變量CandidatePrice值三妈。這個(gè)CandidatePrice值是根據(jù)這個(gè)代碼CandidatePrice = Price[LengthCntr]求得的了。//?

PivotBar = LengthCntr ;//引用參數(shù)PivotBar = 變量LengthCntr值了悠鞍。//

Return True;//把這兩值返回給主函數(shù)了饿凛。//

}Else//布爾型InstanceTest假的情況涧窒。//

{

PivotPrice = -1 ;//引用參數(shù)PivotPrice = -1.//

PivotBar = -1 ; //引用參數(shù)PivotBar = -1.//

Return False; //返回的兩值是假的锭亏。//

}

End

看著這么一堆代碼下來,有的人可能覺得頭暈了戴已,但這一步步把初值代入公式糖儡,計(jì)算得了一個(gè)怔匣,你就發(fā)現(xiàn),其實(shí)也就那樣金闽,第二個(gè)循環(huán)也是繼續(xù)代值進(jìn)去求就得了。

我們?cè)倏催@求波峰函數(shù)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);//看到了吧钞速,我們?cè)谇筠D(zhuǎn)折的時(shí)候嫡秕,定義了8個(gè)參數(shù),這邊調(diào)用Pivot時(shí)遵班,也得用相應(yīng)8個(gè)數(shù)值返回去求值狭郑,再反饋回來PivotPrice值與PivotBar值汇在。//

Return PivotPrice;//這邊只把PivotPrice值返回給主函數(shù)就行。//

End

接下來就是求波谷函數(shù)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);//數(shù)數(shù)也是8個(gè)參數(shù)吧羡洁,這里改的是-1筑煮,至于這1跟-1返回對(duì)應(yīng)的函數(shù)就是替代HoLi了。//

Return PivotPrice;//這邊只把PivotPrice值返回給主函數(shù)就行袋马。//

End

真正求ZigZag指標(biāo)的代碼秸应,如下了:

Params

Numeric RetracePct(2);//聲明參數(shù)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 = 收盤價(jià)佛吓。//

SwingHighPrice = SwingHigh( 1, Close, 1,2); //變量SwingHighPrice值就是把這四個(gè)參數(shù)值返回函數(shù)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 * 固定系數(shù)(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 = 當(dāng)前k線數(shù)位值丙者。//

}

}

Else If(SwingLowPrice <> -1)//假如波谷SwingLowPrice不等于-1.下列代碼是處理波谷情況的械媒,跟波峰反過來。//

{

If(UpDn >=0 && SwingLowPrice <= SwingPrice * (1-RetracePct*0.01)) // 假如變量UpDn>= 0痢虹,并且波谷SwingLowPrice <= 變量SwingPrice * 系數(shù)(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 = 當(dāng)前K線索引值捣染。//

}

}

If( NewTL)//假如布爾型NewTL為真。//

{

PlotNumeric("ZigZag",SwingPrice,0,-1,1); //畫線ZigZag線停巷,值為SwingPrice值了耍攘。至于后邊的0叠穆,-1少漆,1,分別對(duì)應(yīng)著輸出值的定位點(diǎn)硼被,顏色示损,返回k線索引值。//

}

Else If(UpdateTL) //假如布爾型UpdateTL為真嚷硫。//

{

If (UpDn == UpDn[1]) //假如當(dāng)前變量UpDn等于前一個(gè)變量UpDn检访。//

{

Unplot("ZigZag",PreBar - PreBar[1]+1); //函數(shù)Unplot意思刪除曾經(jīng)輸出的值,這里就是刪除ZigZag值仔掸,其值為當(dāng)前PreBar減去前一個(gè)PreBar值脆贵,再加上1.//

PlotNumeric("ZigZag",SwingPrice,0,-1,1);//重新畫線ZigZag線。//

}

Else//除了上邊當(dāng)前變量UpDn等于前一個(gè)變量UpDn情況之外的起暮,直接用下列代碼處理卖氨。//

{

PlotNumeric("ZigZag",SwingPrice,0,-1,1);//直接畫線ZigZag,值為變量SwingPrice值了负懦。//

}

}

End

這四段代碼沒點(diǎn)耐心還真不好讀下來筒捺,而且不仔細(xì)書寫一下各個(gè)計(jì)算得到的值的意思,還容易讓人迷糊纸厉,所以系吭,我也暫時(shí)不再舉例用它做成程序化的代碼是如何寫的了,明天看看再說吧颗品。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肯尺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子躯枢,更是在濱河造成了極大的恐慌则吟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锄蹂,死亡現(xiàn)場(chǎng)離奇詭異逾滥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門寨昙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掀亩,你說我怎么就攤上這事舔哪。” “怎么了槽棍?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵捉蚤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我炼七,道長(zhǎng)缆巧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任豌拙,我火速辦了婚禮陕悬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘按傅。我一直安慰自己捉超,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布唯绍。 她就那樣靜靜地躺著拼岳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪况芒。 梳的紋絲不亂的頭發(fā)上惜纸,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音绝骚,去河邊找鬼耐版。 笑死,一個(gè)胖子當(dāng)著我的面吹牛皮壁,可吹牛的內(nèi)容都是我干的椭更。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蛾魄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虑瀑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滴须,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舌狗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扔水,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痛侍,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了主届。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赵哲。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖君丁,靈堂內(nèi)的尸體忽然破棺而出枫夺,到底是詐尸還是另有隱情,我是刑警寧澤绘闷,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布橡庞,位于F島的核電站,受9級(jí)特大地震影響印蔗,放射性物質(zhì)發(fā)生泄漏扒最。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一华嘹、第九天 我趴在偏房一處隱蔽的房頂上張望吧趣。 院中可真熱鬧,春花似錦除呵、人聲如沸再菊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纠拔。三九已至,卻和暖如春泛豪,著一層夾襖步出監(jiān)牢的瞬間稠诲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工诡曙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臀叙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓价卤,卻偏偏與公主長(zhǎng)得像劝萤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎璧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容