原文出自這里:
請編飛狐DMA函數(shù).
函數(shù): DMA(X,N)
別名: 動態(tài)移動平均
參數(shù): X為數(shù)組,N為計(jì)算周期
返回: 返回?cái)?shù)組
說明: 求X的動態(tài)移動平均。
算法: 若Y=DMA(X,N) 則 Y=N*X+(1-N)*Y',其中Y'表示上一周期Y值,A必須小于1。
示例: DMA(CLOSE,(HIGH-LOW)/CLOSE)
表示求以該周期震幅為平滑因子的平均價(jià)
他上面的描述有點(diǎn)錯誤,應(yīng)該是N必須小于1;
且N不是計(jì)算周期,我們還是看看文華的關(guān)于DMA的描述吧,這樣清楚點(diǎn):
很簡單,我們可以看出,如果要寫這個用戶函數(shù),則我們必須要先定義兩個參數(shù),
一個是上面的X,代表價(jià)格,我們用Price來表示,一個是N,代表動態(tài)因子,我們用Length來表示
當(dāng)然,您可以用任意你喜歡的名字來表示;
好的,開始吧!
我們先新建一個用戶函數(shù),簡稱寫DMA,名稱寫:求動態(tài)移動平均,分類選用戶函數(shù),模板任意(我選bool),然后確定;
出來如下東西:
Params
Numeric Num(10);
Vars
Bool Con1;
Begin
Con1 = Close > Num;
Return Con1;
End
我們把那些沒用的東西刪除,僅留下下面的內(nèi)容
Params
Vars
Begin
End
在定義參數(shù)的時候我們首先考慮下參數(shù)的數(shù)據(jù)類型
我們先看價(jià)格參數(shù),很明顯我們應(yīng)該把它定義為數(shù)值序列型,因?yàn)镃lose啊,Open...啊,都是數(shù)值序列型的
對于動態(tài)因子,同樣簡單,應(yīng)該是數(shù)值型,于是,我們在Params關(guān)鍵字后面寫定義參數(shù)的代碼,如下:
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
Begin
End
我們首先應(yīng)該明白,我們寫函數(shù)的目的是要他幫我們做點(diǎn)事情并且返回個什么東西給我們,所以我們
再定義一個變量ReturnValue,代表這個函數(shù)要返回的數(shù)據(jù),到時候當(dāng)這個函數(shù)執(zhí)行完的時候我們就把這個東西返回給調(diào)用者 ( m.kzuj.com.cn )
于是我們再在Vars后面定義一個變量ReturnVlaue,數(shù)據(jù)類型是數(shù)值序列型,因?yàn)槊扛鵎線上都有的,所以定義成序列型,代碼如下:
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
NumericSeries ReturnValue(0);
Begin
End
好拉,現(xiàn)在我們開始寫這個函數(shù)的工作代碼了;
看看這個函數(shù)的意思,我們就很明白,今日的動態(tài)移動平均=昨日的動態(tài)移動平均*(1-動態(tài)因子)+今日的價(jià)格*動態(tài)因子;然后再把這個值Return返回就Ok了;
于是我們在Begin后面寫代碼:
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
NumericSeries ReturnValue(0);
Begin
ReturnValue = ReturnValue[1]*(1-Length)+Price*Length;
Return ReturnValue;
End
好了,這個函數(shù)就寫好了啊,是不是very very 簡單啊?
呵呵
但是細(xì)心的朋友可能會發(fā)現(xiàn),這個函數(shù)還有點(diǎn)小問題,就是如果是第一根K線,那么這根K線的昨日的動態(tài)移動平均沒有啊?
這樣做是不是會出錯啊?
對,非常對,會出錯的啊,所以我們要先判斷一下這根K線是不是第一根K線,用什么來判斷是不是第一根K線呢?請看這個函數(shù):
Integer BarStatus()
當(dāng)前公式應(yīng)用商品當(dāng)前Bar的狀態(tài)值,返回值0表示為第一個Bar,返回值為1表示為中間的普通Bar,返回值為2表示最后一個Bar。
呵呵,就用BarStatus這個函數(shù),如果他返回0,就代表第一根K線啊
于是我們再改寫完善上面的代碼為:
//------------------------------------------------------------------------
// 簡稱: DMA
// 名稱: 求動態(tài)移動平均
// 類別: 用戶函數(shù) QQ 1145508240
// 類型: 用戶函數(shù)
// 輸出: 數(shù)值型
//------------------------------------------------------------------------
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
NumericSeries ReturnValue(0);
Begin
If(BarStatus==0)
{
ReturnValue = Price;//如果是第一根K線就直接把Price賦值
}
Else
{
ReturnValue = ReturnValue[1]*(1-Length)+Price*Length;
}
Return ReturnValue;
End
//------------------------------------------------------------------------
// 編譯版本 GS2004.06.12
// 用戶版本 2007/11/03 11:57
// 版權(quán)所有 m.kzuj.com.cn
// 更改聲明 TradeBlazer Software保留對TradeBlazer平臺
// 每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------