커뮤니티
44971번글 관련 수정식 검토 부탁드립니다.
2015-11-11 21:31:41
153
글번호 92317
안녕하세요.
보내주신 시스템식에서 4가지 조건을 모두 만족할때 "매수이평기간(15)" 즉, 15일 이평선에서 매수하는 시스템식은 제가 구현하려는 식과 맞지가 않아, 15일 이평선에서 매수하는 내용만 빼고, 기존 시스템식에서 참조데이타(코스피 or 코스닥 지수)를 참조하여 지수가 전일대비 -3% 이상 하락시 보수적으로(매수비중관리) 매수하는 시스템식만 추가하여 사용하려고 아래와 같이 제가 수정해 보았는데, 매수신호가 너무 많이 잡히네요. 잘 되지를 않습니다.
검토 부탁드립니다.
제가 수정한 식은 아래와 같습니다.
--------------------------------------------------------------------------------------
input : 전략식시작일자(20150105), 전략식시작시간(090000), 전략총매수금액1(3000), 전략총매수금액2(2500);
input : data2N(1),Data2전일대비등락률(-3);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(0),일봉이평기간(120),이평보정계수(0);
input : P(5), 매수위치1차(5), 매수위치2차(5), 매수위치3차(10);
input : 매수위치보정(1);
input : 매도위치1차(5), 매도위치2차(10);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100), 타점보유일수(5);
var : sum(0,data1),mav(0,data1),cnt(0,data1),eup(0,data1),edn(0,data1);
var : Didx(0,data1),LatestEntryDidx(0,data1),Ecnt(0,data1);
var : TimeCond(false,data1),Xcond1(false,data1),Xcond2(false,data1),Loss(0,data1),LatestEntrylow(0,data1);
var : Period(0,data1),매수1차(0,data1);
var : cum1(0,data1),cum2(0,data1),ma1(0,data1),ma2(0,data1),ma3(0,data1);
var : D2rate(0,data2),전략총매수금액(0,data1);
#data2의 data2N일전 대비 등락율
D2rate = data2((C*CloseD(data2N))/CloseD(data2N)*100);
#전략총매수금액은 전략총매수금액1이 기본
#data2 등락률이 Data2전일대비등락률이하이면
#전략총매수금액은 전략총매수금액2
전략총매수금액 = 전략총매수금액1;
if D2rate <= Data2전일대비등락률 Then
전략총매수금액 = 전략총매수금액2;
# 일자수 계산
if date != date[1] Then
Didx = Didx+1;
# 일봉 120이평 계산(전일기준,전전일기준)
cum1 = 0;
cum2 = 0;
for cnt = 1 to 일봉이평기간{
cum1 = cum1+DayClose(cnt);
cum2 = cum2+DayClose(cnt+1);
}
# 전일기준 일봉 120일이평
ma1 = cum1/일봉이평기간;
# 전전일기준 일봉 120일이평
ma2 = cum2/일봉이평기간;
#기본값은 기간은 P, %는 매수위치1차
Period = P;
매수1차 = 매수위치1차;
#갭하락이면
#기간은 기존Period값+시장보정계수
#%는 기존 매수1차값에 + 시장보정계수
if dayopen < DayClose(1)*(1-갭하락/100) Then{
Period = Period + 시장보정계수;
매수1차 = 매수1차 + 시장보정계수;
}
#이평하락이면
#기간은 기존Period값+이평보정계수
#%는 기존 매수1차값에 + 이평보정계수
if ma1 < ma2 and DayClose(일봉이평기간+1) > 0 Then{
Period = Period + 이평보정계수;
매수1차 = 매수1차 + 이평보정계수;
}
#당일포함 일봉 Period개의 종가를 누적
sum = 0;
for cnt = 0 to Period-1{
sum = sum+DayClose(cnt);
}
#누적값을 Period로 나누어 평균값 산출
mav = sum/Period;
#상단계산
Eup = mav+mav*(매수1차/100);
#하단계산
Edn = mav-mav*(매수1차/100);
#지정일 지정시간이 되면 TimeCond는 True(그전에는 false)
if sdate == 전략식시작일자 and (stime == 전략식시작시간 or (stime > 전략식시작시간 and stime[1] < 전략식시작시간 )) then
TimeCond = true;
if sdate > 전략식종료일자 Then
TimeCond = false;
#TimeCond가 True가 된 후
if TimeCond == true then{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then
Ecnt = Ecnt+1;
#무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략식진입횟수 and stime < 144200 Then
buy("1차매수",atlimit,ma3*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Xcond1 = false;
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntrylow = L;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 and stime < 144200 Then
buy("2차매수",atlimit,ma3[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 and stime < 144200 Then
buy("3차매수",atlimit,ma3[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도") then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도") then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false and stime < 144200 Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false and stime < 144200 Then
exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100));
#최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{
#최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산
if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{
Loss = daylow(1);
for cnt = 1 to (타점보유일수-1) {
if daylow(cnt) < Loss Then
Loss = daylow(cnt);
}
}
#Loss값 이하로 가격하락하면 전량 청산
exitlong("손절",AtStop,Loss);
}
#최종 매수일 포함 5일경과되면 다음날 시가에 매도
if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{
exitlong("익절2",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{
# exitlong("익절1",AtStop,LatestEntrylow);
# }
}
else{ #매수포지션이 아니면 false로 초기화
Xcond1 = false;
Xcond2 = false;
}
}
- 1. 참조데이터_적용_오류.PNG (0.06 MB)
답변 1
예스스탁 예스스탁 답변
2015-11-12 14:48:42
안녕하세요
예스스탁입니다.
작성하신 식에 주문함수에 ma3를 사용하는데
해당 변수가 선언만되고 계산값이 없었습니다.
15일 이평선 계산식을 추가했습니다.
input : 전략식시작일자(20150105), 전략식시작시간(090000), 전략총매수금액1(3000), 전략총매수금액2(2500);
input : data2N(1),Data2전일대비등락률(-3);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(0),일봉이평기간(120),이평보정계수(0);
input : P(5), 매수위치1차(5), 매수위치2차(5), 매수위치3차(10);
input : 매수위치보정(1),매수이평기간(15);
input : 매도위치1차(5), 매도위치2차(10);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100), 타점보유일수(5);
var : sum(0,data1),mav(0,data1),cnt(0,data1),eup(0,data1),edn(0,data1);
var : Didx(0,data1),LatestEntryDidx(0,data1),Ecnt(0,data1);
var : TimeCond(false,data1),Xcond1(false,data1),Xcond2(false,data1),Loss(0,data1),LatestEntrylow(0,data1);
var : Period(0,data1),매수1차(0,data1);
var : cum1(0,data1),cum2(0,data1),ma1(0,data1),ma2(0,data1),ma3(0,data1);
var : D2rate(0,data2),전략총매수금액(0,data1),cum3(0,data1);
#data2의 data2N일전 대비 등락율
D2rate = data2((C*CloseD(data2N))/CloseD(data2N)*100);
#전략총매수금액은 전략총매수금액1이 기본
#data2 등락률이 Data2전일대비등락률이하이면
#전략총매수금액은 전략총매수금액2
전략총매수금액 = 전략총매수금액1;
if D2rate <= Data2전일대비등락률 Then
전략총매수금액 = 전략총매수금액2;
# 일자수 계산
if date != date[1] Then{
Didx = Didx+1;
# 일봉 120이평 계산(전일기준,전전일기준)
cum1 = 0;
cum2 = 0;
for cnt = 1 to 일봉이평기간{
cum1 = cum1+DayClose(cnt);
cum2 = cum2+DayClose(cnt+1);
}
# 전일기준 일봉 120일이평
ma1 = cum1/일봉이평기간;
# 전전일기준 일봉 120일이평
ma2 = cum2/일봉이평기간;
#기본값은 기간은 P, %는 매수위치1차
Period = P;
매수1차 = 매수위치1차;
#갭하락이면
#기간은 기존Period값+시장보정계수
#%는 기존 매수1차값에 + 시장보정계수
if dayopen < DayClose(1)*(1-갭하락/100) Then{
Period = Period + 시장보정계수;
매수1차 = 매수1차 + 시장보정계수;
}
#이평하락이면
#기간은 기존Period값+이평보정계수
#%는 기존 매수1차값에 + 이평보정계수
if ma1 < ma2 and DayClose(일봉이평기간+1) > 0 Then{
Period = Period + 이평보정계수;
매수1차 = 매수1차 + 이평보정계수;
}
#당일포함 일봉 Period개의 종가를 누적
sum = 0;
for cnt = 0 to Period-1{
sum = sum+DayClose(cnt);
}
#누적값을 Period로 나누어 평균값 산출
mav = sum/Period;
#상단계산
Eup = mav+mav*(매수1차/100);
#하단계산
Edn = mav-mav*(매수1차/100);
#지정일 지정시간이 되면 TimeCond는 True(그전에는 false)
if sdate == 전략식시작일자 and (stime == 전략식시작시간 or (stime > 전략식시작시간 and stime[1] < 전략식시작시간 )) then
TimeCond = true;
if sdate > 전략식종료일자 Then
TimeCond = false;
}
# 일봉 15이평 계산
cum3 = 0;
for cnt = 0 to 매수이평기간-1{
cum3 = cum3+DayClose(cnt);
}
ma3 = cum3/매수이평기간;
#TimeCond가 True가 된 후
if TimeCond == true then{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then
Ecnt = Ecnt+1;
#무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략식진입횟수 and stime < 144200 Then
buy("1차매수",atlimit,ma3*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Xcond1 = false;
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntrylow = L;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 and stime < 144200 Then
buy("2차매수",atlimit,ma3[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 and stime < 144200 Then
buy("3차매수",atlimit,ma3[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도") then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도") then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false and stime < 144200 Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false and stime < 144200 Then
exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100));
#최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{
#최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산
if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{
Loss = daylow(1);
for cnt = 1 to (타점보유일수-1) {
if daylow(cnt) < Loss Then
Loss = daylow(cnt);
}
}
#Loss값 이하로 가격하락하면 전량 청산
exitlong("손절",AtStop,Loss);
}
#최종 매수일 포함 5일경과되면 다음날 시가에 매도
if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{
exitlong("익절2",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{
# exitlong("익절1",AtStop,LatestEntrylow);
# }
}
else{ #매수포지션이 아니면 false로 초기화
Xcond1 = false;
Xcond2 = false;
}
}
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : 44971번글 관련 수정식 검토 부탁드립니다.
> 안녕하세요.
보내주신 시스템식에서 4가지 조건을 모두 만족할때 "매수이평기간(15)" 즉, 15일 이평선에서 매수하는 시스템식은 제가 구현하려는 식과 맞지가 않아, 15일 이평선에서 매수하는 내용만 빼고, 기존 시스템식에서 참조데이타(코스피 or 코스닥 지수)를 참조하여 지수가 전일대비 -3% 이상 하락시 보수적으로(매수비중관리) 매수하는 시스템식만 추가하여 사용하려고 아래와 같이 제가 수정해 보았는데, 매수신호가 너무 많이 잡히네요. 잘 되지를 않습니다.
검토 부탁드립니다.
제가 수정한 식은 아래와 같습니다.
--------------------------------------------------------------------------------------
input : 전략식시작일자(20150105), 전략식시작시간(090000), 전략총매수금액1(3000), 전략총매수금액2(2500);
input : data2N(1),Data2전일대비등락률(-3);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(0),일봉이평기간(120),이평보정계수(0);
input : P(5), 매수위치1차(5), 매수위치2차(5), 매수위치3차(10);
input : 매수위치보정(1);
input : 매도위치1차(5), 매도위치2차(10);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100), 타점보유일수(5);
var : sum(0,data1),mav(0,data1),cnt(0,data1),eup(0,data1),edn(0,data1);
var : Didx(0,data1),LatestEntryDidx(0,data1),Ecnt(0,data1);
var : TimeCond(false,data1),Xcond1(false,data1),Xcond2(false,data1),Loss(0,data1),LatestEntrylow(0,data1);
var : Period(0,data1),매수1차(0,data1);
var : cum1(0,data1),cum2(0,data1),ma1(0,data1),ma2(0,data1),ma3(0,data1);
var : D2rate(0,data2),전략총매수금액(0,data1);
#data2의 data2N일전 대비 등락율
D2rate = data2((C*CloseD(data2N))/CloseD(data2N)*100);
#전략총매수금액은 전략총매수금액1이 기본
#data2 등락률이 Data2전일대비등락률이하이면
#전략총매수금액은 전략총매수금액2
전략총매수금액 = 전략총매수금액1;
if D2rate <= Data2전일대비등락률 Then
전략총매수금액 = 전략총매수금액2;
# 일자수 계산
if date != date[1] Then
Didx = Didx+1;
# 일봉 120이평 계산(전일기준,전전일기준)
cum1 = 0;
cum2 = 0;
for cnt = 1 to 일봉이평기간{
cum1 = cum1+DayClose(cnt);
cum2 = cum2+DayClose(cnt+1);
}
# 전일기준 일봉 120일이평
ma1 = cum1/일봉이평기간;
# 전전일기준 일봉 120일이평
ma2 = cum2/일봉이평기간;
#기본값은 기간은 P, %는 매수위치1차
Period = P;
매수1차 = 매수위치1차;
#갭하락이면
#기간은 기존Period값+시장보정계수
#%는 기존 매수1차값에 + 시장보정계수
if dayopen < DayClose(1)*(1-갭하락/100) Then{
Period = Period + 시장보정계수;
매수1차 = 매수1차 + 시장보정계수;
}
#이평하락이면
#기간은 기존Period값+이평보정계수
#%는 기존 매수1차값에 + 이평보정계수
if ma1 < ma2 and DayClose(일봉이평기간+1) > 0 Then{
Period = Period + 이평보정계수;
매수1차 = 매수1차 + 이평보정계수;
}
#당일포함 일봉 Period개의 종가를 누적
sum = 0;
for cnt = 0 to Period-1{
sum = sum+DayClose(cnt);
}
#누적값을 Period로 나누어 평균값 산출
mav = sum/Period;
#상단계산
Eup = mav+mav*(매수1차/100);
#하단계산
Edn = mav-mav*(매수1차/100);
#지정일 지정시간이 되면 TimeCond는 True(그전에는 false)
if sdate == 전략식시작일자 and (stime == 전략식시작시간 or (stime > 전략식시작시간 and stime[1] < 전략식시작시간 )) then
TimeCond = true;
if sdate > 전략식종료일자 Then
TimeCond = false;
#TimeCond가 True가 된 후
if TimeCond == true then{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then
Ecnt = Ecnt+1;
#무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략식진입횟수 and stime < 144200 Then
buy("1차매수",atlimit,ma3*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화
if CurrentContracts > CurrentContracts[1] Then
Xcond1 = false;
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntrylow = L;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 and stime < 144200 Then
buy("2차매수",atlimit,ma3[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 and stime < 144200 Then
buy("3차매수",atlimit,ma3[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도") then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도") then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false and stime < 144200 Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false and stime < 144200 Then
exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100));
#최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{
#최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산
if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{
Loss = daylow(1);
for cnt = 1 to (타점보유일수-1) {
if daylow(cnt) < Loss Then
Loss = daylow(cnt);
}
}
#Loss값 이하로 가격하락하면 전량 청산
exitlong("손절",AtStop,Loss);
}
#최종 매수일 포함 5일경과되면 다음날 시가에 매도
if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{
exitlong("익절2",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{
# exitlong("익절1",AtStop,LatestEntrylow);
# }
}
else{ #매수포지션이 아니면 false로 초기화
Xcond1 = false;
Xcond2 = false;
}
}