2014年2月17日 星期一

●CCI 商品通道指標 (程式碼)

EasyTrader ArtNo 110
商品通道指標又叫CCI指標,其英文全稱為“Commodity Channel Index”,是由美國股市分析家唐納德·藍伯特(Donald Lambert)所創造的,是一種重點研判股價偏離度的股市分析工具。

一、CCI指標的原理
  CCI指標是唐納德·藍伯特於上世紀80年代提出的,是一種比較新穎的技術指標。它最早是用於期貨市場的判斷,後運用於股票市場的研判,並被廣泛使用。與大多數單一利用股票的收盤價、開盤價、最高價或最低價而發明出的各種技術分析指標不同,CCI指標是根據統計學原理,引進價格與固定期間的股價平均區間的偏離程度的概念,強調股價平均絕對偏差在股市技術分析中的重要性,是一種比較獨特的技術分析指標

  CCI指標是專門衡量股價是否超出常態分佈範圍,屬於超買超賣類指標的一種,但它與其他超買超賣型指標又有自己比較獨特之處。像大多數超買超賣型指標都有“0——100”上下界限,因此,它們對待一般常態行情的研判比較適用,而對於那些短期內暴漲暴跌的股票的價格走勢時,就可能會發生指標鈍化的現象。而CCI指標卻是波動於正無窮大到負無窮大之間,因此不會出現指標鈍化現象,這樣就有利於投資者更好地研判行情,特別是那些短期內暴漲暴跌的非常態行情。
二、CCI指標的計算方法
  和其他技術分析指標一樣,由於選用的計算周期不同,CCI指標也包括日CCI指標、周CCI指標、年CCI指標以及分鐘CCI指標等很多種類型。經常被用於股市研判的是日CCI指標和周CCI指標。雖然它們計算時取值有所不同,但基本方法一樣。

以日CCI計算為例,其計算方法有兩種。
第一種計算過程如下:
CCI(N日)=(TP-MA)÷MD÷0.015
其中,TP=(最高價+最低價+收盤價)÷3
MA=最近N日收盤價的累計之和÷N
MD=最近N日(MA-收盤價)的累計之和÷N
0.015為計算係數,N為計算周期

第二種計算方法表述為中價與中價的N日內移動平均的差除以N日內中價的平均絕對偏差
其中,中價等於最高價、最低價和收盤價之和除以3

平均絕對偏差為統計函數

從上面的計算過程我們可以看出,相對於其他技術分析指標,CCI指標的計算是比較複雜的。由於現在股市技術分析軟體的普及,對於投資者來說無需進行CCI值的計算,主要是通過對CCI指標的計算方法的瞭解,更加熟練地運用它來如何研判股市行情。

三、CCI指標的研判標準
CCI指標區間的判斷
  1、當CCI指標從下向上突破﹢100線而進入非常態區間時,表明股價脫離常態而進入異常波動階段,中短線應及時買入,如果有比較大的成交量配合,買入信號則更為可靠。
  2、當CCI指標從上向下突破﹣100線而進入另一個非常態區間時,表明股價的盤整階段已經結束,將進入一個比較長的尋底過程,投資者應以持幣觀望為主。
  3、當CCI指標從上向下突破﹢100線而重新進入常態區間時,表明股價的上漲階段可能結束,將進入一個比較長時間的盤整階段。投資者應及時逢高賣出股票。
  4、當CCI指標從下向上突破﹣100線而重新進入常態區間時,表明股價的探底階段可能結束,又將進入一個盤整階段。投資者可以逢低少量買入股票。
  5、當CCI指標在﹢100線——﹣100線的常態區間運行時,投資者則可以用KDJ、CCI等其他超買超賣指標進行研判

本篇也利用CCI 搭配 真實區間 (ATR) 應用,對歷史資料作一回測
基本設定 台指期 日K 回測週期 2001/1~2013/12/31 交易成本 1200


基本設定 台指期 60 min K 回測週期 2001/1~2013/12/31 交易成本 1200


測試程式碼(日K)
Inputs: CCI_Len(10),UpBand(100),DnBand(100),ATR_Len(10),ATR_Ratio(1.5),Stop_Ratio(2.0),NBarL(20),NBarS(20),TradeStopLoss(0.03),TradeProfit(0.05);

Var:AveTR(0),Ubuy(0),Usell(0),BuyStop(0),SellStop(0);
Var:VarL1(0),VarS1(0),EntCondL(false),EntCondS(false);
Var: IsBalanceDay(False),MP(0),PF(0),PL(0);

MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

{ Average true range }
AveTR = Average(TrueRange, ATR_Len);

{ Entry prices }
Ubuy = Close[1] + ATR_Ratio * AveTR;
Usell = Close[1] - ATR_Ratio * AveTR;

{ Entry and exit conditions }
VarL1 = CCI(CCI_Len);
VarS1 = CCI(CCI_Len);

EntCondL = VarL1 > UpBand;
EntCondS = VarS1 < -DnBand;

If EntCondL then Buy next bar at Ubuy stop;
If EntCondS then Sell next bar at Usell stop;

If MP > 0 then begin
If BarsSinceEntry = 0 then begin
BuyStop = EntryPrice - Stop_Ratio * AveTR;
end;

If BarsSinceEntry >= NBarL then ExitLong next bar at market;
ExitLong next bar at BuyStop stop;
end;

If MP < 0 then begin
If BarsSinceEntry = 0 then begin
SellStop = EntryPrice + Stop_Ratio * AveTR;
end;

If BarsSinceEntry >= NBarS then ExitShort next bar at market;
ExitShort next bar at SellStop stop;
end;

if IsBalanceDay then setExitonClose ;

0 留言:

張貼留言

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

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