커뮤니티

복합 분봉에서 일봉 ADX 지표 계산

프로필 이미지
다니엘87
2019-12-08 22:48:19
445
글번호 134217
답변완료

첨부 이미지

복합 분봉에 일봉의 ADX를 표시하기 위해 다음과 같이 식을 짜 보았으나 첨부파일과 같이 매우 다른 결과를 얻게 되었습니다. 문제점이 무엇인지 수정 부탁드립니다. 감사합니다. # ===<<< 분봉 차트에서 일봉 시고저종 계산 >>>=========================================== Arrays : 일봉_시가[20](0), 일봉_고가[20](0), 일봉_저가[20](0), 일봉_종가[20](0); Variable : cnt(0); If sTime[1] < 080000 And 080000 <= sTime Then Begin 일봉_시가[0] = Open; 일봉_고가[0] = High; 일봉_저가[0] = Low; 일봉_종가[0] = Close; End; If sTime[1] < 170000 And 170000 <= sTime Then Begin For cnt = 19 DownTo 1 Begin 일봉_시가[cnt] = 일봉_시가[cnt-1]; 일봉_고가[cnt] = 일봉_고가[cnt-1]; 일봉_저가[cnt] = 일봉_저가[cnt-1]; 일봉_종가[cnt] = 일봉_종가[cnt-1]; End; 일봉_시가[0] = Open; 일봉_고가[0] = High; 일봉_저가[0] = Low; 일봉_종가[0] = Close; End; If 일봉_고가[0] < High Then 일봉_고가[0] = High; If 일봉_저가[0] > Low Then 일봉_저가[0] = Low; 일봉_종가[0] = Close; # ===<<< 분봉 차트에서 일봉 DMI와 ADX 계산 >>>=========================================== Arrays : Positive_DM[14](0), Negative_DM[14](0), True_Range[14](0); Arrays : Positive_DI[14](0), Negative_DI[14](0), DX[14](0), Average_DX[14](0); Variables : Positive_DM14(0), Negative_DM14(0), True_Range14(0); Arrays : Positive_DI14[14](0), Negative_DI14[14](0); Variables : ADX_var1(0), ADX_var2(0), ADX_var3(0); Variables : sum1(0), sum2(0), sum3(0), sum4(0), len(14); If 일봉_고가[1] > 일봉_고가[0] Then Positive_DM[0] = 0; Else Positive_DM[0] = 일봉_고가[0] - 일봉_저가[1]; If 일봉_저가[1] < 일봉_저가[0] Then Positive_DM[0] = 0; Else Positive_DM[0] = 일봉_저가[1] - 일봉_저가[0]; ADX_var1 = Abs(일봉_고가[0]-일봉_저가[0]); ADX_var2 = Abs(일봉_고가[0]-일봉_종가[1]); ADX_var3 = Abs(일봉_저가[0]-일봉_종가[1]); True_Range[0] = Max(ADX_var1, ADX_var2, ADX_var3); Positive_DI[0] = Positive_DM[0] / True_Range[0]; Negative_DI[0] = Negative_DM[0] / True_Range[0]; sum1 = 0; # 단순이동평균 sum2 = 0; sum3 = 0; For cnt = 0 to len-1 Begin sum1 = sum1 + Positive_DM[cnt]; sum2 = sum2 + Negative_DM[cnt]; sum3 = sum3 + True_Range[cnt]; End; Positive_DM14 = sum1 / len; Negative_DM14 = sum2 / len; True_Range14 = sum3 / len; Positive_DI14[0] = Positive_DM14 / True_Range14; Negative_DI14[0] = Negative_DM14 / True_Range14; DX[0] = Abs(Positive_DI[0]-Negative_DI[0]) / (Positive_DI[0]+Negative_DI[0]) * 100; sum4 = 0; # 단순이동평균 For cnt = 0 to len-1 Begin sum4 = sum4 + DX[cnt]; End; Average_DX[0] = sum4 /len; If sTime[1] < 170000 And 170000 <= sTime Then Begin For cnt = 14 DownTo 1 Begin # 배열 이동 Positive_DM[cnt] = Positive_DM[cnt-1]; Negative_DM[cnt] = Negative_DM[cnt-1]; True_Range[cnt] = True_Range[cnt-1]; Positive_DI[cnt] = Positive_DI[cnt-1]; Negative_DI[cnt] = Negative_DI[cnt-1]; Positive_DI14[cnt] = Positive_DI14[cnt-1]; Negative_DI14[cnt] = Negative_DI14[cnt-1]; DX[cnt] = DX[cnt-1]; Average_DX[cnt] = Average_DX[cnt-1]; End; End; # ===<<< 분봉 차트에서 화면 출력 >>>======================================== If Positive_DI[1] < Positive_DI[0] Then Plot1(Positive_DI[0],"Positive_DI", RED); Else If Positive_DI[1] > Positive_DI[0] Then Plot1(Positive_DI[0],"Positive_DI", BLUE); If Negative_DI[1] < Negative_DI[0] Then Plot2(Negative_DI[0],"Negative_DI", RED); Else If Negative_DI[1] > Negative_DI[0] Then Plot2(Negative_DI[0],"Negative_DI", BLUE); If Average_DX[1] < Average_DX[0] Then Plot3(Average_DX[0],"Average_DX", RED); Else If Average_DX[1] > Average_DX[0] Then Plot3(Average_DX[0],"Average_DX", BLUE); # ===<<< 기준선 화면 출력 >>>======================================== PlotBaseLine1(20,"20",Gray);
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-12-10 09:51:40

