커뮤니티

재문의 드립니다

프로필 이미지
돈을잃자
2024-04-08 14:45:43
876
글번호 178391
답변완료

첨부 이미지

아래는 선생님께서 작성해주신 지표인데 필터로 쓰기전에 플롯을 해서 제대로 나오는지 살펴보았는데 전일이나 전전일 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]);