更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。
今天的文章,我们将为大家介绍一个与DMI(Directional Movement Index)类似,判断多空趋势的指标Vortex Indicator。DMI原本的概念为,计算一段周期内走势向上与向下的力度消长,判断多空强弱。而向上的力度在概念上使用今天高点与昨天高点的差值,若今天高点比昨天高点高越多,则表示向上力度比较强。向下的力度则相反。
Vortex Indicator的概念与DMI略有不同,向上力度的计算为使用今天的高点与昨天的低点差值的绝对值,向下力度的计算为使用今天的低点与昨天的低点差值的绝对值。
Vortex Indicator计算方式
1.用当日最高价减去前一日最低价取绝对值:VM+= AbsValue(High - Low[1])
2.用当日最低价减去前一日最高价取绝对值:VM- = AbsValue(Low - High[1])
3.将周期内的VM+加总:VMPlusSum = Summation(VM+,Length)
4.将周期内的VM-加总:VMMinusSum = Summation(VM-,Length)
5.将周期内每日的真实波动区间加总:TRSum = Summation(TrueRange,Length)
6.最后将VMPlusSum除以TRSum则可得+VM7.最后将VMMinusSum除以TRSum则可得-VM
Vortex Indicator多空判断
若+VM从下向上穿越-VM则目前市场趋势为多头
若-VM从下向上穿越-VM则目前市场趋势为空头
Vortex Indicator效果展示
计算方式在K线图上图标化的话很像涡旋(Vortex)的图案,因此取名为Vortex Indicator。
Vortex Indicator指标代码(MC版)
//Indicator: Vortex inputs:Length( 14 ) ; variables:VMPlus( 0 ),VMMinus( 0 ),VMPlusSum( 0 ),VMMinusSum( 0 ),TR( 0 ),TRSum( 0 ),VIPlusSumRge( 0 ),VIMinusSumRge( 0 ),DX(0),ADXX(0); VMPlus = AbsValue( High - Low[1] ) ; VMMinus = AbsValue( Low - High[1] ) ; VMPlusSum = Summation( VMPlus, Length ) ; VMMinusSum = Summation( VMMinus, Length ) ; TR = TrueRange ; TRSum = Summation( TR, Length ) ; if TRSum <> 0 then begin VIPlusSumRge = VMPlusSum / TRSum ; VIMinusSumRge = VMMinusSum / TRSum ; end ; Plot1( VIPlusSumRge, "VI+Sum/Rge", Green ) ; Plot2( VIMinusSumRge, "VI-Sum/Rge", Red ) ;
Vortex Indicator交易策略(MC版)
接下来使用Vortex指标回测一个顺势交易策略
1.+VM穿越-VM时判断为多头,突破穿越时的价格高点做多
2.-VM穿越+VM时判断为空头,突破穿越时的价格低点做空
3.多空反手,没有其它出场条件,一直在市
inputs:Length( 14 ); variables:VMPlus( 0 ),VMMinus( 0 ),VMPlusSum( 0 ),VMMinusSum( 0 ),TR( 0 ),TRSum( 0 ), VIPlusSumRge( 0 ),VIMinusSumRge( 0 ),SignalTradeNum( 0 ),BuySignal( false ), ShortSignal( false ),StopPrice( 0 ) ; VMPlus = AbsValue( High - Low[1] ) ; VMMinus = AbsValue( Low - High[1] ) ; VMPlusSum = Summation( VMPlus, Length ) ; VMMinusSum = Summation( VMMinus, Length ) ; TR = TrueRange ; TRSum = Summation( TR, Length ) ; if TRSum <> 0 then begin VIPlusSumRge = VMPlusSum / TRSum ; VIMinusSumRge = VMMinusSum / TRSum ; end ; if VIPlusSumRge crosses over VIMinusSumRge then begin SignalTradeNum = TotalTrades ; BuySignal = true ; ShortSignal = false ; StopPrice = High ; end else if VIPlusSumRge crosses under VIMinusSumRge then begin SignalTradeNum = TotalTrades ; BuySignal = false ; ShortSignal = true ; StopPrice = Low ; end ; if BuySignal and TotalTrades = SignalTradeNum and MarketPosition <> 1 then Buy next bar StopPrice stop ; if ShortSignal and TotalTrades = SignalTradeNum and MarketPosition <> -1 then SellShort next bar at StopPrice stop ;
以下是Vortex策略在K线上的交易信号示例
策略回测绩效(MC版)
策略在台湾指数期货60分钟K线的回测绩效:
策略在NYMEX轻原油120分钟K线的回测绩效: