함수설명
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
복사
뒤로가기는 좌측상단의 목차 버튼을 눌러주세요.