2014年8月14日 星期四

開發商品的交易系統 - 基礎篇 [5]

EasyTrader ArtNo 193
布林線是常常用來確定商品價格是否超出其"正常" 的交易範圍外的一個非常流行的技術分析工具。布林線是繪製在移動平均線的上方+2標準差和下方-2 標準差二條移動線。正常的狀況下, 99%的價格被含括在這2個 標準差之內。因此,我們可以安全地假設在布林帶外交易的價格是具有重大意義的。在有趨勢的市場,通常在布林帶外的交易價格意味著市場將有大量的動能和伴隨著強烈的趨勢。
在盤整波動的市場,布林線可以指示的市場超賣或超買位置及作方向改變的準備。由於這雙重的不同解釋,我們將使用第二個條件來確認價格與布林線的相對關係。為了要這樣做,我們將使用 CCI 指標。CCI 指標數值利用超過100或跌破-100 來指示市場目前是在超買或超賣狀態, 它是一個振盪指標。CCI 設計的特性讓約 75%的交易活動落在中立範圍區。

這個交易系統主要是在超賣的區域內找尋CCI反轉向上的機會, 以及在超買的區域內找尋CCI向下反轉的機會。結合CCI、 布林線這兩種分析技術,將給我們作進場的條件準備。當價格活動最近已向下穿越布林帶下方且 CCI 在超賣區域並反轉向上,是為買進訊號。如果價格最近已超過布林帶上方且 CCI 是在 超買區並反轉向下的情況,是為賣出訊號。

系統的參數與變數
inputs:BBLen(27),BBStdv(0.56),CCILen(33),CCIAvgLn(8),UpBand(165),DownBand(185) ;
vars:BarPosition(0),TopBand(0),BotBand(0),BBStatus(0),CCIAvg(0),CCITurnsUp(false),CCITurnsDown(false),StopPrice(0),MP(0),LongCount(0),ShortCount(0),LEP(0),SEP(0);

進場準備

{ 計算布林通道與 CCI 指標的均線 }
TopBand = BollingerBand(Close,BBLen,BBStdv) ;
BotBand = BollingerBand(Close,BBLen,-BBStdv) ;
CCIAvg = Xaverage(CCI(CCILen),CCIAvgLn) ;

{ 評估價格目前所在位置 }
{Determines location of prices in relation to bands }
if TopBand <> BotBand then BarPosition = (Close-BotBand)/(TopBand-BotBand) ;

if CurrentBar > 1 then Begin
{在中線附近時維持觀望}
if BarPosition cross over 0.5 then BBStatus = 0 ;
if BarPosition cross under 0.5 then BBStatus = 0 ;

{最低價跌破下通道時,為賣方環境,準備尋找買點}
if Low Cross under BotBand then BBStatus = -1 ;

{最高價突破上通道時,為買方環境,準備尋找賣點}
if High Cross over TopBand then BBStatus = 1 ;
end;

作多進場邏輯
當 CCI 在超賣區域下降中開始反轉向上時 ,我們等待最近 5根K棒內,價格突破最近 3根K棒的最高價進場作多

{Determine location of CCI}
CCITurnsUp = SwingLowBar(1,CCIAvg,1,3) = 1 and CCIAvg[1] < -DownBand ;

{Determine long entry price}
if BBStatus = -1 and CCITurnsUp then Begin
LongCount = CurrentBar ;
LEP = Highest(High,3) ;
end;

{ Place long entry order, keeping it active for 5 bars}
if Currentbar < LongCount+5 and MP <> 1 then Buy next bar at LEP stop ;

作空進場邏輯
當 CCI 在超買區域上昇中開始反轉向下時 ,我們等待最近 5根K棒內,價格跌破最近 3根K棒的最低價進場作空
{Determine location of CCI}
CCITurnsDown = SwingHighBar(1,CCIAvg,2,3) = 2 and CCIAvg[2] > UpBand ;

{Determine Short entry price}
if BBStatus = 1 and CCITurnsDown then Begin
ShortCount = CurrentBar ;
SEP = Lowest(Low,3) ;
end;

{ Place Short entry order, keeping it active for 5 bars}
if Currentbar < ShortCount+5 and MP <> -1 then Sell next bar at SEP stop ;

This function works in the same way the SwingLow function does with one exception. Instead of returning the PRICE of the bar, the function returns how many bars ago the Swing Low occurred.

{**********************************************************}
這裡使用了新的內建函數 SwingLowBar 與 SwingHighBar

SwingLowBar(OCCUR,PRICE,STRENGTH,LENGTH) 
- 尋找最近轉折低點與目前K棒位置距離

SwingHighBar(OCCUR,PRICE,STRENGTH,LENGTH) 
- 尋找最近轉折高點與目前K棒位置距離

{函數需要傳入的參數}

{最近幾次發生}
OCCUR which occurrence (i.e., 1 = most recent, 2 = 2nd most recent, and so on)
{參考價格/數值}
PRICE specifies which price of the asset of interest is to be used
{強度 -左右兩測K棒數}
STRENGTH specifies required number of bars on either side of the swing bar
{回溯K棒數}
LENGTH specifies the number of trailing bars to consider

{函數回傳值} -1 沒找到轉折低點 , 若是正值 N ,表是最低點發生在 N 根Bar 前
{**********************************************************}

出場規則 { 原始方式 }
多單進場後 以當根K棒最低點減去最近四根K棒平均振幅的2/3 做為啟始停損點

if MP = 1 and MP[1] <> 1 then StopPrice = Low-Average(Range,4)*2/3 ;
if MP = 1 then Begin
ExitLong ("ExitLng") next bar at StopPrice stop ;

{ 這裡運用移動出場的觀念,每過一根K棒重新計算出場價格以確保獲利 }
StopPrice = StopPrice + (0.3*(Low-StopPrice)) ;
end;

空單進場後 以當根K棒最高點加上最近四根K棒平均振幅的2/3 做為啟始停損點
if MP = -1 and MP[1] <> -1 then StopPrice = High + Average(Range,4)*2/3 ;
if MP = -1 then Begin
ExitShort ("ExitShort") next bar at StopPrice stop ;

{ 這裡運用移動出場的觀念,每過一根K棒重新計算出場價格以確保獲利 }
StopPrice = StopPrice - (0.3*(StopPrice-High)) ;
end;

另外加上我們平常使用的幾種出場方式一起測試
台指期 15 分K 只作多留倉 交易週期 2004/8/2 ~ 2014/7/31 交易成本 1200

台指期 15 分K 多空留倉 交易週期 2004/8/2 ~ 2014/7/31 交易成本 1200

結論:透過不同指標的特性作組合,也是能夠幫我們開發出不錯的策略
MagicQS102

2 則留言:

  1. 老師您好棒喔! 讀您的文章, 就像品嚐美酒, 好茶, 真是一大享受呢!

    回覆刪除
  2. 謝謝誇獎! 希望對大家的策略開發有所助益

    回覆刪除