ZigZag指標(biāo),即之字轉(zhuǎn)向指標(biāo),不是一個主流指標(biāo),疊加在超級圖表上,勾畫出交易商品趨勢的大致輪廓。ZigZag連續(xù)的折線,可以輔助我們判斷出交易商品的多空趨勢,當(dāng)然再加上自己畫的阻力支撐位,可能更完美一些。這個指標(biāo)的算法怎么說呢,很麻煩,我查了一下,看得我也頭疼。簡略來說吧,分三步:
1、求波峰;
2、求波谷;
3、對波峰波谷的處理判斷,從而進(jìn)行判斷畫線。
大概就這三步,具體算法,感興趣的自己百度去看了,這一大段的,我復(fù)制過來,解釋也挺費(fèi)勁的。我直接一步步解讀代碼好了。
先看第一個如何求轉(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,這個新出現(xiàn)的NumericRef,引用參數(shù)的意思,具體嗎,就是這個引用參數(shù)返回值根據(jù)你代碼表達(dá)是可以多個數(shù)值的,待會看例子吧。//
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)語句,當(dāng)變量LengthCntr(初值0)小于參數(shù)Length(初值10)時,并且InstanceTest為真。!InstanceTest這個連著感嘆號意思是非假,即為真了。//
{
CandidatePrice = Price[LengthCntr] ;//價格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] )) //假如里邊有兩括號,分開來看,第一個,參數(shù)HiLo等于1,并且變量CandidatePrice值(初值為0)小于Price[1],這里的StrengthCntr,根據(jù)上面公式算得值為1了。第二個括號,參數(shù)HiLo等于-1,并且變量CandidatePrice值大于Price[1]的。這兩括號用邏輯判斷or來連接,意思是這兩括號只要有一個是正確的,就可以繼續(xù)執(zhí)行下列代碼。//
PivotTest = False; //執(zhí)行的是布爾型變量PivotTest為假了。//
Else // 就是兩括號都是假的時候,執(zhí)行下列語句。//
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//還是意思假如條件都不滿足兩括號的條件。//
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值。這個CandidatePrice值是根據(jù)這個代碼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
看著這么一堆代碼下來,有的人可能覺得頭暈了,但這一步步把初值代入公式,計算得了一個,你就發(fā)現(xiàn),其實(shí)也就那樣,第二個循環(huán)也是繼續(xù)代值進(jìn)去求就得了。
我們再看這求波峰函數(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);//看到了吧,我們在求轉(zhuǎn)折的時候,定義了8個參數(shù),這邊調(diào)用Pivot時,也得用相應(yīng)8個數(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個參數(shù)吧,這里改的是-1,至于這1跟-1返回對應(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 = 收盤價。//
SwingHighPrice = SwingHigh( 1, Close, 1,2); //變量SwingHighPrice值就是把這四個參數(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,分別對應(yīng)著輸出值的定位點(diǎn),顏色,返回k線索引值。//
}
Else If(UpdateTL) //假如布爾型UpdateTL為真。//
{
If (UpDn == UpDn[1]) //假如當(dāng)前變量UpDn等于前一個變量UpDn。//
{
Unplot("ZigZag",PreBar - PreBar[1]+1); //函數(shù)Unplot意思刪除曾經(jīng)輸出的值,這里就是刪除ZigZag值,其值為當(dāng)前PreBar減去前一個PreBar值,再加上1.//
PlotNumeric("ZigZag",SwingPrice,0,-1,1);//重新畫線ZigZag線。//
}
Else//除了上邊當(dāng)前變量UpDn等于前一個變量UpDn情況之外的,直接用下列代碼處理。//
{
PlotNumeric("ZigZag",SwingPrice,0,-1,1);//直接畫線ZigZag,值為變量SwingPrice值了。//
}
}
End
這四段代碼沒點(diǎn)耐心還真不好讀下來,而且不仔細(xì)書寫一下各個計算得到的值的意思,還容易讓人迷糊,所以,我也暫時不再舉例用它做成程序化的代碼是如何寫的了,明天看看再說吧。