커뮤니티
시스템식 검토 부탁드립니다.
2015-11-20 13:52:15
241
글번호 92610
안녕하세요.. 연일 흐린 날씨에 건강하신지요?
아래와 같은 시스템식에서
if MarketPosition == 0 and Ecnt < 전략진입횟수 and Eup2<DayClose(0) and ma2>ma1 and ma11>ma12 and ma21>ma22 and 140000<stime and stime<145000 Then
buy("15선-1차매수",atlimit,Eup2,2);
1) Eup2<DayClose(0) : 현재가가 Eup2 즉, 10:10 엔벨로프 상단선에 있을때,
2) ma2>ma1 : 15일이평이 120이평선 위에 있을때
3) ma11>ma12 : 120일이평이 우상향할때
4) ma21>ma22 : 15일이평이 우상향할때
5) 오후 2시 이후에
1. 위 5가지 조건을 만족하면 그냥 1차매수가 되도록 수정 부탁드리고
어떤 부분을 수정했는지도 부탁드려요. (공부를 위해서)
2. 15선-1차매수후 수익이 나서 1차매도가 이루어진 다음 2차매도까지 이루어지지 않고 주가가 하락하는 경우 15선-2차매수가 이루어 지도록 검토 부탁드립니다.
3. 15선-1차매수만 매수후 타점보유일수+5일로 해서 "익절1" 처리 할 수 있나요?
4. 아래 전체시스템식이 맞는지도 검토 부탁드립니다.
-------------------------------------------------------------------------------------
## 기본식+15일선매매로 하향추세 판단을 15일선과 120일선의 위치를 비교하여 판단함. 시간제한 있음.
## 외부변수 설정 ##
input : 전략시작일자(20150617), 전략시작시간(090000), 전략매수금액(1500);
input : 전략종료일자(20161230);
input : 악재시갭하락(5), 악재보정계수(5), 이평보정계수(1);
input : 매수위치보정(1), 매수기준엔벨(10), 중심매수엔벨(10);
input : 매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매도위치1차(7), 매도위치2차(14);
input : 전략진입횟수(100);
input : 타점보유일수(5);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
## 내부변수 설정 ##
var : sum1(0),mav1(0),cnt(0),Eup1(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),ma11(0),ma12(0),ma21(0),ma22(0),sum2(0),mav2(0);
var : cum1(0),cum11(0),cum12(0),cum2(0),cum21(0),cum22(0),ma1(0),ma2(0),Eup2(0);
# 일자수 계산
if date != date[1] Then
Didx = Didx+1;
# 일봉 120이평 계산 (120이평=ma1)
cum1 = 0;
for cnt = 1 to 119 {
cum1 = cum1+DayClose(cnt);
}
ma1 = cum1/120; # 당일 120이평 계산
# 전일, 전전일 120이평 계산
cum11 = 0;
cum12 = 0 ;
for cnt = 1 to 120 {
cum11 = cum11+DayClose(cnt);
cum12 = cum12+DayClose(cnt+1);
}
ma11 = cum11/120; # 전일 120이평 계산
ma12 = cum12/120; # 전전일 120이평 계산
# 일봉 15이평 계산 (15이평=ma2)
cum2 = 0;
for cnt = 0 to 14 {
cum2 = cum2+DayClose(cnt);
}
ma2 = cum2/15; # 당일 15일이평 계산
# 전일, 전전일 15이평 계산
cum21 = 0;
cum22 = 0;
for cnt = 1 to 15 {
cum21 = cum21+DayClose(cnt);
cum22 = cum22+DayClose(cnt+1);
}
ma21 = cum21/15; # 전일 15일이평 계산
ma22 = cum22/15; # 전전일 15일이평 계산
# 기본값은 기간은 P, %는 매수위치1차
Period = 매수기준엔벨;
매수1차 = 매수위치1차;
# 악재가 발생하여 갭하락하면
# 기간은 기존 Period값 + 악재보정계수
# %는 기존 매수1차값에 + 악재보정계수
if dayopen < DayClose(1)*(1-악재시갭하락/100) Then {
Period = Period + 악재보정계수;
매수1차 = 매수1차 + 악재보정계수;
}
# 15일 이평이 120이평 아래에 있으면 (또한 지정한 기간의 일봉데이타가 있으면)
# 기간은 기존 Period값+이평보정계수
# %는 기존 매수1차값에 + 이평보정계수
if ma2 < ma1 and DayClose(120+1) > 0 Then {
Period = Period + 이평보정계수;
매수1차 = 매수1차 + 이평보정계수;
}
# 당일포함 일봉 Period개의 종가를 누적 (엔벨하단선 매수를 위한 종가누적)
sum1 = 0;
for cnt = 0 to Period-1 {
sum1 = sum1+DayClose(cnt);
}
# 당일포함 일봉 중심기준엔벨개의 종가를 누적 (중심선 1차매수를 위한 종가누적)
sum2 = 0;
for cnt = 0 to 중심매수엔벨-1 {
sum2 = sum2+DayClose(cnt);
}
# 누적값을 Period로 나누어 평균값 산출
mav1 = sum1/Period;
mav2 = sum2/중심매수엔벨; # 중심선 1차매수를 위한 엔벨 %
# 엔벨로프 상단 계산
Eup1 = mav1+mav1*(매수1차/100);
Eup2 = mav2+mav2*(중심매수엔벨/100);
# 엔벨로프 하단 계산
Edn = mav1-mav1*(매수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차매수" or LatestEntryName(0) == "15선-1차매수") Then
Ecnt = Ecnt+1;
# 무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략진입횟수 and stime < 144200 Then
buy("엔벨-1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중1차/100)));
if MarketPosition == 0 and Ecnt < 전략진입횟수 and Eup2<DayClose(0) and ma2>ma1 and ma11>ma12 and ma21>ma22 and 140000<stime and stime<145000 Then # 오후 2시 이후에 매수
buy("15선-1차매수",atlimit,Eup2,2);
## 첫매수이후 ##
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 EntryName=="엔벨-1차매수" and stime < 144200 Then
buy("엔벨-2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략매수금액*10000/c)*(매수비중2차/100)));
if MaxEntries == 1 and EntryName=="15선-1차매수" and stime < 144200 Then
buy("15선-2차매수",atlimit,ma2*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중2차/100)));
# 1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 and EntryName=="엔벨-1차매수" and stime < 144200 Then
buy("엔벨-3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100)));
if MaxEntries == 2 and EntryName=="15선1차매수" and stime < 144200 Then
buy("15선-3차매수",atlimit,EntryPrice*(1-매수위치2차/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));
# 최근 진입후 보유일수 이상 경과(현재 일자수가 최근진입시점의 일자수보다 보유일수 이상 증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then {
# 최근 진입이후 보유일수가 되었을때의 최근진입일 포함 보유일수동안 최저가 계산
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("익절1",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then {
# exitlong("익절2",AtStop,LatestEntrylow); # "익절2"는 상황에 따라 적용유무를 달리함.
# }
} # 87번행 # 첫매수이후 if MarketPosition == 1 Then { 의 괄호를 닫아 줌.
## 매수포지션이 아니면 false로 초기화 ##
else {
Xcond1 = false;
Xcond2 = false;
}
} # 79번행 # TimeCond가 True가 된 후 if TimeCond == true then { 의 괄호를 닫아 줌.
- 1. 일진홀딩스_2015년7월구간.PNG (0.08 MB)
답변 1
예스스탁 예스스탁 답변
2015-11-20 18:14:59
안녕하세요
예스스탁입니다.
1.
5가지 조건만 만족하면 무조건 진입을 하고자 하시면
atlimit타입을 사용하시면 안됩니다.
atlimit은 지정한 가격이하의 시세가 발생해야 신호가 발생하므로
onclose로 변경하셔야 합니다.
if MarketPosition == 0 and Ecnt < 전략진입횟수 and
Eup2<DayClose(0) and
ma2>ma1 and ma11>ma12 and
ma21>ma22 and
140000 < stime and stime<145000 Then # 오후 2시 이후에 매수
buy("15선-1차매수",Onclose,def,Floor((전략매수금액*10000/c)*(매수비중1차/100)));//2
2.
15선-1차매수후 1차 매도가 되면 보유수량이 감소한 상태가 됩니다.
그러므로 일부매도가 되었다는 내용으로
15선-2차매수 조건식에
CurrentContracts < MaxContracts and MaxEntries == 1
조건이 추가되어야 합니다.
현재 수량은 진입이후 최고수량이 아니고 최대 진입횟수는 1이었다는 내용입니다.
if MaxEntries == 2 and EntryName=="엔벨-1차매수" and stime < 144200 and CurrentContracts < MaxContracts and MaxEntries == 1 Then
buy("엔벨-3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100)));
3.
15선-1차매수만 된 상태는 현재 포지션의
최대 진입횟수가 1이라는 의미입니다.
그러므로 MaxEntries == 1 and EntryName(0) == "15선-1차매수" 을 조건으로 추가해 주시면 됩니다.
if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 and MaxEntries == 1 and EntryName(0) == "15선-1차매수" Then {
exitlong("익절1",AtMarket);
4
수식의 진입명을 지정하는 부분에
실제 진입명과 이름이 다른부분이 있습니다.
EntryName=="15선1차매수"
if MaxEntries == 2 and EntryName=="15선1차매수" and stime < 144200 Then
buy("15선-3차매수",atlimit,EntryPrice*(1-매수위치2차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100)));
5. 수정한 식입니다.
## 기본식+15일선매매로 하향추세 판단을 15일선과 120일선의 위치를 비교하여 판단함. 시간제한 있음.
## 외부변수 설정 ##
input : 전략시작일자(20150617), 전략시작시간(090000), 전략매수금액(1500);
input : 전략종료일자(20161230);
input : 악재시갭하락(5), 악재보정계수(5), 이평보정계수(1);
input : 매수위치보정(1), 매수기준엔벨(10), 중심매수엔벨(10);
input : 매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매도위치1차(7), 매도위치2차(14);
input : 전략진입횟수(100);
input : 타점보유일수(5);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
## 내부변수 설정 ##
var : sum1(0),mav1(0),cnt(0),Eup1(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),ma11(0),ma12(0),ma21(0),ma22(0),sum2(0),mav2(0);
var : cum1(0),cum11(0),cum12(0),cum2(0),cum21(0),cum22(0),ma1(0),ma2(0),Eup2(0);
# 일자수 계산
if date != date[1] Then
Didx = Didx+1;
# 일봉 120이평 계산 (120이평=ma1)
cum1 = 0;
for cnt = 1 to 119 {
cum1 = cum1+DayClose(cnt);
}
ma1 = cum1/120; # 당일 120이평 계산
# 전일, 전전일 120이평 계산
cum11 = 0;
cum12 = 0 ;
for cnt = 1 to 120 {
cum11 = cum11+DayClose(cnt);
cum12 = cum12+DayClose(cnt+1);
}
ma11 = cum11/120; # 전일 120이평 계산
ma12 = cum12/120; # 전전일 120이평 계산
# 일봉 15이평 계산 (15이평=ma2)
cum2 = 0;
for cnt = 0 to 14 {
cum2 = cum2+DayClose(cnt);
}
ma2 = cum2/15; # 당일 15일이평 계산
# 전일, 전전일 15이평 계산
cum21 = 0;
cum22 = 0;
for cnt = 1 to 15 {
cum21 = cum21+DayClose(cnt);
cum22 = cum22+DayClose(cnt+1);
}
ma21 = cum21/15; # 전일 15일이평 계산
ma22 = cum22/15; # 전전일 15일이평 계산
# 기본값은 기간은 P, %는 매수위치1차
Period = 매수기준엔벨;
매수1차 = 매수위치1차;
# 악재가 발생하여 갭하락하면
# 기간은 기존 Period값 + 악재보정계수
# %는 기존 매수1차값에 + 악재보정계수
if dayopen < DayClose(1)*(1-악재시갭하락/100) Then {
Period = Period + 악재보정계수;
매수1차 = 매수1차 + 악재보정계수;
}
# 15일 이평이 120이평 아래에 있으면 (또한 지정한 기간의 일봉데이타가 있으면)
# 기간은 기존 Period값+이평보정계수
# %는 기존 매수1차값에 + 이평보정계수
if ma2 < ma1 and DayClose(120+1) > 0 Then {
Period = Period + 이평보정계수;
매수1차 = 매수1차 + 이평보정계수;
}
# 당일포함 일봉 Period개의 종가를 누적 (엔벨하단선 매수를 위한 종가누적)
sum1 = 0;
for cnt = 0 to Period-1 {
sum1 = sum1+DayClose(cnt);
}
# 당일포함 일봉 중심기준엔벨개의 종가를 누적 (중심선 1차매수를 위한 종가누적)
sum2 = 0;
for cnt = 0 to 중심매수엔벨-1 {
sum2 = sum2+DayClose(cnt);
}
# 누적값을 Period로 나누어 평균값 산출
mav1 = sum1/Period;
mav2 = sum2/중심매수엔벨; # 중심선 1차매수를 위한 엔벨 %
# 엔벨로프 상단 계산
Eup1 = mav1+mav1*(매수1차/100);
Eup2 = mav2+mav2*(중심매수엔벨/100);
# 엔벨로프 하단 계산
Edn = mav1-mav1*(매수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차매수" or LatestEntryName(0) == "15선-1차매수") Then
Ecnt = Ecnt+1;
# 무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략진입횟수 and stime < 144200 Then
buy("엔벨-1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중1차/100)));
if MarketPosition == 0 and Ecnt < 전략진입횟수 and
Eup2<DayClose(0) and
ma2>ma1 and ma11>ma12 and
ma21>ma22 and
140000 < stime and stime<145000 Then # 오후 2시 이후에 매수
buy("15선-1차매수",Onclose,def,Floor((전략매수금액*10000/c)*(매수비중1차/100)));//2
## 첫매수이후 ##
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 EntryName=="엔벨-1차매수" and stime < 144200 Then
buy("엔벨-2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략매수금액*10000/c)*(매수비중2차/100)));
if MaxEntries == 1 and EntryName=="15선-1차매수" and stime < 144200 Then
buy("15선-2차매수",atlimit,ma2*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중2차/100)));
# 1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 and EntryName=="엔벨-1차매수" and stime < 144200 and CurrentContracts < MaxContracts and MaxEntries == 1 Then
buy("엔벨-3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100)));
if MaxEntries == 2 and EntryName=="15선-1차매수" and stime < 144200 Then
buy("15선-3차매수",atlimit,EntryPrice*(1-매수위치2차/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));
# 최근 진입후 보유일수 이상 경과(현재 일자수가 최근진입시점의 일자수보다 보유일수 이상 증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then {
# 최근 진입이후 보유일수가 되었을때의 최근진입일 포함 보유일수동안 최저가 계산
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 and MaxEntries == 1 and EntryName(0) == "15선-1차매수" Then {
exitlong("익절1",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then {
# exitlong("익절2",AtStop,LatestEntrylow); # "익절2"는 상황에 따라 적용유무를 달리함.
# }
} # 87번행 # 첫매수이후 if MarketPosition == 1 Then { 의 괄호를 닫아 줌.
## 매수포지션이 아니면 false로 초기화 ##
else {
Xcond1 = false;
Xcond2 = false;
}
} # 79번행 # TimeCond가 True가 된 후 if TimeCond == true then { 의 괄호를 닫아 줌.
즐거운 하루되세요
> 종풍화성 님이 쓴 글입니다.
> 제목 : 시스템식 검토 부탁드립니다.
> 안녕하세요.. 연일 흐린 날씨에 건강하신지요?
아래와 같은 시스템식에서
if MarketPosition == 0 and Ecnt < 전략진입횟수 and Eup2<DayClose(0) and ma2>ma1 and ma11>ma12 and ma21>ma22 and 140000<stime and stime<145000 Then
buy("15선-1차매수",atlimit,Eup2,2);
1) Eup2<DayClose(0) : 현재가가 Eup2 즉, 10:10 엔벨로프 상단선에 있을때,
2) ma2>ma1 : 15일이평이 120이평선 위에 있을때
3) ma11>ma12 : 120일이평이 우상향할때
4) ma21>ma22 : 15일이평이 우상향할때
5) 오후 2시 이후에
1. 위 5가지 조건을 만족하면 그냥 1차매수가 되도록 수정 부탁드리고
어떤 부분을 수정했는지도 부탁드려요. (공부를 위해서)
2. 15선-1차매수후 수익이 나서 1차매도가 이루어진 다음 2차매도까지 이루어지지 않고 주가가 하락하는 경우 15선-2차매수가 이루어 지도록 검토 부탁드립니다.
3. 15선-1차매수만 매수후 타점보유일수+5일로 해서 "익절1" 처리 할 수 있나요?
4. 아래 전체시스템식이 맞는지도 검토 부탁드립니다.
-------------------------------------------------------------------------------------
## 기본식+15일선매매로 하향추세 판단을 15일선과 120일선의 위치를 비교하여 판단함. 시간제한 있음.
## 외부변수 설정 ##
input : 전략시작일자(20150617), 전략시작시간(090000), 전략매수금액(1500);
input : 전략종료일자(20161230);
input : 악재시갭하락(5), 악재보정계수(5), 이평보정계수(1);
input : 매수위치보정(1), 매수기준엔벨(10), 중심매수엔벨(10);
input : 매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매도위치1차(7), 매도위치2차(14);
input : 전략진입횟수(100);
input : 타점보유일수(5);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
## 내부변수 설정 ##
var : sum1(0),mav1(0),cnt(0),Eup1(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),ma11(0),ma12(0),ma21(0),ma22(0),sum2(0),mav2(0);
var : cum1(0),cum11(0),cum12(0),cum2(0),cum21(0),cum22(0),ma1(0),ma2(0),Eup2(0);
# 일자수 계산
if date != date[1] Then
Didx = Didx+1;
# 일봉 120이평 계산 (120이평=ma1)
cum1 = 0;
for cnt = 1 to 119 {
cum1 = cum1+DayClose(cnt);
}
ma1 = cum1/120; # 당일 120이평 계산
# 전일, 전전일 120이평 계산
cum11 = 0;
cum12 = 0 ;
for cnt = 1 to 120 {
cum11 = cum11+DayClose(cnt);
cum12 = cum12+DayClose(cnt+1);
}
ma11 = cum11/120; # 전일 120이평 계산
ma12 = cum12/120; # 전전일 120이평 계산
# 일봉 15이평 계산 (15이평=ma2)
cum2 = 0;
for cnt = 0 to 14 {
cum2 = cum2+DayClose(cnt);
}
ma2 = cum2/15; # 당일 15일이평 계산
# 전일, 전전일 15이평 계산
cum21 = 0;
cum22 = 0;
for cnt = 1 to 15 {
cum21 = cum21+DayClose(cnt);
cum22 = cum22+DayClose(cnt+1);
}
ma21 = cum21/15; # 전일 15일이평 계산
ma22 = cum22/15; # 전전일 15일이평 계산
# 기본값은 기간은 P, %는 매수위치1차
Period = 매수기준엔벨;
매수1차 = 매수위치1차;
# 악재가 발생하여 갭하락하면
# 기간은 기존 Period값 + 악재보정계수
# %는 기존 매수1차값에 + 악재보정계수
if dayopen < DayClose(1)*(1-악재시갭하락/100) Then {
Period = Period + 악재보정계수;
매수1차 = 매수1차 + 악재보정계수;
}
# 15일 이평이 120이평 아래에 있으면 (또한 지정한 기간의 일봉데이타가 있으면)
# 기간은 기존 Period값+이평보정계수
# %는 기존 매수1차값에 + 이평보정계수
if ma2 < ma1 and DayClose(120+1) > 0 Then {
Period = Period + 이평보정계수;
매수1차 = 매수1차 + 이평보정계수;
}
# 당일포함 일봉 Period개의 종가를 누적 (엔벨하단선 매수를 위한 종가누적)
sum1 = 0;
for cnt = 0 to Period-1 {
sum1 = sum1+DayClose(cnt);
}
# 당일포함 일봉 중심기준엔벨개의 종가를 누적 (중심선 1차매수를 위한 종가누적)
sum2 = 0;
for cnt = 0 to 중심매수엔벨-1 {
sum2 = sum2+DayClose(cnt);
}
# 누적값을 Period로 나누어 평균값 산출
mav1 = sum1/Period;
mav2 = sum2/중심매수엔벨; # 중심선 1차매수를 위한 엔벨 %
# 엔벨로프 상단 계산
Eup1 = mav1+mav1*(매수1차/100);
Eup2 = mav2+mav2*(중심매수엔벨/100);
# 엔벨로프 하단 계산
Edn = mav1-mav1*(매수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차매수" or LatestEntryName(0) == "15선-1차매수") Then
Ecnt = Ecnt+1;
# 무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략진입횟수 and stime < 144200 Then
buy("엔벨-1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중1차/100)));
if MarketPosition == 0 and Ecnt < 전략진입횟수 and Eup2<DayClose(0) and ma2>ma1 and ma11>ma12 and ma21>ma22 and 140000<stime and stime<145000 Then # 오후 2시 이후에 매수
buy("15선-1차매수",atlimit,Eup2,2);
## 첫매수이후 ##
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 EntryName=="엔벨-1차매수" and stime < 144200 Then
buy("엔벨-2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략매수금액*10000/c)*(매수비중2차/100)));
if MaxEntries == 1 and EntryName=="15선-1차매수" and stime < 144200 Then
buy("15선-2차매수",atlimit,ma2*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중2차/100)));
# 1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 and EntryName=="엔벨-1차매수" and stime < 144200 Then
buy("엔벨-3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100)));
if MaxEntries == 2 and EntryName=="15선1차매수" and stime < 144200 Then
buy("15선-3차매수",atlimit,EntryPrice*(1-매수위치2차/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));
# 최근 진입후 보유일수 이상 경과(현재 일자수가 최근진입시점의 일자수보다 보유일수 이상 증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then {
# 최근 진입이후 보유일수가 되었을때의 최근진입일 포함 보유일수동안 최저가 계산
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("익절1",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then {
# exitlong("익절2",AtStop,LatestEntrylow); # "익절2"는 상황에 따라 적용유무를 달리함.
# }
} # 87번행 # 첫매수이후 if MarketPosition == 1 Then { 의 괄호를 닫아 줌.
## 매수포지션이 아니면 false로 초기화 ##
else {
Xcond1 = false;
Xcond2 = false;
}
} # 79번행 # TimeCond가 True가 된 후 if TimeCond == true then { 의 괄호를 닫아 줌.
다음글