커뮤니티
심각한 상황이니, 빠른 검토 부탁요~ Time사용상 주의점
2019-04-25 03:10:41
325
글번호 128102
예스글로벌에서 다음과 같은 테스트를 하다가 증상이 이상해서 문의드립니다.
1분봉챠트에서 9시30분부터 특정 작업을 하고자 할때,
if time == 093000 then { ... }
와 같이 코딩을 하게 되는데, 이상하게 과거데이타에선 문제없는게 실시간에서는 오동작을 하는듯 해서 살펴봤더니,
예를들어, 체결데이타가 9시29분59초에 한번 들어오고 다음 체결이 9시30분01초에 들어와서 9시30분00초에는 체결이 없는 경우, 저 if문에 의한 실행이 건너띄는 것을 발견하였습니다.
보통 interval 단위로 로직이 한번씩 동작한다고 가정하게 코딩을 하고, 따라서 time값은 1분단위로 딱 떨어지게 나오리라 예상하는데, 중간에 계산상의 목적으로 로그에는 매 틱마다의 값들이 표시가 되긴 한다고 해도 저렇게 봉 완성 시각을 경과할 때는 이론적으로라도 동작이 되겠거니 했다가 그렇지 않는 현상을 보고 무척 당황스럽습니다.
테스트에 사용한 코드를 첨부합니다.
var: target(020500);
if BarIndex == 0 then ClearDebug;
if LastBarOnChart == 1 then {
MessageLog("%.f %.f %.f : %.2f %.f", CurrentTime, time, sTime, close, V);
if time == target Then {
MessageLog("%.f == %.f : target reached by Time : %.f %.f %.f : %.2f %.f", time, target, CurrentTime, time, sTime, close, V);
}
if stime == target Then {
MessageLog("%.f == %.f : target reached by sTime : %.f %.f %.f : %.2f %.f", stime, target, CurrentTime, time, sTime, close, V);
}
}
위의 결과가 표시된 디버깅창의 내용은 첨부한 것과 같습니다.
첨부한 것에서 보시다시피, 봉의 종가가 1분단위로 완성될 것이므로 봉 완성기준 2시05분봉에 로그를 출력하는 문장과 봉 시작기준 2시05분을 감지하는 로그출력 문장을 실행시켜본 즉, 'target reached by Time'이 포함된 문장은 실행되지 않고 스킵된 것을 확인할 수 있습니다.
최근에 하이선물예스에서 밴드를 구하기 위한 명령으로 time을 사용해서 시간을 비교하여 변수값들을 설정하는 로직에서 이상증상이 자꾸 보여서 원인이 무언지 찾다가, 위와 같은 것을 발견하였습니다.
예를 들어, 9시20분 완성봉의 종가를 기준값으로 저장하고, 9시30분부터 10시까지의 구간에서의 고저값을 구하는 로직을 구현한다고 했을때, 2가지 고민이 생기는데요,
첫번째는, time == 092000으로 비교문을 구현하면 9시20분의 종가를 위와 같은 현상 때문에 구하지 못하는 경우가 종종 발생하였고,
두번째 고민은, 9시30분 부터는 stime으로 비교한다 치지만 10시까지의 것을 구한다는 것을 표현한다고 할때 역시나 time == 100000이라고 하면 또 문제가 될 것 같아 stime == 100000 - interval*100 이라고 하고 싶어도 stime이 동일한 종가가 여러개가 되니 정말 10시 정각 직전까지의 종가까지를 가져오는 가장 안전하고 정확한 방법이 무엇인지 혼동이 오기 시작했습니다.
글로 표현한 것이 다소 전달이 부족하였다면 금일 중으로 다시 문의전화 드리겠습니다.
이러한 증상(time을 사용할때 위와 같은 증상)이 해외선물에서만 발생하는 것이 아니라 국내선물옵션에서도 발생하는 것인지 걱정이 살짝 되어서 내일은 국내종목에서도 실행해 봐야 겠네요..
추가로 첨부한 그림2와 그림3에서 보시듯이,
그림2에서는,(참고로 챠트는 한국시간기준으로 해놔서 현지시각과 1시간이 차이나는 관계로 시세창에서는 1시38분으로 나오고 챠트에서는 2시38분으로 처리되고 있는 상황입니다) 종가기준 시각이 2시38분이 되면 동작하라는 명령은 여전히 실행이 안되고 2시38분00이 지나서 체결이 들어온 후에는 바로 sTime은 2시30분00초(뒤에 00초를 정확히 만들어 주는 모습을 확인하였습니다)로 조회가 되므로 sTime으로 비교하는 문장은 실행이 되는 것(빨간 밑줄 부분)이 확인됩니다.
그림3에서는 로직의 실행이 너무 임박하게 해서 time으로 비교하는 문장이 실행되지 않은거 아니냐는 의혹을 없애기 위해서 target값은 2시41분으로 설정하고 로직의 실행은 2시39분부터 실행해서 당시에 들어온 틱과 그에 따른 로그 출력값의 모습을 캡쳐한 것인데, 보시다시피 2시40분01초에서 2시40분59초까지의 체결이 없다가 41분04초에 체결들어올 때, 이론상은 time == 024100 일때의 문장이 한번은 실행해주기를 기대하지만 역시나 실행이 없이 interval 단위로 생성되는 stime값에 의해서는 실행이 되는 것을 발견하였습니다.
그래서 문뜩 떠오른 것이 '거래 없는 구간 봉 그리기'와 같은 옵션을 체크 안해서 저런 증상이 나오는 것인지... 정말 해결하고 싶습니다. (실험결과, 예상대로 이 옵션은 위 증상을 없애는데 도움은 되지 않았습니다. 그림 4 참조)
저 문제 때문에 오늘 오전에도 항생에서 신호가 반대로 나오고, 이상해서 챠트를 다시 그리니(봉 갯수를 바꾸는 방법으로) 지표와 로직이 의도대로 다시 그려지고 신호도 바뀌면서 오늘 큰 수익 낼 수 있는 날에 큰 손실을 내고 패닉에 빠진 하루였습니다.
최적의 대안 부탁드립니다.
- 1. 2019-04-25_오전_2-19-08.png (0.02 MB)
- 2. 128706_2.png (0.04 MB)
- 3. 128706_3.png (0.04 MB)
- 4. 128706_4.png (0.06 MB)
답변 2
예스스탁 예스스탁 답변
2019-04-25 13:14:15
> 온고지신 님이 쓴 글입니다.
> 제목 : 심각한 상황이니, 빠른 검토 부탁요~ Time사용상 주의점
> 예스글로벌에서 다음과 같은 테스트를 하다가 증상이 이상해서 문의드립니다.
1분봉챠트에서 9시30분부터 특정 작업을 하고자 할때,
if time == 093000 then { ... }
와 같이 코딩을 하게 되는데, 이상하게 과거데이타에선 문제없는게 실시간에서는 오동작을 하는듯 해서 살펴봤더니,
예를들어, 체결데이타가 9시29분59초에 한번 들어오고 다음 체결이 9시30분01초에 들어와서 9시30분00초에는 체결이 없는 경우, 저 if문에 의한 실행이 건너띄는 것을 발견하였습니다.
보통 interval 단위로 로직이 한번씩 동작한다고 가정하게 코딩을 하고, 따라서 time값은 1분단위로 딱 떨어지게 나오리라 예상하는데, 중간에 계산상의 목적으로 로그에는 매 틱마다의 값들이 표시가 되긴 한다고 해도 저렇게 봉 완성 시각을 경과할 때는 이론적으로라도 동작이 되겠거니 했다가 그렇지 않는 현상을 보고 무척 당황스럽습니다.
테스트에 사용한 코드를 첨부합니다.
var: target(020500);
if BarIndex == 0 then ClearDebug;
if LastBarOnChart == 1 then {
MessageLog("%.f %.f %.f : %.2f %.f", CurrentTime, time, sTime, close, V);
if time == target Then {
MessageLog("%.f == %.f : target reached by Time : %.f %.f %.f : %.2f %.f", time, target, CurrentTime, time, sTime, close, V);
}
if stime == target Then {
MessageLog("%.f == %.f : target reached by sTime : %.f %.f %.f : %.2f %.f", stime, target, CurrentTime, time, sTime, close, V);
}
}
위의 결과가 표시된 디버깅창의 내용은 첨부한 것과 같습니다.
첨부한 것에서 보시다시피, 봉의 종가가 1분단위로 완성될 것이므로 봉 완성기준 2시05분봉에 로그를 출력하는 문장과 봉 시작기준 2시05분을 감지하는 로그출력 문장을 실행시켜본 즉, 'target reached by Time'이 포함된 문장은 실행되지 않고 스킵된 것을 확인할 수 있습니다.
최근에 하이선물예스에서 밴드를 구하기 위한 명령으로 time을 사용해서 시간을 비교하여 변수값들을 설정하는 로직에서 이상증상이 자꾸 보여서 원인이 무언지 찾다가, 위와 같은 것을 발견하였습니다.
예를 들어, 9시20분 완성봉의 종가를 기준값으로 저장하고, 9시30분부터 10시까지의 구간에서의 고저값을 구하는 로직을 구현한다고 했을때, 2가지 고민이 생기는데요,
첫번째는, time == 092000으로 비교문을 구현하면 9시20분의 종가를 위와 같은 현상 때문에 구하지 못하는 경우가 종종 발생하였고,
두번째 고민은, 9시30분 부터는 stime으로 비교한다 치지만 10시까지의 것을 구한다는 것을 표현한다고 할때 역시나 time == 100000이라고 하면 또 문제가 될 것 같아 stime == 100000 - interval*100 이라고 하고 싶어도 stime이 동일한 종가가 여러개가 되니 정말 10시 정각 직전까지의 종가까지를 가져오는 가장 안전하고 정확한 방법이 무엇인지 혼동이 오기 시작했습니다.
글로 표현한 것이 다소 전달이 부족하였다면 금일 중으로 다시 문의전화 드리겠습니다.
이러한 증상(time을 사용할때 위와 같은 증상)이 해외선물에서만 발생하는 것이 아니라 국내선물옵션에서도 발생하는 것인지 걱정이 살짝 되어서 내일은 국내종목에서도 실행해 봐야 겠네요..
추가로 첨부한 그림2와 그림3에서 보시듯이,
그림2에서는,(참고로 챠트는 한국시간기준으로 해놔서 현지시각과 1시간이 차이나는 관계로 시세창에서는 1시38분으로 나오고 챠트에서는 2시38분으로 처리되고 있는 상황입니다) 종가기준 시각이 2시38분이 되면 동작하라는 명령은 여전히 실행이 안되고 2시38분00이 지나서 체결이 들어온 후에는 바로 sTime은 2시30분00초(뒤에 00초를 정확히 만들어 주는 모습을 확인하였습니다)로 조회가 되므로 sTime으로 비교하는 문장은 실행이 되는 것(빨간 밑줄 부분)이 확인됩니다.
그림3에서는 로직의 실행이 너무 임박하게 해서 time으로 비교하는 문장이 실행되지 않은거 아니냐는 의혹을 없애기 위해서 target값은 2시41분으로 설정하고 로직의 실행은 2시39분부터 실행해서 당시에 들어온 틱과 그에 따른 로그 출력값의 모습을 캡쳐한 것인데, 보시다시피 2시40분01초에서 2시40분59초까지의 체결이 없다가 41분04초에 체결들어올 때, 이론상은 time == 024100 일때의 문장이 한번은 실행해주기를 기대하지만 역시나 실행이 없이 interval 단위로 생성되는 stime값에 의해서는 실행이 되는 것을 발견하였습니다.
그래서 문뜩 떠오른 것이 '거래 없는 구간 봉 그리기'와 같은 옵션을 체크 안해서 저런 증상이 나오는 것인지... 정말 해결하고 싶습니다. (실험결과, 예상대로 이 옵션은 위 증상을 없애는데 도움은 되지 않았습니다. 그림 4 참조)
저 문제 때문에 오늘 오전에도 항생에서 신호가 반대로 나오고, 이상해서 챠트를 다시 그리니(봉 갯수를 바꾸는 방법으로) 지표와 로직이 의도대로 다시 그려지고 신호도 바뀌면서 오늘 큰 수익 낼 수 있는 날에 큰 손실을 내고 패닉에 빠진 하루였습니다.
최적의 대안 부탁드립니다.
온고지신
2019-04-26 11:03:12
상세한 설명 감사드립니다.~
이전글