예스스탁
예스스탁 답변
2016-03-21 11:22:09
안녕하세요
예스스탁입니다.
1.2
말씀하신 내용과 같이 수정하시면 됩니다.
2
현재 올려주신 식으로 적용해 보았지만
첨부된 그림과 같이 신호가 발생하고 있습니다.
1차매수1다음에 바로 2차매도2가 나오진 않습니다.
1차매도1과 1차매도2가 atlimit을 사용하므로
if문에서 부등호는 아래와 같이 완성봉 시가가 지정값보다 작은것으로
지정하시면 됩니다.
NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차
처음에 올리신 식은 부등호가 반대로 되어 있어서
발생하는 문제였습니다.
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : [46898]번글 관련 질문드립니다.
> 안녕하세요..
[46898]번글 관련하여 수정된 시스템식으로 작성하여 검증한 결과 그림과 같은 오류메세지가 나왔습니다.
1. 오류메세지가 나온 줄은 다음과 같습니다.
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
이식에서 def를 제외하고 다음과 같이 작성하면 되지요?
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,"",Floor(MaxContracts*(매도비중1차/100)),1);
2. "1차매도"의 등호도 "2차매도"의 등호처럼 바꾸어 주어야 하지요?
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then 을 다음과 같이
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then으로 바꿈
1번항목, 2번항목을 모두 수정하였는데... 그림2와 같이 1차매수1 신호가 나오고 바로 2차매도2 신호가 나오네요
그림3과 같이 신호가 제대로 나오게 검토 부탁드립니다.
저의 의도는 매수한 다음날 1차매도든, 2차매도든 매도조건을 만족하는 값 이상에서 시가가 갭상승하여 출발하였을때 바로 매도하기 위함입니다.
참조한 종목의 챠트는 한국가스공사 3월15일~3월18일 3분봉입니다.
보내주신 시스템식을 바탕으로 제가 위와 같이 수정한 시스템식은 다음과 같습니다.
------------------------------------------------------------------------------
## 일봉상 일목균형표의 26일 기준선을 참조하여 3분봉에서 매매함.
## 2분할매수, 2분할매도 시스템식
## 외부변수 설정 ##
input : 전략시작일자(20160315), 전략시작시간(090000), 전략매수금액(1000);
input : 매수위치1차(1), 매수위치2차(2);
input : 매도위치1차(1.5), 매도위치2차(2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략진입횟수(1);
input : 최종손절위치(3),최종익절위치(1);
input : Period(26);
## 내부변수 설정 ##
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(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; ## "초"타점-4타점
V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점
V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점
V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점
V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점
V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점
value = abs(var1-V0.5);
#######################################################
if sdate >= 전략시작일자 and # 지정일 이후
TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략시작시간 and # 지정시간 이후
EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건
# (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2)
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 {
# 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Condition1 = false;
# 매수시점의 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차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2)
if stime <= 145500 or stime == 150000 Then {
if NextBarOpen > var1-value*(매수위치2차+1) Then
buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C));
Else
buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then
buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
# Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
# 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then
Condition1 = true;
# 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then
Condition2 = true;
# Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산
if Condition1 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
Else
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then
exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if Condition1 == true and CurrentContracts < MaxContracts then {
if stime <= 145500 Then
exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치);
if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then
exitlong("최종익절2",AtMarket);
}
# Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산
if Condition2 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치2차 Then
exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
Else
exitlong("2차매도2",AtStop,NextBarOpen-PriceScale*1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then
exitlong("2차매도3",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이나 1차매수2, 1차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then
entrycond1 = true;
# 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then
entrycond2 = true;
# 무포지션이면 false로 초기화
if MarketPosition == 0 Then {
entrycond1 = false;
entrycond2 = false;
}
제.. 시스템식에서는 마찬가지로 나오네요..
적용한 시스템식좀 올려주실수 있나요?
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : [46898]번글 관련 질문드립니다.
> 안녕하세요
예스스탁입니다.
1.2
말씀하신 내용과 같이 수정하시면 됩니다.
2
현재 올려주신 식으로 적용해 보았지만
첨부된 그림과 같이 신호가 발생하고 있습니다.
1차매수1다음에 바로 2차매도2가 나오진 않습니다.
1차매도1과 1차매도2가 atlimit을 사용하므로
if문에서 부등호는 아래와 같이 완성봉 시가가 지정값보다 작은것으로
지정하시면 됩니다.
NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차
처음에 올리신 식은 부등호가 반대로 되어 있어서
발생하는 문제였습니다.
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : [46898]번글 관련 질문드립니다.
> 안녕하세요..
[46898]번글 관련하여 수정된 시스템식으로 작성하여 검증한 결과 그림과 같은 오류메세지가 나왔습니다.
1. 오류메세지가 나온 줄은 다음과 같습니다.
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
이식에서 def를 제외하고 다음과 같이 작성하면 되지요?
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,"",Floor(MaxContracts*(매도비중1차/100)),1);
2. "1차매도"의 등호도 "2차매도"의 등호처럼 바꾸어 주어야 하지요?
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then 을 다음과 같이
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then으로 바꿈
1번항목, 2번항목을 모두 수정하였는데... 그림2와 같이 1차매수1 신호가 나오고 바로 2차매도2 신호가 나오네요
그림3과 같이 신호가 제대로 나오게 검토 부탁드립니다.
저의 의도는 매수한 다음날 1차매도든, 2차매도든 매도조건을 만족하는 값 이상에서 시가가 갭상승하여 출발하였을때 바로 매도하기 위함입니다.
참조한 종목의 챠트는 한국가스공사 3월15일~3월18일 3분봉입니다.
보내주신 시스템식을 바탕으로 제가 위와 같이 수정한 시스템식은 다음과 같습니다.
------------------------------------------------------------------------------
## 일봉상 일목균형표의 26일 기준선을 참조하여 3분봉에서 매매함.
## 2분할매수, 2분할매도 시스템식
## 외부변수 설정 ##
input : 전략시작일자(20160315), 전략시작시간(090000), 전략매수금액(1000);
input : 매수위치1차(1), 매수위치2차(2);
input : 매도위치1차(1.5), 매도위치2차(2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략진입횟수(1);
input : 최종손절위치(3),최종익절위치(1);
input : Period(26);
## 내부변수 설정 ##
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(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; ## "초"타점-4타점
V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점
V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점
V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점
V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점
V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점
value = abs(var1-V0.5);
#######################################################
if sdate >= 전략시작일자 and # 지정일 이후
TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략시작시간 and # 지정시간 이후
EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건
# (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2)
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 {
# 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Condition1 = false;
# 매수시점의 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차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2)
if stime <= 145500 or stime == 150000 Then {
if NextBarOpen > var1-value*(매수위치2차+1) Then
buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C));
Else
buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then
buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
# Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
# 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then
Condition1 = true;
# 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then
Condition2 = true;
# Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산
if Condition1 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
Else
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then
exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if Condition1 == true and CurrentContracts < MaxContracts then {
if stime <= 145500 Then
exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치);
if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then
exitlong("최종익절2",AtMarket);
}
# Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산
if Condition2 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치2차 Then
exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
Else
exitlong("2차매도2",AtStop,NextBarOpen-PriceScale*1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then
exitlong("2차매도3",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이나 1차매수2, 1차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then
entrycond1 = true;
# 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then
entrycond2 = true;
# 무포지션이면 false로 초기화
if MarketPosition == 0 Then {
entrycond1 = false;
entrycond2 = false;
}
예스스탁
예스스탁 답변
2016-03-21 12:51:14
> 종풍화성 님이 쓴 글입니다.
> 제목 : Re : Re : 시스템식 올려주실수 있나요?
> 제.. 시스템식에서는 마찬가지로 나오네요..
적용한 시스템식좀 올려주실수 있나요?
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : [46898]번글 관련 질문드립니다.
> 안녕하세요
예스스탁입니다.
1.2
말씀하신 내용과 같이 수정하시면 됩니다.
2
현재 올려주신 식으로 적용해 보았지만
첨부된 그림과 같이 신호가 발생하고 있습니다.
1차매수1다음에 바로 2차매도2가 나오진 않습니다.
1차매도1과 1차매도2가 atlimit을 사용하므로
if문에서 부등호는 아래와 같이 완성봉 시가가 지정값보다 작은것으로
지정하시면 됩니다.
NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차
처음에 올리신 식은 부등호가 반대로 되어 있어서
발생하는 문제였습니다.
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : [46898]번글 관련 질문드립니다.
> 안녕하세요..
[46898]번글 관련하여 수정된 시스템식으로 작성하여 검증한 결과 그림과 같은 오류메세지가 나왔습니다.
1. 오류메세지가 나온 줄은 다음과 같습니다.
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
이식에서 def를 제외하고 다음과 같이 작성하면 되지요?
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,"",Floor(MaxContracts*(매도비중1차/100)),1);
2. "1차매도"의 등호도 "2차매도"의 등호처럼 바꾸어 주어야 하지요?
if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then 을 다음과 같이
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then으로 바꿈
1번항목, 2번항목을 모두 수정하였는데... 그림2와 같이 1차매수1 신호가 나오고 바로 2차매도2 신호가 나오네요
그림3과 같이 신호가 제대로 나오게 검토 부탁드립니다.
저의 의도는 매수한 다음날 1차매도든, 2차매도든 매도조건을 만족하는 값 이상에서 시가가 갭상승하여 출발하였을때 바로 매도하기 위함입니다.
참조한 종목의 챠트는 한국가스공사 3월15일~3월18일 3분봉입니다.
보내주신 시스템식을 바탕으로 제가 위와 같이 수정한 시스템식은 다음과 같습니다.
------------------------------------------------------------------------------
## 일봉상 일목균형표의 26일 기준선을 참조하여 3분봉에서 매매함.
## 2분할매수, 2분할매도 시스템식
## 외부변수 설정 ##
input : 전략시작일자(20160315), 전략시작시간(090000), 전략매수금액(1000);
input : 매수위치1차(1), 매수위치2차(2);
input : 매도위치1차(1.5), 매도위치2차(2);
input : 매수비중1차(50), 매수비중2차(50);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략진입횟수(1);
input : 최종손절위치(3),최종익절위치(1);
input : Period(26);
## 내부변수 설정 ##
var : CL(0),V0.5(0),V1(0),V2(0),V3(0);
var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(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; ## "초"타점-4타점
V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점
V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점
V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점
V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점
V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점
value = abs(var1-V0.5);
#######################################################
if sdate >= 전략시작일자 and # 지정일 이후
TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전
MarketPosition == 0 and # 현재 무포지션
stime >= 전략시작시간 and # 지정시간 이후
EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨)
DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건
# (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지
# 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지
# 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다.
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2)
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 {
# 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Condition1 = false;
# 매수시점의 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차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수)
# 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1)
# 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2)
if stime <= 145500 or stime == 150000 Then {
if NextBarOpen > var1-value*(매수위치2차+1) Then
buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C));
Else
buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then
buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C));
}
# Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수
# 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then
Condition1 = true;
# 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true
if CurrentContracts < CurrentContracts[1] and
(LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then
Condition2 = true;
# Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산
if Condition1 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then
exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1);
Else
exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then
exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1);
}
if Condition1 == true and CurrentContracts < MaxContracts then {
if stime <= 145500 Then
exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치);
if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then
exitlong("최종익절2",AtMarket);
}
# Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태)
# 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산
if Condition2 == false then {
if stime <= 145500 Then {
if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치2차 Then
exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차);
Else
exitlong("2차매도2",AtStop,NextBarOpen-PriceScale*1);
}
if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then
exitlong("2차매도3",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이나 1차매수2, 1차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then
entrycond1 = true;
# 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then
entrycond2 = true;
# 무포지션이면 false로 초기화
if MarketPosition == 0 Then {
entrycond1 = false;
entrycond2 = false;
}