안녕하세요.
항상 도움을 받고 있습니다.
ADX, +DI 및 -DI 지표 관련해서 아래와 같은 예스랭귀지 수식을 찾았습니다.
이 수식을 바탕으로 자바스크립트로 변환해 보았습니다만,
ADX가 잘 구현되었는지 궁금합니다.
시스템식에 ADX >30으로 해 놨는데, 신호가 발생 하는게 하나도 없네요.
자바스크립트 수식 검토 부탁합니다.
==============예스랭귀지===================
input : Period(14);
var : PDI(0),MDI(0),ADXv(0);
PDI = ema(iff(H-H[1]>0 && H-H[1]>L[1]-L,H-H[1],0),Period)/
ema(max(max(H-L,abs(C[1]-H)),abs(C[1]-L)),Period)*100;
MDI = ema(iff(L[1]-L>0 && H-H[1]<L[1]-L,L[1]-L,0),Period)/
ema(max(max(H-L,abs(C[1]-H)),abs(C[1]-L)),Period)*100;
ADXV = ema(abs(PDI-MDI)/(PDI+MDI),period)*100;
plot1(ADXv);
plot2(PDI);
plot3(MDI);
==============자바스크립트===================
var DMplus, DMminus, TR, ATR, DMplus_avg, DMminus_avg, PDI, MDI, DX, ADX, PeriodADX, PeriodDI;
// ADX(Average Directional Movement Index)
var TR1 = [];
var TR2 = [];
var TR3 = [];
var TR = [];
var DMplus = [];
var DMminus = [];
var PeriodADX = 11;
var PeriodDI = 28;
var DMplusCnt = 0;
var DMminusCnt = 0;
for (var i = PeriodADX; i >= 0; i--)
{
TR1[i] = MKT.High(i+1) - MKT.Low(i+1);
TR2[i] = Math.abs(MKT.Close(i+2) - MKT.High(i+1));
TR3[i] = Math.abs(MKT.Close(i+2) - MKT.Low(i+1));
TR[i] = Math.max(TR1[i], TR2[i], TR3[i]);
if(((MKT.High(i+1) > MKT.High(i+2)) && (MKT.High(i+1) - MKT.High(i+2)) > (MKT.Low(i+2) - MKT.Low(i+1))))
{
DMplus[i] = (MKT.High(i+1) - MKT.High(i+2));
}
else DMplus[i] = 0;
if(((MKT.Low(i+2) > MKT.Low(i+1)) && (MKT.High(i+1) - MKT.High(i+2)) < (MKT.Low(i+2) - MKT.Low(i+1))))
{
DMminus[i] = (MKT.Low(i+2) - MKT.Low(i+1));
}
else DMminus[i] = 0;
}
var ATR = 0;
for (var i = 0; i < TR.length; i++) ATR += TR[i];
ATR = ATR/(TR.length);
var DMplus_avg = 0;
for (var i = 0; i < DMplus.length; i++) DMplus_avg += DMplus[i];
DMplus_avg = DMplus_avg/(DMplus.length);
var DMminus_avg = 0;
for (var i = 0; i < DMminus.length; i++) DMminus_avg += DMminus[i];
DMminus_avg = DMminus_avg/(DMminus.length);
PDI = DMplus_avg / ATR * 100;
MDI = DMminus_avg / ATR * 100;
DX = Math.abs(PDI-MDI) / (PDI+MDI);
ADX = DX / (PeriodADX+1) * 100;
답변 1
예스스탁
예스스탁 답변
2024-01-08 11:49:44
안녕하세요
예스스탁입니다.
올리신 내용은 작성해 드리는데 시간이 많이 소모됩니다.
업무상 일정이상 요구되는 내용은 저희가 작성해 드리지 않습니다.
즐거운 하루되세요
> 아름다운사람들 님이 쓴 글입니다.
> 제목 : ADX, +DI 및 -DI 지표 문의 드립니다
> 안녕하세요.
항상 도움을 받고 있습니다.
ADX, +DI 및 -DI 지표 관련해서 아래와 같은 예스랭귀지 수식을 찾았습니다.
이 수식을 바탕으로 자바스크립트로 변환해 보았습니다만,
ADX가 잘 구현되었는지 궁금합니다.
시스템식에 ADX >30으로 해 놨는데, 신호가 발생 하는게 하나도 없네요.
자바스크립트 수식 검토 부탁합니다.
==============예스랭귀지===================
input : Period(14);
var : PDI(0),MDI(0),ADXv(0);
PDI = ema(iff(H-H[1]>0 && H-H[1]>L[1]-L,H-H[1],0),Period)/
ema(max(max(H-L,abs(C[1]-H)),abs(C[1]-L)),Period)*100;
MDI = ema(iff(L[1]-L>0 && H-H[1]<L[1]-L,L[1]-L,0),Period)/
ema(max(max(H-L,abs(C[1]-H)),abs(C[1]-L)),Period)*100;
ADXV = ema(abs(PDI-MDI)/(PDI+MDI),period)*100;
plot1(ADXv);
plot2(PDI);
plot3(MDI);
==============자바스크립트===================
var DMplus, DMminus, TR, ATR, DMplus_avg, DMminus_avg, PDI, MDI, DX, ADX, PeriodADX, PeriodDI;
// ADX(Average Directional Movement Index)
var TR1 = [];
var TR2 = [];
var TR3 = [];
var TR = [];
var DMplus = [];
var DMminus = [];
var PeriodADX = 11;
var PeriodDI = 28;
var DMplusCnt = 0;
var DMminusCnt = 0;
for (var i = PeriodADX; i >= 0; i--)
{
TR1[i] = MKT.High(i+1) - MKT.Low(i+1);
TR2[i] = Math.abs(MKT.Close(i+2) - MKT.High(i+1));
TR3[i] = Math.abs(MKT.Close(i+2) - MKT.Low(i+1));
TR[i] = Math.max(TR1[i], TR2[i], TR3[i]);
if(((MKT.High(i+1) > MKT.High(i+2)) && (MKT.High(i+1) - MKT.High(i+2)) > (MKT.Low(i+2) - MKT.Low(i+1))))
{
DMplus[i] = (MKT.High(i+1) - MKT.High(i+2));
}
else DMplus[i] = 0;
if(((MKT.Low(i+2) > MKT.Low(i+1)) && (MKT.High(i+1) - MKT.High(i+2)) < (MKT.Low(i+2) - MKT.Low(i+1))))
{
DMminus[i] = (MKT.Low(i+2) - MKT.Low(i+1));
}
else DMminus[i] = 0;
}
var ATR = 0;
for (var i = 0; i < TR.length; i++) ATR += TR[i];
ATR = ATR/(TR.length);
var DMplus_avg = 0;
for (var i = 0; i < DMplus.length; i++) DMplus_avg += DMplus[i];
DMplus_avg = DMplus_avg/(DMplus.length);
var DMminus_avg = 0;
for (var i = 0; i < DMminus.length; i++) DMminus_avg += DMminus[i];
DMminus_avg = DMminus_avg/(DMminus.length);
PDI = DMplus_avg / ATR * 100;
MDI = DMminus_avg / ATR * 100;
DX = Math.abs(PDI-MDI) / (PDI+MDI);
ADX = DX / (PeriodADX+1) * 100;