Dual Thrust策略是一个很经典的策略。常年排在国外前10大流行策略之一!
绩效测试(橡胶期货,2016/1/1~2018/1/4,主图1分K,子图30分K,回测换月跳空有处理些) 2017年策略陷入瓶颈,2016年的趋势年,策略表现非常良好!
(资料图)
策略代码说明 1.模型体现的基本思想:
首先,HH到LL这个范围框出了过去N天中价格的移动区间。HC和LC表示的是过去N天内价格的波动情况。如果HC和LC都在中间位置,那么表示价格在N天内的高低波动只是一种偶然情况。其余时间波动都很小,而且市场呈现出不明朗的趋势。在HH和LL范围固定的情况下,突破需要的点数相对较少。
如果过去N天内价格都在上涨或下跌,呈现单边趋势,那么则表现为HH和LL的范围较大,HC和LC都趋近于箱体的上/下沿,则表现为较大的buyrange 和 sellrange,于是乎,价格产生突破的话需要的点数也就更多一些。
这样的设计,体现了突破策略的一个基本思路,即“大行情大突破,小行情小突破”。
2.我们进一步研究一下策略在不同行情中的表现情况:
(1)行情连续走强。例如,前日大涨,昨日大涨,今日也大涨。这时,策略会一直向上突破,死死扣住持有的多仓。
(2)行情由强转弱,进入平台期。例如,前日大涨,昨日小涨,今日微涨或微跌。这时,策略仍然会一直持有多仓,不产生任何有效突破。
(3)行情由弱转强。例如,前日小涨,昨日中涨,今日大涨。这时,策略会针对之前持有的仓位采取进一步的措施。如果之前持有的是反向仓位,则会反手。如果之前持有的是同向仓位,则会一直抱住。
(4)行情持续保持弱势,波动越来越弱。但温和同向变动。这时,如果持有的是同向仓位,那么不会有什么问题。但如果持有的是反向仓位,问题就来了。可能价格一直不突破,从而导致连续亏损。这种亏损可能持续时间不会很长,因为随着短K棒的逐渐增加,突破所需要的点数也就越来越小,很容易突破做反手。
(5)行情急速反转。这时,要取决于k线长度的相对大小。如果反转的幅度远小于之前的幅度,且幅度逐渐缩小,那么策略要承受较大的利润回吐或亏损。如果反转幅度大于之前的幅度,那么会直接反手。所以,为了保险起见,作者引入了小于1的参数K1和K2,保证突破区间逐渐收敛,使得投资人不至于长时间一直持有一个亏损仓位。
(6)策略最大的风险来自于隔日风险。如果连续出现两根阳线,但后一根阳线远低于前一根,这时的问题在于
,策略会一直持有这样的亏损仓位而不采取任何动作。
3.由于没有止损止盈模块,模型的表现实际上并不是十分稳定。
这可以说是模型的一个缺陷。模型是一个永远在市的策略,碰到信号以后就反手。但是,进一步设定固定止损位后,发现模型的盈利状况反而下降了。我进一步调试止损位,发现只有当止损位大于1000跳,也就是对应橡胶的5000个点时,策略的盈利才不会受到止损位的影响。也就是说,最大回撤高达保证金账户的300%,也就是说,如果全部资金投入这样的策略的话,已经爆仓无数次了。策略风险极大。所以,看上去很美的策略并不一定真的敢用。
1000跳的波动已经远远超过了涨跌停板的限制,说明策略在某一时间段连续持有巨额亏损仓位达数日之久。而当初的突破信号可能已经与当前的行情不再有任何关联,说明这样的盈利很有可能存在运气的成分。
另一方面,策略缺少止盈部分,所以,也不会锁住任何利润。当然,止盈止损要结合在一起看,如果只有止损,没有止盈,那么策略很可能就是一直止损出场,没有盈利。
4.可以借鉴和提升之处
一是这个策略用一个很简单的逻辑,融入了顺势突破的精髓和一定的止损功能,在不同的行情内体现出不同的变化。设计人思维之独特令人叹服。二是该策略如果转变成日内策略,也许会有一定的效果改善。具体有待各位朋友去挖掘。三是该策略突破区域的设置和参数的运用,似乎缺少一个令人信服的理由。未来的盈利能力值得怀疑。
策略使用注意事项 策略插入时会出现如下错误,因为本策略需搭配子图商品,可以在主图商品上右键-〉插入商品,选择不同周期的商品。
代码:
//Use data2 as day bar.
//Use data1 as minute bar.
Inputs:k1( 0.5),k2 (0.5);
inputs:Mday(1 ),Nday (1),lots(1), daystart(900 ), dayend(1500 ),freq_min (10);//10 min bars, you may chance to other frequency
vars: dayclose(0 ), dayhigh(0 ),daylow (0);
vars: sellrange(0 ),buyrange (0),buytrig(0), selltrig(0 );
Vars: HH( 0),HC (0),LC(0), LL( 0);
vars: buyposition(0 ),sellposition (0);
vars: opentoday(0 );
//give a start value for open price of today(data1)
if time >=daystart and time <=daystart+ freq_min then begin
opentoday=open ;
end;
HH=highest (high ,Mday ) of data2 ;
HC=highest (close ,Mday ) of data2 ;
LL=lowest (low ,Mday ) of data2 ;
LC=lowest (close ,Mday ) of data2 ;
if (HH-LC)>=( HC- LL) then sellrange=HH -LC
else sellrange =HC -LL ;
HH = Highest (High ,Nday ) of data2 ;
HC = Highest (Close ,Nday ) of data2 ;
LL = Lowest (Low ,Nday ) of data2 ;
LC = Lowest (Close ,Nday ) of data2 ;
If((HH - LC) >= ( HC - LL ))then buyrange = HH - LC
Else buyrange = HC - LL;
buytrig = k1* buyrange;
selltrig = k2* sellrange;
buyposition = opentoday +buytrig ;
sellposition = opentoday -selltrig ;
If(MarketPosition = 0) then
begin
If High >=buyposition then
Buy lots shares next bar at buyposition stop ;
If Low <=sellposition then
SellShort lots shares next bar at sellposition stop;
end;
if marketposition =-1 then
begin
if high >=buyposition then
buy lots shares next bar at buyposition stop ;
end;
if marketposition =1 then
begin
if low <=sellposition then
sellshort lots shares next bar at sellposition stop ;
end;
//setstoploss(minmove*30);
//draw trendlines
if (time>= dayend-3 *freq_min and time<=dayend ) then begin
tl_new(date ,0900,buyposition, date,time ,buyposition );
tl_new(date ,0900,sellposition, date,time ,sellposition );
end;