2015年3月2日 星期一

●慣性指標 Inertia Index [程式碼]

EasyTrader ArtNo 249
     慣性指標(Inertia Index)是由唐納德·多西(Donald Dorsey)發明的,建立在多西的相對波動性指標(RVI)基礎上。多西選擇“慣性”這個名字,是因為他對趨勢的定義,他斷言趨勢簡單的說就是“慣性的外在結果”。對市場來說,扭轉趨勢方向所需要的能量要遠大於維持趨勢沿原來方向運動所需要的能量。因此,趨勢就是對市場慣性的度量。在物理學上,慣性是根據運動的質量來定義。利用技術分析方法來分析證券價格時,運動的方向很容易定義。然而,質量不那麼容易定義。多西斷言“波動性”也許是對慣性最簡單和最準確的度量。這個理論引導他採用RVI(相對波動性指標)作為趨勢指標的基礎。
在1993 年發表的 RVI 原始定義是以收盤價為基礎.
S = 10 天收盤價的標準差
如果收盤價大於前日收盤價 U = S 否則 U = 0 ;
RVIorig= 14日U的指數平均數 / 14日S的指數平均數

在1995 年作者修正了的 RVI 是以當日最高價與最低價為基礎.
RVIorig of highs + RVIorig of lows RVI = 2

慣性指標(Inertia Index)則是將 RVI 以20天期的最小方差統計將之平滑化,作為多空趨勢判斷基礎


慣性指標的使用
很簡單,我們看到箭頭1處的紅色虛線為50中間值,慣性指標大於50表示正的慣性,長期趨勢是上升的,只要該指標保持在50以上,未來趨勢將繼續上升。慣性指標小於50表示負的慣性,長期趨勢是下降的,只要該指標保持在50以下,未來趨勢將繼續下降。

測試程式碼
input:EntryType(1),ExitType(2);
inputs:NBarL(33),NBarS(2),TradeProfit(0.02),TradeStopLoss(0.02),ATRs_L(15),ATRs_S(10);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0);
inputs:BaseLen(10),Len(14),InerTiaLen(20),HB(60),LB(40),HighBar(5),LowBar(5) ;
Vars:BaseDev(0),UpDev(0),RVI(0),Inertia(0);

MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

{ 計算慣性指標 }
BaseDev = StdDev(Close,BaseLen) ;
UpDev = iff(Close > Close[1],BaseDev,0) ;
if Xaverage(BaseDev,Len) <> 0 then RVI = 100 * Xaverage(UpDev,Len)/Xaverage(BaseDev,Len) ;

最小方差利用內建線性迴歸的函數來計算
Inertia = LinearRegValue(RVI,InertiaLen,0) ;

{ 原始策略以參考分界線來進出 }
if EntryType = 1 then Begin
if MP <> 1 and Inertia > HB then Buy next bar at Highest(High,HighBar) stop ;
if MP <> -1 and Inertia < LB then Sell next bar at Lowest(Low,LowBar) stop ;
end;

{ 修正策略以轉折方向來進出 }
if EntryType = 2 then Begin
if MP <> 1 and Countif(Inertia > Inertia[1],2) = 2 and Inertia[3] > Inertia[2] then Buy next bar at Highest(High,HighBar) stop ;
if MP <> -1 and Countif(Inertia < Inertia[1],2) = 2 and Inertia[3] < Inertia[2] then Sell next bar at Lowest(Low,LowBar) stop ;
end;

if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin
if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;
end;

if ExitType = 4 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
if MP > 0 and BarsSinceEntry = NBarL then {Sell } ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then {Buy} ExitShort next bar at Market ;
end;

{ 結算日增加 20150224 }
if IsBalanceDay or Date = 1150224 then setExitonClose ;

策略1台指期 60 min K 留倉 交易期間 2004/12/31 ~ 2014/12/31 交易成本 1200


策略2指期 60 min K 留倉 交易期間 2004/12/31 ~ 2014/12/31 交易成本 1200

4 留言:

匿名 提到...

您好,請問PL(0)和PF(0)二個變數的數值是由自己給定嗎?另外再請問MP(0)變數的中文意義該如何解讀?謝謝!

EasyTrader 提到...

您好

MP 變數只是接收倉目前倉位狀態 , MP = MarketPosition
PL/PF 變數是用來設定出場的參考值 ,會使用目前K棒均價 * 參數比例來決定 ,因此會隨K棒的變化而變動
PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;
AvgPrice = (Open+high+Low+Close)/4 是內建保留字

EasyTrader 提到...

您好

MP 變數只是接收倉目前倉位狀態 , MP = MarketPosition
PL/PF 變數是用來設定出場的參考值 ,會使用目前K棒均價 * 參數比例來決定 ,因此會隨K棒的變化而變動
PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;
AvgPrice = (Open+high+Low+Close)/4 是內建保留字

匿名 提到...

if Xaverage(BaseDev,Len) <> 0 then RVI = 100 *

請問一下,這個後面是不是少了甚麼??

張貼留言

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

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