input:Length(15); setinputname(1,"計算期數"); variable: OBVolume(0),Kprice(0); value1 = close-close[1]; if close<> close[1] then OBVolume += Volume*(value1)/absvalue(value1); if close<highest(high,Length) and OBVolume[2]=highest(OBVolume,Length) and OBVolume=lowest(OBVolume,3) then Kprice =L ; Ret= Close crosses under Kprice;
Author Archives: 發財橘子
MACD死亡交叉關鍵價跌破
MACD死亡交叉 是被普遍應用的賣出訊號,但我們以加權指數為例,在實務上,不一定一出現死亡交叉就賣出,因為這可能受到當時消息面或突發事件的影響,也可以是把死亡交叉當日的最低價做為一個基準價,一旦價格跌破這一基準價時再賣出。
根據這樣的邏輯所寫的腳本如下:
input: FastLength(12), SlowLength(26), MACDLength(9); variable: difValue(0), macdValue(0), oscValue(0),Kprice(0); SetInputName(1, "DIF短期期數"); SetInputName(2, "DIF長期期數"); SetInputName(3, "MACD期數"); MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue); if difValue Crosses Below macdValue then Kprice =L; if Close crosses under Kprice then ret=1;
DMI翻空
DMI是一個被廣泛使用的技術分析指標,是由技術分析大師威爾德(J. Welles Wilder)所開創出來一組技術工具。它不僅是威爾德自認為最實用的技術分析工具,同時也是深受一般技術分析師肯定的分析工具之一。DMI指標是一套在理論與實際應用上都相當複雜的技術指標。
由於DMI指標主要的用途在於作趨勢成立的判斷,因此是屬於較為長期交易的技術指標。
舉加權指數為例,請參看下圖
當+DI往下,-DI往上,且-DI穿越+DI時,如果是在一個空頭市場,或是一個比較長的修正趨勢裡,這是一個反轉的確認訊號。但由於計算方式的關係,如果是在一個多頭市場或盤整行情,這樣的情況就不見得是一個高可信度的賣出訊號了。
以下是對應的腳本
input:Length(14); setinputname(1,"計算期數"); variable: pdi(0), ndi(0), adx_value(0); DirectionMovement(Length, pdi, ndi, adx_value); if pdi<pdi[1] and ndi>ndi[1] and ndi crosses over pdi then ret=1;
DIF-MACD翻負
MACD是大家耳熟能詳的技術分析指標,英文原名為 Moving Average Convergnece & Divergence,也就是收斂發散移動平均線的意思,所以顧名思義它是移動平均線的一種。這個指標在技術分析各指標當中,算是極普遍又有名的一個。以下是MACD的計算步驟:
1. 計算出真實成本:
Pt=Ct ´ 1/2 + Ht ´ ¼ + Lt ´ ¼ 其中 Ct為收盤價, Ht為最高價, Lt為最低價
2. 計算兩條平滑平均線 12EMA與26EMA
Et = Et-1 + α ´ ( Pt – Et-1 )
其中 Et為當日平滑平均值, Et-1為前一日平滑平均值, Pt為當日真實成本,
α= 2 / ( 1+ MA) ; MA = 平均天數 (即=12或26 )
3. 計算正負差線
DIF = 12EMA – 26EMA
4. 計算MACD線(或稱EDA線)
將DIF線取九天EMA平均值即得
5.柱線 = DIF線–MACD線
根據這個公式,DIF-MACD就是 12日與26日平滑平均線的差值跟其九日移平均線的差,如果短期股價是上漲,DIF就應該是往上走,跟MACD之間的差應該是正的,如果趨勢往下,這個值就會翻黑。
舉加權指數為例
從上圖來看,DIF-MACD翻負,在多頭及盤整時基本上算是漲勢的拉回或修正,但在空頭市場,則是跌勢的確認,所以當出現這個訊號時,可以搭配其他型態上等因素一起考量,如果是在一個大環境不利多頭發展的情況下,那麼這個訊號就必須被嚴肅的看待。
以下是這個賣出訊號的腳本
// DIF-MACD翻負 input: FastLength(12, "DIF短期期數"), SlowLength(26, "DIF長期期數"), MACDLength(9, "MACD期數"); variable: difValue(0), macdValue(0), oscValue(0); MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue); if oscValue Crosses Below 0 then ret=1;
多次到底而破
多次到底而破的型態有如下圖
有點像是跌破多次止跌區的概念。
對應的腳本如下:
input:day(100); input:band1(4); setinputname(1,"計算區間"); setinputname(2,"三高點之高低價差"); value1=nthlowest(1,low[1],day); value2=nthlowest(3,low[1],day); value4=nthlowestbar(1,low,day); value5=nthlowestbar(3,low,day); value6=nthlowestbar(5,low,day); value7=absvalue(value4-value6); value8=absvalue(value5-value6); value9=absvalue(value4-value5); condition1=false; if value7>3 and value8>3 and value9>3 then condition1=true; value3=(value1-value2)/value2; if value3<=band1/100 and close crosses under value1 and volume>2000 and condition1 then ret=1;
以下的例子是從上面的腳本中挑中的。
這個策略在空頭市場有不錯的勝率,如果手上有的基金出現這樣的型態是真的必須小心是否是另一段跌勢的開始。
CCI超買反轉直下
CCI指標的原文是 Commodity Channel Index,直譯的話就是「商品通道指標」。這個指標是由Donald R. Lamber所發明的。
這個指標的計算過程如下:
1. 先計算出典型價格:
TP t = ( 最高價t + 最低價t + 收盤價t ) /3
2. 求算典型價格的簡單平均值:
MA t =( TPt + TPt-1 + ... + TP t-n+1 ) / n
3. MA t 與TPt 離差絕對值的n日加總:
MD t =(|MAt-TPt|+|MAt-1-TPt-1 |+....+|MAt-n+1-TPt-n+1|)/n
4. CCI公式:
CCI t = ( TP t-MA t ) / ( 0.015 * MD t )
這個CCI公式的設計,當典型價格等於其平均值時,CCI值會等於零。所以這個公式的原始設計比較像是在使用乖離率的觀念,因為只有當最後股價在極短期內作劇烈的向上或向下運動時,CCI值才會出現突然向上或向下大幅擺盪的極端值。這個公式的發明者為了將CCI指標值限定在一定的範圍內波動,所以特別將分母部份乘上0.015的參數值。
所以當C CI是個乖離概念,那麼我們就可以寫一個腳本,找出當CCI超過100超買之後,如果價格跌破當被超買時的股價低點,把它視為一個賣出訊號,下面就是這麼一個腳本
Input: Length(14), AvgLength(9), Overbought(100); Variable: cciValue(0), cciMAValue(0),KPrice(0); SetInputName(1, "期數"); SetInputName(2, "平滑期數"); SetInputName(3, "超買值"); cciValue = CommodityChannel(Length); cciMAValue = Average(cciValue, AvgLength); if cciMAValue Crosses Above OverBought then KPrice =L;; if Close crosses under KPrice then ret=1;
這個腳本就是專門在正乖離過大時,一旦股價跌破關鍵價位,就出賣出訊號。
好久沒出現的連五日上漲
如果近百日以來都沒有出現價格連續五天上漲,而現在出現了,這代表這市場先前並沒有出現多頭長驅而入的現象,但現在出現,這就是個訊號,一個多頭士氣如虹的訊號。
我們可以把這個現象寫成腳本如下
setbarback(100); if trueall(close>close[1],5) and barslast(trueall(close>close[1],5))[1]>100 then ret=1; //40天後出場
然後就可以找出像下面這張圖的標的
這個腳本在多頭市場的回測報告如下
如報告中所列,其實基金對應的Benchmark要出現這樣的訊號,次數並不多見,但勝率其實不錯,所以如果出現這個訊號,是可以多留意該市場的後市的。
多方勢力壓過空方
基金投資用的Benchmark都是指數對應的ETF,除了價量之外,一般沒有像個股有其他的決策可應用的欄位如籌碼,如財報等等,這時候像開高低收這四個價位也就很彌足珍貴,需要更用力的使用,例如我們可以把每天的最高價減收盤價稱為上檔賣壓,把收盤價減最低價稱為下檔支撐。諸如此類的,透過對多空力道的定義及演算,計算出一天裡的多空淨力道,然後據以作為研判市場多空的依據。
根據這樣的精神,對應的腳本如下
input:day(5,"短期參數"),period(10,"長期參數"); value1=summation(high-close,period);//上檔賣壓 value2=summation(close-open,period); //多空實績 value3=summation(close-low,period);//下檔支撐 value4=summation(open-close[1],period);//隔夜力道 if close<>0 then value5=(value2+value3+value4-value1)/close*100; value6=linearregslope(value5,period); if trueall(value6[1]<0,10) and value6>0 and value5 <0 then ret=1;
以下是一個上述腳本挑出來的例子
這個策略在多頭市場的回測報告如下
由於這個策略只要是近十天多空淨力趨勢開始由下轉向上時就算數,所以跑出來的交易次數蠻多的,可以輔以其他的策略來搭配使用。
碗型底
在型態學上,碗型底是一個可遇不可求的型態,這種碗如果夠大,後面多頭行情就可能走的愈長久,但可惜碗型底要用程式寫出來有點難度,我們試著寫出一個儘量接近的腳本,幫大家挑出可能的碗型底,但由於目標是寧可多挑也不要放過,所以挑中的標的,還需要大家用肉眼再作一次確認。
我們寫的腳本如下
input:t2(60,"敏感度(T)"),S1(true,"T=早訊號,F=晚訊號"); variable:t1(1); value1=(H+L+O+C)/4; value2=square(H)+square(L)+square(O)+square(C); value14+=value2; if value2[t2]<>0 then value14-=value2[t2]; value15+=value1; if value1[t2]<>0 then value15-=value1[t2]; value16=(value14-t2*4*square(value15/t2))/(t2*4); value17=mtm(t2/2); value18=wma(value17,round(t2*0.2,0)); value19=wma(value16,round(t2*0.2,0)); condition1=s1 and value19<value19[1] and value18>value18[1]; condition3=not s1 and value18 crosses over 0; if value18 crosses under 0 then condition2=true; if trueall(value19>value19[1] and value18<value18[1],t2*0.1) then condition4=true; if (condition1 or condition3) and condition2 and condition4 then begin condition2=false; condition4=false; ret=1; end;
符合這個腳本的例子如下
這個腳本在多頭市場下的回測報告如下
碗型底原本就可遇不可求,這個腳本把條件設的比較寬,挑中的要麻煩大家再檢視一下。
趨向指標轉向多頭(ADX趨勢成形)
ADX是DMI這個指標裡,一個確認趨勢確立的指標,這個指標轉正,代表上漲趨勢已然確立,我們發現,這個指標拿來應用基金投資的相關指數Benchmark上,有不錯的效果。
要印證這樣的想法,對應的腳本如下
input: Length(14), Threshold(25); variable: pdi_value(0), ndi_value(0), adx_value(0); settotalbar(maxlist(Length,6) * 13 + 8); SetInputName(1, "期數"); SetInputName(2, "穿越值"); DirectionMovement(Length, pdi_value, ndi_value, adx_value); if adx_value Crosses Above Threshold then ret=1;;
以下的例子就是腳本所挑出來的標的之一,這樣的訊號會出現在整個上昇趨勢確定的當下。
這個策略在多頭市場下的回測報告如下:
從勝率上看,幾乎已經是三戰兩勝的比例了。