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