2010年9月21日 星期二

[程式交易]留倉單轉倉的寫法

  很多人在測試留倉單時,往往都忽略了結算日當天,近月的契約已被結算掉了,隔日的新倉跳空,在實際上是參與不到的,這不管在參數最佳化或回測報表中,均無法顯示出來,為了要能更精細計算獲利的差異,應該要在結算日當天的13:25時將目前的部位先平倉掉,至隔日再依據策略決定是否建倉。在2003~2007四年的績效報表中,不平倉與平倉二種績效竟然可以差到20萬,為了能讓報表更能呈現實際情況,一定得看看平倉後的績效表現。

隔日建倉有二種做法,一種是隔日一開盤,自動建立昨日平倉掉的多空部位,另一種是等待下次訊號出現時再進場,不同的策略,會有不同的作法,所以本篇文章的將提供一個範本,可以由參數來設定這些交易的策略,讀者可以自行加入自己的進出場參數與進出場策略。



Inputs:IsAutoExit(true), IsAutoBuild(true) {,…其他參數.};

Variables:NeedLong(false), NeedShort(false) {,…其他變數.};

If Date <> Date[1] Then

Begin

      If NeedLong Then

         Buy(“LE_Settle”) At Next Bar Open;

    If NeedShort Then

         Sell(“SE_Settle”) At Next Bar Open;

    If _IsSettleDay(Date[1]) Then

         Begin

             NeedLong = fasle;

          NeedShort = false;

         End;

End;



{



其他策略進出場條件



}



If Time > 1320 And IsAutoExit And _IsSettleDay(Date) And MarketPosition <> 0 Then

Begin

If MarketPosition > 0 Then

Begin

ExitLong(“LX_Settle”) At Next Bar Open;

If IsAutoBuild Then

NeedLong = true;

End;

If MarketPosition < 0 Then

Begin

ExitShort(“SX_Settle”) At Next Bar Open;

If IsAutoBuild Then

NeedShort = true;

End;

End;

2010年9月14日 星期二

[程式交易]計算最近幾日四價的均值

在前上一篇文章中寫到如何分鐘的策略中計算前幾日的最高最低價,本文將介紹如何計算前幾日四價(開高低收)的平均值。
函式原始碼:
{
    NumericType : 傳入O, H, L, C四種字串來代表開盤價, 最高價, 最低價, 收盤價
    DayCount : 計算的天數
}
Input : NumericType(String), DayCount(NumericSimple);
Variables : SumD(0), Counter(0);

SumD = 0;
For Counter = 1 To DayCount
Begin
    If NumericType = "O" Then               
        SumD = SumD + OpenD(Counter);

    If NumericType = "H" Then
        SumD = SumD + HighD(Counter);

    If NumericType = "L" Then
        SumD = SumD + LowD(Counter);

    If NumericType = "C" Then
        SumD = SumD + CloseD(Counter);
End;

_AverageD = IFF(DayCount > 0, SumD / DayCount, 0);

2010年9月13日 星期一

[程式交易]計算最近幾日的高低點函式

在開發當沖策略時,常常會使用到前幾天的高或低價是否被突破,以做為進場的判斷,這些程式的寫法很類似,若每段訊號的程式都使用複製的方式,則一旦程式有錯,將會修改許多程式碼,最好的方式即是寫成函式來使用,這樣只需要修改函式部份即可。
以下為幾日最高價或最低價的函式原始碼:

[1]最高價(_HighestD)
Input : DayCount(NumericSimple);
Variables : HighestD(0), Counter(0);

HighestD = 0;
For Counter = 1 To DayCount
Begin
    HighestD = IFF(HighD(Counter) > HighestD, HighD(Counter), HighestD);
End;       
_HighestD = HighestD;

[2]最低價(_LowestD)
Input : DayCount(NumericSimple);
Variables : LowestD(0), Counter(0);

LowestD = 999999;

For Counter = 1 To DayCount
Begin
    LowestD = IFF(LowD(Counter) < LowestD, LowD(Counter), LowestD);
End;       
_LowestD = LowestD;

2010年9月1日 星期三

[策略驗證] TradeStation的回測問題

  在這二個月的策略驗證中, 發現TradeStation有一個致命的問題, 當設定天數為回推N日時, 若策略中會有計算起始日至目前中數值變化的數值時, 則該數值會隨著交易日慢慢地往後推而造成策略損益會變動的情形, 這在策略最佳化及策略全測時是看不出來的, 雖然可以將所有的起始日都回推為同一天, 但因資料時間超過十年, 會造成盤中計算量很大, 而造成訊號延遲的問題, 因為此問題的存在, 筆者決定將策略暫時停止驗證。
今後將先以TradeStation的EasyLanguage介紹為主, 再加上每日盤後會公佈一些市場的交易資訊為輔。