百科知識

當前位置: 首頁 > 百科知識

百科知識

Zigzag指標算法和實現(xiàn)

2024-10-11 02:14:26 來源:互聯(lián)網(wǎng)

在理解Zigzag指標的算法之前,我們可以思考這么一個問題: 給我們下面的這副圖,我們怎么能夠把這些1、2、3等數(shù)字代表的高低點給選擇出來? Zigzag指標算法 如官方所述:Zigzag指標是連接一系列價格點的趨勢線。所以Zigzag主要...

在理解Zigzag指標的算法之前,我們可以思考這么一個問題:
給我們下面的這副圖,我們怎么能夠把這些1、2、3等數(shù)字代表的高低點給選擇出來?

Zigzag指標算法

如官方所述:Zigzag指標是連接一系列價格點的趨勢線。所以Zigzag主要用途是來標識過去價格中的相對高低點,并以這些點之間的連線來表示這段價格變動的趨勢。

1.Zigzag3個參數(shù)

Zigzag在識別高低點的過程中,主要設(shè)置了以下三個參數(shù):ExtDepth, DextDeviation 以及ExtBackstep。程序中的表示:

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

說明:
+ExtDepth:用于設(shè)置高低點是相對與過去多少個Bars(價格圖形中的一個柱子)而言。Mt4中默認是12。
+ExtDeviation:用于設(shè)置重新計算高低點時,與前一高低點的相對點差。默認值是5, 也就是說如果
A)當前高點>上個高點+ 5 ,或者
B)當前低點<上個低點 – 5的情況下,則會對之前計算過的ExtBacksteps個Bars值的高低點進行重新計算。
+ExtBackstep:用于設(shè)置回退計算的Bars的個數(shù)。

2.Zigzag算法

1對計算位置進行初期化
1.1判斷是否是靠前次進行高低點計算,如果是,則設(shè)定計算位置為除去ExtDepth個圖形最初的部分。
1.2如果之前已經(jīng)計算過,找到最近已知的三個拐點(高點或低點),將計算位置設(shè)置為倒數(shù)第三個拐點之后,重新計算最后的拐點。

2.從步驟1已經(jīng)設(shè)置好的計算位置開始,將對用于存儲高低點的變量進行初始化,準備計算高低點
2.1計算ExtDepth區(qū)間內(nèi)的低點,如果該低點是當前低點,則進行2.1.1的計算,并將其記錄成一個低點。
2.1.1如果當前低點比上一個低點值小于相對點差(ExtDeviation);并且之前ExtBackstep個Bars的記錄的中,高于當前低點的值清空。
2.2高點的計算如同2.1以及分支處理2.1.1。

3.從步驟1已經(jīng)設(shè)置好的計算位置開始,定義指標高點和低點
3.1如果開始位置為高點,則接下來尋找低點,在找到低點之后,將下一個尋找目標定義為高點
3.2如果開始位置為低點,則與3.1反之。

Bar-14   Bar-4  Bar-1?  Bar-Current
高(3.1)  低(1.5)  高(2.1)?   X

對于Bar-Current,即當前的價格X,
CaseI.
如果 X >=2.1 + ExtDeviation,則根據(jù)Zigzag的定義,這將是一個新的高點。假設(shè)這里X=2.3,那么我們繪制指標的時候應(yīng)該成為:
Bar-14?   Bar-4  Bar-Current
高(3.1)?   低(1.5)  高(2.3)

CaseII.
如果 1.5?– ExtDeviation< X<2.1 + ExtDeviation,則我們繼續(xù)等待價格的變化,所繪制的指標也不會變化。

CaseIII.
如果 1.5?– ExtDeviation>= X,則這是一個新的低點。假設(shè)這里X=1.3,則我們繪制指標的時候應(yīng)該成為:
Bar-14   Bar-Current
高(3.1)?   低(1.3)

這個時候,之前的Bar-4因為在我們定義的ExtBackstep之內(nèi)(1-4),所以他的最低值會被清空,
根據(jù)算法第三步的定義,我們會一直尋找低點直到發(fā)現(xiàn)Bar-Current,這時候已經(jīng)遍歷過Bar-1,所以Bar-1定義的高點也不再成為拐點。
這也就是所謂的重繪部分,也因此詬病為“未來函數(shù)”——因為所看見的當前最后的高低點可能在下個時間段里面被抹去。

3 Zigzag源碼及解釋:
Mt4的Zigzag源碼里面的注釋特別稀罕,估計是感覺實現(xiàn)比較簡單,所以一概略去——恩,極壞的編程習(xí)慣。
下面簡要說明一下,中文部分都是追加的解釋:

//+——————————————————————+
//|?????????????????????????????????????????????????????? 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特有的指標屬性設(shè)置
#property indicator_chart_window????? //主窗口進行指標顯示
#property indicator_buffers 1????????????//指標運用到數(shù)值的個數(shù)
#property indicator_color1 Red?????? //指標顯示顏色
//—- indicator parameters
//Zigzag的三個參數(shù)
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

//—- indicator buffers
//指標的數(shù)值存儲變量
double ZigzagBuffer[];??????? //拐點
double HighMapBuffer[];????? //高點的臨時變量數(shù)組
double LowMapBuffer[];??? //低點的臨時變量數(shù)組

int level=3; // recounting’s depth? //最近已知的三個拐點
bool downloadhistory=false; //是否靠前次計算
//+——————————————————————+
//| Custom indicator initialization function???????????????????????? |
//+——————————————————————+

//Init函數(shù)是Mt4指標靠前次載入之后運行的初期化函數(shù)
int init()
{
IndicatorBuffers(3); //對于緩沖儲存器分配記憶應(yīng)用自定義指標計算,用F1可以看到該函數(shù)的幫助和解釋
//—- drawing settings
SetIndexStyle(0,DRAW_SECTION);???? //劃線的風格
//—- 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è)置指標的簡稱。
//—- initialization done
return(0);
}
//+——————————————————————+
//|????????????????????????????????????????????????????????????????? |
//+——————————————————————+

//start函數(shù)是Mt4的主函數(shù),當每次價格變動之后都會觸發(fā)該函數(shù)的執(zhí)行
int start()
{
//變量定義

//i:臨時變量;
//counted_bars :用于標識已經(jīng)計算過的Bar數(shù)
int i, counted_bars = IndicatorCounted();

//limit:算法中所謂的開始計算位置;
//counterZ:臨時變量
//whatlookfor:用于標識當前計算的是高點或者低點
int limit,counterZ,whatlookfor;

//以下都是臨時變量,具體設(shè)值時解釋
int shift,back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;

if (counted_bars==0 && downloadhistory) // history was downloaded
{?? //指標載入時counted_bars為0,而downloadhistory為false,將在下一次價格變化時進行
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
if (counted_bars==0)
{ //初期化,靠前次運行時limit為除去ExtDepth個圖形最初的部分。(算法1.1)
limit=Bars-ExtDepth;
downloadhistory=true;
}
if (counted_bars>0)
{//如果之前已經(jīng)計算過,找到最近已知的三個拐點(高點或低點),將計算位置設(shè)置為倒數(shù)第三個拐點。(算法1.2)
while (counterZ{
res=ZigzagBuffer[i];
if (res!=0) counterZ++;
i++;
}
i–;???????????//在上面while中最后一次找到的時候進行+1,所以要-1才能得到真正第三個拐點處。
limit=i;? //計算位置賦值
if (LowMapBuffer[i]!=0)
{//如果倒數(shù)第三個拐點是低點
curlow=LowMapBuffer[i];
//目標在于尋找高點
whatlookfor=1;
}
else
{
curhigh=HighMapBuffer[i];
whatlookfor=-1;
}
for (i=limit-1;i>=0;i–)
{//清空第三個拐點后的數(shù)值,準備重新計算最后的拐點
ZigzagBuffer[i]=0.0;
LowMapBuffer[i]=0.0;
HighMapBuffer[i]=0.0;
}
}

//算法Step2部分:計算高低點
for(shift=limit; shift>=0; shift–)
{
//2.1計算ExtDepth區(qū)間內(nèi)的低點
val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{//如果該低點是當前低點,
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;????????//是否比上個低點還低ExtDeviation,不是的話則不進行回歸處理
else
{//找到一個新的低點
for(back=1; back<=ExtBackstep; back++)
{//回退ExtBackstep個Bar,把比當前低點高的紀錄值給清空
res=LowMapBuffer[shift+back];
if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0.0;
}
}
}
//將新的低點進行記錄
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.定義指標的高低點
for (shift=limit;shift>=0;shift–)
{
res=0.0;
switch(whatlookfor)
{
//初期化的情況下,嘗試找靠前個高點或者是地點
case 0: // look for peak or lawn
if (lastlow==0 && lasthigh==0)
{//lastlow,lasthigh之前已經(jīng)初始化,再次判斷以保證正確性?
if (HighMapBuffer[shift]!=0)
{//發(fā)現(xiàn)高點
lasthigh=High[shift];
lasthighpos=shift;
whatlookfor=-1;????????//下個尋找目標是低點
ZigzagBuffer[shift]=lasthigh;
res=1;
}
if (LowMapBuffer[shift]!=0)
{//發(fā)現(xiàn)低點
lastlow=Low[shift];
lastlowpos=shift;
whatlookfor=1;?????? //下個尋找目標是高點
ZigzagBuffer[shift]=lastlow;
res=1;
}
}
break;
case 1: // look for peak????? //尋找高點
if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]{//如果在上個低點和下個高點間發(fā)現(xiàn)新的低點,則把上個低點抹去,將新發(fā)現(xià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)目標高點
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
whatlookfor=-1;??????? //下一個目標將是尋找低點
res=1;
}
break;
case -1: // look for lawn????????? //尋找低點
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é)
以上就是對Zigzag算法和實現(xiàn)的分析。希望能夠?qū)Υ蠹揖帉懼笜撕虴A有所幫助。

上一篇:正規(guī)的外匯平臺有哪幾家公司,常見外匯平臺公司有哪幾家?
下一篇:2024年現(xiàn)貨黃金交易平臺排名及特色概覽(TOP 10)

熱門文章