커뮤니티
스크립트 처리과정 질문
2019-08-27 21:39:50
300
글번호 131524
실시간으로 코드 돌릴때는 tick이 들어올때마다 스크립트를 반복한다고 알고있어서, 15분마다 딱 한번만 실행시키고 싶은 내용이 있어서 다음과 같은 코드를 짰습니다.
Time이 15분이 되었을때 TFinitializer의 값이 1이고 if문이 처음 돌아가면서 TFinitializer를 0으로 만들어 줘서 다음 tick들이 들어올때 if문을 더이상 실행시키지 않으려고 하였습니다.
그런데 디버그 창을 보니 생각대로 안되고 tick이 들어오는대로 if문 안의 코드들이 계속 실행되는것처럼 보입니다.
그런데 더 신기한점은 tmpsum이나 tmp 배열의 값은 또 바뀌지 않는다는 점입니다.
실시간 tick이 들어올때 아래 스크립트가 어떤 과정으로 처리되는지 궁금합니다.
아래 코드가 tick이 들어올때마다 if문이 실행되는 것인지도 궁금하고 만약 그렇다면 이것을 한번만 실행되게 하려면 어떻게 해야하는지도 궁금합니다.
첨부한 이미지의 highlight 된 부분 이전은 이미 load 된 데이터에 대한 결과이고 이후는 실시간 데이터에 적용된 결과입니다.
-----------------------------------------------------------------------------------
var : tmpsum(0), cnt(0), baseTF(15), TF(0), TFinitializer(1);
Array : tmp[100](0);
TF = TimeToMinutes(stime)%baseTF;
if (Bdate != Bdate[1]) or (Bdate == Bdate[1] and baseTF-TF == 2) then {
TFinitializer = 1;
}
if (Bdate != Bdate[1]) or (Bdate == Bdate[1] and baseTF-TF == 1 and TFinitializer == 1) then {
Tfinitializer = 0;
tmpsum = tmpsum + 1;
for cnt = 1 to 99 {
tmp[99-cnt+1] = tmp[99-cnt];
}
tmp[0] = tmpsum;
if sdate == 20190827 and stime> 200000 and stime < 230000 then {
MessageLog("time: %.0f, tmpsum: %.0f", time, tmpsum);
MessageLog("tmp array: %.0f, %.0f, %.0f, %.0f", tmp[0], tmp[1], tmp[2], tmp[3]);
}
}
- 1. 스크립트처리과정질문.png (0.04 MB)
답변 1
예스스탁 예스스탁 답변
2019-08-28 11:05:12
안녕하세요
예스스탁입니다.
수식은 기본체계은 봉완성(다음봉시가수신)이 기준입니다.
수식은 시세가 들어올때 계산을 하지만
다음 시세가 해당봉을 완성시키는 시세가 아니면 각 변수의 값이 이전봉의 값으로 환원이 됩니다.
첨부된 그림은 아래수식을 국내선물 1분봉에 적용한 그림입니다.
날짜는 오늘날자 시간은 9시 이후로 지정했고 기존메세지와 같은 내용을
수식의 상단에 하다더 추가해서 시세가 들어올때마다 조건없이 출력하게 했습니다.
구분을 위해 1과 2라는 숫자를 지정했습니다.
var : tmpsum(0), cnt(0), baseTF(15), TF(0), TFinitializer(1);
Array : tmp[100](0);
MessageLog("1 time: %.0f, tmpsum: %.0f", time, tmpsum);
MessageLog("1 tmp array: %.0f, %.0f, %.0f, %.0f", tmp[0], tmp[1], tmp[2], tmp[3]);
TF = TimeToMinutes(stime)%baseTF;
if (Bdate != Bdate[1]) or (Bdate == Bdate[1] and baseTF-TF == 2) then
{
TFinitializer = 1;
}
if (Bdate != Bdate[1]) or (Bdate == Bdate[1] and baseTF-TF == 1 and TFinitializer == 1) then
{
Tfinitializer = 0;
tmpsum = tmpsum + 1;
for cnt = 1 to 99
{
tmp[99-cnt+1] = tmp[99-cnt];
}
tmp[0] = tmpsum;
if sdate == 20190828 and stime> 090000 and stime < 230000 then
{
MessageLog("2 time: %.0f, tmpsum: %.0f", time, tmpsum);
MessageLog("2 tmp array: %.0f, %.0f, %.0f, %.0f", tmp[0], tmp[1], tmp[2], tmp[3]);
}
}
그림에서 초록색부분은 if조건 만족봉의 전봉의 값이고
빨간색 부분은 if조건 만족한봉이고
파란색은 if조건 만족봉 다음봉입니다.
빨간색 영역을 보시면 if문 들어가기 전에 각 출력값이
if문에 들어간 후에 변경되는 것을 보실수 있습니다.
하지만 다음 시세가 다음봉의 시가가 아니므로
다시 이전봉의 값으로 환원이 되고 if문 안에서 새로 계산한 값이 저장이됩니다.
이런방식으로 미완성시에 계속 수행하다가
다음봉시가(파란색영역)가 수신되면 저장된 값은 확정이 됩니다.
시세가 수신될때마나 수행되는 것은 맞지만
최종적으로 변수에 가격이 확정적으로 저장되는 봉완성시입니다.
하나의 봉에서 봉미완성시에 변수가 값을 저장해서
해당 값을 다음틱에 사용하는 부분은 랭귀지에서 가능하지 않습니다.
즐거운 하루되세요
> 홀리산타 님이 쓴 글입니다.
> 제목 : 스크립트 처리과정 질문
> 실시간으로 코드 돌릴때는 tick이 들어올때마다 스크립트를 반복한다고 알고있어서, 15분마다 딱 한번만 실행시키고 싶은 내용이 있어서 다음과 같은 코드를 짰습니다.
Time이 15분이 되었을때 TFinitializer의 값이 1이고 if문이 처음 돌아가면서 TFinitializer를 0으로 만들어 줘서 다음 tick들이 들어올때 if문을 더이상 실행시키지 않으려고 하였습니다.
그런데 디버그 창을 보니 생각대로 안되고 tick이 들어오는대로 if문 안의 코드들이 계속 실행되는것처럼 보입니다.
그런데 더 신기한점은 tmpsum이나 tmp 배열의 값은 또 바뀌지 않는다는 점입니다.
실시간 tick이 들어올때 아래 스크립트가 어떤 과정으로 처리되는지 궁금합니다.
아래 코드가 tick이 들어올때마다 if문이 실행되는 것인지도 궁금하고 만약 그렇다면 이것을 한번만 실행되게 하려면 어떻게 해야하는지도 궁금합니다.
첨부한 이미지의 highlight 된 부분 이전은 이미 load 된 데이터에 대한 결과이고 이후는 실시간 데이터에 적용된 결과입니다.
-----------------------------------------------------------------------------------
var : tmpsum(0), cnt(0), baseTF(15), TF(0), TFinitializer(1);
Array : tmp[100](0);
TF = TimeToMinutes(stime)%baseTF;
if (Bdate != Bdate[1]) or (Bdate == Bdate[1] and baseTF-TF == 2) then {
TFinitializer = 1;
}
if (Bdate != Bdate[1]) or (Bdate == Bdate[1] and baseTF-TF == 1 and TFinitializer == 1) then {
Tfinitializer = 0;
tmpsum = tmpsum + 1;
for cnt = 1 to 99 {
tmp[99-cnt+1] = tmp[99-cnt];
}
tmp[0] = tmpsum;
if sdate == 20190827 and stime> 200000 and stime < 230000 then {
MessageLog("time: %.0f, tmpsum: %.0f", time, tmpsum);
MessageLog("tmp array: %.0f, %.0f, %.0f, %.0f", tmp[0], tmp[1], tmp[2], tmp[3]);
}
}
다음글
이전글