数量技术宅团队在CSDN学院推出了量化投资系列课程
欢迎有兴趣系统学习量化投资的同学,点击下方链接报名:
量化投资速成营(入门课程)
Python股票量化投资
Python期货量化投资
Python数字货币量化投资
C++语言CTP期货交易系统开发
数字货币JavaScript语言量化交易系统开发
今天的文章,我们将为大家介绍一个与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线的回测绩效: