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;



MagicQS067

沒有留言:

張貼留言