2014年12月8日 星期一

順應趨勢的開盤價與收盤價[程式碼]

EasyTrader ArtNo 225
在市場價格上漲的過程中通常收盤價都高於開盤價,而在下跌的趨勢中則是收盤價大部份是低於開盤價,雖然在趨勢盤中總是會有價格修正的回檔與反彈,但整體而言上漲中K棒收紅多,下跌狀況K棒收黑多! 因此本篇要介紹的是一個在 TradeStation 網站的交易策略,即是從開盤價與收盤價彼此間的關係來判斷目前市場的趨勢方向。
首先我們先分別計算過去10根K棒的收盤價指數平均值與開盤價的指數平均值,並將其差距作成一長條圖,當此長柱從負值轉正值時意味著平均收盤價大於平均開盤價,也就是目前市場是上漲的,反之~長柱從正值轉負值時,意味著平均收盤價小於平均開盤價,也就是目前市場是下跌的。

作多進場邏輯
1.長柱從負值轉正值(轉多)
2.當根K棒高點加上過去10根K棒的真實區間平均值的 1/2,作為買進價格,被突破即進場
3.此 Stop 單為在條件1 成立後10根K棒內有效,或是在長柱轉為負值(轉空)時取消

多單出場
1.一旦建立多頭部位後,我們以翻多前根K棒低點減去前10根K棒的真實區間平均值的 1/2作為平倉出場價
2.當長柱轉為負值(轉空)時,多單部位平倉

作空進場邏輯
1.長柱從正值轉負值(轉空)
2.當根K棒低點減去過去10根K棒的真實區間平均值的 1/2,作為賣出價格,被跌破即進場
3.此 Stop 單為在條件1 成立後10根K棒內有效,或是在長柱轉為正值(轉多)時取消

空單出場
1.一旦建立空頭部位後,我們以翻空的前根K棒高點加上前10根K棒的真實區間平均值的 1/2作為平倉出場價
2.當長柱轉為正值(轉多)時,空單部位平倉

{指標 1 - 趨勢柱狀圖 }
Input: CloseLen(10), OpenLen(10);
Vars: Histogram(0) ;
Histogram = XAverage(Close, CloseLen) - XAverage(Open, OpenLen) ;
Plot1( Histogram, "OC Histogram", iff(Histogram >=0,Magenta,Cyan),Black,4);
Plot2(0,"zero") ;

{指標 2 - 價格線 }
Input: OpenLen(10), CloseLen(10);
Vars: Histogram(0), BuyPrice(0), SellPrice(0), LongExitPrice(0), ShortExitPrice(0);

Histogram = XAverage(Close, CloseLen) - XAverage(Open, OpenLen);

If Histogram Crosses Over 0 then Begin
BuyPrice = High + Average( TrueRange, 10 ) * .5;
LongExitPrice = Low[1] - Average(TrueRange, 10)[1]/2;
End;

If Histogram Crosses Under 0 then Begin
SellPrice = Low - Average( TrueRange, 10 ) * .5;
ShortExitPrice = High[1] + Average(TrueRange, 10)[1]/2;
End;

Plot1(BuyPrice,"BuyPrice") ;
Plot2(SellPrice,"SellPrice") ;
Plot3(LongExitPrice,"LX") ;
Plot4(ShortExitPrice,"SX") ;
原始程式碼+結算日
Input: OpenLen(10), CloseLen(10);
Vars: Histogram(0), BuyPrice(0), SellPrice(0), LongExitPrice(0), ShortExitPrice(0),isBalanceDay (False);

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

{ 計算期間內收盤價與開盤價的 EMA 平均線差距}
Histogram = XAverage(Close, CloseLen) - XAverage(Open, OpenLen);

{ 買方環境 - 當差距由負值轉正時計算多單進場價格與平倉價格 }
If Histogram Crosses Over 0 then Begin
BuyPrice = High + Average( TrueRange, 10 ) *0.5;
LongExitPrice = Low[1] - Average(TrueRange, 10)[1]/2;
End;

{ 如果差距維持正值且 10根K棒內出現翻多信號則突破進場價格,多單進場 }
If MRO(Histogram Crosses Over 0, 10, 1) > -1 AND Histogram > 0 then
Buy ("LE") next bar at BuyPrice Stop;

{ 賣方環境 - 當差距由正值轉負時,計算空單進場價格與平倉價格 }
If Histogram Crosses Under 0 then Begin
SellPrice = Low - Average( TrueRange, 10 ) *0.5;
ShortExitPrice = High[1] + Average(TrueRange, 10)[1]/2;
End;

{ 如果差距維持正值且 10根K棒內出現翻空信號 則跌破進場價格,空單進場 }
If MRO(Histogram Crosses Under 0, 10, 1) > -1 AND Histogram < 0 then
Sell ("SE") next bar at SellPrice Stop;

{ 移動停損利}
{ 多方出場}

If Histogram crosses under 0 then ExitLong this bar at Close;
ExitLong from entry ("LE") next bar at LongExitPrice Stop;

{ 空方出場}
If Histogram Crosses Over 0 then ExitShort this bar at Close;
ExitShort from entry ("SE") next bar at ShortExitPrice Stop;

if IsBalanceDay then setExitonClose ;
台指期 30 分K 多空留倉 交易週期 2004/11/1~ 2014/10/31 交易成本 1200
 台指期 60 分K 多空留倉 交易週期 2004/11/1~ 2014/10/31 交易成本 1200
 原始策略只有兩個參數讀者應該很容易作測試,就自行測試囉!

我在很多策略裡都使用了多空不對稱的參數進行測試,甚至將原始策略的固定常數,也作為可變參數作測試,以下為修改後的程式碼
input:ExitType(2) ;
inputs:NBarL(6),NBarS(7),TradeProfit(0.034),TradeStopLoss(0.026),ATRs_L(12.7),ATRs_S(4.6);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0),HLRange(100);
inputs: OpenLen(10), CloseLen(10),OpenLenS(10), CloseLenS(10),ChkBarL(10),ChkBarS(10);
Vars: Histogram(0),HistogramS(0), BuyPrice(0), SellPrice(0), LongExitPrice(0), ShortExitPrice(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 ;

Histogram = XAverage(Close, CloseLen) - XAverage(Open, OpenLen);
HistogramS = XAverage(Close, CloseLenS) - XAverage(Open, OpenLenS);

{ Long entry orders }
If Histogram Crosses Over 0 then Begin
BuyPrice = High + Average( TrueRange, ChkBarL ) * .5;
LongExitPrice = Low[1] - Average(TrueRange, ChkBarL)[1]/2;
End;

If MRO(Histogram Crosses Over 0, ChkBarL, 1) > -1 AND Histogram > 0 then
Buy ("LE2") next bar at BuyPrice Stop;

{ Short entry orders }
If HistogramS Crosses Under 0 then Begin
SellPrice = Low - Average( TrueRange, ChkBarS ) * .5;
ShortExitPrice = High[1] + Average(TrueRange, ChkBarS)[1]/2;
End;

If MRO(HistogramS Crosses Under 0, ChkBarS, 1) > -1 AND HistogramS < 0 then
Sell ("SE2") next bar at SellPrice Stop;
end;

if ExitType = 6 then Begin
{ Exits }
If Histogram crosses under 0 Then ExitLong next bar at market;
ExitLong from entry ("LE") next bar at LongExitPrice Stop;
If Histogram Crosses Over 0 Then ExitSHort next bar at market;
ExitSHort from entry ("SE") next bar at ShortExitPrice 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 then setExitonClose ;
台指期 30 分K 多空留倉 交易週期 2004/11/1~ 2014/10/31 交易成本 1200


台指期 60 分K 多空留倉 交易週期 2004/11/1~ 2014/10/31 交易成本 1200

今年的表現相當不錯喔 !
結論:策略參數使用的多寡因策略開發者的習性而異,多參數一定不好嗎?見仁見智 ! 只是參數多了在優化的測試中是一件費時耗力的事,應用[隨機參數] (多參數同時優化的方法)可以讓我們更省時省力
MagicQS136

2 則留言:

  1. Egale 老師,

    真太棒了, 好享受喔! 謝謝您的分享!
    感恩!

    祝福闔家 Merry Xmas and Happy New Year.

    回覆刪除
  2. 這篇策略是上隨機參數課程的練習題 ,上完課到現在都快半年了,不曉得同學們有沒試作 ? 呵呵

    回覆刪除