2014年4月2日 星期三

●震盪+趨勢混合策略--恆溫器策略 [程式碼]

EasyTrader ArtNo 130
策略簡述
當CMI指標小於20時,策略處於震盪模式。
若處於趨買市:
最新價>max(開盤價+0.5*10日ART,3日平均低價),做多。
最新價>max(開盤價-0.75*10日ART,3日平均高價),做空。

若處於趨賣市:
最新價>max(開盤價-0.75*10日ART,3日最低價),做多。
最新價>max(開盤價+0.5*10日ART,3日最高價),做空。

當CMI指標大於20時,策略處於趨勢模式。
趨勢策略使用 布林帶策略
進入趨勢模式後,有震盪模式下的持倉,以開倉價+-3個10日ATR為出場條件。

策略詳述
恒溫器策略以其能夠在震盪和趨勢市場中自動調節交易行為而得名。看到自動調節的字眼,很多人會覺得這一定是個高級、神秘的策略。但事實恰恰相反,這是個簡單的策略組合,這類策略的關鍵在於將不同市場狀態下能成功應用的策略相結合。

市場狀態轉換,我們採用CMI指標(市場波動指標)作為評判標準。
當CMI值小於20,短週期震盪模式下運用的是區間突破結合模式識別策略。,我們將系統歸於震盪模式。模式識別依靠關鍵價指標(關鍵價指的是(high+low+close)/3),如果當收盤價高於昨天的關鍵價,我們推測明天的市場是熊市(趨賣市),反之亦然。

當CMI值大於20,該策略系統在趨勢模式下(長週期)運用的是個類似布林通道策略(常規布林策略此處不做介紹)。值得稱道的是,該模型考慮了趨勢模式下,原有震盪持倉的處理問題。因為震盪模式的出場是以3日高低均價為准。但是把這個標準放在趨勢模式下就不合時宜了,該策略的方法是以開倉價+-3個10日ATR為出場條件(一個相對較長期的條件)。

市場波動指數(Choppy Market Index,CMI)是一個用來判斷市場走勢類型的技術分析指標。

它通過計算當前收盤價與一定週期前的收盤價的差值與這段時間內價格波動的範圍的比值,來判斷目前的股價走勢是趨勢還是盤整。

市場波動指數CMI的計算公式:
CMI = (AbsValue(Close - Close[N-1])/(Highest(High,N) -Lowest(Low,N))*100);
N是週期數,例如30。

市場波動指數CMI的使用方法:
這個指標的重要用途是來區分目前的股價走勢類型:盤整,趨勢。
當CMI指標小於 20 時,市場走勢是盤整;
當CMI指標大於 20 時,市場在趨勢期。

CMI指標還可以用於預測股價走勢類型的轉變。因為物極必反,
當CMI長期處於 0 附近,此時,股價走勢很可能從盤整轉為趨勢;
當CMI長期處於 100 附近,此時,股價趨勢很可能變弱,形成盤整。

在分析CMI指標時,為了更好的反映它在一段時間內的變化趨勢,還可以對這個指標進行平滑處理,這樣可以減少“噪音”的影響。


{Thermostat by George Pruitt Two systems in one. }Inputs: bollingerLengths(50),trendLiqLength(50),numStdDevs(2),swingPrcnt1(0.50),swingPrcnt2(0.75),atrLength(10),swingTrendSwitch(20);
Vars:cmiVal(0),buyEasierDay(0),sellEasierDay(0),trendLokBuy(0),trendLokSell(0),keyOfDay(0),swingBuyPt(0),swingSellPt(0),trendBuyPt(0),trendSellPt(0),swingProtStop(0);

cmiVal = ChoppyMarketIndex(30);
buyEasierDay = 0;
sellEasierDay = 0;
trendLokBuy = Average(Low,3);
trendLokSell = Average(High,3);
keyOfDay = (High + Low + Close)/3;
if(Close > keyOfDay) then sellEasierDay = 1;
if(Close <= keyOfDay) then buyEasierDay = 1;

if(buyEasierDay = 1) then begin
swingBuyPt = Open of tomorrow + swingPrcnt1*AvgTrueRange(atrLength);
swingSellPt = Open of tomorrow - swingPrcnt2*AvgTrueRange(atrLength);
end;

if(sellEasierDay = 1) then begin
swingBuyPt = Open of tomorrow + swingPrcnt2*AvgTrueRange(atrLength);
swingSellPt = Open of tomorrow - swingPrcnt1*AvgTrueRange(atrLength);
end;

swingBuyPt = MaxList(swingBuyPt,trendLokBuy);
swingSellPt = MinList(swingSellPt,trendLokSell);
trendBuyPt = BollingerBand(Close,bollingerLengths,numStdDevs);
trendSellPt = BollingerBand(Close,bollingerLengths,–numStdDevs);

if(cmiVal < swingTrendSwitch) then begin
if(MarketPosition <> 1) then Buy("SwingBuy") next bar at swingBuyPt stop;
if(MarketPosition <> –1) then Sell("SwingSell") next bar at swingSellPt stop;
end else begin
swingProtStop = 3*AvgTrueRange(atrLength);
Buy("TrendBuy") next bar at trendBuyPt stop;
Sell("TrendSell") next bar at trendSellPt stop;
ExitLong from Entry("TrendBuy") next bar at Average(Close,trendLiqLength) stop;
ExitShort from Entry("TrendSell") next bar at Average(Close,trendLiqLength) stop;
ExitLong from Entry("SwingBuy") next bar at EntryPrice - swingProtStop stop;
ExitShort from Entry("SwingSell") next bar at EntryPrice + swingProtStop stop;
end;

讀者可以先行測試!

2 留言:

Unknown 提到...

感謝大大無私分享,我一直苦惱於如何讓程式更能判斷"趨勢盤"、"震盪盤",看來好用的程式不一定複雜,看一堆技術指標有時反而頭暈!! 謝過了

EasyTrader 提到...

ADX 也是可以搭配使用

張貼留言

如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!

----------------------------------------------------------------------------------------------------
網站聲明(Disclaimer)
本教學網站內所提供之程式碼(包括函數、指標、訊號)屬開放程式碼,用意在於讓使用者學習程式語法之撰寫,使用者可以任意修改語法內容並調整參數。本網站所有之內容(包括文章、影片、歷史紀錄、程式碼、教材)限用於個人學習使用,請勿轉寄、濫用,嚴禁私自串接帳戶交易。
-------------------------------------------------------------------------------------------------