예스스탁
예스스탁 답변
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);