飛狐DMA涵數(shù)改開(kāi)拓者用戶涵數(shù)[開(kāi)拓者公式]
原文出自這里:
請(qǐng)編飛狐DMA函數(shù).
函數(shù): DMA(X,N)
別名: 動(dòng)態(tài)移動(dòng)平均
參數(shù): X為數(shù)組,N為計(jì)算周期
返回: 返回?cái)?shù)組
說(shuō)明: 求X的動(dòng)態(tài)移動(dòng)平均。
算法: 若Y=DMA(X,N) 則 Y=N*X+(1-N)*Y',其中Y'表示上一周期Y值,A必須小于1。
示例: DMA(CLOSE,(HIGH-LOW)/CLOSE)
表示求以該周期震幅為平滑因子的平均價(jià)
他上面的描述有點(diǎn)錯(cuò)誤,應(yīng)該是N必須小于1;
且N不是計(jì)算周期,我們還是看看文華的關(guān)于DMA的描述吧,這樣清楚點(diǎn):
很簡(jiǎn)單,我們可以看出,如果要寫這個(gè)用戶函數(shù),則我們必須要先定義兩個(gè)參數(shù),
一個(gè)是上面的X,代表價(jià)格,我們用Price來(lái)表示,一個(gè)是N,代表動(dòng)態(tài)因子,我們用Length來(lái)表示
當(dāng)然,您可以用任意你喜歡的名字來(lái)表示;
好的,開(kāi)始吧!
我們先新建一個(gè)用戶函數(shù),簡(jiǎn)稱寫DMA,名稱寫:求動(dòng)態(tài)移動(dòng)平均,分類選用戶函數(shù),模板任意(我選bool),然后確定;
出來(lái)如下東西:
Params
Numeric Num(10);
Vars
Bool Con1;
Begin
Con1 = Close > Num;
Return Con1;
End
我們把那些沒(méi)用的東西刪除,僅留下下面的內(nèi)容
Params
Vars
Begin
End
在定義參數(shù)的時(shí)候我們首先考慮下參數(shù)的數(shù)據(jù)類型
我們先看價(jià)格參數(shù),很明顯我們應(yīng)該把它定義為數(shù)值序列型,因?yàn)镃lose啊,Open...啊,都是數(shù)值序列型的
對(duì)于動(dòng)態(tài)因子,同樣簡(jiǎn)單,應(yīng)該是數(shù)值型,于是,我們?cè)赑arams關(guān)鍵字后面寫定義參數(shù)的代碼,如下:
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
Begin
End
我們首先應(yīng)該明白,我們寫函數(shù)的目的是要他幫我們做點(diǎn)事情并且返回個(gè)什么東西給我們,所以我們
再定義一個(gè)變量ReturnValue,代表這個(gè)函數(shù)要返回的數(shù)據(jù),到時(shí)候當(dāng)這個(gè)函數(shù)執(zhí)行完的時(shí)候我們就把這個(gè)東西返回給調(diào)用者 ( m.kzuj.com.cn )
于是我們?cè)僭赩ars后面定義一個(gè)變量ReturnVlaue,數(shù)據(jù)類型是數(shù)值序列型,因?yàn)槊扛鵎線上都有的,所以定義成序列型,代碼如下:
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
NumericSeries ReturnValue(0);
Begin
End
好拉,現(xiàn)在我們開(kāi)始寫這個(gè)函數(shù)的工作代碼了;
看看這個(gè)函數(shù)的意思,我們就很明白,今日的動(dòng)態(tài)移動(dòng)平均=昨日的動(dòng)態(tài)移動(dòng)平均*(1-動(dòng)態(tài)因子)+今日的價(jià)格*動(dòng)態(tài)因子;然后再把這個(gè)值Return返回就Ok了;
于是我們?cè)贐egin后面寫代碼:
Params
NumericSeries Price(100);
Numeric Length(0.5);
Vars
NumericSeries ReturnValue(0);
Begin
ReturnValue = ReturnValue[1]*(1-Length)+Price*Length;
Return ReturnValue;
End
好了,這個(gè)函數(shù)就寫好了啊,是不是very very 簡(jiǎn)單啊?
呵呵
但是細(xì)心的朋友可能會(huì)發(fā)現(xiàn),這個(gè)函數(shù)還有點(diǎn)小問(wèn)題,就是如果是第一根K線,那么這根K線的昨日的動(dòng)態(tài)移動(dòng)平均沒(méi)有啊?
這樣做是不是會(huì)出錯(cuò)啊?
對(duì),非常對(duì),會(huì)出錯(cuò)的啊,所以我們要先判斷一下這根K線是不是第一根K線,用什么來(lái)判斷是不是第一根K線呢?請(qǐng)看這個(gè)函數(shù):
Integer BarStatus()
當(dāng)前公式應(yīng)用商品當(dāng)前Bar的狀態(tài)值,返回值0表示為第一個(gè)Bar,返回值為1表示為中間的普通Bar,返回值為2表示最后一個(gè)Bar。
呵呵,就用BarStatus這個(gè)函數(shù),如果他返回0,就代表第一根K線啊
于是我們?cè)俑膶懲晟粕厦娴拇a為:
//------------------------------------------------------------------------
// 簡(jiǎn)稱: DMA
// 名稱: 求動(dòng)態(tài)移動(dòng)平均
// 類別: 用戶函數(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保留對(duì)TradeBlazer平臺(tái)
// 每一版本的TrabeBlazer公式修改和重寫的權(quán)利
//------------------------------------------------------------------------
有思路,想編寫各種指標(biāo)公式,程序化交易模型,選股公式,預(yù)警公式的朋友
可聯(lián)系技術(shù)人員 QQ: 1145508240 進(jìn)行 有償 編寫!(不貴!點(diǎn)擊查看價(jià)格!)
相關(guān)文章
-
沒(méi)有相關(guān)內(nèi)容