2013年11月12日 星期二

函數(_dayMA):分線圖上抓取即時的日線MA值


在 MultiCharts 上,我們要在分線或是秒線這樣比日線小的時間層級中取用日線級的資料時,如果僅僅日線的開高低收,有內建函數 openD(ago)、highD(ago)、lowD(ago)、closeD(ago)可以直接拿來用。

但如果我要取用的日線資料是比如技術指標 KD、RSI、MACD 這類的數值呢?通常我們會使用多商品方式去做,也就是 dataN,在圖表上把日線K棒放進序列2或是更多,然後在程式碼內寫上比如:RSI(close, 9) of data2 來抓取日線的 9RSI數值,在指標上這麼做的話,完全沒有問題。

簡單的操作如下,以下皆以簡單移動平均為例。新增商品,日線,放到 Data2,然後新增指標,讓它取 Data2 的資料來做計算。





問題是,指標通常只能用來作為...觀賞用。要把日線資料用來作為策略訊號的判斷就跟我們想得不一樣了。直接把取用 MA 的資料放在訊號中,Print 來觀察一下。你可以看到,在訊號中取來的日線MA數值,其實不是當天的MA,而是"昨天"的 MA,換言之,在訊號中,如果沒有開啟 IOG,經由多商品的方式取來的值是...被取值商品的前一根,而取不到當下的。


那如果,我想要在分線中取日線的MA,而不要用近似值呢(很多人可能就在10分鐘線上,用 30*5=150MA 來當做 5日MA 用)?這就要回到原本日線的MA怎麼計算去做了。也就是直接取最近幾個日線的收盤價來計算。簡單嘛,大不了 5日MA就 ( closeD(0)+closeD(1)+...+closeD(4) ) / 5 就行了唄。那 10日MA,60日MA?你打算怎麼處理?順便練習打字嗎?

這時候我們可以把迴圈與陣列一起搭配來使用!利用迴圈,依序把最近幾個日線的收盤價填到一維陣列裡面,然後把陣列的個別值依序取出來加總後做平均計算,我們就能得到專門用來在分線裡取得即時日線MA值的函數,而且還能做參數最佳化咧。

做一個函數名稱為 _dayMA
inputs:Len( numericsimple ) ;                                             
var:j(0),sumDayClose(0);
Array:dayClose[200](0);


for j=0 to len-1 begin
  dayClose[j] = closeD(j);
end;

sumDayClose=0;
for j=0 to len begin
  sumDayClose= sumDayClose+dayClose[j];
end;


_dayMA= sumDayClose / len ;


再來,把這個函數引用到剛剛的訊號裡面做一下測試,看看如此得到的MA數值,是否是...即時的?從以下這個 Print 跟上面的訊號數值 Print 做對照就可以明顯發現,這個以 _dayMA 函數去算出來的 日線5MA,盤中的每根K棒數值都不同,且最後一根的數值,跟直接用日線圖計算的 5MA 是一樣的!而且,這樣的作法是不需要 Data2 的喔


好啦,透過這樣的架構我們就可以陸續把許多你想要在分線中引用日線級的資料,透過陣列與迴圈的協同運作,得到即時的日線資料,而不會只能屈就於...昨天。

當然,你要這麼做的話就必須知道你想取得的日線技術指標值,比如 RSI 或是其他技術指標是怎麼計算的啦。這個範例是用來讓你知道,如何透過陣列把需要的值保留下來做你想要的計算。

熱門文章