Search

DMI_TA

함수설명

DMI(Directional Movement Index) 지표함수
※기존 DMI 함수들이 DiPlus, DiMinus, DMI , ADX 별로 함수가 각각 제공되고 기간값들만 지정할 수 있고 계산의 기준값들은 지정할 수 없었지만 DMI_TA함수는 기준값을 다른 값으로 지정해 계산할 수 있으며 하나의 함수에서 지정한 매개변수로 DI+/DI-/DMI/ADX값을 모두 리턴받을 수 있습니다.

작성방법

DMI_TA(HPrice,LPrice,CPrice,기간,oDIP,oDIM,oDMI,oADX)
C
복사

매개변수 설명

"Hprice": Numeric, 데이터, 함수, 변수, 계산식 등, 계산식에서 고가로 사용할 값
"LPrice": Numeric, 데이터, 함수, 변수, 계산식 등, 계산식에서 저가로 사용할 값
"CPrice": Numeric, 데이터, 함수, 변수, 계산식 등, 계산식에서 종가로 사용할 값
"기간": Numeric, 최근 N개봉 기간값을 입력
"oDIP": NumericRef, DI+값을 지정한 변수에 저장
"oDIM": NumericRef, DI-값을 지정한 변수에 저장
"oDMI": NumericRef, DMI값을 지정한 변수에 저장
"oADX": NumericRef, ADX값을 지정한 변수에 저장
계산
DMPlus = (당일고가-전일고가) > 0 이고 (당일고가-전일고가 > 전일저가-당일저가) 이면 (당일고가-전일고가)이고 아니면 0. DMMinus = (전일저가-당일저가) > 0 이고 (당일고가-전일고가 < 전일저가-당일저가) 이면 (전일저가-당일저가)이고 아니면 0. TR = TrueRange값 TRn = TR의 Period 기간 이동평균값 DMnPlus = (+DM)의 Period 기간 이동평균값 DMnMinus = (-DM)의 Period 기간 이동평균값 DIPlus = DMnPlus/TRn DIMinus = DMnMinus/TRn DMI = (DiPlus-DIMinus)의 절대값/(DiPlus+DIMinus)*100

활용예시

1. DMI(H,L,C,14,var1,var2,var3,var4); --> 주어진 값들을 이용해 DMI를 계산하고 var1에는 DI+, var2는 DI-K값, var3에는 DMI값, var4는 ADX값을 저장 2. //인라인함수(수식안에서 만들어 사용하는 함수) Function infx_DMI_TA Numeric { input : PriceH(NumericSeries),PriceL(NumericSeries),PriceC(NumericSeries); input : Length(NumericSimple); input : oDIPlus(NumericRef),oDIMinus(NumericRef),oDMI(NumericRef),oADX(NumericRef); var : cnt(0),TH(0),TL(0),TR(0); Var : Counter(0), TRange(0), MyRange(Length), PlusDM14(0),MinusDM14(0); var : PlusDM(0), MinusDM(0),CummDMI(0); TH = PriceH ; TL = PriceL ; if PriceC[1] > PriceH then TH = PriceC[1]; if PriceC[1] < PriceL then TL = PriceC[1] ; TR = TH - TL; If CurrentBar == 1 Then { MyRange = Length; oDIPlus = 0; oDIMinus = 0; PlusDM14 = 0; MinusDM14 = 0; TRange = 0; For Counter = 0 To MyRange - 1 { If PriceH[Counter] - PriceH[Counter+1] < 0 Then PlusDM = 0; Else PlusDM = PriceH[Counter] - PriceH[Counter+1]; If PriceL[Counter+1] - PriceL[Counter] < 0 Then MinusDM = 0; Else MinusDM = PriceL[Counter+1] - PriceL[Counter]; value1 = PlusDM; Value2 = MinusDM; If value1 >= Value2 Then MinusDM = 0; If Value2 >= value1 Then PlusDM = 0; TRange = TRange + TR[Counter]; PlusDM14 = PlusDM14 + PlusDM; MinusDM14 = MinusDM14 + MinusDM; } If TRange <> 0 Then { oDIPlus = 100 * PlusDM14 / TRange; oDIMinus = 100 * MinusDM14 / TRange; } Else { oDIPlus = 0 ; oDIMinus = 0; } } Else { If CurrentBar > 1 Then { If PriceH[0] - PriceH[1] < 0 Then PlusDM = 0; Else PlusDM = PriceH[0] - PriceH[1]; If PriceL[1] - PriceL[0] < 0 Then MinusDM = 0; Else MinusDM = PriceL[1] - PriceL[0]; value1 = PlusDM; Value2 = MinusDM; If value1 >= Value2 Then MinusDM = 0; If Value2 >= value1 Then PlusDM = 0; If MyRange > 0 Then { TRange = TRange[1] - (TRange[1] / MyRange) + TrueRange; PlusDM14 = PlusDM14[1] - (PlusDM14[1] / MyRange) + PlusDM; MinusDM14 = MinusDM14[1] - (MinusDM14[1] / MyRange) + MinusDM; } If TRange <> 0 Then { oDIPlus = 100 * PlusDM14 / TRange; oDIMinus = 100 * MinusDM14 / TRange; } Else { oDIPlus = 0 ; oDIMinus = 0; } } } If CurrentBar >= 1 AND Length > 0 Then { If oDIPlus + oDIMinus == 0 Then oDMI = 0; Else oDMI = 100 * AbsValue(oDIPlus - oDIMinus) / (oDIPlus + oDIMinus); If CurrentBar < Length Then { CummDMI = 0; for Counter = 0 To CurrentBar - 1 Begin CummDMI = CummDMI + oDMI[Counter]; End; if CummDMI > 0 Then oADX = CummDMI / CurrentBar; } Else oADX = (oADX[1] * (Length - 1) + oDMI) / Length; infx_DMI_TA = 1; } } EndFunction Input : Period(14); var : oDP(0),oDM(0),oDMI(0),oADX(0); var1 = infx_DMI_TA(H,L,C,Period,oDP,oDM,oDMI,oADX); plot1(oDP,"DiPlus"); plot2(oDM,"DiMinus"); plot3(oDMI,"DMI"); plot4(oADX,"ADX");
C
복사
뒤로가기는 좌측상단의 목차 버튼을 눌러주세요.