2014年4月30日 星期三

●布林交易系統 [程式碼]

EasyTrader ArtNo 144
參考部落格 布林帶寬度的交易模型MACD BBand 都有應用到布林帶作為策略元素,本篇介紹這個國外的 布林交易系統比較特別的是它的出場方式

布林帶(BOLL)是由John Bollinger在20世紀60年代創建的。最初,布林帶是用來判斷市場走勢的邊界,現在國內很多人也依然這麼用,即當價格移動到上軌或下軌附近後,預測價格將會回歸到中軌。但是經過測試,已經發現將上、下軌作為突破指標的效果要遠好於做為阻力指標。

布林交易系統是一個中長線策略,將採用後者的規則,價格超過50日移動平均線上方N個標準差作為買進信號的標準,跌破50日移動平均線下方N個標準差作為賣出信號的標準。

除了上文講到的主體交易系統外,作為通道趨勢交易,布林交易系統還增加了確認模組。

之前我們提到過上軌下軌是潛在的買入賣出點。這裏潛在的是一個關鍵字眼。在建立倉位前我們必須進行多次確認:當日收盤價必須高於30日前的收盤價才能做多,當日收盤價必須低於30 日前的收盤價才能做空。這個額外的要求是一個趨勢濾網。我們只希望在上升趨勢中做多或者在下降趨勢中做空。

接下來要介紹一個該系統最具特色一個部分——出場:我們都知道常規3條線組成的通道策略,都是以突破上下軌開倉,回歸中軌平倉。但是這種平倉方式,將捨棄很大一塊利潤。布林交易系統採用了一個較另類、較積極的方式

入場條件:
價格突破布林帶上軌,收盤價大於30週期收盤價最高值,即做多;
價格跌破布林帶下軌,收盤價小於30週期收盤價最低值,即做空;

出場條件:
主條件:當建立倉位時,保護性止損設置在50 日均線(中軌)。之後持有倉位的時間每多一天,計算移動平均線的天數減一。持有倉位時間越長,我們越容易帶著利潤離場。計算移動平均線的天數最小可以遞減到10。如果達到10,則不再遞減。

次條件:
如果持多倉,移動平均低於上軌發出平倉信號;
如果持空倉,移動平均高於下軌發出平倉信號。

加入這個離場條件是為了防止布林系統在停損之後重複入場。
如果我們不使用這個離場條件,當移動平均在上軌上方時,多頭入場條件仍然成立,因此多頭將會建立倉位。

Inputs: bollingerLengths(50),liqLength(50),rocCalcLength(30);
Vars: upBand(0),dnBand(0),liqDays(50),rocCalc(0);
upBand = BollingerBand(Close,bollingerLengths,1.25);
dnBand = BollingerBand(Close,bollingerLengths,-1.25);
rocCalc = Close - Close[rocCalcLength-1]; {remember to subtract 1}

if(MarketPosition <> 1 and rocCalc > 0) then Buy ("BanditBuy") tomorrow upBand stop;
if(MarketPosition <>-1 and rocCalc < 0) then Sell ("BanditSell") tomorrow dnBand stop;

[計算移動平均線的天數最小可以遞減到10。如果達到10,則不再遞減]
if(MarketPosition = 0) then liqDays = liqLength;
if(MarketPosition <> 0) then begin
liqDays = liqDays - 1;
liqDays = MaxList(liqDays,10);
end;

if(MarketPosition = 1 and Average(Close,liqDays) < upBand) then
ExitLong ("Long Liq") tomorrow Average(Close,liqDays) stop;
if(MarketPosition = -1 and Average(Close,liqDays) > dnBand) then
ExitShort ("Short Liq") tomorrow Average(Close,liqDays) stop;

加入結算日及參數調整
台指期 60分K 最近 3000 交易日 留倉測試 交易成本 1200





邏輯改變 用 ADX判斷是趨勢還是盤整
upBand = BollingerBand(Close,BarLenL,DevUp);
dnBand = BollingerBand(Close,BarLenS,-DevDn) ;

if ADX(ADXTrend) > TrendNO then Begin
if(MarketPosition <> 1 and ExitsToday(date) = 0)
then Buy("BandBuy")tomorrow upBand
stop;
if(MarketPosition <> -1 and ExitsToday(date) = 0) then
Sell("BandSell")tomorrow dnBand
stop;
end;

if ADX(ADXSwing) < SwingNO then Begin
if(MarketPosition <> 1 and ExitsToday(date) = 0) and Close > UpBand then
Sell("RevSell")tomorrow upBand stop;
if(MarketPosition <> -1 and ExitsToday(date) = 0) and Close < dnBand then
Buy("RevBuy")tomorrow dnBand stop;
end;


0 留言:

張貼留言

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

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