Dual Thrust是一個著名的隔日交易策略(日內尋找機會突破開倉,但是持倉必須隔日才有足夠利潤),可以較好地把握趨勢變化方向。
簡單描述如下:Dual Thrust在形式上和開盤區間突破策略類似,也是較為常見的日內交易策略之一,是以今日開盤價加減range的一定比例確定上下軌,日內價格突破上軌時做多,價格突破下軌時做空。
不同點主要體現在兩方面:(1)Dual Thrust在Range的設置上,引入前N日的四個價位,使得一定時期內的Range相對穩定,可以適用於日間的趨勢跟蹤;(2)Dual Thrust對於多頭和空頭的觸發條件,考慮了非對稱的幅度,做多和做空參考的Range可以選擇不同的週期數,也可以通過參數Ks和Kx來確定。
因為有了K1和K2,也就是上文中說的Ks和Kx,使得這套系統可以更好地把握一些階段性行情,但是也產生了過擬合效果。比如我們用來訓練參數的數據是一段上漲期間數據,則訓練的結果是空頭難以觸發,多頭容易觸發,而實盤期間不是這樣,情況就非常危險。
在網上還流傳一個版本,將N日也做了區分,多頭和空頭給予不同的兩個參數,而在我們看來除了股指期貨,商品期貨的上下漲跌對稱性較好(雖然漲跌形態不同),所以今天放出一個版本,統一了上下幅度控制,作為粗模。
樣本:IF000(股指指數)
測試時間:2011-2018
交易盈虧曲線:
源碼:
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
閱讀更多 股期魔方 的文章