커뮤니티
시스템식 검토 부탁드립니다.
2015-11-11 15:27:03
191
글번호 92301
안녕하세요.. 수고 많으세요.
일봉참조하여 3분봉에서 거래하는 시스템식인데요,
예전에 44830번글에서 한번 부탁드려서 받은 시스템식인데 여러번 검토하고 분석한 결과 제가 만족을 못하여 다시 또 부탁드립니다.
아래 시스템식에서 "매수이평기간(15)" 즉, 15일 이평선 매수시 다음 4가지 조건을 모두 만족하면 매수하는 식입니다.
if DayClose(cnt1) > Hv and DayClose(cnt1) > maC and maA > maB and C > upv Then
cond4 = true;
아래의 식은 일단 4개의 조건을 과거에 한번이라도 만족하면 계속해서 15일 이평선에 오기만 하면 매수를 하는데요,
제가 원하는 매매식은 그림1)과 같이 4개조건을 동시에 만족할때만 다시 매매를 하도록 하고 싶습니다.
---------------------------------------------------------------------------------------
input : 전략식시작일자(20150105), 전략식시작시간(090000), 전략총매수금액(3000);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(0),일봉이평기간(120),이평보정계수(0);
input : P(5), 매수위치1차(5), 매수위치2차(5), 매수위치3차(10);
input : nday(10),매수이평기간(15),매수위치보정(1);
input : 매도위치1차(5), 매도위치2차(10);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100);
input : 타점보유일수(5);
var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0);
var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0);
var : Period(0),매수1차(0);
var : cum1(0),cum2(0),ma1(0),ma2(0);
var : cnt1(0),cnt2(0),cnt3(0),cnt4(0),Hv(0),cond4(false),Hv1(0);
var : Asum(0),Bsum(0),Csum(0),Dsum(0),maA(0),maB(0),maC(0),maD(0),upv(0);
var : cum3(0),ma3(0);
# 일자수 계산
if date != date[1] Then{
Didx = Didx+1;
cond4 = false;
#1일전~nday일전 까지
for cnt1 = 1 to nday{
Asum = 0;
Bsum = 0;
#cnt1일전 기준 15일봉이평과 그전일 이평값 계산
for cnt2 = 0 to 매수이평기간-1{
Asum = Asum+DayClose(cnt1+cnt2);
Bsum = Bsum+DayClose(cnt1+cnt2+1);
}
maA = Asum/매수이평기간;
maB = Bsum/매수이평기간;
#cnt1일전 기준 120일 이평
#cnt1일전 기준 120일 최고가와 그전일 120일 최고가
Csum = 0;
Hv = dayhigh(cnt1);
Hv1 = dayhigh(cnt1+1);
for cnt3 = 0 to 일봉이평기간-1{
Csum = Csum+DayClose(cnt1+cnt3);
if dayhigh(cnt1+cnt3) > Hv Then
HV = dayhigh(cnt1+cnt3);
if dayhigh(cnt1+cnt3+1) > Hv1 Then
HV1 = dayhigh(cnt1+cnt3+1);
}
#cnt1일전 기준 10-10 엔벨로프 상단
Dsum = 0;
for cnt4 = 0 to P-1{
Dsum = Dsum+DayClose(cnt1+cnt4);
}
maD = Dsum/P;
upv = maD+maD*(매수위치1차/100);
if DayClose(cnt1) > Hv and DayClose(cnt1) > maC and maA > maB and C > upv Then
cond4 = true;
}
}
# 일봉 15이평 계산
cum3 = 0;
for cnt = 0 to 매수이평기간-1{
cum3 = cum3+DayClose(cnt);
}
ma3 = cum3/매수이평기간;
# 일봉 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);
}
#최종 매수일 포함 3일경과되면 다음날 시가에 매도
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. 4개조건만족_예시.PNG (0.05 MB)
답변 1
예스스탁 예스스탁 답변
2015-11-11 17:54:30
안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
전화로 답변드린 부분과 같이
차트에 참조데이터로 데이터를 추가하고 적용하셔야 합니다.
input : 전략식시작일자(20150105), 전략식시작시간(090000), 전략총매수금액1(3000), 전략총매수금액2(2500);
input : data2N(1),Data2전일대비등락률(-10);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(0),일봉이평기간(120),이평보정계수(0);
input : P(5), 매수위치1차(5), 매수위치2차(5), 매수위치3차(10);
input : nday(10),매수이평기간(15),매수위치보정(1);
input : 매도위치1차(5), 매도위치2차(10);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100);
input : 타점보유일수(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);
var : cnt1(0,data1),cnt2(0,data1),cnt3(0,data1),cnt4(0,data1),Hv(0,data1),cond4(false,data1),Hv1(0,data1);
var : Asum(0,data1),Bsum(0,data1),Csum(0,data1),Dsum(0,data1),maA(0,data1),maB(0,data1),maC(0,data1),maD(0,data1),upv(0,data1);
var : cum3(0,data1),ma3(0,data1),D2rate(0,data2),전략총매수금액(0,data1);
Array : ndate[50](0,data1);
#data2의 data2N일전 대비 등락율
D2rate = data2((C*CloseD(data2N))/CloseD(data2N)*100);
#전략총매수금액은 전략총매수금액1이 기본
#data2 등락률이 Data2전일대비등락률이하이면
#전략총매수금액은 전략총매수금액2
전략총매수금액 = 전략총매수금액1;
if D2rate <= Data2전일대비등락률 Then
전략총매수금액 = 전략총매수금액2;
# 일자수 계산
if data1(date != date[1]) Then{
ndate[0] = sdate;
for cnt = 1 to 49{
ndate[cnt] = ndate[cnt-1][1];
}
Didx = Didx+1;
cond4 = false;
#1일전~nday일전 까지
for cnt1 = 1 to nday{
if cond4 == false then{
Asum = 0;
Bsum = 0;
#cnt1일전 기준 15일봉이평과 그전일 이평값 계산
for cnt2 = 0 to 매수이평기간-1{
Asum = Asum+DayClose(cnt1+cnt2);
Bsum = Bsum+DayClose(cnt1+cnt2+1);
}
maA = Asum/매수이평기간;
maB = Bsum/매수이평기간;
#cnt1일전 기준 120일 이평
#cnt1일전 기준 120일 최고가와 그전일 120일 최고가
Csum = 0;
Hv = dayhigh(cnt1);
Hv1 = dayhigh(cnt1+1);
for cnt3 = 0 to 일봉이평기간-1{
Csum = Csum+DayClose(cnt1+cnt3);
if dayhigh(cnt1+cnt3) > Hv Then
HV = dayhigh(cnt1+cnt3);
if dayhigh(cnt1+cnt3+1) > Hv1 Then
HV1 = dayhigh(cnt1+cnt3+1);
}
#cnt1일전 기준 10-10 엔벨로프 상단
Dsum = 0;
for cnt4 = 0 to P-1{
Dsum = Dsum+DayClose(cnt1+cnt4);
}
maD = Dsum/P;
upv = maD+maD*(매수위치1차/100);
#첫 진입이면 nday안에 조건만족하면 true
#두번째 진입부터 nday안에 조건만족하면 조건만족봉이 청산일 이후이면 true
if (ExitDate(1) == 0 or (ExitDate(1) > 0 and ndate[cnt1] > ExitDate(1)))
and DayClose(cnt1) > Hv and DayClose(cnt1) > maC and maA > maB and C > upv Then
cond4 = true;
}
}
}
# 일봉 15이평 계산
cum3 = 0;
for cnt = 0 to 매수이평기간-1{
cum3 = cum3+DayClose(cnt);
}
ma3 = cum3/매수이평기간;
# 일봉 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);
}
#최종 매수일 포함 3일경과되면 다음날 시가에 매도
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;
}
}
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : 시스템식 검토 부탁드립니다.
> 안녕하세요.. 수고 많으세요.
일봉참조하여 3분봉에서 거래하는 시스템식인데요,
예전에 44830번글에서 한번 부탁드려서 받은 시스템식인데 여러번 검토하고 분석한 결과 제가 만족을 못하여 다시 또 부탁드립니다.
아래 시스템식에서 "매수이평기간(15)" 즉, 15일 이평선 매수시 다음 4가지 조건을 모두 만족하면 매수하는 식입니다.
if DayClose(cnt1) > Hv and DayClose(cnt1) > maC and maA > maB and C > upv Then
cond4 = true;
아래의 식은 일단 4개의 조건을 과거에 한번이라도 만족하면 계속해서 15일 이평선에 오기만 하면 매수를 하는데요,
제가 원하는 매매식은 그림1)과 같이 4개조건을 동시에 만족할때만 다시 매매를 하도록 하고 싶습니다.
---------------------------------------------------------------------------------------
input : 전략식시작일자(20150105), 전략식시작시간(090000), 전략총매수금액(3000);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(0),일봉이평기간(120),이평보정계수(0);
input : P(5), 매수위치1차(5), 매수위치2차(5), 매수위치3차(10);
input : nday(10),매수이평기간(15),매수위치보정(1);
input : 매도위치1차(5), 매도위치2차(10);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100);
input : 타점보유일수(5);
var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0);
var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0);
var : Period(0),매수1차(0);
var : cum1(0),cum2(0),ma1(0),ma2(0);
var : cnt1(0),cnt2(0),cnt3(0),cnt4(0),Hv(0),cond4(false),Hv1(0);
var : Asum(0),Bsum(0),Csum(0),Dsum(0),maA(0),maB(0),maC(0),maD(0),upv(0);
var : cum3(0),ma3(0);
# 일자수 계산
if date != date[1] Then{
Didx = Didx+1;
cond4 = false;
#1일전~nday일전 까지
for cnt1 = 1 to nday{
Asum = 0;
Bsum = 0;
#cnt1일전 기준 15일봉이평과 그전일 이평값 계산
for cnt2 = 0 to 매수이평기간-1{
Asum = Asum+DayClose(cnt1+cnt2);
Bsum = Bsum+DayClose(cnt1+cnt2+1);
}
maA = Asum/매수이평기간;
maB = Bsum/매수이평기간;
#cnt1일전 기준 120일 이평
#cnt1일전 기준 120일 최고가와 그전일 120일 최고가
Csum = 0;
Hv = dayhigh(cnt1);
Hv1 = dayhigh(cnt1+1);
for cnt3 = 0 to 일봉이평기간-1{
Csum = Csum+DayClose(cnt1+cnt3);
if dayhigh(cnt1+cnt3) > Hv Then
HV = dayhigh(cnt1+cnt3);
if dayhigh(cnt1+cnt3+1) > Hv1 Then
HV1 = dayhigh(cnt1+cnt3+1);
}
#cnt1일전 기준 10-10 엔벨로프 상단
Dsum = 0;
for cnt4 = 0 to P-1{
Dsum = Dsum+DayClose(cnt1+cnt4);
}
maD = Dsum/P;
upv = maD+maD*(매수위치1차/100);
if DayClose(cnt1) > Hv and DayClose(cnt1) > maC and maA > maB and C > upv Then
cond4 = true;
}
}
# 일봉 15이평 계산
cum3 = 0;
for cnt = 0 to 매수이평기간-1{
cum3 = cum3+DayClose(cnt);
}
ma3 = cum3/매수이평기간;
# 일봉 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);
}
#최종 매수일 포함 3일경과되면 다음날 시가에 매도
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;
}
}