2014年10月22日 星期三

★The Vortex indicator (含程式碼)

《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 留言:

張貼留言

如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!

----------------------------------------------------------------------------------------------------
網站聲明(Disclaimer)
本教學網站內所提供之程式碼(包括函數、指標、訊號)屬開放程式碼,用意在於讓使用者學習程式語法之撰寫,使用者可以任意修改語法內容並調整參數。本網站所有之內容(包括文章、影片、歷史紀錄、程式碼、教材)限用於個人學習使用,請勿轉寄、濫用,嚴禁私自串接帳戶交易。
-------------------------------------------------------------------------------------------------