2011年1月10日 星期一

系統訊號跨月換倉


程式交易小學堂─期貨投機事業的王道
這一篇講的是如何把交易系統的倉位訊號在結算日清空部位,但是在隔天建立同方向且口數相同的訊號。也就是說,如果你的交易系統是屬於持有口數會變化的那種的話,就會需要(適用)以下這種方式。

這個方式會讓你的系統有結算日當天最後一根的K棒沒有部位,因為每個人所採用的週期時間不同,所以清空部位的時間就不一樣,我不是定個時間來清倉的,當然你可以因應自己的需要想想用定時的方式該怎麼做?別忘了結算日當天的 01:30 期貨連續圖就不會再有報價喔!所以...想落跑要趁早 XD

首先,我們需要先在宣告兩個變數,一個用來記錄目前分線是當天的第幾根K棒,名稱就取做 K,另外還需要用來記錄在面臨結算時系統的未平倉口數 NCheckDay 是用來判斷結算日的函數

Var:K(1),N(0);
K = iff( D>D[1], 1, K+1 );

然後接上這個換倉用的程式碼在你的程式尾端。

HTS版:
//跨月換倉
  N=abs(CurrentContracts)
  if CheckDay then
    if K=(300/BarInterval)-1 then
      ExitLong  ("多換") next bar at Market
      ExitShort ("空換") next bar at Market
    end if
    if K=(300/BarInterval) and BarsSinceExit(0)=0 then
      if EntryType(0)>0 then  
        Buy  ("換多") N[1] Share next bar at Market
      else
        Sell ("換空") N[1] Share next bar at Market
      end if
    end if
  end if


MultiCharts版:
//OverMonth Change
M=CurrentContracts;
PositionWay=MarketPosition; 
if CheckDay then begin
  if K=(300/BarInterval)-1 then begin
    Sell ("L_C") next bar Market;
    BuyToCover ("S_C") next bar Market;
  end;
  if K=(300/BarInterval) and BarsSinceExit(1)=0 and PositionWay[1]>0 then
    Buy ("C_L") M[1] Share next bar at Market;
  if K=(300/BarInterval) and BarsSinceExit(1)=0 and PositionWay[1]<0 then
    SellShort ("C_S") M[1] Share next bar at Market;
end;

再來讓我們看看這樣做的效果。這個是結算當日系統本來有 1口空單,我們在結算日最後一根的開盤價出場,空手等到隔天的開盤建立 1口空單以延續本來的系統部位。

這是結算日當天系統有 2口空單,在結算日最後一根的開盤平倉,空手等到隔天開盤建立 2口空單。



以上的跨月換倉作法,通常會讓波段留倉程式的歷史回測績效變差 XD,而好處是這樣的回測數據不會受到 期貨連續圖換月的假性跳空 價差影響,也就意味著少了些灌水或是還點公道~
而且這是可以接在自動下單去執行的。

對了,當你要使用這個套件時,還必須檢查你的進場條件會不會受這個出場的動作影響?比如一開盤就有可能觸發 STOP 價格的,在跨月的時候,進場條件的合理性?

==============

我個人後來處理跨月價差的問題,採用的是結算日當天抱單抱到參與結算(不會有出場的滑價),隔天按原部位原方向進場的話,程式碼(MultiCharts)如下:
value99=marketposition;  value98=currentcontracts;
if _CheckDay and sessionlastbar then begin
  setexitonclose;
  if value99>0 then buy ("cB") value98 share next bar market;
  if value99<0 then sellshort ("cS") value98 share next bar market;
end;

熱門文章