百科知識(shí)
Zigzag指標(biāo)算法和實(shí)現(xiàn)
在理解Zigzag指標(biāo)的算法之前,我們可以思考這么一個(gè)問題: 給我們下面的這副圖,我們?cè)趺茨軌虬堰@些1、2、3等數(shù)字代表的高低點(diǎn)給選擇出來? Zigzag指標(biāo)算法 如官方所述:Zigzag指標(biāo)是連接一系列價(jià)格點(diǎn)的趨勢(shì)線。所以Zigzag主要...
在理解Zigzag指標(biāo)的算法之前,我們可以思考這么一個(gè)問題:
給我們下面的這副圖,我們?cè)趺茨軌虬堰@些1、2、3等數(shù)字代表的高低點(diǎn)給選擇出來?
Zigzag指標(biāo)算法
如官方所述:Zigzag指標(biāo)是連接一系列價(jià)格點(diǎn)的趨勢(shì)線。所以Zigzag主要用途是來標(biāo)識(shí)過去價(jià)格中的相對(duì)高低點(diǎn),并以這些點(diǎn)之間的連線來表示這段價(jià)格變動(dòng)的趨勢(shì)。
1.Zigzag的3個(gè)參數(shù)
Zigzag在識(shí)別高低點(diǎn)的過程中,主要設(shè)置了以下三個(gè)參數(shù):ExtDepth, DextDeviation 以及ExtBackstep。程序中的表示:
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
說明:
+ExtDepth:用于設(shè)置高低點(diǎn)是相對(duì)與過去多少個(gè)Bars(價(jià)格圖形中的一個(gè)柱子)而言。Mt4中默認(rèn)是12。
+ExtDeviation:用于設(shè)置重新計(jì)算高低點(diǎn)時(shí),與前一高低點(diǎn)的相對(duì)點(diǎn)差。默認(rèn)值是5, 也就是說如果
A)當(dāng)前高點(diǎn)>上個(gè)高點(diǎn)+ 5 ,或者
B)當(dāng)前低點(diǎn)<上個(gè)低點(diǎn) – 5的情況下,則會(huì)對(duì)之前計(jì)算過的ExtBacksteps個(gè)Bars值的高低點(diǎn)進(jìn)行重新計(jì)算。
+ExtBackstep:用于設(shè)置回退計(jì)算的Bars的個(gè)數(shù)。
2.Zigzag算法
1對(duì)計(jì)算位置進(jìn)行初期化
1.1判斷是否是靠前次進(jìn)行高低點(diǎn)計(jì)算,如果是,則設(shè)定計(jì)算位置為除去ExtDepth個(gè)圖形最初的部分。
1.2如果之前已經(jīng)計(jì)算過,找到最近已知的三個(gè)拐點(diǎn)(高點(diǎn)或低點(diǎn)),將計(jì)算位置設(shè)置為倒數(shù)第三個(gè)拐點(diǎn)之后,重新計(jì)算最后的拐點(diǎn)。
2.從步驟1已經(jīng)設(shè)置好的計(jì)算位置開始,將對(duì)用于存儲(chǔ)高低點(diǎn)的變量進(jìn)行初始化,準(zhǔn)備計(jì)算高低點(diǎn)
2.1計(jì)算ExtDepth區(qū)間內(nèi)的低點(diǎn),如果該低點(diǎn)是當(dāng)前低點(diǎn),則進(jìn)行2.1.1的計(jì)算,并將其記錄成一個(gè)低點(diǎn)。
2.1.1如果當(dāng)前低點(diǎn)比上一個(gè)低點(diǎn)值小于相對(duì)點(diǎn)差(ExtDeviation);并且之前ExtBackstep個(gè)Bars的記錄的中,高于當(dāng)前低點(diǎn)的值清空。
2.2高點(diǎn)的計(jì)算如同2.1以及分支處理2.1.1。
3.從步驟1已經(jīng)設(shè)置好的計(jì)算位置開始,定義指標(biāo)高點(diǎn)和低點(diǎn)
3.1如果開始位置為高點(diǎn),則接下來尋找低點(diǎn),在找到低點(diǎn)之后,將下一個(gè)尋找目標(biāo)定義為高點(diǎn)
3.2如果開始位置為低點(diǎn),則與3.1反之。
Bar-14 Bar-4 Bar-1? Bar-Current
高(3.1) 低(1.5) 高(2.1)? X
對(duì)于Bar-Current,即當(dāng)前的價(jià)格X,
CaseI.
如果 X >=2.1 + ExtDeviation,則根據(jù)Zigzag的定義,這將是一個(gè)新的高點(diǎn)。假設(shè)這里X=2.3,那么我們繪制指標(biāo)的時(shí)候應(yīng)該成為:
Bar-14? Bar-4 Bar-Current
高(3.1)? 低(1.5) 高(2.3)
CaseII.
如果 1.5?– ExtDeviation< X<2.1 + ExtDeviation,則我們繼續(xù)等待價(jià)格的變化,所繪制的指標(biāo)也不會(huì)變化。
CaseIII.
如果 1.5?– ExtDeviation>= X,則這是一個(gè)新的低點(diǎn)。假設(shè)這里X=1.3,則我們繪制指標(biāo)的時(shí)候應(yīng)該成為:
Bar-14 Bar-Current
高(3.1)? 低(1.3)
這個(gè)時(shí)候,之前的Bar-4因?yàn)樵谖覀兌x的ExtBackstep之內(nèi)(1-4),所以他的最低值會(huì)被清空,
根據(jù)算法第三步的定義,我們會(huì)一直尋找低點(diǎn)直到發(fā)現(xiàn)Bar-Current,這時(shí)候已經(jīng)遍歷過Bar-1,所以Bar-1定義的高點(diǎn)也不再成為拐點(diǎn)。
這也就是所謂的重繪部分,也因此詬病為“未來函數(shù)”——因?yàn)樗匆姷漠?dāng)前最后的高低點(diǎn)可能在下個(gè)時(shí)間段里面被抹去。
3 Zigzag源碼及解釋:
Mt4的Zigzag源碼里面的注釋特別稀罕,估計(jì)是感覺實(shí)現(xiàn)比較簡(jiǎn)單,所以一概略去——恩,極壞的編程習(xí)慣。
下面簡(jiǎn)要說明一下,中文部分都是追加的解釋:
//+——————————————————————+
//|?????????????????????????????????????????????????????? Zigzag.mq4 |
//|???????????????? Copyright ?2005-2007, MetaQuotes Software Corp. |
//|?????????????????????????????????????? http://www.metaquotes.net/ |
//+——————————————————————+
#property copyright “Copyright ?2007, MetaQuotes Software Corp.”
#property link????? “http://www.metaquotes.net/”
//Mt4特有的指標(biāo)屬性設(shè)置
#property indicator_chart_window????? //主窗口進(jìn)行指標(biāo)顯示
#property indicator_buffers 1????????????//指標(biāo)運(yùn)用到數(shù)值的個(gè)數(shù)
#property indicator_color1 Red?????? //指標(biāo)顯示顏色
//—- indicator parameters
//Zigzag的三個(gè)參數(shù)
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//—- indicator buffers
//指標(biāo)的數(shù)值存儲(chǔ)變量
double ZigzagBuffer[];??????? //拐點(diǎn)
double HighMapBuffer[];????? //高點(diǎn)的臨時(shí)變量數(shù)組
double LowMapBuffer[];??? //低點(diǎn)的臨時(shí)變量數(shù)組
int level=3; // recounting’s depth? //最近已知的三個(gè)拐點(diǎn)
bool downloadhistory=false; //是否靠前次計(jì)算
//+——————————————————————+
//| Custom indicator initialization function???????????????????????? |
//+——————————————————————+
//Init函數(shù)是Mt4指標(biāo)靠前次載入之后運(yùn)行的初期化函數(shù)
int init()
{
IndicatorBuffers(3); //對(duì)于緩沖儲(chǔ)存器分配記憶應(yīng)用自定義指標(biāo)計(jì)算,用F1可以看到該函數(shù)的幫助和解釋
//—- drawing settings
SetIndexStyle(0,DRAW_SECTION);???? //劃線的風(fēng)格
//—- indicator buffers mapping
SetIndexBuffer(0,ZigzagBuffer);
SetIndexBuffer(1,HighMapBuffer);
SetIndexBuffer(2,LowMapBuffer);
SetIndexEmptyValue(0,0.0);
//—- indicator short name
IndicatorShortName(”ZigZag(”+ExtDepth+”,”+ExtDeviation+”,”+ExtBackstep+”)”);??????? //設(shè)置指標(biāo)的簡(jiǎn)稱。
//—- initialization done
return(0);
}
//+——————————————————————+
//|????????????????????????????????????????????????????????????????? |
//+——————————————————————+
//start函數(shù)是Mt4的主函數(shù),當(dāng)每次價(jià)格變動(dòng)之后都會(huì)觸發(fā)該函數(shù)的執(zhí)行
int start()
{
//變量定義
//i:臨時(shí)變量;
//counted_bars :用于標(biāo)識(shí)已經(jīng)計(jì)算過的Bar數(shù)
int i, counted_bars = IndicatorCounted();
//limit:算法中所謂的開始計(jì)算位置;
//counterZ:臨時(shí)變量
//whatlookfor:用于標(biāo)識(shí)當(dāng)前計(jì)算的是高點(diǎn)或者低點(diǎn)
int limit,counterZ,whatlookfor;
//以下都是臨時(shí)變量,具體設(shè)值時(shí)解釋
int shift,back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;
if (counted_bars==0 && downloadhistory) // history was downloaded
{?? //指標(biāo)載入時(shí)counted_bars為0,而downloadhistory為false,將在下一次價(jià)格變化時(shí)進(jìn)行
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
if (counted_bars==0)
{ //初期化,靠前次運(yùn)行時(shí)limit為除去ExtDepth個(gè)圖形最初的部分。(算法1.1)
limit=Bars-ExtDepth;
downloadhistory=true;
}
if (counted_bars>0)
{//如果之前已經(jīng)計(jì)算過,找到最近已知的三個(gè)拐點(diǎn)(高點(diǎn)或低點(diǎn)),將計(jì)算位置設(shè)置為倒數(shù)第三個(gè)拐點(diǎn)。(算法1.2)
while (counterZ{
res=ZigzagBuffer[i];
if (res!=0) counterZ++;
i++;
}
i–;???????????//在上面while中最后一次找到的時(shí)候進(jìn)行+1,所以要-1才能得到真正第三個(gè)拐點(diǎn)處。
limit=i;? //計(jì)算位置賦值
if (LowMapBuffer[i]!=0)
{//如果倒數(shù)第三個(gè)拐點(diǎn)是低點(diǎn)
curlow=LowMapBuffer[i];
//目標(biāo)在于尋找高點(diǎn)
whatlookfor=1;
}
else
{
curhigh=HighMapBuffer[i];
whatlookfor=-1;
}
for (i=limit-1;i>=0;i–)
{//清空第三個(gè)拐點(diǎn)后的數(shù)值,準(zhǔn)備重新計(jì)算最后的拐點(diǎn)
ZigzagBuffer[i]=0.0;
LowMapBuffer[i]=0.0;
HighMapBuffer[i]=0.0;
}
}
//算法Step2部分:計(jì)算高低點(diǎn)
for(shift=limit; shift>=0; shift–)
{
//2.1計(jì)算ExtDepth區(qū)間內(nèi)的低點(diǎn)
val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{//如果該低點(diǎn)是當(dāng)前低點(diǎn),
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;????????//是否比上個(gè)低點(diǎn)還低ExtDeviation,不是的話則不進(jìn)行回歸處理
else
{//找到一個(gè)新的低點(diǎn)
for(back=1; back<=ExtBackstep; back++)
{//回退ExtBackstep個(gè)Bar,把比當(dāng)前低點(diǎn)高的紀(jì)錄值給清空
res=LowMapBuffer[shift+back];
if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0.0;
}
}
}
//將新的低點(diǎn)進(jìn)行記錄
if (Low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]=0.0;
//— high
val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=HighMapBuffer[shift+back];
if((res!=0)&&(res}
}
}
if (High[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]=0.0;
}
// final cutting
if (whatlookfor==0)
{
lastlow=0;
lasthigh=0;
}
else
{
lastlow=curlow;
lasthigh=curhigh;
}
//算法step3.定義指標(biāo)的高低點(diǎn)
for (shift=limit;shift>=0;shift–)
{
res=0.0;
switch(whatlookfor)
{
//初期化的情況下,嘗試找靠前個(gè)高點(diǎn)或者是地點(diǎn)
case 0: // look for peak or lawn
if (lastlow==0 && lasthigh==0)
{//lastlow,lasthigh之前已經(jīng)初始化,再次判斷以保證正確性?
if (HighMapBuffer[shift]!=0)
{//發(fā)現(xiàn)高點(diǎn)
lasthigh=High[shift];
lasthighpos=shift;
whatlookfor=-1;????????//下個(gè)尋找目標(biāo)是低點(diǎn)
ZigzagBuffer[shift]=lasthigh;
res=1;
}
if (LowMapBuffer[shift]!=0)
{//發(fā)現(xiàn)低點(diǎn)
lastlow=Low[shift];
lastlowpos=shift;
whatlookfor=1;?????? //下個(gè)尋找目標(biāo)是高點(diǎn)
ZigzagBuffer[shift]=lastlow;
res=1;
}
}
break;
case 1: // look for peak????? //尋找高點(diǎn)
if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]{//如果在上個(gè)低點(diǎn)和下個(gè)高點(diǎn)間發(fā)現(xiàn)新的低點(diǎn),則把上個(gè)低點(diǎn)抹去,將新發(fā)現(xiàn)的低點(diǎn)作為最后一個(gè)低點(diǎn)
ZigzagBuffer[lastlowpos]=0.0;
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
res=1;
}
if (HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{//發(fā)現(xiàn)目標(biāo)高點(diǎn)
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
whatlookfor=-1;??????? //下一個(gè)目標(biāo)將是尋找低點(diǎn)
res=1;
}
break;
case -1: // look for lawn????????? //尋找低點(diǎn)
if (HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
{
ZigzagBuffer[lasthighpos]=0.0;
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
}
if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
ZigzagBuffer[shift]=lastlow;
whatlookfor=1;
}
break;
default: return;
}
}
return(0);
}
//+——————————————————————+
4.總結(jié)
以上就是對(duì)Zigzag算法和實(shí)現(xiàn)的分析。希望能夠?qū)Υ蠹揖帉懼笜?biāo)和EA有所幫助。
其他文章
- 廣州靠譜代辦營(yíng)業(yè)執(zhí)照窗口
- 辦營(yíng)業(yè)執(zhí)照需要到哪里辦手續(xù)
- 上海無地址公司執(zhí)照注冊(cè)代辦機(jī)構(gòu)
- 網(wǎng)絡(luò)科技公司經(jīng)營(yíng)范圍怎么選
- 實(shí)業(yè)公司經(jīng)營(yíng)范圍5大類怎么寫
- 衛(wèi)生許可證網(wǎng)上申請(qǐng)教程
- 石家莊早餐車怎么辦理營(yíng)業(yè)執(zhí)照
- 沒有實(shí)體店辦理營(yíng)業(yè)執(zhí)照怎么辦
- 個(gè)人網(wǎng)店如何辦理營(yíng)業(yè)執(zhí)照
- 秀米海外怎么注冊(cè)公司的
- 個(gè)人注冊(cè)一家公司要多少錢
- 重慶云上注冊(cè)公司可靠嗎,重慶云上注冊(cè)公司靠譜嗎?
- 網(wǎng)上營(yíng)業(yè)執(zhí)照辦理網(wǎng)站是什么
- 代辦營(yíng)業(yè)執(zhí)照給3萬(wàn)5
- 有了中介怎么注冊(cè)公司
- 網(wǎng)上注冊(cè)企業(yè)工商執(zhí)照流程
- 企業(yè)生產(chǎn)經(jīng)營(yíng)許可證號(hào)怎么找
- 醫(yī)藥企業(yè)注冊(cè)公司條件要求
- 青島公司注冊(cè)怎么做
- 天津注冊(cè)滴滴公司