커뮤니티
어제 답변에 이어서 질문입니다
2017-11-06 21:36:03
192
글번호 113947
var : S1(0),D1(0),TM(0),TF(0),cnt(0),TM1(0),TF1(0);
Array : Ovalue[10](0),Hvalue[10](0),Lvalue[10](0),Cvalue[10](0);
#영업일 변경
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);//변경시점의 9시 이후 경과된 분 저장
D1 = sdate; //날짜저장
}
#날짜저장후(차트상 최초 영업일 변경후부터)
if D1 > 0 then{
#영업일 변경시간을 기준으로 현재 경과된 분수를 계산
#영업일 변경시간이 07시이면 s1는 420
#현재 10시이면 600-420 = 180분
#현재 20시이면 1200-420 = 780분
#현재 03시이면 180+1440-420 = 1200분
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
#영업일변경이후 경과된 분수를 60으로 나누어 나머지를 구함
#1분봉에서 아래와 같이 반복적으로 나머지값을 가지게 됨
#[0,1,2,~,58,59],[0,1,2,~,58,59],[0,1,2,~,58,59],....
#그러므로 TF가 전봉보다 작아지는 봉이 새로운 60분봉이 시작되는 봉임
TF = TM%60;
#새로운 60분봉 시작
#각 배열변수 [0]번방에는 초기값 지정
#각 배열변수의 각 방에 저장된 값을 다음방으로 이동
#기존 [0]번방은 [1]번방으로, 기존[1]번방값은 [2]번방으로....
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
Ovalue[0] = O;
Hvalue[0] = H;
Lvalue[0] = L;
for cnt = 1 to 9{
Ovalue[cnt] = Ovalue[cnt-1][1];
Hvalue[cnt] = Hvalue[cnt-1][1];
Lvalue[cnt] = Lvalue[cnt-1][1];
Cvalue[cnt] = Cvalue[cnt-1][1];
}
}
#Hvalue[0]보다 큰 고가가 출력하면 값갱신
if H > Hvalue[0] Then
Hvalue[0] = H;
#Lvalue[0]보다 작은 저가가 출력하면 값갱신
if L < Lvalue[0] Then
Lvalue[0] = L;
#Cvalue[0]는 매봉종가
Cvalue[0] = C;
var1=dayopen;
#
if (TF == 59) then
{
If Cvalue[0] > var1 and Ovalue[0]<=var1 and Ovalue[1] < Cvalue[0] and Ovalue[2] < Cvalue[0] Then
Condition1 = true;
Else
Condition1 = false;
}
if Condition1 == true Then
buy("시가매수", atlimit ,var1);
if MarketPosition == 1 then
{
if C < entryprice then
ExitLong ("본절청산",AtLimit,entryprice);
if C > entryprice and TM >= TM[BarsSinceEntry]+120 then //진입이후 120분 이상 경과
exitlong("매수익절",AtLimit,entryprice+PriceScale*100);
}
}
이렇게 수식을 주셨는데요.
Cvalue[0]=C; 매봉 종가로 잡아주셔서 차트와 같은 일이 생기는 것 같습니다.
(상단은 60분, 하단은 1분봉입니다. 60분차트의 화살표가 제가 의도하는 진입과 청산시점인데
하단 1분봉 차트에서는 그 이전캔들에서 돌파되자마자 바로 청산해 버리는 상황입니다.)
즉, 60분 봉이었다면 다음 캔들에서 조정이 올때 청산했을 텐데. 1분봉 전략에서는
진입캔들(60개 묶음)이 완성되자 마자. 다음부터 1분캔들 하나하나의 종가에 모두 반응해 버리는 문제가 있습니다.
어제 설명해주신 것처럼 마지막 59분 캔들의 종가에만(매봉 종가가 아닌) Cvalue(0)가 갱신될 수 있도록 부탁드립니다.
if C(또는 Cvalue(0)) < entryprice then
ExitLong ("본절청산",AtLimit,entryprice);
그러면 청산식에서도 C 와 Cvalue(0)의 차이가 생길것 같네요. 위의 식으로는 C대신 Cvalue(0)를 입력해도 같은 결과가 나옵니다...
그리고 한가지 추가 질문드리면, Bdate 는 해외선물에서 오전7시 부터 다음날 오전6시가 영업일 1단위가 되는 건가요? (위에 설명에서는 오전9시 부터라고 해놓으셔서...)
- 1. 60분1분비교.png (0.04 MB)
답변 1
예스스탁 예스스탁 답변
2017-11-07 15:16:19
안녕하세요
예스스탁입니다.
1
청산쪽도 59분봉 기준으로 조건체크하게 수정했습니다.
var : S1(0),D1(0),TM(0),TF(0),cnt(0),TM1(0),TF1(0),count(0);
Array : Ovalue[10](0),Hvalue[10](0),Lvalue[10](0),Cvalue[10](0);
#영업일 변경
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);//변경시점의 9시 이후 경과된 분 저장
D1 = sdate; //날짜저장
}
#날짜저장후(차트상 최초 영업일 변경후부터)
if D1 > 0 then{
#영업일 변경시간을 기준으로 현재 경과된 분수를 계산
#영업일 변경시간이 07시이면 s1는 420
#현재 10시이면 600-420 = 180분
#현재 20시이면 1200-420 = 780분
#현재 03시이면 180+1440-420 = 1200분
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
#영업일변경이후 경과된 분수를 60으로 나누어 나머지를 구함
#1분봉에서 아래와 같이 반복적으로 나머지값을 가지게 됨
#[0,1,2,~,58,59],[0,1,2,~,58,59],[0,1,2,~,58,59],....
#그러므로 TF가 전봉보다 작아지는 봉이 새로운 60분봉이 시작되는 봉임
TF = TM%60;
#새로운 60분봉 시작
#각 배열변수 [0]번방에는 초기값 지정
#각 배열변수의 각 방에 저장된 값을 다음방으로 이동
#기존 [0]번방은 [1]번방으로, 기존[1]번방값은 [2]번방으로....
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
Ovalue[0] = O;
Hvalue[0] = H;
Lvalue[0] = L;
for cnt = 1 to 9{
Ovalue[cnt] = Ovalue[cnt-1][1];
Hvalue[cnt] = Hvalue[cnt-1][1];
Lvalue[cnt] = Lvalue[cnt-1][1];
Cvalue[cnt] = Cvalue[cnt-1][1];
}
}
#Hvalue[0]보다 큰 고가가 출력하면 값갱신
if H > Hvalue[0] Then
Hvalue[0] = H;
#Lvalue[0]보다 작은 저가가 출력하면 값갱신
if L < Lvalue[0] Then
Lvalue[0] = L;
#Cvalue[0]는 매봉종가
Cvalue[0] = C;
var1=dayopen;
#
if (TF == 59) then
{
If Cvalue[0] > var1 and Ovalue[0]<=var1 and Ovalue[1] < Cvalue[0] and Ovalue[2] < Cvalue[0] Then
Condition1 = true;
Else
Condition1 = false;
}
if Condition1 == true Then
buy("시가매수", atlimit ,var1);
if MarketPosition == 1 then
{
if TF == 59 Then{
count = count+1;
if Cvalue[0] < entryprice then
Condition2 = true;
Else
Condition2 = false;
if Cvalue[0] > entryprice then
Condition3 = true;
Else
Condition3 = false;
}
if Condition2 == true then
ExitLong ("본절청산",AtLimit,entryprice);
if Condition3 == true and count >= 2 then
ExitLong("매수익절",AtLimit,entryprice+PriceScale*100);
}
Else{
count = 0;
Condition2 = false;
Condition3 = false;
}
}
2
bdate는 자동으로 해당 종목의 거래소에 영업시간변경에 맞게 제공됩니다.
아래 지표적용하시면 영업일 변경시간 확인하실수 있습니다.
plot1(bdate);
즐거운 하루되세요
> 마인드마스터 님이 쓴 글입니다.
> 제목 : 어제 답변에 이어서 질문입니다
> var : S1(0),D1(0),TM(0),TF(0),cnt(0),TM1(0),TF1(0);
Array : Ovalue[10](0),Hvalue[10](0),Lvalue[10](0),Cvalue[10](0);
#영업일 변경
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);//변경시점의 9시 이후 경과된 분 저장
D1 = sdate; //날짜저장
}
#날짜저장후(차트상 최초 영업일 변경후부터)
if D1 > 0 then{
#영업일 변경시간을 기준으로 현재 경과된 분수를 계산
#영업일 변경시간이 07시이면 s1는 420
#현재 10시이면 600-420 = 180분
#현재 20시이면 1200-420 = 780분
#현재 03시이면 180+1440-420 = 1200분
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
#영업일변경이후 경과된 분수를 60으로 나누어 나머지를 구함
#1분봉에서 아래와 같이 반복적으로 나머지값을 가지게 됨
#[0,1,2,~,58,59],[0,1,2,~,58,59],[0,1,2,~,58,59],....
#그러므로 TF가 전봉보다 작아지는 봉이 새로운 60분봉이 시작되는 봉임
TF = TM%60;
#새로운 60분봉 시작
#각 배열변수 [0]번방에는 초기값 지정
#각 배열변수의 각 방에 저장된 값을 다음방으로 이동
#기존 [0]번방은 [1]번방으로, 기존[1]번방값은 [2]번방으로....
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
Ovalue[0] = O;
Hvalue[0] = H;
Lvalue[0] = L;
for cnt = 1 to 9{
Ovalue[cnt] = Ovalue[cnt-1][1];
Hvalue[cnt] = Hvalue[cnt-1][1];
Lvalue[cnt] = Lvalue[cnt-1][1];
Cvalue[cnt] = Cvalue[cnt-1][1];
}
}
#Hvalue[0]보다 큰 고가가 출력하면 값갱신
if H > Hvalue[0] Then
Hvalue[0] = H;
#Lvalue[0]보다 작은 저가가 출력하면 값갱신
if L < Lvalue[0] Then
Lvalue[0] = L;
#Cvalue[0]는 매봉종가
Cvalue[0] = C;
var1=dayopen;
#
if (TF == 59) then
{
If Cvalue[0] > var1 and Ovalue[0]<=var1 and Ovalue[1] < Cvalue[0] and Ovalue[2] < Cvalue[0] Then
Condition1 = true;
Else
Condition1 = false;
}
if Condition1 == true Then
buy("시가매수", atlimit ,var1);
if MarketPosition == 1 then
{
if C < entryprice then
ExitLong ("본절청산",AtLimit,entryprice);
if C > entryprice and TM >= TM[BarsSinceEntry]+120 then //진입이후 120분 이상 경과
exitlong("매수익절",AtLimit,entryprice+PriceScale*100);
}
}
이렇게 수식을 주셨는데요.
Cvalue[0]=C; 매봉 종가로 잡아주셔서 차트와 같은 일이 생기는 것 같습니다.
(상단은 60분, 하단은 1분봉입니다. 60분차트의 화살표가 제가 의도하는 진입과 청산시점인데
하단 1분봉 차트에서는 그 이전캔들에서 돌파되자마자 바로 청산해 버리는 상황입니다.)
즉, 60분 봉이었다면 다음 캔들에서 조정이 올때 청산했을 텐데. 1분봉 전략에서는
진입캔들(60개 묶음)이 완성되자 마자. 다음부터 1분캔들 하나하나의 종가에 모두 반응해 버리는 문제가 있습니다.
어제 설명해주신 것처럼 마지막 59분 캔들의 종가에만(매봉 종가가 아닌) Cvalue(0)가 갱신될 수 있도록 부탁드립니다.
if C(또는 Cvalue(0)) < entryprice then
ExitLong ("본절청산",AtLimit,entryprice);
그러면 청산식에서도 C 와 Cvalue(0)의 차이가 생길것 같네요. 위의 식으로는 C대신 Cvalue(0)를 입력해도 같은 결과가 나옵니다...
그리고 한가지 추가 질문드리면, Bdate 는 해외선물에서 오전7시 부터 다음날 오전6시가 영업일 1단위가 되는 건가요? (위에 설명에서는 오전9시 부터라고 해놓으셔서...)