커뮤니티

부탁 드립니다.

프로필 이미지
뮬리
2020-08-24 19:18:25
896
글번호 141751
답변완료
도움에 깊이 감사 드립니다. ADX지표에 사용되는 DIPLUS함수의 타주기 즉 1)분봉 차트에서 예를 들어 10분봉에서 60분봉지표 2)60분봉 차트에서 일봉 지표 장시간 번거로우시겠지만 부탁드리오며 미리 경배로 깊이 감사 드립니다. Inputs: Length(NumericSimple) ; Variables: Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0); If CurrentBar == 1 Then Begin MyRange = Length; DIPlus = 0; PlusDM14 = 0; TRange = 0; For Counter = 0 To MyRange - 1 Begin 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; End; If TRange <> 0 Then DIPlus = 100 * PlusDM14 / TRange; Else DIPlus = 0 ; End Else If CurrentBar > 1 Then Begin 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 DIPlus = 100 * PlusDM14 / TRange; Else DIPlus = 0 ; End ; 참조1) TrueRange = TrueHigh - TrueLow; 참조2) If C[1] > H then TrueHigh = C[1]; else TrueHigh = H; 참조3) If C[1] < L then TrueLow = C[1]; else TrueLow = L;
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2020-08-25 13:12:17

안녕하세요 예스스탁입니다. 아래식 참고하시기 바랍니다. 타주기 ADX,DMI,DiPlus,Diminu가 모두 포함된 식입니다. 각 값이 모두 배열변수(adxv,dmiv,dplus,dminus)에 저장되어 있습니다. [0]이 현재봉, [1]이 전봉, [2]가 전전봉순서입니다. 1 input : Atime1(10),Length(14); var : TL(0),TH(0),cnt(0),Dcnt(0),preTRange(0),prePlusDM14(0),MinusDM14(0),TRange1(0),preMinusDM14(0); Var : TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0),preADX(0); Var : CummDMI(0), Cummi(0); var : S1(0),D1(0),TM(0),TF1(0),CB(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 { S1 = TimeToMinutes(stime); D1 = sdate; } if D1 > 0 then { if sdate == D1 Then TM = TimeToMinutes(stime)-S1; Else TM = TimeToMinutes(stime)+1440-S1; TF1 = TM%Atime1; if Bdate != Bdate[1] or (Bdate == Bdate[1] and Atime1 > 1 and TF1 < TF1[1]) or (Bdate == Bdate[1] and Atime1 > 1 and TM >= TM[1]+Atime1) or (Bdate == Bdate[1] and Atime1 == 1 and TM > TM[1]) Then { Dcnt = Dcnt+1; if Dcnt >= Length+2 Then CB = CB+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 CB == 1 Then { MyRange = Length; DPlus[0] = 0; PlusDM14 = 0; TRange = 0; DMinus[0] = 0; MinusDM14 = 0; TRange1 = 0; For cnt = 0 To MyRange - 1 { If HH[cnt] - HH[cnt+1] < 0 Then PlusDM = 0 ; Else PlusDM = HH[cnt] - HH[cnt+1]; If LL[cnt+1] - LL[cnt] < 0 Then MinusDM = 0; Else MinusDM = LL[cnt+1] - LL[cnt]; var1 = PlusDM; var2 = MinusDM; If var1 >= var2 Then MinusDM = 0; If var2 >= var1 Then PlusDM = 0; TRange = TRange + TR[cnt]; 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 CB > 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 CB >= 1 AND Length > 0 Then { If CB < Length Then { CummDMI = 0; for cnt = 0 To CB - 1 { CummDMI = CummDMI + DMIV[cnt]; } ADXv[0] = CummDMI / CB; } Else ADXv[0] = (ADXv[1] * (Length - 1) + DMIv[0]) / Length; } plot1(adxV[0]); plot2(DMIv[0]); plot3(DPlus[0]); plot4(DMinus[0] ); } 2 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; plot1(adxv[0]); plot2(DMIv[0]); plot3(DPlus[0]); plot4(DMinus[0] ); 즐거운 하루되세요 > 뮬리 님이 쓴 글입니다. > 제목 : 부탁 드립니다. > 도움에 깊이 감사 드립니다. ADX지표에 사용되는 DIPLUS함수의 타주기 즉 1)분봉 차트에서 예를 들어 10분봉에서 60분봉지표 2)60분봉 차트에서 일봉 지표 장시간 번거로우시겠지만 부탁드리오며 미리 경배로 깊이 감사 드립니다. Inputs: Length(NumericSimple) ; Variables: Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0); If CurrentBar == 1 Then Begin MyRange = Length; DIPlus = 0; PlusDM14 = 0; TRange = 0; For Counter = 0 To MyRange - 1 Begin 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; End; If TRange <> 0 Then DIPlus = 100 * PlusDM14 / TRange; Else DIPlus = 0 ; End Else If CurrentBar > 1 Then Begin 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 DIPlus = 100 * PlusDM14 / TRange; Else DIPlus = 0 ; End ; 참조1) TrueRange = TrueHigh - TrueLow; 참조2) If C[1] > H then TrueHigh = C[1]; else TrueHigh = H; 참조3) If C[1] < L then TrueLow = C[1]; else TrueLow = L;