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í)不再舉例用它做成程序化的代碼是如何寫的了,明天看看再說吧颗品。