함수설명
ADX(Average Directional Movement Index ) 지표함수
작성방법
ADX(기간)
C
복사
매개변수 설명
•
"기간": Numeric, 최근 N개봉 기간값을 입력
계산
PDM = (당일고가-전일고가 > 0) 이고
(당일고가-전일고가 > 전일저가-당일저가) 이면,
(당일고가-전일고가) 이고, 아니면 0.
MDM = (전일저가-당일저가 > 0) 이고
(당일고가-전일고가 < 전일저가-당일저가) 이면,
(전일저가-당일저가) 이고, 아니면 0.
PDMMA = (+DM)의 Period 일 이동평균
MDMMA = (-DM)의 Period 일 이동평균
DX = PDMMA-MDMMA의 절대값 / (PDMMA + MDMMA) ×100
ADX = DX의 Period 일 이동평균
활용예시
//인라인함수(수식안에서 만들어 사용하는 함수)
//DIPlus 함수식
Function Infx_DIPlus Numeric
{
Input : Length(NumericSimple) ;
Var : Counter(0), TRange(0), MyRange(Length);
var : PlusDM14(0), PlusDM(0), MinusDM(0);
If CurrentBar == 1 Then
{
MyRange = Length;
Infx_DIPlus = 0;
PlusDM14 = 0;
TRange = 0;
For Counter = 0 To MyRange - 1
{
If High[Counter] - High[Counter+1] < 0 Then
PlusDM = 0;
Else
PlusDM = High[Counter] - High[Counter+1];
If Low[Counter+1] - Low[Counter] < 0 Then
MinusDM = 0;
Else
MinusDM = Low[Counter+1] - Low[Counter];
If MinusDM >= PlusDM Then
PlusDM = 0;
TRange = TRange + TrueRange[Counter];
PlusDM14 = PlusDM14 + PlusDM;
}
If TRange <> 0 Then
Infx_DIPlus = 100 * PlusDM14 / TRange;
Else
Infx_DIPlus = 0 ;
}
Else If CurrentBar > 1 Then
{
If High[0] - High[1] < 0 Then
PlusDM = 0;
Else
PlusDM = High[0] - High[1];
If Low [1] - Low [0] < 0 Then
MinusDM = 0;
Else
MinusDM = Low[1] - Low[0];
If MinusDM >= PlusDM Then
PlusDM = 0;
If MyRange > 0 Then Begin
TRange = TRange[1] - (TRange[1] / MyRange) + TrueRange;
PlusDM14 = PlusDM14[1] - (PlusDM14[1] / MyRange) + PlusDM;
End;
If TRange <> 0 Then
Infx_DIPlus = 100 * PlusDM14 / TRange;
Else
Infx_DIPlus = 0 ;
}
}
EndFunction
//DIMinus 함수식
Function Infx_DIMinus Numeric
{
Input : Length(NumericSimple);
Var : Counter(0), TRange(0), MyRange(Length);
var : MinusDM14(0), MinusDM(0), PlusDM(0);
If CurrentBar == 1 Then
{
MyRange = Length;
Infx_DIMinus = 0;
MinusDM14 = 0;
TRange = 0;
For Counter = 0 To MyRange-1
{
If High[Counter] - High[Counter+1] < 0 Then
PlusDM = 0 ;
Else
PlusDM = High[Counter] - High[Counter + 1];
If Low[Counter + 1] - Low[Counter] < 0 Then
MinusDM = 0;
Else
MinusDM = Low[Counter + 1] - Low[Counter];
If PlusDM >= MinusDM Then
MinusDM = 0;
TRange = TRange + TrueRange[Counter];
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
Infx_DIMinus = 100 * MinusDM14 / TRange;
Else
Infx_DIMinus = 0;
}
Else If CurrentBar > 1 Then
{
If High[0] - High[1] < 0 Then
PlusDM = 0;
Else
PlusDM = High[0] - High[1];
If Low[1] - Low [0] < 0 Then
MinusDM = 0 ;
Else
MinusDM = Low[1] - Low[0] ;
If PlusDM >= MinusDM Then
MinusDM = 0 ;
If MyRange > 0 Then
{
TRange = TRange[1] - (TRange[1] / MyRange) + TrueRange;
MinusDM14 = MinusDM14[1] - (MinusDM14[1] / MyRange) + MinusDM;
}
If TRange <> 0 Then
Infx_DIMinus = 100 * MinusDM14 / TRange;
Else
Infx_DIMinus = 0;
}
}
EndFunction
//DMI 함수식
Function Infx_DMI Numeric
{
Inputs: Length(NumericSimple);
Variables: DP(0), DM(0);
DP = Infx_DIPlus(Length);
DM = InFx_DIMinus(Length);
If DP + DM == 0 Then
Infx_DMI = 0;
Else
Infx_DMI = 100 * AbsValue(DP - DM) / (DP + DM);
}
EndFunction
//ADX 함수식
Function infx_ADXV Numeric
{
Inputs: Length(Numeric);
Variables: Counter(0), CummDMI(0), Return(0), DMIV(0);
Return = 0;
DMIV = Infx_DMI(Length);
If CurrentBar >= 1 AND Length > 0 Then
{
If CurrentBar < Length Then
{
CummDMI = 0;
for Counter = 0 To CurrentBar - 1
{
CummDMI = CummDMI + DMIV[Counter];
}
Return = CummDMI / CurrentBar;
}
Else
Return = (infx_ADXV[1] * (Length - 1) + DMIV) / Length;
}
infx_ADXV = Return;
}
EndFunction
input : Period(14);
var : ADXV(0);
ADXV = infx_ADXV(14);
Plot1(ADXV);
C
복사
뒤로가기는 좌측상단의 목차 버튼을 눌러주세요.