예스스탁
예스스탁 답변
2021-10-29 09:57:10
안녕하세요
예스스탁입니다.
피라미딩을 모든진입신호 허용으로 설정하고 적용하시면 됩니다.
종가 바로 아래 이평찾는 로직과 진입과 청산만 수정해 드립니다.
종가 아래 이평이 없을 경우나 가격 움직임에 따라 종가아래 이평이 변경되는데
해당 상황에서는 어떤 방식으로 처리할지 알수 없습니다.
해당 부분은 사용자분이 의도하는 내용으로 처리해 보셔야 합니다.
input : p5(0), p10(0),p20(20), p60(60),p120(120),p240(240);
input : dayperiod5(5), dayperiod10(10), dayperiod20(20),dayperiod60(60);
var : cond1(False), cond11(False), cond12(False);
var : ma5(0),ma10(0),ma20(0),ma60(0),ma120(0),ma240(0), 이평(0), count(0);
var : cnt(0),sum5(0), sum10(0), sum20(0), sum60(0), daymav(0), daymav5(0), daymav10(0), daymav20(0), daymav60(0);
var : minv(0);
if Bdate != Bdate[1] Then
{
count = 0;
}
#일봉 이동평균계산
sum5 = 0;
For cnt = 0 to dayPeriod5-1
{
sum5 = sum5 + DayClose(cnt);
}
daymav5 = sum5/dayPeriod5; // 현재 20일선
sum10 = 0;
For cnt = 0 to dayPeriod10-1
{
sum10 = sum10 + DayClose(cnt);
}
daymav10 = sum10/dayPeriod10; // 현재 20일선
sum20 = 0;
For cnt = 0 to dayPeriod20-1
{
sum20 = sum20 + DayClose(cnt);
}
daymav20 = sum20/dayPeriod20; // 현재 20일선
sum60 = 0;
For cnt = 0 to dayPeriod60-1
{
sum60 = sum60 + DayClose(cnt);
}
daymav60 = sum60/dayPeriod60; // 현재 20일선
#종가보다 낮은 이평 중 가장 큰값을 daymav에 저장, 없으면 0
daymav = 0;
if C > daymav5 and (daymav == 0 or (daymav > 0 and daymav5 > daymav)) Then
daymav = daymav5;
if C > daymav10 and (daymav == 0 or (daymav > 0 and daymav10 > daymav)) Then
daymav = daymav10;
if C > daymav20 and (daymav == 0 or (daymav > 0 and daymav20 > daymav)) Then
daymav = daymav20;
if C > daymav60 and (daymav == 0 or (daymav > 0 and daymav60 > daymav)) Then
daymav = daymav60;
If ExitDate(1) != sDate and MarketPosition == 0 and min(NextBarOpen,DayOpen(0)*0.99) > daymav Then
{
Buy("b1", AtLimit, DayOpen(0)*0.99,1);
}
if MarketPosition == 1 Then
{
If min(NextBarOpen,DayOpen(0)*(1-(1+MaxEntries)/100)) > daymav Then
{
Buy("bb", AtLimit, DayOpen(0)*(1-(1+MaxEntries)/100),1);
}
}
If MarketPosition == 1 then
{
// 이평선 2% 이탈 시 손절
ExitLong("bx1",AtStop,daymav*0.98,"",1,2);
//익절(5%)
ExitLong("bx11",AtLimit,AvgEntryPrice*1.05,"",1,2);
}
SetStopEndofday(151500);
즐거운 하루되세요
> 깜피 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 안녕하세요.
1분봉에서 일봉 이평선 가격을 기준으로 매수/매도하는 수식을 작성하려고 합니다.
거의 일봉으로만 거래를 하다보니 분봉 시스템에 익숙치 않아서 도움을 부탁드립니다.
시스템 제작에 많은 도움을 주셔서 항상 감사드립니다.
전략은 개장 후 시가가 밀리면 1% 하락 시마다 분할 매수(현재는 4회만 표시하였으나 횟수 제한 없이 매수할 예정)한 후 평균가 대비 5% 상승 시 매도하는 전략입니다.
단 일봉 이평선(5,10,20,60) 중 현재가격 바로 아래에 있는 일봉이평선을 기준으로 삼아서 그 이평선 도달 전까지만 매수하고 이평선을 이탈(-2%)하면 손절할 예정이며, 일 1회만 거래하려고 합니다.
아래 수식으로 작성을 해봤는데 수정 부탁드립니다. 좋은 하루 보내세요.
input : p5(0), p10(0),p20(20), p60(60),p120(120),p240(240);
input : dayperiod5(5), dayperiod10(10), dayperiod20(20),dayperiod60(60);
var : cond1(False), cond11(False), cond12(False);
var : ma5(0),ma10(0),ma20(0),ma60(0),ma120(0),ma240(0), 이평(0), count(0);
var : cnt(0),sum5(0), sum10(0), sum20(0), sum60(0), daymav(0), daymav5(0), daymav10(0), daymav20(0), daymav60(0);
var : min1(0), min2(0), min3(0), min4(0);
if Bdate != Bdate[1] Then
{
Cond1 = False; #당일조건만족여부
count = 0;
}
#일봉 이동평균계산
sum5 = 0;
For cnt = 0 to dayPeriod5-1
{
sum5 = sum5 + DayClose(cnt);
}
daymav5 = sum5/dayPeriod5; // 현재 20일선
sum10 = 0;
For cnt = 0 to dayPeriod10-1
{
sum10 = sum10 + DayClose(cnt);
}
daymav10 = sum10/dayPeriod10; // 현재 20일선
sum20 = 0;
For cnt = 0 to dayPeriod20-1
{
sum20 = sum20 + DayClose(cnt);
}
daymav20 = sum20/dayPeriod20; // 현재 20일선
sum60 = 0;
For cnt = 0 to dayPeriod60-1
{
sum60 = sum60 + DayClose(cnt);
}
daymav60 = sum60/dayPeriod60; // 현재 20일선
// 분봉 종가와 일봉이평선과의 간격 확인
min1 = nthminlist(1,C-daymav5,C-daymav10,C-daymav20,C-daymav60);
min2 = nthminlist(2,C-daymav5,C-daymav10,C-daymav20,C-daymav60);
min3 = nthminlist(3,C-daymav5,C-daymav10,C-daymav20,C-daymav60);
min4 = nthminlist(4,C-daymav5,C-daymav10,C-daymav20,C-daymav60);
// 종가가 모든 이평선보다 위에 있으면 daymav를 제일 높은 가격의 이평선선택
if min1>0 Then daymav = NthMaxList(1, daymav5, daymav10, daymav20, daymav60);
// 1개의 이평선이 종가보다 높은 경우, 2번재 높은 가격의 이평선을 선택
Else if min2 > 0 Then daymav = NthMaxList(2, daymav5, daymav10, daymav20, daymav60);
Else if min3 > 0 Then daymav = NthMaxList(3, daymav5, daymav10, daymav20, daymav60);
Else if min4 > 0 Then daymav = NthMaxList(4, daymav5, daymav10, daymav20, daymav60);
Else daymav = 0;
If cond1 == False and MarketPosition == 0 and C < DayOpen(0) and C>daymav and count< 1 Then
{
Buy("b1", AtLimit, DayOpen(0)*0.99,1);
}
If cond1 == False and MarketPosition == 1 and C < DayOpen(0) and C>daymav and count< 2 Then
{
Buy("b2", AtLimit, DayOpen(0)*0.98,1);
}
If cond1 == False and MarketPosition == 1 and C < DayOpen(0) and C>daymav and count< 3 Then
{
Buy("b3", AtLimit, DayOpen(0)*0.97,1);
}
If cond1 == False and MarketPosition == 1 and C < DayOpen(0) and C>daymav and count< 4 Then
{
Buy("b4", AtLimit, DayOpen(0)*0.96,1);
}
If MarketPosition == 1 then
{
// 이평선 2% 이탈 시 손절
ExitLong("bx1",AtLimit,daymav*0.98,"",1,2);
//익절(5%)
ExitLong("bx11",AtLimit,AvgEntryPrice*1.05,"",1,2);
}
If CurrentEntries<CurrentEntries[1] Then
count = count + 1;