커뮤니티
시스템식 검토 부탁드립니다.
2015-10-22 20:59:56
153
글번호 91587
그림1)은 1차매수, 2차매수가 이루어 지고 최종손절가인 초록색선이 4,180원 입니다.
오후3:00 이전에는 가격이 4,215원으로 손절이 발생하지 않았는데..
그림2)에서 보듯이 오후 3:00에 동시호가 가격이 4,170원이 되면서 손절신호가 나왔습니다.
이처럼 아래와 같은 조건일 경우 당일에는 손절신호가 발생하였으나 실제 매도를 할수 없으므로 다음날 시가에 매도할수 있게 시스템식을 변경 부탁드립니다.
1) 오후 2:50에 가격이 손절가에 진입시
2) 오후 3:00에 동시호가가 손절가 이하일때
시스템식은 다음과 같습니다.
---------------------------------------------------------------------------------
input : 전략식시작일자(20151019), 전략식시작시간(090000), 전략총매수금액(2000);
input : 매수위치1차(2), 매수위치2차(3);
input : 매도위치1차(1), 매도위치2차(1.2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(1);
input : 최종손절위치(4);
input : Period(120);
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0);
var : diff(0),TF(0),cnt(0),value(0);
var : entrycond1(false),entrycond2(false),entrycond3(false);
# Period기간전 최고가의 값이 있으면
if dayhigh(Period) > 0 Then{
var1 = dayhigh(0); # 당일최고가(Period기간동안 최고가를 계산하기 위한 초기값)
var2 = daylow(0); # 당일최저가(Period기간동안 최고가를 계산하기 위한 초기값)
var11 = dayhigh(1); # 전일최고가(전일기준 Period기간동안 최고가를 계산하기 위한 초기값)
var12 = daylow(1); # 전일최저가(전일기준 Period기간동안 최고가를 계산하기 위한 초기값)
# 0일부터 Period전일까지 최고가와 최저가를 불러와
# Period기간동안 최고가/최저가를 계산
# 전일기준은 0을 제외하고 Period기간이므로 +1
for cnt = 0 to Period-1{
if DayHigh(cnt) > var1 Then
var1 = DayHigh(cnt);
if dayhigh(cnt+1) > var11 Then
var11 = dayhigh(cnt+1);
if daylow(cnt) < var2 Then
var2 = daylow(cnt);
if daylow(cnt+1) < var21 Then
var21 = daylow(cnt+1);
}
# Period기간동알 최고가가 전일보다 상승하면
# CL에 당일 중간값 저장
if var11 < var1 Then
CL = (var1+var2)/2;
V0.5 = var1-((var1-CL)/5)*1;
V1 = var1-((var1-CL)/5)*2; ## 1매수타점
V2 = var1-((var1-CL)/5)*3; ## 2매수타점
V3 = var1-((var1-CL)/5)*4; ## 3매수타점
mid = (var1+var2)/2;
V4 = var1-((var1-CL)/5)*5;
V5 = var1-((var1-CL)/5)*6;
V6 = var1-((var1-CL)/5)*7;
V7 = var1-((var1-CL)/5)*8;
value = abs(var1-V0.5);
if sdate >= 전략식시작일자 and # 지정일 이후
TotalTrades < 전략식진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략식시작시간 and #지정시간 이후
EntryCond1 == false Then{ #EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
# (1차매수),(1차매수.)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수.)
if NextBarOpen > var1-value*(매수위치1차+1) Then
buy("1차매수",atlimit,var1-value*(매수위치1차+1),Floor((전략총매수금액*10000*(매수비중1차/100))/C));
Else
buy("1차매수.",AtMarket,def,Floor((전략총매수금액*10000*(매수비중1차/100))/C));
}
# 매수진입이후
if MarketPosition == 1 then{
#매수시점의 var1와 V0.5의 차이값을 diff에 저장
diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]);
if MaxEntries == 1 and #최대진입횟수가1이고(첫진입 한번만 발생한 상황)
L >= var1-value*(매수위치2차+1) and #저가가 2차매수가격 이상이고
EntryCond2 == false Then #EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨)
#다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
buy("2차매수",atlimit,var1-value*(매수위치2차+1),Floor((전략총매수금액*10000*(매수비중2차/100))/C));
#Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
#포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if LatestExitName(0) == "1차매도" Then
Condition1 = true;
#포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if LatestExitName(0) == "2차매도" Then
Condition2 = true;
#Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
#당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큰 청상
if Condition1 == false then
exitlong("1차매도",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
#Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
#당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큰 청상
if Condition2 == false then
exitlong("2차매도",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
#당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산
exitlong("최종손절",AtStop,var1-value*(최종손절위치+1));
}
Else{#매수포지션이 아니면 모두 false로 초기화
Condition1 = false;
Condition2 = false;
}
}
#매수진입 후 1차매수나 1차매수.진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수" or LatestEntryName(0) == "1차매수.") Then
entrycond1 = true;
#매수진입 후 2차매수가 발생하면 true
if MarketPosition == 1 and LatestEntryName(0) == "2차매수" Then
entrycond2 = true;
#무포지션이면 flase로 초기화
if MarketPosition == 0 Then{
entrycond1 = false;
entrycond2 = false;
}
--------------------------------------------------------------------------------------
- 1. 동시호가_시간과_체결가.PNG (0.02 MB)
- 2. 오후_동시호가_시간에_손절시_문제점.PNG (0.02 MB)
답변 1
예스스탁 예스스탁 답변
2015-10-23 13:57:21
안녕하세요
예스스탁입니다.
문의하신 내용은 수식으로 해결할수 않습니다.
3분봉에서
동시호가봉은 stime 150000
1봉전(정규장마지막봉시간)은 stime 145800
2봉전(정규장마지막봉시간)은 stime 145500
입니다.
일반적으로 전체시간에 대해 봉이 모두 있으면
아래와 같은 구조로 식을 작성해서
최종손절1이라는 청산은 14시58분봉 까지만 발생하게 하고
15시 봉은 조건만 판단해 다음봉 시가에 신호(최종손절2)가 나오게 해서
해결이 가능한데
if stime <= 145500 Then
exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1));
if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then
exitlong("최종손절2",AtMarket);
첨부하신 그림과 같이
14시 30분봉 이후로 거래가 없는 상태에서
동시호가 데이터가 수신될 경우 신호를 막을 수가 없습니다.
전체 식에서 작성된 신호가 봉완성시 가격을 셋팅하고
다음봉에서 해당가격 이상이나 이하에서 신호가 발생하는
atstop,atlimit 타입인데
가격이 셋팅되는 것을 막을 적절한 시간조건이 없기 때문입니다.
우선 정상적으로 모든 시간에 거래가 있는 봉에서
동시호가 봉에서 신호가 나오는 부분은 모두 다음날 시가에 주문을 내게 아래에 수정했습니다.
위에 설명드린 부분과 같이 거래가 없어
14시 55분, 14시58분봉이 없는 날은 제어가 되지는 않습니다.
input : 전략식시작일자(20151019), 전략식시작시간(090000), 전략총매수금액(2000);
input : 매수위치1차(2), 매수위치2차(3);
input : 매도위치1차(1), 매도위치2차(1.2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(1);
input : 최종손절위치(4);
input : Period(120);
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0);
var : diff(0),TF(0),cnt(0),value(0);
var : entrycond1(false),entrycond2(false),entrycond3(false);
# Period기간전 최고가의 값이 있으면
if dayhigh(Period) > 0 Then{
var1 = dayhigh(0); # 당일최고가(Period기간동안 최고가를 계산하기 위한 초기값)
var2 = daylow(0); # 당일최저가(Period기간동안 최고가를 계산하기 위한 초기값)
var11 = dayhigh(1); # 전일최고가(전일기준 Period기간동안 최고가를 계산하기 위한 초기값)
var12 = daylow(1); # 전일최저가(전일기준 Period기간동안 최고가를 계산하기 위한 초기값)
# 0일부터 Period전일까지 최고가와 최저가를 불러와
# Period기간동안 최고가/최저가를 계산
# 전일기준은 0을 제외하고 Period기간이므로 +1
for cnt = 0 to Period-1{
if DayHigh(cnt) > var1 Then
var1 = DayHigh(cnt);
if dayhigh(cnt+1) > var11 Then
var11 = dayhigh(cnt+1);
if daylow(cnt) < var2 Then
var2 = daylow(cnt);
if daylow(cnt+1) < var21 Then
var21 = daylow(cnt+1);
}
# Period기간동알 최고가가 전일보다 상승하면
# CL에 당일 중간값 저장
if var11 < var1 Then
CL = (var1+var2)/2;
V0.5 = var1-((var1-CL)/5)*1;
V1 = var1-((var1-CL)/5)*2; ## 1매수타점
V2 = var1-((var1-CL)/5)*3; ## 2매수타점
V3 = var1-((var1-CL)/5)*4; ## 3매수타점
mid = (var1+var2)/2;
V4 = var1-((var1-CL)/5)*5;
V5 = var1-((var1-CL)/5)*6;
V6 = var1-((var1-CL)/5)*7;
V7 = var1-((var1-CL)/5)*8;
value = abs(var1-V0.5);
if sdate >= 전략식시작일자 and # 지정일 이후
TotalTrades < 전략식진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략식시작시간 and #지정시간 이후
EntryCond1 == false Then{ #EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
# (1차매수),(1차매수.)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수.)
if stime <= 145500 Then{
if NextBarOpen > var1-value*(매수위치1차+1) Then
buy("1차매수1",atlimit,var1-value*(매수위치1차+1),Floor((전략총매수금액*10000*(매수비중1차/100))/C));
Else
buy("1차매수2",AtMarket,def,Floor((전략총매수금액*10000*(매수비중1차/100))/C));
}
if stime == 150000 Then{
if L <= var1[1]-value[1]*(매수위치1차+1) Then
buy("1차매수3",AtMarket,def,Floor((전략총매수금액*10000*(매수비중1차/100))/C));
}
}
# 매수진입이후
if MarketPosition == 1 then{
#매수시점의 var1와 V0.5의 차이값을 diff에 저장
diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]);
if MaxEntries == 1 and #최대진입횟수가1이고(첫진입 한번만 발생한 상황)
L >= var1-value*(매수위치2차+1) and #저가가 2차매수가격 이상이고
EntryCond2 == false Then{ #EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨)
#다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
if stime <= 145500 Then
buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략총매수금액*10000*(매수비중2차/100))/C));
if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then
buy("2차매수2",AtMarket,def,Floor((전략총매수금액*10000*(매수비중2차/100))/C));
}
#Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
#포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" Then
Condition1 = true;
#포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" Then
Condition2 = true;
#Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
#당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큰 청상
if Condition1 == false then{
if stime <= 145500 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then
exitlong("1차매도2",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
#Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
#당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큰 청상
if Condition2 == false then{
if stime <= 145500 Then
exitlong("2차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then
exitlong("2차매도2",AtMarket);
}
#당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산
#3분봉에서 정규장마지막봉 전봉까지만 만족했을때 신호발생
if stime < 145700 Then
exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1));
#정규장 마지막봉에서 조건만족하면 다음봉(다음날)시가에 청산
if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then
exitlong("최종손절2",AtMarket);
}
Else{#매수포지션이 아니면 모두 false로 초기화
Condition1 = false;
Condition2 = false;
}
}
#매수진입 후 1차매수나 1차매수.진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then
entrycond1 = true;
#매수진입 후 2차매수가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2") Then
entrycond2 = true;
#무포지션이면 flase로 초기화
if MarketPosition == 0 Then{
entrycond1 = false;
entrycond2 = false;
}
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : 시스템식 검토 부탁드립니다.
> 그림1)은 1차매수, 2차매수가 이루어 지고 최종손절가인 초록색선이 4,180원 입니다.
오후3:00 이전에는 가격이 4,215원으로 손절이 발생하지 않았는데..
그림2)에서 보듯이 오후 3:00에 동시호가 가격이 4,170원이 되면서 손절신호가 나왔습니다.
이처럼 아래와 같은 조건일 경우 당일에는 손절신호가 발생하였으나 실제 매도를 할수 없으므로 다음날 시가에 매도할수 있게 시스템식을 변경 부탁드립니다.
1) 오후 2:50에 가격이 손절가에 진입시
2) 오후 3:00에 동시호가가 손절가 이하일때
시스템식은 다음과 같습니다.
---------------------------------------------------------------------------------
input : 전략식시작일자(20151019), 전략식시작시간(090000), 전략총매수금액(2000);
input : 매수위치1차(2), 매수위치2차(3);
input : 매도위치1차(1), 매도위치2차(1.2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(1);
input : 최종손절위치(4);
input : Period(120);
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0);
var : diff(0),TF(0),cnt(0),value(0);
var : entrycond1(false),entrycond2(false),entrycond3(false);
# Period기간전 최고가의 값이 있으면
if dayhigh(Period) > 0 Then{
var1 = dayhigh(0); # 당일최고가(Period기간동안 최고가를 계산하기 위한 초기값)
var2 = daylow(0); # 당일최저가(Period기간동안 최고가를 계산하기 위한 초기값)
var11 = dayhigh(1); # 전일최고가(전일기준 Period기간동안 최고가를 계산하기 위한 초기값)
var12 = daylow(1); # 전일최저가(전일기준 Period기간동안 최고가를 계산하기 위한 초기값)
# 0일부터 Period전일까지 최고가와 최저가를 불러와
# Period기간동안 최고가/최저가를 계산
# 전일기준은 0을 제외하고 Period기간이므로 +1
for cnt = 0 to Period-1{
if DayHigh(cnt) > var1 Then
var1 = DayHigh(cnt);
if dayhigh(cnt+1) > var11 Then
var11 = dayhigh(cnt+1);
if daylow(cnt) < var2 Then
var2 = daylow(cnt);
if daylow(cnt+1) < var21 Then
var21 = daylow(cnt+1);
}
# Period기간동알 최고가가 전일보다 상승하면
# CL에 당일 중간값 저장
if var11 < var1 Then
CL = (var1+var2)/2;
V0.5 = var1-((var1-CL)/5)*1;
V1 = var1-((var1-CL)/5)*2; ## 1매수타점
V2 = var1-((var1-CL)/5)*3; ## 2매수타점
V3 = var1-((var1-CL)/5)*4; ## 3매수타점
mid = (var1+var2)/2;
V4 = var1-((var1-CL)/5)*5;
V5 = var1-((var1-CL)/5)*6;
V6 = var1-((var1-CL)/5)*7;
V7 = var1-((var1-CL)/5)*8;
value = abs(var1-V0.5);
if sdate >= 전략식시작일자 and # 지정일 이후
TotalTrades < 전략식진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략식시작시간 and #지정시간 이후
EntryCond1 == false Then{ #EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
# (1차매수),(1차매수.)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수.)
if NextBarOpen > var1-value*(매수위치1차+1) Then
buy("1차매수",atlimit,var1-value*(매수위치1차+1),Floor((전략총매수금액*10000*(매수비중1차/100))/C));
Else
buy("1차매수.",AtMarket,def,Floor((전략총매수금액*10000*(매수비중1차/100))/C));
}
# 매수진입이후
if MarketPosition == 1 then{
#매수시점의 var1와 V0.5의 차이값을 diff에 저장
diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]);
if MaxEntries == 1 and #최대진입횟수가1이고(첫진입 한번만 발생한 상황)
L >= var1-value*(매수위치2차+1) and #저가가 2차매수가격 이상이고
EntryCond2 == false Then #EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨)
#다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
buy("2차매수",atlimit,var1-value*(매수위치2차+1),Floor((전략총매수금액*10000*(매수비중2차/100))/C));
#Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
#포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if LatestExitName(0) == "1차매도" Then
Condition1 = true;
#포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if LatestExitName(0) == "2차매도" Then
Condition2 = true;
#Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
#당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큰 청상
if Condition1 == false then
exitlong("1차매도",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
#Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
#당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큰 청상
if Condition2 == false then
exitlong("2차매도",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
#당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산
exitlong("최종손절",AtStop,var1-value*(최종손절위치+1));
}
Else{#매수포지션이 아니면 모두 false로 초기화
Condition1 = false;
Condition2 = false;
}
}
#매수진입 후 1차매수나 1차매수.진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수" or LatestEntryName(0) == "1차매수.") Then
entrycond1 = true;
#매수진입 후 2차매수가 발생하면 true
if MarketPosition == 1 and LatestEntryName(0) == "2차매수" Then
entrycond2 = true;
#무포지션이면 flase로 초기화
if MarketPosition == 0 Then{
entrycond1 = false;
entrycond2 = false;
}
--------------------------------------------------------------------------------------
다음글
이전글