2015年12月22日 星期二

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

EasyTrader ArtNo 282
你的市場商品正處於哪個階段 ? 商品價格在任何時候可以是上漲、下跌或是保持不變。當市場價格在一段時期保持相對不變的稱為盤整。而能見到相對較高的價格被稱為上升趨勢,同時一段相對較低的價格時期被稱為下降趨勢。本篇介紹 M.H.Pee 所開發的一個相位變化指標(PCI) 是專門用於檢測市場分階段變化的指標。



圖一到圖六表示市場價格可能的六個相位變化 (黑線表示為特定的時期收盤價,圖例為 35 天) 。PCI 則是告訴我們如何區分六個相位 ? 首先,請注意,為了能在市場獲利,我們必需會在上漲過程中持有多頭倉位,如圖 1 和圖 3 (他們的信號可能是上升趨勢的開始),在下跌趨勢中(如圖 2 和圖 4) 持有空頭倉位,至於在圖 5 和圖 6 中的情形,可能是保持現有倉位不變或是先平倉空手。

為了找到答案,將所選期間畫一個假想的坡度線連接起點和終點的收盤價 (圖中的紅線)


圖 1 和圖 3 中的情形,請注意期間收盤價大部分仍低於這條紅線。此外,坡度線向上傾斜。
圖 2 和圖 4 大部分的收盤價都在紅線之上且坡度線向下傾斜。
圖 5 收盤價大部分仍高於紅線 (這是一樣的圖 2 和圖 4),但其坡度線是向上傾斜下來。
圖 6 顯示,大多數收盤價低於紅線 (類似于圖 1 和圖 3),但它顯示向下傾斜的坡度線。

35 天動量線量測代表坡度線的斜率,而收盤價與坡度線的位置由 PCI來表示。

若要計算 35 天的相位變化指數,我們需要找到過去 35 天每個坡度線與收盤價的偏差。
PCI = [(D+) / ((D+) + (D-))] * 100
D + 是過去的 35 根K棒向上偏差的總和
D -  是過去的 35 根K棒向下偏差的總和


PCI 只有 0 和 100 之間上下波動。35 天 的PCI 值在80 上方或在20下方表示在那段期間內存在著相位的變化 。這些變化可能是從盤整轉變為上升或六個相位中任一種。PCI 值在80 與20之間表示不存在相位變化。這意味著當前市場保持穩定。
參考此篇文章 Phase Change Index
{指標程式碼}
inputs: LBack(34);
vars: MomL(0),SumDev(0),Devplus(0),DevMinus(0),PCI(0),Counter(0),SumNo(0),PMGap(0);

if Lback <> 0 then MomL = (Close-Close[LBack])/(LBack) ;
SumNo = 0 ;
SumDev = 0 ;
For Counter = 1 to LBack-1 Begin
SumDev = SumDev+AbsValue(Close[LBack-Counter]-Close[Lback]-Counter*MomL) ;
SumNo = SumNo + Counter ;
End;

SumNo = SumNo + LBack ;

PMGap = Summation(Close,LBack+1)-(LBack+1)*Close[LBack] - SumNo*MomL ;
DevPlus = iff(PMGap > 0 ,(SumDev-PMGap)/2 +PMGap,(SumDev+PMGap)/2) ;

if SumDev <> 0 then PCI = DevPlus/SumDev *100;
Plot1(PCI,"PCI") ;
Plot3(80,"Uband") ;
Plot4(20,"Lband") ;

{ 動量指標 }
inputs: LBack(34);
vars: MomL(0);
if Lback <> 0 then MomL = (Close-Close[LBack+1])/(LBack) ;
Plot1(MomL,"MomL",iff(MomL > 0,Magenta,Cyan),Black,3) ;



