함수설명

ADX(Average Directional Movement Index ) 지표함수

작성방법

ADX(기간)

매개변수 설명

<aside> 📘 계산

PDM = (당일고가-전일고가 > 0) 이고 (당일고가-전일고가 > 전일저가-당일저가) 이면, (당일고가-전일고가) 이고, 아니면 0. MDM = (전일저가-당일저가 > 0) 이고 (당일고가-전일고가 < 전일저가-당일저가) 이면, (전일저가-당일저가) 이고, 아니면 0. PDMMA = (+DM)의 Period 일 이동평균 MDMMA = (-DM)의 Period 일 이동평균 DX = PDMMA-MDMMA의 절대값 / (PDMMA + MDMMA) ×100 ADX = DX의 Period 일 이동평균

</aside>

활용예시

//인라인함수(수식안에서 만들어 사용하는 함수)

//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);

<aside> 💡 뒤로가기는 좌측상단의 목차 버튼을 눌러주세요.

</aside>