커뮤니티
주봉참조 사용자 함수
2003-07-10 00:00:00
4996
글번호 341
주봉데이터 참조할 수 있는 사용자 함수를 의뢰하셨는데 이미 뒷페이지로 넘어갔기에 답변 글로 올리지 않고 새로이 올립니다.
풀이를 생각해보니 재미있을 것 같아 만들어 보았습니다.
원리는 월요일부터 금요일까지 1~5로 표시하면 분봉에서
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 로 표시됩니다.
위 배열에서 주가 바뀐 것을 어떻게 알 수 있을까요?
5에서 1로 바뀌는 시점이 주종과 주초입니다.
제가 얼마 전에 소개한 요일 체크 함수를 이용하여 day()[1] > day()를 만족하는 시점을 찾으면 그것이 주초의 좌표가 됩니다.
MRO함수의 사용법은 지난 번 글에서 이미 소개하였습니다.
전주 종가는 지금의 주초에서 한개 이전봉의 종가가 될 것이고 전주 시가는 day()[1] > day()를 만족하는 두번째 좌표가 됩니다.
이런 식으로 전주 시가와 전주 종가를 구하고 전주 시가 좌표에서 전주 종가 좌표까지의 고저가를 체크하여 주봉 고가와 주봉 저가를 구합니다.
highest함수를 사용해서 간단하게 구해질 줄 알았는데 지표식을 적용하면 에러가 발생해서 for문으로 계산해야만 했습니다.
해당 기간을 비교 검색해야 하기 때문에 연산 시간이 걸리는 흠이 있습니다.
글로는 쉬운데 저도 시행착오를 겪으면서 장장 3시간째 작업중입니다.
우선 지표식으로 만들어 테스트하고 다시 사용자함수로 만드는 과정에서 예트 프로가 아직은 사용자함수에서 사용자함수를 불러 쓰질 못해 다시 재정의해줘야 되더군요.
다음은 사용자함수로 만들기 전에 지표식으로 만들어 테스트하던 수식입니다.
검증을 위해서는 day()라는 사용자함수가 있어야 하며 제 홈피에 올렸져 있습니다.
input:n(1);
var:period(0),cnt(0),occ1(0),occ2(0),x1(0),x2(0),WeekClose(0),WeekOpen(0),WeekHigh(0),WeekLow(0);
period = ceiling(375/BarInterval())*5*(n+1);
occ1 = n + 1;
x1 = mro(day()[1] > day(),period,occ1);
if n == 0 then
{
occ2 = 1;
x2 = 0;
}
else
{
occ2 = n;
x2 = mro(day()[1] > day(),period,occ2)+1;
}
WeekOpen = o[x1];
WeekClose = c[x2];
weekhigh = 0;
for cnt = x2 to x1 begin
if WeekHigh < h[cnt] then WeekHigh = h[cnt];
end;
weeklow = 10000000000;
for cnt = x2 to x1 begin
if Weeklow > l[cnt] then Weeklow = l[cnt];
end;
plot1(WeekOpen,"o");
plot2(WeekClose,"c");
plot3(Weekhigh,"h");
plot4(Weeklow,"l");
위 내용을 분리해서 각각의 사용자 함수로 만듭니다.
day() 사용자 함수를 불러 쓸 수 없어 재정의해야 하는 불편함은 있습니다.
완성된 사용자함수식과 위 수식 설명은 제 홈피에서 확인하시기 바랍니다.
조회 횟수라도 많아야 글 올리는 맛이 나는 법이니까요.
답변 4
수식지왕
2003-07-10 00:00:00
첨부 지표식은 위의 수식에서 주봉 고가와 주봉 저가를 for문이 아니라 highest와 lowest로 구하는 것입니다.
지표식을 적용하면 그림과 같은 오류 메시지가 나옵니다.
로직상 이상이 없고 검증도 되는데 연산의 어느 부분이 잘못 되었는지 검토 바랍니다.
추가적으로 안의 내용을 보시면 다음과 같이 작성한 부분이 있습니다.
<예제1>
if n == 0 then
{
occ2 = 1;
x2 = 0;
}
else
{
occ2 = n;
x2 = mro(dday[1] > dday,period,occ2)+1;
}
아래의 이유로 n값을 mro함수에서 바로 사용하지 않고 다른 변수에 move하여 사용할 수 밖에 없더군요.
<예제2>
if n == 0 then
x2 = 0;
else
x2 = mro(dday[1] > dday,period,n)+1;
입력 변수 n 하나만으로 충분하다고 여겨 <예제2>와 같이 작성하고 n의 값에 0을 주면 n/a가 나옵니다. 0이 아닐 때는 정상적인 값이 나오고.
if else 문에서 완전히 분기되었으므로 n이 0일때도 정상적으로 계산이 되어야 할 것 같은데 이것 역시 검토해 보시기 바랍니다.
리서치팀 예스스탁 답변
2003-07-10 00:00:00
안녕하세요? 예스스탁입니다.....
검토결과 오류가 발생하는 것을 확인했습니다.....
이 부분은 바로 조치해서 반영하도록 하겠습니다.....
불편을 드려서 죄송합니다...
.
리서치팀 예스스탁 답변
2003-07-11 00:00:00
안녕하세요..
문의하신 오류 메세지 창 발생되는 내용과 <예제2> 작성 되도록 수정하였습니다.
수정된 내용은 오후에 올리도록 하겠습니다.
즐거운 하루 보내세요..
수식지왕
2003-07-12 00:00:00
수식이 간결해지고 연산속도가 빨라졌습니다.
빠른 대응 감사합니다.
이전글