{系統參數與變數} 
input:EntryType(1),ExitType(2),FTR_LE(1),FTR_SE(1);
inputs:NBarL(27),NBarS(13),TradeProfit(0.028),TradeStopLoss(0.034),ATRs_L(15.8),ATRs_S(13.8);
vars:IsBalanceDay(False),MP(0),PF(0),PL(0);
inputs:LenA(35),Avg1(5),LenB(35),Avg2(5),HB(80),LB(20),HighBar(5),LowBar(5) ;
vars: MomL(0),SumDev(0),Devplus(0),DevMinus(0),PCI(0),Counter(0),SumNo(0),PMGap(0);
vars:MomL1(0),SumDev1(0),Devplus1(0),DevMinus1(0),PCI1(0),Counter1(0),SumNo1(0),PMGap1(0);
vars: AvgMomL(0),AvgMomL1(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 ;

{ 計算平均動量變化 }
if LenA <> 0 then MomL = (Close-Close[LenA])/(LenA) ;

SumNo = 0 ;
SumDev = 0 ;

{計算期間內 D+ 與 D-的總和 }
For counter = 1 to LenA-1 Begin
SumDev = SumDev+AbsValue(Close[LenA-Counter]-Close[LenA]-Counter*MomL) ;
SumNo = SumNo + Counter ;
End;

SumNo = SumNo + LenA ;

{計算期間內 D+ 與 D-的差值 }
PMGap = Summation(Close,LenA+1)-(LenA+1)*Close[LenA] - SumNo*MomL ;

{計算期間內 D+ 值 }
DevPlus = iff(PMGap > 0 ,(SumDev-PMGap)/2 +PMGap,(SumDev+PMGap)/2) ;

{計算期間內 PCI 值 }
if SumDev <> 0 then PCI = DevPlus/SumDev *100;

{ 計算另一組不同期間PCI值作為多空不同進場參考 }
if LenB <> 0 then MomL1 = (Close-Close[LenB])/(LenB) ;
SumNo1 = 0 ;
SumDev1 = 0 ;

For Counter1 = 1 to LenB-1 Begin
SumDev1 = SumDev1+AbsValue(Close[LenB-Counter1]-Close[LenB]-Counter1*MomL1) ;
SumNo1 = SumNo1 + Counter1 ;
End;

SumNo1 = SumNo1 + LenB ;

PMGap1 = Summation(Close,LenB+1)-(LenB+1)*Close[LenB] - SumNo1*MomL1 ;
DevPlus1 = iff(PMGap1 > 0 ,(SumDev1-PMGap1)/2 +PMGap1,(SumDev1+PMGap1)/2) ;

if SumDev1 <> 0 then PCI1 = DevPlus1/SumDev1 *100;

{ 依據相位變化來作多空進場 -多空參考週期相同}
if EntryType = 1 then begin
if MP <> 1 and PCI < LB and MomL > 0 then buy next bar at Highest(High,HighBar) stop;
if MP <> -1 and PCI > HB and MomL < 0 then sell next bar at Lowest(Low,LowBar) stop;
end;

{ 依據相位變化來作多空進場 -多空參考週期不同 }
if EntryType = 2 then begin
if MP <> 1 and PCI < LB and MomL > 0 then buy next bar at Highest(High,HighBar) stop;
if MP <> -1 and PCI1 > HB and MomL1 < 0 then sell next bar at Lowest(Low,LowBar) stop;
end;

if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin
if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;
end;

if ExitType = 4 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
if MP > 0 and BarsSinceEntry = NBarL then {Sell } ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then {Buy} ExitShort next bar at Market ;
end;

if IsBalanceDay or date = 1150224 then setExitonClose ;

進場方式 1 _ 台指期 30 min K 多空留倉 交易週期 2005/6/30~ 2015/6/30 交易成本 1200


進場方式 2 _ 台指期 30 min K 多空留倉 交易週期 2005/6/30~ 2015/6/30 交易成本 1200


結論:從作者測試的商品包含外匯、金屬、國債、農產品、能源從1980~2003 之間都有不錯的表現,而從本文中所作的台指期測試也有一定的績效表現。
MagicQS190

3 則留言:

  1. 請問, 為什麼在計算另一組不同期間PCI值作為多空不同進場參考 所用的LenB 跟LenA 是一樣?

    可以解釋一下“依據相位變化來作多空進場 -多空參考週期不同”的碼嗎?! 謝謝🙏

    回覆刪除
    回覆
    1. 預設參數 LenB 跟LenA 是一樣 應用在多空參考K棒長度一樣
      當進場方式選用 EntryType = 2 且 LenB 跟LenA 是不一樣的數值
      if MP <> 1 and PCI < LB and MomL > 0 then buy next bar at Highest(High,HighBar) stop;
      if MP <> -1 and PCI1 > HB and MomL1 < 0 then sell next bar at Lowest(Low,LowBar) stop;
      多方進場是 PCI 空方進場是參考 PCI1 喔

      刪除