첨부 이미지
그림1
아래는 선생님께서 작성해주신 지표인데
필터로 쓰기전에 플롯을 해서 제대로 나오는지 살펴보았는데
전일이나 전전일 adx의 고가 값이 다 100으로 고정되어 있네요
당일꺼는 움직이는거 같은데
당일께 만약 adx가 60을 하이로 찍었으면
내일은 hdax[1]이 60을 나타내야 할텐데요
확인부탁드려요~
Inputs : Period(14);
Var : idx(0),Counter(0), TRange(0), PlusDM14(0),MinusDM14(0);
var : PlusDM(0), MinusDM(0),DMIv(0);
var : DP(0),DM(0),hd(0),ld(0);
var : cnt(0);
Array : Hadx[10](0);
if bdate != Bdate[1] Then
{
idx = 0;
DP = 0;
DM = 0;
}
else
idx = idx+1;
if idx == 0 Then
hd = C-O;
Else
hd = H-H[1];
if idx == 0 Then
ld = C-O;
Else
ld = L-L[1];
If idx >= 0 and idx <= Period+1 Then
{
DP = 0;
DM = 0;
PlusDM14 = 0;
MinusDM14 = 0;
TRange = 0;
For Counter = 0 To idx
{
If hd < 0 Then
PlusDM = 0;
Else
PlusDM = hd;
If ld < 0 Then
MinusDM = 0;
Else
MinusDM = ld;
var1 = PlusDM;
Var2 = MinusDM;
If Var2 >= var1 Then
PlusDM = 0;
If var1 >= Var2 Then
MinusDM = 0;
TRange = TRange + TrueRange[Counter];
PlusDM14 = PlusDM14 + PlusDM;
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
{
DP = 100 * PlusDM14 / TRange;
DM = 100 * MinusDM14 / TRange;
}
Else
{
DP = 0;
DM = 0;
}
}
If idx > Period+1 Then
{
If hd < 0 Then
PlusDM = 0;
Else
PlusDM = hd;
If ld < 0 Then
MinusDM = 0;
Else
MinusDM = ld;
var1 = PlusDM;
Var2 = MinusDM;
If Var2 >= var1 Then
PlusDM = 0;
If var1 >= Var2 Then
MinusDM = 0;
If Period > 0 Then Begin
TRange = TRange[1] - (TRange[1] / Period) + TrueRange;
PlusDM14 = PlusDM14[1] - (PlusDM14[1] / Period) + PlusDM;
MinusDM14 = MinusDM14[1] - (MinusDM14[1] / Period) + MinusDM;
End;
If TRange <> 0 Then
{
DP = 100 * PlusDM14 / TRange;
DM = 100 * MinusDM14 / TRange;
}
Else
{
DP = 0;
DM = 0;
}
}
If DP + DM == 0 Then
DMIv = 0;
Else
DMIv = 100 * AbsValue(DP - DM) / (DP + DM);
var : CummDMI(0),ADXV(0);
If idx >= 1 AND Period > 0 Then
{
If idx < Period Then
{
CummDMI = 0;
for Counter = 0 To idx - 1
{
CummDMI = CummDMI + DMIV[Counter];
}
ADXv = CummDMI / idx;
}
Else
ADXv = (ADXv * (Period - 1) + DMIv) / Period;
}
if Bdate != Bdate[1] Then
{
For cnt = 9 DownTo 1
{
Hadx[cnt] = Hadx[cnt-1];
}
Hadx[0] = ADXV;
}
if ADXV > Hadx[0] Then
Hadx[0] = Adxv;
Plot1(hadx[0]);
Plot2(hadx[1]);
답변 1
예스스탁
예스스탁 답변
2024-04-08 15:54:48
안녕하세요
예스스탁입니다.
1
현재 답변드린 수식은 당일데이터를 이용하기 위해
당일 ADX기간 전에는 당일값만 모아서 계산하게 되어 있습니다.
이런 이유로 장초반에 큰값이 나오는 경우가 많이 있습니다.
Plot1(ADXV);
Plot2(hadx[1]);
Plot3(hadx[2]);
위와 같이 ADX를 같이 출력해 보시면 장초반에 큰값들이 나오는 것을 보실 수 있습니다.
2
위 장초반에 큰값이 나오는 것을 해결하려면
다른 방식으로 당일 값을 계산해야 합니다.
당일 ADX를 계산할 만큼 충분한 봉이 없을때는 값을 0으로 하고
충분한 봉갯수가 발생뒤 부터 값이 계산되게 하는 방법입니다.
이 내용이면 아래식 이용하시면 됩니다.
Inputs : Period(14);
Var : idx(0),Counter(0), TRange(0), PlusDM14(0),MinusDM14(0);
var : PlusDM(0), MinusDM(0),DMIv(0);
var : DP(0),DM(0),hd(0),ld(0);
var : cnt(0),b(0);
var : CummDMI(0),ADXV(0);
Array : Hadx[10](0);
if bdate != Bdate[1] Then
{
idx = 0;
DP = 0;
DM = 0;
DMIV = 0;
ADXV = 0;
}
else
idx = idx+1;
If idx == Period+1 Then
{
DP = 0;
DM = 0;
PlusDM14 = 0;
MinusDM14 = 0;
TRange = 0;
For Counter = 0 To Period - 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];
var1 = PlusDM;
Var2 = MinusDM;
If Var2 >= var1 Then
PlusDM = 0;
If var1 >= Var2 Then
MinusDM = 0;
TRange = TRange + TrueRange[Counter];
PlusDM14 = PlusDM14 + PlusDM;
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
{
DP = 100 * PlusDM14 / TRange;
DM = 100 * MinusDM14 / TRange;
}
Else
{
DP = 0;
DM = 0;
}
}
If idx > Period+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];
var1 = PlusDM;
Var2 = MinusDM;
If Var2 >= var1 Then
PlusDM = 0;
If var1 >= Var2 Then
MinusDM = 0;
If Period > 0 Then Begin
TRange = TRange[1] - (TRange[1] / Period) + TrueRange;
PlusDM14 = PlusDM14[1] - (PlusDM14[1] / Period) + PlusDM;
MinusDM14 = MinusDM14[1] - (MinusDM14[1] / Period) + MinusDM;
End;
If TRange <> 0 Then
{
DP = 100 * PlusDM14 / TRange;
DM = 100 * MinusDM14 / TRange;
}
Else
{
DP = 0;
DM = 0;
}
}
If DP + DM == 0 Then
DMIv = 0;
Else
DMIv = 100 * AbsValue(DP - DM) / (DP + DM);
If DMIV > 0 Then
{
b = b+1;
if b < Period Then
{
CummDMI = CummDMI + DMIV;
ADXV = CummDMI / b;
}
Else
ADXV = (ADXV[1] * (Period - 1) + DMIV) / Period;
}
if Bdate != Bdate[1] Then
{
For cnt = 9 DownTo 1
{
Hadx[cnt] = Hadx[cnt-1];
}
Hadx[0] = ADXV;
}
if ADXV > Hadx[0] Then
Hadx[0] = Adxv;
Plot1(ADXV);
Plot2(Hadx[0]);
Plot3(Hadx[1]);
즐거운 하루되세요
> 돈을잃자 님이 쓴 글입니다.
> 제목 : 재문의 드립니다
> 아래는 선생님께서 작성해주신 지표인데
필터로 쓰기전에 플롯을 해서 제대로 나오는지 살펴보았는데
전일이나 전전일 adx의 고가 값이 다 100으로 고정되어 있네요
당일꺼는 움직이는거 같은데
당일께 만약 adx가 60을 하이로 찍었으면
내일은 hdax[1]이 60을 나타내야 할텐데요
확인부탁드려요~
Inputs : Period(14);
Var : idx(0),Counter(0), TRange(0), PlusDM14(0),MinusDM14(0);
var : PlusDM(0), MinusDM(0),DMIv(0);
var : DP(0),DM(0),hd(0),ld(0);
var : cnt(0);
Array : Hadx[10](0);
if bdate != Bdate[1] Then
{
idx = 0;
DP = 0;
DM = 0;
}
else
idx = idx+1;
if idx == 0 Then
hd = C-O;
Else
hd = H-H[1];
if idx == 0 Then
ld = C-O;
Else
ld = L-L[1];
If idx >= 0 and idx <= Period+1 Then
{
DP = 0;
DM = 0;
PlusDM14 = 0;
MinusDM14 = 0;
TRange = 0;
For Counter = 0 To idx
{
If hd < 0 Then
PlusDM = 0;
Else
PlusDM = hd;
If ld < 0 Then
MinusDM = 0;
Else
MinusDM = ld;
var1 = PlusDM;
Var2 = MinusDM;
If Var2 >= var1 Then
PlusDM = 0;
If var1 >= Var2 Then
MinusDM = 0;
TRange = TRange + TrueRange[Counter];
PlusDM14 = PlusDM14 + PlusDM;
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
{
DP = 100 * PlusDM14 / TRange;
DM = 100 * MinusDM14 / TRange;
}
Else
{
DP = 0;
DM = 0;
}
}
If idx > Period+1 Then
{
If hd < 0 Then
PlusDM = 0;
Else
PlusDM = hd;
If ld < 0 Then
MinusDM = 0;
Else
MinusDM = ld;
var1 = PlusDM;
Var2 = MinusDM;
If Var2 >= var1 Then
PlusDM = 0;
If var1 >= Var2 Then
MinusDM = 0;
If Period > 0 Then Begin
TRange = TRange[1] - (TRange[1] / Period) + TrueRange;
PlusDM14 = PlusDM14[1] - (PlusDM14[1] / Period) + PlusDM;
MinusDM14 = MinusDM14[1] - (MinusDM14[1] / Period) + MinusDM;
End;
If TRange <> 0 Then
{
DP = 100 * PlusDM14 / TRange;
DM = 100 * MinusDM14 / TRange;
}
Else
{
DP = 0;
DM = 0;
}
}
If DP + DM == 0 Then
DMIv = 0;
Else
DMIv = 100 * AbsValue(DP - DM) / (DP + DM);
var : CummDMI(0),ADXV(0);
If idx >= 1 AND Period > 0 Then
{
If idx < Period Then
{
CummDMI = 0;
for Counter = 0 To idx - 1
{
CummDMI = CummDMI + DMIV[Counter];
}
ADXv = CummDMI / idx;
}
Else
ADXv = (ADXv * (Period - 1) + DMIv) / Period;
}
if Bdate != Bdate[1] Then
{
For cnt = 9 DownTo 1
{
Hadx[cnt] = Hadx[cnt-1];
}
Hadx[0] = ADXV;
}
if ADXV > Hadx[0] Then
Hadx[0] = Adxv;
Plot1(hadx[0]);
Plot2(hadx[1]);