分享一個Dual Thrust策略

分享一個Dual Thrust策略


Dual Thrust是一個著名的隔日交易策略(日內尋找機會突破開倉,但是持倉必須隔日才有足夠利潤),可以較好地把握趨勢變化方向

簡單描述如下:Dual Thrust在形式上和開盤區間突破策略類似,也是較為常見的日內交易策略之一,是以今日開盤價加減range的一定比例確定上下軌,日內價格突破上軌時做多,價格突破下軌時做空。

不同點主要體現在兩方面:(1)Dual Thrust在Range的設置上,引入前N日的四個價位,使得一定時期內的Range相對穩定,可以適用於日間的趨勢跟蹤;(2)Dual Thrust對於多頭和空頭的觸發條件,考慮了非對稱的幅度,做多和做空參考的Range可以選擇不同的週期數,也可以通過參數Ks和Kx來確定。

分享一個Dual Thrust策略

因為有了K1和K2,也就是上文中說的Ks和Kx,使得這套系統可以更好地把握一些階段性行情,但是也產生了過擬合效果。比如我們用來訓練參數的數據是一段上漲期間數據,則訓練的結果是空頭難以觸發,多頭容易觸發,而實盤期間不是這樣,情況就非常危險。

  在網上還流傳一個版本,將N日也做了區分,多頭和空頭給予不同的兩個參數,而在我們看來除了股指期貨,商品期貨的上下漲跌對稱性較好(雖然漲跌形態不同),所以今天放出一個版本,統一了上下幅度控制,作為粗模。

樣本:IF000(股指指數)

測試時間:2011-2018

交易盈虧曲線:

分享一個Dual Thrust策略

源碼:

Params

Numeric K(0.45);

Numeric Aday(20);

Numeric lots(1);

Vars

Numeric HH;

Numeric LL;

Numeric HC;

Numeric LC;

Numeric BuyPosition;

Numeric SellPosition;

Begin

// 集合競價和小節休息過濾

If(!CallAuctionFilter()) Return;

// 過濾開盤前的價格的第二種寫法

If(BarStatus == 2 && Time == 0.090000 && CurrentTime < 0.090000) Return;

// 避免在8:59分發出委託

If(date != date[1] and high==low) Return;

// 過濾非理性時段(9點05分之前 21點05分之前)不交易

If(BarStatus == 2 && CurrentTime >= 0.090000 && CurrentTime <= 0.090500) Return;

If(BarStatus == 2 && CurrentTime >= 0.210000 && CurrentTime <= 0.210500) Return;

If(CurrentBar > 44 * Aday ) // 44個bar表示從圖表開始不小於一天,可以根據週期自己修改

{

HH = Highest(HighD(1),Aday); //求Aday週期以來的前一Bar最高價的最高值, 即 高價最高值

HC = Highest(CloseD(1),Aday); //求Aday週期以來的前一Bar收盤價的最高值, 即 收盤最高值

LL = Lowest(LowD(1),Aday); //求Aday週期以來的前一Bar最低價的最低值, 即 低價最低值

LC = Lowest(CloseD(1),Aday); //求Aday週期以來的前一Bar收盤價的最低值, 即 收盤最低值

BuyPosition = OpenD(0) + K * Max(HH-LC,HC-LL); //連續計算 買入開倉價格

SellPosition = OpenD(0) - K * Max(HH-LC,HC-LL); //連續計算 賣出開倉價格

PlotNumeric("BuyPosition",BuyPosition); //畫出上述開倉價格

PlotNumeric("SellPosition",SellPosition); //畫出上述開倉價格

// ========= 以下是開倉 =========

If(MarketPosition == 0) //當持倉為零

{

If(High>=BuyPosition) //當前Bar的最高價突破 買入開倉價格

{

Buy(lots,Max(Open,BuyPosition)); //買入開倉

Return;

}

If(Low<=SellPosition) //當前Bar的最低價突破 賣出開倉價格

{

SellShort(lots,Min(Open,SellPosition)); //賣出開倉

Return;

}

}

// ========== 以下是平倉 =========

If(MarketPosition == -1) //如果持有空頭

{

If(High>=BuyPosition) //如果突破 買入價格

{

Buy(lots,Max(Open,BuyPosition)); //平空買多

Return;

}

}

If(MarketPosition == 1) //如果持有多頭

{

If(Low<=SellPosition) //如果突破賣出價格

{

SellShort(lots,Min(Open,SellPosition)); //平多賣空

Return;

}

}

}

End


分享到:


相關文章: