《Wen外期策略團隊》
以下介紹一個與DMI(Directional Movement Index)類似,判斷多空趨勢的指標Vortex Indicator。DMI原本的概念為,計算一段週期內走勢向上與向下的力道消長,判斷多空強弱。而向上的力道在概念上使用今天高點與昨天高點的差值,若今天高點比昨天高點高越多,則表示向上力道比較強。向下的力道則相反。而Vortex Indicator的概念與DMI略有不同,向上力道的計算為使用今天的高點與昨天的低點差值的絕對值,向下力道的計算為使用今天的低點與昨天的低點差值的絕對值。
計算方式:
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則可得+VM
7. 最後將VMMinusSum除以TRSum則可得-VM
若+VM從下向上穿越-VM則目前市場趨勢為多頭
若-VM從下向上穿越-VM則目前市場趨勢為空頭
計算方試在K線圖上圖示化的話很像渦旋(Vortex)的圖案,因此取名為Vortex Indicator
以下為指標程式碼
//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指標回測一個簡單的順勢交易策略
1.+VM穿越-VM時判斷為多頭,突破穿越時的價格高點做多
2.-VM穿越+VM時判斷為空頭,突破穿越時的價格低點放空
多空對翻,無其它出場條件
以下為策略程式碼
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 ;
以下為台指期(TXF1)60K回測
以下為NYMEX輕原油(CL)120K回測
0 留言:
張貼留言
如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!