예스스탁
예스스탁 답변
2021-01-29 16:09:29
안녕하세요
예스스탁입니다.
1
plot1(cnt);
각각의 수식에 위 지표내용 추가해서 출력해 보시면
cnt값이 상이한것을 보실 수 있습니다.
언급하신 내용과 같이 계산횟수 증가때문에 발생하는 부분입니다.
참조데이타의 주기가 기본차트보다 짧으면
기본차트봉완성시에 그 사이에 완성봉 참보데이타의 봉이 여러개이므로
해당 갯수만큼 반복계산이 됩니다.
그래서 루프문의 sNaN(line[i]) == True의 조건만족횟수가 다르게 됩니다.
2
우선 수식을 다른방법으로 작성해 드립니다.작성하신 내용으로는 별도의 방법이 없습니다.
수식이 차트과거부터 현재로 수행되므로 해당 수식은 while문 쓰는 것이 불필요합니다.
추세선 출력시점에 필요한 값을 변수에 저장하고 다음 조건 체크시에 사용하시면 됩니다.
1번식 변경하면 아래와 같습니다.
var : hh(0),ll(0),dd(0),tt(0),ee(0),line(0);
If Index == 1 Then
{
line = TL_New(sDate[1],sTime[1],L[1]-1,sDate,sTime,L[1]);
hh = h;
ll = l;
dd = sDate;
tt = sTime;
ee = l[1];
}
Else if Index != 0 Then
{
If HH < H[0] and LL <= L[0] Then
{
line = TL_New(dd,tt,ee,sDate,sTime,H[0]);
hh = h;
ll = l;
dd = sDate;
tt = sTime;
ee = h[0];
}
Else If HH>=H[0] and LL>L[0] Then
{
line = TL_New(dd,tt,ee,sDate,sTime,L[0]);
hh = h;
ll = l;
dd = sDate;
tt = sTime;
ee = L[0];
}
Else
{
line = NaN();
}
}
3
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,H[0]);
line = TL_New(sDate,sTime,TL_GetEndVal(line),sDate,sTime,L[0]);
2번식은 ht2와 lt2와 비교시 2개의 추세선이 출려되는데
추세선은 동일라인으로 2개가 겹치면 보이지 않게 됩니다.
당일고가보다 당일저가가 나중에 출혈했으면 저가를
반대이면 고가를 출력하게 작성해 드립니다.
var : line(0,Data1),i(1,Data1),cnt(1,Data1),break(False,Data1);
var : hh(0,Data1),ll(0,Data1),dd(0,Data1),tt(0,Data1),ee(0,Data1);
var : HT2(0,Data2),LT2(0,Data2);
If Data2(H == HighD(0)) Then
HT2 = Data2(sTime);
If Data2(L == LowD(0)) Then
LT2 = Data2(sTime);
If data1(Index == 1) Then
{
line = TL_New(sDate[1],sTime[1],L[1]-1,sDate,sTime,L[1]);
hh = Data1(h);
ll = Data1(l);
dd = Data1(sDate);
tt = Data1(sTime);
ee = Data1(l[1]);
}
Else if data1(Index != 0) Then
{
If data1(HH < H[0] and LL <= L[0]) Then
{
line = TL_New(dd,tt,ee,sDate,sTime,H[0]);
hh = Data1(h);
ll = Data1(l);
dd = Data1(sDate);
tt = Data1(sTime);
ee = Data1(h[0]);
}
Else If data1(HH >= H[0] and LL > L[0]) Then
{
line = TL_New(dd,tt,ee,sDate,sTime,L[0]);
hh = Data1(h);
ll = Data1(l);
dd = Data1(sDate);
tt = Data1(sTime);
ee = Data1(L[0]);
}
Else If data1(hh < H[0] and LL > L[0]) Then
{
If HT2<LT2 Then
{
line = TL_New(dd,tt,ee,sDate,sTime,L[0]);
hh = Data1(h);
ll = Data1(l);
dd = Data1(sDate);
tt = Data1(sTime);
ee = Data1(L[0]);
}
Else
{
line = TL_New(dd,tt,ee,sDate,sTime,H[0]);
hh = Data1(h);
ll = Data1(l);
dd = Data1(sDate);
tt = Data1(sTime);
ee = Data1(L[0]);
}
}
Else
{
line = NaN();
}
}
즐거운 하루되세요
> ravit 님이 쓴 글입니다.
> 제목 : 참조데이터를 고려한 함수 작성?
> 참조데이터를 고려한 함수를 작성하면 기존함수가 작동을 하지 않습니다.
#여기서 기본데이터는 일봉이고, 참조데이터는 60분봉입니다.#
아래는 그림1의 수식입니다.
var : line(0),i(1),cnt(1),break(False);
i = 1;
cnt = 1;
break = False;
If Index == 1 Then
line = TL_New(sDate[1],sTime[1],L[1]-1,sDate,sTime,L[1]);
Else if Index != 0 Then
{
While break == False
{
If IsNaN(line[i]) == True Then
{
cnt = cnt + 1;
i = i + 1;
}
Else
break = True;
}
If H[cnt]<H[0] and L[cnt]<=L[0] Then
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,H[0]);
Else If H[cnt]>=H[0] and L[cnt]>L[0] Then
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,L[0]);
Else
line = NaN();
}
아래는 그림2의 수식입니다.
var : line(0),i(1),cnt(1),break(False);
var : HT2(0,Data2),LT2(0,Data2);
i = 1;
cnt = 1;
break = False;
If Index == 1 Then
line = TL_New(sDate[1],sTime[1],L[1]-1,sDate,sTime,L[1]);
Else if Index != 0 Then
{
While break == False
{
If IsNaN(line[i]) == True Then
{
cnt = cnt + 1;
i = i + 1;
}
Else
break = True;
}
If H[cnt]<H[0] and L[cnt]<=L[0] Then
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,H[0]);
Else If H[cnt]>=H[0] and L[cnt]>L[0] Then
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,L[0]);
Else If H[cnt]<H[0] and L[cnt]>L[0] Then
{
If Data2(H == HighD(0)) Then
HT2 = Data2(sTime);
If Data2(L == LowD(0)) Then
LT2 = Data2(sTime);
If HT2<LT2 Then
{
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,H[0]);
line = TL_New(sDate,sTime,TL_GetEndVal(line),sDate,sTime,L[0]);
}
If LT2<HT2 Then
{
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,L[0]);
line = TL_New(sDate,sTime,TL_GetEndVal(line),sDate,sTime,H[0]);
}
}
Else
line = NaN();
}
그림1의 수식과 그림2의 수식의 차이는
분봉데이터를 고려하지 않음(그림1) 분봉데이터를 고려함(그림2)
입니다.
그림1이 제 함수의 기본 골격인데, 여기에
Else If H[cnt]<H[0] and L[cnt]>L[0] Then
{
If Data2(H == HighD(0)) Then
HT2 = Data2(sTime);
If Data2(L == LowD(0)) Then
LT2 = Data2(sTime);
If HT2<LT2 Then
{
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,H[0]);
line = TL_New(sDate,sTime,TL_GetEndVal(line),sDate,sTime,L[0]);
}
If LT2<HT2 Then
{
line = TL_New(sDate[cnt],sTime[cnt],TL_GetEndVal(line[cnt]),sDate,sTime,L[0]);
line = TL_New(sDate,sTime,TL_GetEndVal(line),sDate,sTime,H[0]);
}
}
이 부분을 추가한 것이 그림 2입니다. 위 수식의 의미는 무엇이냐면,
현재 일봉으로부터 비교되는 특정 시점의 과거 봉의 저점과 고점이 현재 봉에 포함된다면,
일봉을 관통하는 수직선을 고점부터 저점 또는 저점부터 고점으로 즉, 궤적을 그려라 뭐 이런 것인데요.
근데 일봉의 고점부터 저점, 저점부터 고점을 결정하는 방식으로 "분봉데이터"에서
일봉 고점 형성시간이 저점보다 시간상으로 앞서면 고점에서 저점으로 그리고
일봉 저점 형성시간이 고점보다 시간상으로 앞서면 저점에서 고점으로 그리는 것입니다.
즉, 분봉데이터를 고려하도록 설계를 했는데, 그 때부터 원래 함수조차 작동을 하지 않습니다.
질문
기존함수(그림1)에 분봉데이터를 참조하는 조건식하나를 추가했는데(그림2), 기존 추세선이 모조리 안나타납니다. 해결방법이 있을까요?
질문참고(1번 내용을 해결하려고 디버그를 돌리다가 알게된 사실이나 추측을 도움되실까하여 적어놓습니다)
1) 분봉데이터를 참조하면서부터 계산횟수가 기존의 8배로 증가했습니다. 60분봉 7개와 일봉1개 총 8번인 듯 합니다.
2) 동일 코드의 추세선 생성 명령이 2번이상 실행되는 경우 추세선 표현이 안되는 듯 합니다. 2)에서 언급된 하루당 8번의 계산이 실행되는 것과 영향이 있을 듯 합니다.
3) 2)내용이 사실이라면 하루 중 마지막 봉을 계산할 때만 추세선 생성 명령이 작동되야할텐데요.. barindex값을 무작정 8로나눈 나머지가 7일 때가 하루 중 마지막 봉의 계산이라고 하면 수능이나 새해날 때문에 뒤로 1칸 또는 2칸이 밀려서 꼬이네요...이 방법은 너무 수식이 좀 더 복잡해질 것 같아 다른 좋은 방법이 있으면 좋겠네요..
항상 친절히 답변해주셔서 감사합니다. 답변 잘 부탁드려요