예스스탁
예스스탁 답변
2021-12-13 15:40:13
안녕하세요
예스스탁입니다.
이전 문의에서 볼밴과 주가이평은 일봉, 나머지는 1시간봉이었습니다.
이평을 2기본차트기준으로 계산하게 변경해 드립니다.
1번식은 기존에 답변드린 수식에 주석을 처리한 식입니다.
일본이평 계산시 If DayClose(BBPeriod-1) > 0 Then로 된 부분은
If DayClose(maPeriod2-1) > 0 Then로 변경해 드립니다.
2번식은 이평을 기본차트 주기로 계산하게 변경한 식입니다.
1
input : BBPeriod(20),dv(5),RSIPeriod(10),maPeriod1(5),maPeriod2(20),short(12),long(26),sig(9);
input : 매수금액(100000),매도금액(100000),진입횟수(4);
var : RSIV(0),macdv(0),macds(0);
var : cnt(0),sum(0),mav(0),SumSqrt(0),Stdv(0),BBup(0),BBdn(0);
var : sum1(0),sum2(0),mav1(0),mav2(0),entry(0);
#19(BBPeriod)일전종가가 0보다 큼(당일포함 일봉 20일치의 데이타가 있을 때)
If DayClose(BBPeriod-1) > 0 Then
{
#일봉이평계산
#sum변수는 매봉 0으로 초기화
sum = 0;
#0일전(당일)~19일전종가를 가져와 sum변수에 누적
for cnt = 0 to BBPeriod-1
{
sum = sum + DayClose(cnt);
}
#sum을 20으로 나누어 20일 이평 계산
mav = sum/BBPeriod;
#일간표준편차 계산
#SumSqrt변수는 매봉 0으로 초기화
#0~19일전 종가와 20일 이평의 차이를 구하고 제곱해서 누적
SumSqrt = 0;
For cnt = 0 To BBPeriod - 1
{
SumSqrt = SumSqrt + (DayClose(cnt) - mav)^2;
}
#누적값을 20으로 나누고 제곱근을 구함
Stdv = SquareRoot(SumSqrt / BBPeriod);
#일간볼밴상단 = 20일이평+일간표준편가*2
#일간볼밴하단 = 20일이평-일간표준편가*2
BBup = mav + (Dv * Stdv);
BBdn = mav - (Dv * Stdv);
}
#19(maPeriod2)일전 종가가 0보다 큼(당일포함 일봉 20일치의 데이타가 있을 때)
If DayClose(maPeriod2-1) > 0 Then
{
#일봉이평계산
#sum1,sum2변수는 매봉 0으로 초기화
sum1 = 0;
sum2 = 0;
for cnt = 0 to max(maPeriod1,maPeriod2)
{
#0일전(당일)~4일전종가를 가져와 sum1변수에 누적
if cnt < maPeriod2 Then
sum1 = sum1 + DayClose(cnt);
#0일전(당일)~4일전종가를 가져와 sum1변수에 누적
if cnt < maPeriod2 Then
sum2 = sum2 + DayClose(cnt);
}
#sum1을 maPeriod1로 나누어 5일 이평계산
mav1 = sum1/maPeriod1;
#sum2를 maPeriod2로 나누어 20일 이평계산
mav2 = sum2/maPeriod2;
}
#기본차트 주기 RSI값
RSIV = RSI(RSIPeriod);
#기본차트 주기 MACD값
macdv = macd(short,long);
#기본차트 주기 MACD 시그널값
macds = Ema(macdv,sig);
#영업일 변경시
#entry변수는 0으로 초기화
if Bdate != Bdate[1] Then
entry = 0;
#진입이 발생하면(전봉대비 수량증가)
#entry변수는 1씩 증가
if CurrentContracts > CurrentContracts[1] Then
entry = entry+1;
if BBdn > 0 and C < bbdn and #BBdn값이 0보다 크고(위 로직에 의해 일간볼밴하단값이 계산이 되었고) 종가가 일간 볼밴하단보다 작고
RSIV <= 30 and #기본차트 RSI는 30 이하이고
mav1 > 0 and mav2 > 0 and mav1 < mav2 and #mav1과 mav2는 0보다 크고 (위 로직에 의해 일간아평값이 계산이 되었고) 일간5이평이 일간 20이평보다 작고
macdv < macds and #기본차트 MACD는 MACD시그널보다 작고
entry < 진입횟수 Then #진입횟수는 지정한 값 이하일때
Buy("b",OnClose,DEF,Floor(매수금액/C)); #지정한 금액만큼 매수
if MarketPosition == 1 and #매수후
C > AvgEntryPrice and #종가가 평균가보다 크고
BBup > 0 and C > bbup and #종가가 일간볼밴상단보다 크고
RSIV >= 70 and # 기본차트 RSI는 70이상이고
mav1 > 0 and mav2 > 0 and mav1 > mav2 and #일간5이평이 일간20이평보다 크고
macdv > macds Then #기본차트 MACD는 MACD시그널보다 크면 지정금액만큼 청산
ExitLong("bx",OnClose,DEF,"",Floor(매도금액/C),2);
2
input : BBPeriod(20),dv(5),RSIPeriod(10),maPeriod1(5),maPeriod2(20),short(12),long(26),sig(9);
input : 매수금액(100000),매도금액(100000),진입횟수(4);
var : RSIV(0),macdv(0),macds(0);
var : cnt(0),sum(0),mav(0),SumSqrt(0),Stdv(0),BBup(0),BBdn(0);
var : mav1(0),mav2(0),entry(0);
#19(BBPeriod)일전종가가 0보다 큼(당일포함 일봉 20일치의 데이타가 있을 때)
If DayClose(BBPeriod-1) > 0 Then
{
#일봉이평계산
#sum변수는 매봉 0으로 초기화
sum = 0;
#0일전(당일)~19일전종가를 가져와 sum변수에 누적
for cnt = 0 to BBPeriod-1
{
sum = sum + DayClose(cnt);
}
#sum을 20으로 나누어 20일 이평 계산
mav = sum/BBPeriod;
#일간표준편차 계산
#SumSqrt변수는 매봉 0으로 초기화
#0~19일전 종가와 20일 이평의 차이를 구하고 제곱해서 누적
SumSqrt = 0;
For cnt = 0 To BBPeriod - 1
{
SumSqrt = SumSqrt + (DayClose(cnt) - mav)^2;
}
#누적값을 20으로 나누고 제곱근을 구함
Stdv = SquareRoot(SumSqrt / BBPeriod);
#일간볼밴상단 = 20일이평+일간표준편가*2
#일간볼밴하단 = 20일이평-일간표준편가*2
BBup = mav + (Dv * Stdv);
BBdn = mav - (Dv * Stdv);
}
#기본차트 주기 이평
mav1 = ma(C,maPeriod1);
mav2 = ma(C,maPeriod2);
#기본차트 주기 RSI값
RSIV = RSI(RSIPeriod);
#기본차트 주기 MACD값
macdv = macd(short,long);
#기본차트 주기 MACD 시그널값
macds = Ema(macdv,sig);
#영업일 변경시
#entry변수는 0으로 초기화
if Bdate != Bdate[1] Then
entry = 0;
#진입이 발생하면(전봉대비 수량증가)
#entry변수는 1씩 증가
if CurrentContracts > CurrentContracts[1] Then
entry = entry+1;
if BBdn > 0 and C < bbdn and #BBdn값이 0보다 크고(위 로직에 의해 일간볼밴하단값이 계산이 되었고) 종가가 일간 볼밴하단보다 작고
RSIV <= 30 and #기본차트 RSI는 30 이하이고
mav1 > 0 and mav2 > 0 and mav1 < mav2 and #mav1과 mav2는 0보다 크고 (위 로직에 의해 일간아평값이 계산이 되었고) 일간5이평이 일간 20이평보다 작고
macdv < macds and #기본차트 MACD는 MACD시그널보다 작고
entry < 진입횟수 Then #진입횟수는 지정한 값 이하일때
Buy("b",OnClose,DEF,Floor(매수금액/C)); #지정한 금액만큼 매수
if MarketPosition == 1 and #매수후
C > AvgEntryPrice and #종가가 평균가보다 크고
BBup > 0 and C > bbup and #종가가 일간볼밴상단보다 크고
RSIV >= 70 and # 기본차트 RSI는 70이상이고
mav1 > 0 and mav2 > 0 and mav1 > mav2 and #일간5이평이 일간20이평보다 크고
macdv > macds Then #기본차트 MACD는 MACD시그널보다 크면 지정금액만큼 청산
ExitLong("bx",OnClose,DEF,"",Floor(매도금액/C),2);
즐거운 하루되세요
> 필명이요 님이 쓴 글입니다.
> 제목 : 수식 부탁드립니다.
> 수고하십니다.
수식수정을 하고싶어서 다시 문의드립니다.
매수조건은 볼린저밴드 하단에 있을때, rsi지표가 30이하, 주가이동평균선이 5일선이 120일 이하일때, macd선이 macd시그널선 아래에 있을때 분할매수하고
매도조건은 볼린저밴드 상단에 있을때, rsi지표가 70이상, 주가이동평균선이 5일선이 120일 이상일때, macd선이 macd시그널선 위에 있을때 분할매도하는
74858번에서 이렇게 작성해주셨는데 1시간봉으로 볼때 볼린저밴드만 일봉기준으로 하고 주가이동평균, rsi, macd는 1시간봉기준으로요. 그리고 주가이동편균선 maPeriod2변수가 120일 일때 20이 맞는건가요?
죄송하지만 수식에 주석을 조금만 달아주시면 안될까요 제가 수정을 하고싶어도 어떤게 어떤건지 잘 몰라서 매번 부탁을 드리게되네요ㅠ
감사합니다.
input : BBPeriod(20),dv(5),RSIPeriod(10),maPeriod1(5),maPeriod2(20),short(12),long(26),sig(9);
input : 매수금액(100000),매도금액(100000),진입횟수(4);
var : RSIV(0),macdv(0),macds(0);
var : cnt(0),sum(0),mav(0),SumSqrt(0),Stdv(0),BBup(0),BBdn(0);
var : sum1(0),sum2(0),mav1(0),mav2(0),entry(0);
If DayClose(BBPeriod-1) > 0 Then
{
#일봉 이동평균 계산
sum = 0;
for cnt = 0 to BBPeriod-1
{
sum = sum + DayClose(cnt);
}
mav = sum/BBPeriod;
SumSqrt = 0;
For cnt = 0 To BBPeriod - 1
{
SumSqrt = SumSqrt + (DayClose(cnt) - mav)^2;
}
Stdv = SquareRoot(SumSqrt / BBPeriod);
BBup = mav + (Dv * Stdv);
BBdn = mav - (Dv * Stdv);
}
If DayClose(BBPeriod-1) > 0 Then
{
sum1 = 0;
sum2 = 0;
for cnt = 0 to max(maPeriod1,maPeriod2)
{
if cnt < maPeriod2 Then
sum1 = sum1 + DayClose(cnt);
if cnt < maPeriod2 Then
sum2 = sum2 + DayClose(cnt);
}
mav1 = sum1/maPeriod1;
mav2 = sum2/maPeriod2;
}
RSIV = RSI(RSIPeriod);
macdv = macd(short,long);
macds = Ema(macdv,sig);
if Bdate != Bdate[1] Then
entry = 0;
if CurrentContracts > CurrentContracts[1] Then
entry = entry+1;
if BBdn > 0 and C < bbdn and
RSIV <= 30 and
mav1 > 0 and mav2 > 0 and mav1 < mav2 and
macdv < macds and
entry < 진입횟수 Then
Buy("b",OnClose,DEF,Floor(매수금액/C));
if MarketPosition == 1 and
C > AvgEntryPrice and
BBup > 0 and C > bbup and
RSIV >= 70 and
mav1 > 0 and mav2 > 0 and mav1 > mav2 and
macdv > macds Then
ExitLong("bx",OnClose,DEF,"",Floor(매도금액/C),2);