안녕하세요 예스스탁입니다. input : Length(14); var : TL(0),TH(0),cnt(0),Dcnt(0),preTRange(0),prePlusDM14(0),MinusDM14(0),TRange1(0),preMinusDM14(0); Var : Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0),preADX(0); Var : CummDMI(0), Return(0); Array : HH[61](0),LL[61](0),CC[61](0),TR[61](0),DMIv[61](0),ADXv[61](0); Array : DPlus[61](0),DMinus[61](0); if bdate != bdate[1] Then{ Dcnt = Dcnt+1; HH[0] = H; LL[0] = L; CC[0] = C; preTRange = TRange[1]; prePlusDM14 = PlusDM14[1]; preMinusDM14 = MinusDM14[1]; for cnt = 1 to 60{ HH[cnt] = HH[cnt-1][1]; LL[cnt] = LL[cnt-1][1]; CC[cnt] = CC[cnt-1][1]; TR[cnt] = TR[cnt-1][1]; DMIv[cnt] = DMIv[cnt-1][1]; ADXv[cnt] = ADXv[cnt-1][1]; Dplus[cnt] = Dplus[cnt-1][1]; Dminus[cnt] = Dminus[cnt-1][1]; } } if H > HH[0] Then HH[0] = H; if L < LL[0] Then LL[0] = L; CC[0] = C; if CC[1] > 0 Then{ If CC[1] > HH[0] then TH = CC[1]; else TH = HH[0]; If CC[1] < LL[0] then TL = CC[1]; else TL = LL[0]; TR[0] = TH-TL; } If Dcnt == Length+1 Then { MyRange = Length; DPlus[0] = 0; PlusDM14 = 0; TRange = 0; DMinus[0] = 0; MinusDM14 = 0; TRange1 = 0; For Counter = 0 To MyRange - 1 { If HH[Counter] - HH[Counter+1] < 0 Then PlusDM = 0 ; Else PlusDM = HH[Counter] - HH[Counter+1]; If LL[Counter+1] - LL[Counter] < 0 Then MinusDM = 0; Else MinusDM = LL[Counter+1] - LL[Counter]; var1 = PlusDM; var2 = MinusDM; If var1 >= var2 Then MinusDM = 0; If var2 >= var1 Then PlusDM = 0; TRange = TRange + TR[Counter]; PlusDM14 = PlusDM14 + PlusDM; MinusDM14 = MinusDM14 + MinusDM; } If TRange <> 0 Then DPlus[0] = 100 * PlusDM14 / TRange; Else DPlus[0] = 0 ; If TRange <> 0 Then DMinus[0] = 100 * MinusDM14 / TRange; Else DMinus[0] = 0; If Dplus[0] + Dminus[0] == 0 Then DMIv[0] = 0; Else DMIv[0] = 100 * AbsValue(Dplus[0] - Dminus[0]) / (Dplus[0] + Dminus[0]); } Else If Dcnt > Length+1 Then { If HH[0] - HH[1] < 0 Then PlusDM = 0; Else PlusDM = HH[0] - HH[1]; If LL[1] - LL[0] < 0 Then MinusDM = 0; Else MinusDM = LL[1] - LL[0]; var1 = PlusDM; var2 = MinusDM; If var1 >= var2 Then MinusDM = 0; If var2 >= var1 Then PlusDM = 0; If MyRange > 0 Then { TRange = preTRange - (preTRange / MyRange) + TR[0]; PlusDM14 = prePlusDM14 - (prePlusDM14 / MyRange) + PlusDM; MinusDM14 = preMinusDM14 - (preMinusDM14 / MyRange) + MinusDM; } If TRange <> 0 Then DPlus[0] = 100 * PlusDM14 / TRange; Else DPlus[0] = 0 ; If TRange <> 0 Then DMinus[0] = 100 * MinusDM14 / TRange; Else DMinus[0] = 0; If Dplus[0] + Dminus[0] == 0 Then DMIv[0] = 0; Else DMIv[0] = 100 * AbsValue(Dplus[0] - Dminus[0]) / (Dplus[0] + Dminus[0]); } If DMIV[Length] == 0 Then{ CummDMI = 0; for Counter = 0 To Length-1 Begin if DMiV[counter] > 0 Then CummDMI = CummDMI + DMIV[Counter]; End; ADXv[0] = CummDMI / CurrentBar; } Else ADXv[0] = (ADXv[1] * (Length - 1) + DMIv[0]) / Length; # ===<<< 분봉 차트에서 화면 출력 >>>======================================== If Dplus[1] < Dplus[0] Then Plot1(Dplus[0],"Positive_DI", RED); Else If Dplus[1] > Dplus[0] Then Plot1(Dplus[0],"Positive_DI", BLUE); If Dminus[1] < Dminus[0] Then Plot2(Dminus[0],"Negative_DI", RED); Else If Dminus[1] > Dminus[0] Then Plot2(Dminus[0],"Negative_DI", BLUE); If ADXv[1] < ADXv[0] Then Plot3(ADXv[0],"Average_DX", RED); Else If ADXv[1] > ADXv[0] Then Plot3(ADXv[0],"Average_DX", BLUE); # ===<<< 기준선 화면 출력 >>>======================================== PlotBaseLine1(20,"20",Gray); 즐거운 하루되세요 > 다니엘87 님이 쓴 글입니다. > 제목 : 복합 분봉에서 일봉 ADX 지표 계산 > 복합 분봉에 일봉의 ADX를 표시하기 위해 다음과 같이 식을 짜 보았으나 첨부파일과 같이 매우 다른 결과를 얻게 되었습니다. 문제점이 무엇인지 수정 부탁드립니다. 감사합니다. # ===<<< 분봉 차트에서 일봉 시고저종 계산 >>>=========================================== Arrays : 일봉_시가[20](0), 일봉_고가[20](0), 일봉_저가[20](0), 일봉_종가[20](0); Variable : cnt(0); If sTime[1] < 080000 And 080000 <= sTime Then Begin 일봉_시가[0] = Open; 일봉_고가[0] = High; 일봉_저가[0] = Low; 일봉_종가[0] = Close; End; If sTime[1] < 170000 And 170000 <= sTime Then Begin For cnt = 19 DownTo 1 Begin 일봉_시가[cnt] = 일봉_시가[cnt-1]; 일봉_고가[cnt] = 일봉_고가[cnt-1]; 일봉_저가[cnt] = 일봉_저가[cnt-1]; 일봉_종가[cnt] = 일봉_종가[cnt-1]; End; 일봉_시가[0] = Open; 일봉_고가[0] = High; 일봉_저가[0] = Low; 일봉_종가[0] = Close; End; If 일봉_고가[0] < High Then 일봉_고가[0] = High; If 일봉_저가[0] > Low Then 일봉_저가[0] = Low; 일봉_종가[0] = Close; # ===<<< 분봉 차트에서 일봉 DMI와 ADX 계산 >>>=========================================== Arrays : Positive_DM[14](0), Negative_DM[14](0), True_Range[14](0); Arrays : Positive_DI[14](0), Negative_DI[14](0), DX[14](0), Average_DX[14](0); Variables : Positive_DM14(0), Negative_DM14(0), True_Range14(0); Arrays : Positive_DI14[14](0), Negative_DI14[14](0); Variables : ADX_var1(0), ADX_var2(0), ADX_var3(0); Variables : sum1(0), sum2(0), sum3(0), sum4(0), len(14); If 일봉_고가[1] > 일봉_고가[0] Then Positive_DM[0] = 0; Else Positive_DM[0] = 일봉_고가[0] - 일봉_저가[1]; If 일봉_저가[1] < 일봉_저가[0] Then Positive_DM[0] = 0; Else Positive_DM[0] = 일봉_저가[1] - 일봉_저가[0]; ADX_var1 = Abs(일봉_고가[0]-일봉_저가[0]); ADX_var2 = Abs(일봉_고가[0]-일봉_종가[1]); ADX_var3 = Abs(일봉_저가[0]-일봉_종가[1]); True_Range[0] = Max(ADX_var1, ADX_var2, ADX_var3); Positive_DI[0] = Positive_DM[0] / True_Range[0]; Negative_DI[0] = Negative_DM[0] / True_Range[0]; sum1 = 0; # 단순이동평균 sum2 = 0; sum3 = 0; For cnt = 0 to len-1 Begin sum1 = sum1 + Positive_DM[cnt]; sum2 = sum2 + Negative_DM[cnt]; sum3 = sum3 + True_Range[cnt]; End; Positive_DM14 = sum1 / len; Negative_DM14 = sum2 / len; True_Range14 = sum3 / len; Positive_DI14[0] = Positive_DM14 / True_Range14; Negative_DI14[0] = Negative_DM14 / True_Range14; DX[0] = Abs(Positive_DI[0]-Negative_DI[0]) / (Positive_DI[0]+Negative_DI[0]) * 100; sum4 = 0; # 단순이동평균 For cnt = 0 to len-1 Begin sum4 = sum4 + DX[cnt]; End; Average_DX[0] = sum4 /len; If sTime[1] < 170000 And 170000 <= sTime Then Begin For cnt = 14 DownTo 1 Begin # 배열 이동 Positive_DM[cnt] = Positive_DM[cnt-1]; Negative_DM[cnt] = Negative_DM[cnt-1]; True_Range[cnt] = True_Range[cnt-1]; Positive_DI[cnt] = Positive_DI[cnt-1]; Negative_DI[cnt] = Negative_DI[cnt-1]; Positive_DI14[cnt] = Positive_DI14[cnt-1]; Negative_DI14[cnt] = Negative_DI14[cnt-1]; DX[cnt] = DX[cnt-1]; Average_DX[cnt] = Average_DX[cnt-1]; End; End; # ===<<< 분봉 차트에서 화면 출력 >>>======================================== If Positive_DI[1] < Positive_DI[0] Then Plot1(Positive_DI[0],"Positive_DI", RED); Else If Positive_DI[1] > Positive_DI[0] Then Plot1(Positive_DI[0],"Positive_DI", BLUE); If Negative_DI[1] < Negative_DI[0] Then Plot2(Negative_DI[0],"Negative_DI", RED); Else If Negative_DI[1] > Negative_DI[0] Then Plot2(Negative_DI[0],"Negative_DI", BLUE); If Average_DX[1] < Average_DX[0] Then Plot3(Average_DX[0],"Average_DX", RED); Else If Average_DX[1] > Average_DX[0] Then Plot3(Average_DX[0],"Average_DX", BLUE); # ===<<< 기준선 화면 출력 >>>======================================== PlotBaseLine1(20,"20",Gray);