如上圖,我想應該是個很清楚的 MACD 背離條件,價格創新高但指標沒有跟著創新高。但是你很容易了解的東西,並不代表可以很容易的轉化為程式條件。
因為你不知道怎麼量化他。
所以這邊比較簡單的作法,就是利用 K 棒的根數來區隔二個高點,分別記錄下當時的價位和指標的位置。
以上面那個例子來說…也許你希望二個高點中間是隔著 20 根 K 棒,這個背離條件才算成立。所以就試著把這樣的背離條件寫出來吧:
array: highPoint[2](0), highMACD[2](0), highK[2](0);
Value1 = MACD(close, 12, 26);
Value2 = XAverage(MACD(close, 12, 26), 9);
if Value1 cross under Value2 then begin
highPoint[0] = highPoint[1];
highMACD[0] = highMACD[1];
highK[0] = highK[1];
for Value3 = 0 to 10 begin
if high[Value3] = highest(high, 10) then begin
highPoint[1] = high[Value3];
highMACD[1] = Value1[Value3];
highK[1] = barnumber[Value3];
end;
end;
if highPoint[1] > highPoint[0] and highMACD[1] < highMACD[0] and highK[1] > highK[0] + 20 then begin
sell next bar at market;
end;
end;
setexitonclose;
這個程式我想又比之前的東西難度更高了一點…
首先我用到了 Array 來宣告變數。在這邊我宣告了三個變數等著來儲存高點、MACD值、和當時的 K 棒。
接下來就是熟悉的 MACD 計算式。
再來的 if 這區塊可能稍微難一點…不過慢慢看應該還是懂我在寫什麼。首先是判斷 MACD 是否死亡交叉。
如果產生死亡交叉後,把 Array 的值給移動一下,因為 Array[1] 這個值我們要拿來儲存最新的值,所以把這個值丟到 Array[0] 裡面去。
在來是一個 For 迴圈,在這邊我假設產生的高點會出現在離交叉出現前的十根 K 線之內。所以我用了一個 For 來去抓出最高價( high[Value3] = highest(high, 10) ) ,當抓出最高價後,就把最高價的值丟進 highPoint[1] 裡面,順便把 MACD 的值和 K 線的值也分別丟進 array 內。
接下來就是比較目前的交叉前所產生的高點和前一個高點,是不是有背離的條件產生。有的話就是空單進場。
當然同樣的…這績效並不怎麼樣。
整個想法化為程式的過程就在上面了…接下來就是多思考、多練習吧。當你有一個想法想實際測試一下的時候…請注意是不是能夠量化。因為用講的總是很簡單…可惜電腦沒這麼聰明。
練習的話…就把多單完成吧。
請教宣告array這行array: highPoint[2](0), highMACD[2](0), highK[2](0);
回覆刪除意思是不是宣告二為陣列,從0開始? 謝謝~
J.I. 這是一維陣列..起始值設為 0
回覆刪除我也不懂耶...
回覆刪除那你那個[2]是什麼意思呢?
小峰to layx
回覆刪除依我的看法[2]是指一維陣列共有兩格,每格的值為0,
只是不知陣列的起始值是從0開始還是1?
請問格的意思試...
回覆刪除你這樣講起來我感覺是2x1的矩陣
回去重看第三篇…
回覆刪除第三偏是哪偏阿= =a
回覆刪除http://ssdkchang.blogspot.com/2010/02/blog-post.html
回覆刪除