커뮤니티
문의드립니다.
2017-11-28 11:33:37
168
글번호 114503
도움주시는 덕분에 도전하고 있습니다. 매번 꼼꼼한 답변 감사합니다.
1. 종목검색
input :n(10),aa(20);
if stime < 140000 and
money >= 10000000000 and
C >= O*(1+n/100) and
H >= L*(1+aa/100) Then
Condition1 = true;
if Condition1 == true then
find(1);
여기서 상한가 종목과 같이 종목에서 검색은 되나 매수는 할 수 없는(매도가 없어서) 종목들을 제외하고 싶습니다. '140000되기 전 n개봉 동안 종가가 상한가를 기록하고 있는'(매도가 없는 종목) 이런 조건을 추가하면 될까요? 적당한 조건이 생각안나 문의해봅니다.
2. 시스템
48940번의 손익비 질문을 보고 손익비를 이용한 시스템을 만들어 보고 싶은데요. 내용을 보니 배열변수를 만들어서 계산을 해주는 것 같은데, 제 실력으론 아무리 봐도 모르겠네요.
일봉을 기준으로 승률과 수익금액 손실금액을 계산해서 손익비를 토대로 시스템을 만들어 보고 싶습니다. 아마도 10000개가 넘어가면 더이상 계산이 안되거나 차트 불러오는 것에 따라 결과가 다르거나 하는 문제가 있을 것 같기는 한데요. 그냥 만개 이하로 해도 상관없습니다.
진입 청산조건
봉마다 진입/청산
진입조건 2
손익비가 1.2이상일 때 매수
필터
손익비가 1이하로 떨어지면 더이상 매수하지 않음.
===============================================================================
해당질문에 있던 코딩
var : cnt(0),sum1(0),sum2(0),sum3(0),sum4(0);
var : avgP(0),avgL(0);
var : sumP(0),Pcnt(0),sumL(0),Lcnt(0);
Array : avgPL[10](0),count[10](0);
if DayOfWeek(bdate) < DayOfWeek(bdate[1]) Then{
sumP = 0; #주간 수익 누적
Pcnt = 0; #주간 수익거래횟수 누적
sumL = 0; #주간 손실 누적
Lcnt = 0; #주간 손실거래횟수 누적
avgPL[0] = 0;
count[0] = 0;
#새로운 주가 시작되면 이전주의 손익비와 거래횟수를 다음 방으로 이관
for cnt = 1 to 9{
count[cnt] = count[cnt-1][1];
avgPL[cnt] = avgPL[cnt-1][1];
}
}
#청산이 되면
if TotalTrades > TotalTrades[1] Then{
count[0] = count[0]+1;
#직전거래가 수익이면 sumP,Pcnt에 값 누적
if PositionProfit(1) > 0 Then{
sumP = sumP + PositionProfit(1);
Pcnt = Pcnt + 1;
}
#직전거래가 손실이면 sumL,Lcnt에 값 누적
if PositionProfit(1) < 0 Then{
sumL = sumL + PositionProfit(1);
Lcnt = Lcnt + 1;
}
if Pcnt >= 1 and Lcnt >= 1 then{
avgP = sumP/Pcnt;#주간평균수익
avgL = sumL/Lcnt;#주간평균손실
avgPL[0] = avgP/abs(avgL); #주간 손익비
}
}
#직전 2주간 거래가 없거나
#직전 2주간 손익비가 모두 1 이상일때만 진입
if (count[1] == 0 and count[2] == 0) or (AvgPL[1] >= 1 and AvgPL[1] >= 1) then{
if 매수진입조건 Then
buy();
if 매도진입조건 Then
sell();
}
===============================================================================
3. 시스템
input: 투입금액(200000),p(0.5);
var : Rate(0),bars(0),mm(0);
var : entry(false);
Rate = (C-C[1])/C[1]*100;
If MarketPosition == 0 Then
value1 = 100;
If Rate > 0 or Rate < 0 Then
value1 = value1+(value1*Rate*p);
If MarketPosition >= 0 Then
buy("b",Atmarket,def,floor((투입금액*value1)/NextBarOpen));
ExitLong("bx",Onclose);
필터
-이 식에서 손실금액이 누적수익금액의 50%가 되면 더이상 진입하지 않음이라는 필터
-투입금액은 제한금액(변수) 이하로만 넣는다는 필터
-누적횟수는 n회로 제한(=n개봉이 지나면 누적을 새로 시작함)이라는 필터 추가 부탁드립니다.
4. 시스템
종목검색식 find만 빼고 복사해서 condition 조건이 되고 손실거래가 생기면 제한(다른 질문 참조) 이런 식으로 코딩을 짜봤는데요. 신호가 발생하지 않았습니다. 어떻게 수정해야할 지 모르겠습니다. 수정과 동시에 왜 신호가 발생하지 않았는 지 간략한 설명도 부탁드립니다.
input: 거래대금(10000000000), 상승률(10),변동폭(10),투입금액(300000),제한시간(140000);
if stime < 제한시간 and
money >= 10000000000 and
C >= O*(1+상승률/100) and
H >= L*(1+변동폭/100) Then
Condition1 = true;
input : N(2);
var : cnt(0),Lcnt(0);
#g현재 진입포함 당일손실거래횟수 카운트
Lcnt = 0;
for cnt = 0 to N
{
if ExitDate(cnt) == sdate and PositionProfit(cnt) < 0 Then
Lcnt = Lcnt+1;
}
Condition2 = Lcnt < N;
condition1 == True Then{
if Condition2 == false then
buy("b",Atmarket,def,floor((투입금액)/NextBarOpen));
}
ExitLong("bx",Onclose);
5. 시스템
input : 날짜(20171127),설정자금(1500000),자금나누기(5);
if sdate == 날짜 and stime > 142900 and stime < 152000 then
buy("b",OnClose,def,floor((설정자금/자금나누기)/C));
if NextBarSdate > sdate Then
ExitLong("bx",AtMarket);
위와 같이 봉마다 분할매수를 하게 했는데요. 제가 생각한 것은 10분차트라면 143000분부터 매수가 시작되서 152000분까지 매수를 하는 것이었습니다. 그런데 실제 실행해보니 봉이 완성되고 다음봉부터(144000?)매수가 시작되더군요.(신호는 이미 30분부터 차트에 나왔습니다.) 그냥 임시방편으로 141900으로 돌려서 해볼 생각이긴 한데요. 코딩과 결과가 이해가 잘 안가서 설명 좀 부탁드립니다. 기술적지표가 들어가는 것이 아닌데도 봉완성시 매수가 되는 이유가 있는지요. 어떻게 수정하면 될까요? 그리고 리포트에 나오는 결과는 실제매매와 같은 봉 완성시를 기준으로 나오는 건가요?
답변 1
예스스탁 예스스탁 답변
2017-11-28 16:38:56
안녕하세요
예스스탁입니다.
1.
input :n(10),aa(20);
var : 상한가(0), UpLimit(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if date >= 19981207 then {
if date < 20050328 && CodeCategory() == 2 then
UpLimit = (BP[0] * 1.12);
Else if date >= 20050328 and date < 20150615 Then
UpLimit = (BP[0] * 1.15);
Else
UpLimit = (BP[0] * 1.30);
if CodeCategory() == 2 then {
if date >= 20030721 then {
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
up7 = int(UpLimit/1+0.00001)*1;
}
}
Else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
if CodeCategory() == 1 || CodeCategory() == 2 then {
if sdate < 20101004 Then{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up6);
}
Else{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up7);
}
}
else if CodeCategory() == 8 || CodeCategory() == 9 then { // ETF
상한가 = up6;
}
}
if stime < 140000 and
money >= 10000000000 and
C >= O*(1+n/100) and
H >= L*(1+aa/100) Then
Condition1 = true;
if Condition1 == true and CountIF(C>=상한가,5) == 0 then
find(1);
2
48940번 답변수식은 해당 수식만으로는 사용이 가능한 부분이 아닙니다.
차트상에서 진입이 발생하기 전에는 손익비가 0입니다.
손익비가 1.2이상일때 진입으로 하면 진입이 전혀 이루어 지지 않습니다.
만약 해당 내용이 가상으로 진입청산을 체크해야 하는 부분이면
이전에 답변드린 내용과 같이 작성해 드리지 않습니다.
아래 내용으로 참고하시기 바랍니다.
손익비는 전략성과함수를 기준으로 아래와 같이 계산해 사용하시면 됩니다.
총손익기준과 평균손익기준 2개입니다.택일해 사용하시면 됩니다.
var1 = GrossProfit/abs(GrossLoss); #손익비 = 총수익/총손실
var2 = (GrossProfit/NumWinTrades)/abs(GrossLoss/NumLosTrades); #손익비2 = 수익평균/손실평균
#수익거래, 손실거래가 각 0일대는 진입
#수익거래 손실거래가 1이상일때는 손익비가 1.2이상일때만 진입
if NumWinTrades == 0 or NumWinTrades == 0 or
(NumWinTrades > 0 and NumWinTrades > 0 and var1 >= 1.2) Then
buy("b",AtMarket);
exitlong("bx");
3
-누적횟수는 n회로 제한(=n개봉이 지나면 누적을 새로 시작함)
위 내용은 내용이 복잡해 작성해 드리기 어렵습니다.
input: 투입금액(200000),p(0.5),제한금액(10000000);
var : Rate(0),bars(0),mm(0);
var : entry(false);
Rate = (C-C[1])/C[1]*100;
If MarketPosition == 0 Then
value1 = 100;
If Rate > 0 or Rate < 0 Then
value1 = value1+(value1*Rate*p);
if MarketPosition == 0 Then
value2 = 0;
If MarketPosition >= 0 and NetProfit > -(투입금액*0.5) Then{
value1 = value1+(투입금액*value1);
if value1 <= 제한금액 then{
buy("b",Atmarket,def,floor((투입금액*value1)/NextBarOpen));
}
}
ExitLong("bx",Onclose);
4
Condition2 == true
로 변경하면 신호가 발생합니다.
5
if문은 봉완성시가 기본체계입니다.
이전에도 반복적으로 답변을 드린 부분입니다.
시간이나 날짜는 봉미완성시로는 조건을 지정해 신호를 발생할수 있는 부분이 아닙니다.
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 도움주시는 덕분에 도전하고 있습니다. 매번 꼼꼼한 답변 감사합니다.
1. 종목검색
input :n(10),aa(20);
if stime < 140000 and
money >= 10000000000 and
C >= O*(1+n/100) and
H >= L*(1+aa/100) Then
Condition1 = true;
if Condition1 == true then
find(1);
여기서 상한가 종목과 같이 종목에서 검색은 되나 매수는 할 수 없는(매도가 없어서) 종목들을 제외하고 싶습니다. '140000되기 전 n개봉 동안 종가가 상한가를 기록하고 있는'(매도가 없는 종목) 이런 조건을 추가하면 될까요? 적당한 조건이 생각안나 문의해봅니다.
2. 시스템
48940번의 손익비 질문을 보고 손익비를 이용한 시스템을 만들어 보고 싶은데요. 내용을 보니 배열변수를 만들어서 계산을 해주는 것 같은데, 제 실력으론 아무리 봐도 모르겠네요.
일봉을 기준으로 승률과 수익금액 손실금액을 계산해서 손익비를 토대로 시스템을 만들어 보고 싶습니다. 아마도 10000개가 넘어가면 더이상 계산이 안되거나 차트 불러오는 것에 따라 결과가 다르거나 하는 문제가 있을 것 같기는 한데요. 그냥 만개 이하로 해도 상관없습니다.
진입 청산조건
봉마다 진입/청산
진입조건 2
손익비가 1.2이상일 때 매수
필터
손익비가 1이하로 떨어지면 더이상 매수하지 않음.
===============================================================================
해당질문에 있던 코딩
var : cnt(0),sum1(0),sum2(0),sum3(0),sum4(0);
var : avgP(0),avgL(0);
var : sumP(0),Pcnt(0),sumL(0),Lcnt(0);
Array : avgPL[10](0),count[10](0);
if DayOfWeek(bdate) < DayOfWeek(bdate[1]) Then{
sumP = 0; #주간 수익 누적
Pcnt = 0; #주간 수익거래횟수 누적
sumL = 0; #주간 손실 누적
Lcnt = 0; #주간 손실거래횟수 누적
avgPL[0] = 0;
count[0] = 0;
#새로운 주가 시작되면 이전주의 손익비와 거래횟수를 다음 방으로 이관
for cnt = 1 to 9{
count[cnt] = count[cnt-1][1];
avgPL[cnt] = avgPL[cnt-1][1];
}
}
#청산이 되면
if TotalTrades > TotalTrades[1] Then{
count[0] = count[0]+1;
#직전거래가 수익이면 sumP,Pcnt에 값 누적
if PositionProfit(1) > 0 Then{
sumP = sumP + PositionProfit(1);
Pcnt = Pcnt + 1;
}
#직전거래가 손실이면 sumL,Lcnt에 값 누적
if PositionProfit(1) < 0 Then{
sumL = sumL + PositionProfit(1);
Lcnt = Lcnt + 1;
}
if Pcnt >= 1 and Lcnt >= 1 then{
avgP = sumP/Pcnt;#주간평균수익
avgL = sumL/Lcnt;#주간평균손실
avgPL[0] = avgP/abs(avgL); #주간 손익비
}
}
#직전 2주간 거래가 없거나
#직전 2주간 손익비가 모두 1 이상일때만 진입
if (count[1] == 0 and count[2] == 0) or (AvgPL[1] >= 1 and AvgPL[1] >= 1) then{
if 매수진입조건 Then
buy();
if 매도진입조건 Then
sell();
}
===============================================================================
3. 시스템
input: 투입금액(200000),p(0.5);
var : Rate(0),bars(0),mm(0);
var : entry(false);
Rate = (C-C[1])/C[1]*100;
If MarketPosition == 0 Then
value1 = 100;
If Rate > 0 or Rate < 0 Then
value1 = value1+(value1*Rate*p);
If MarketPosition >= 0 Then
buy("b",Atmarket,def,floor((투입금액*value1)/NextBarOpen));
ExitLong("bx",Onclose);
필터
-이 식에서 손실금액이 누적수익금액의 50%가 되면 더이상 진입하지 않음이라는 필터
-투입금액은 제한금액(변수) 이하로만 넣는다는 필터
-누적횟수는 n회로 제한(=n개봉이 지나면 누적을 새로 시작함)이라는 필터 추가 부탁드립니다.
4. 시스템
종목검색식 find만 빼고 복사해서 condition 조건이 되고 손실거래가 생기면 제한(다른 질문 참조) 이런 식으로 코딩을 짜봤는데요. 신호가 발생하지 않았습니다. 어떻게 수정해야할 지 모르겠습니다. 수정과 동시에 왜 신호가 발생하지 않았는 지 간략한 설명도 부탁드립니다.
input: 거래대금(10000000000), 상승률(10),변동폭(10),투입금액(300000),제한시간(140000);
if stime < 제한시간 and
money >= 10000000000 and
C >= O*(1+상승률/100) and
H >= L*(1+변동폭/100) Then
Condition1 = true;
input : N(2);
var : cnt(0),Lcnt(0);
#g현재 진입포함 당일손실거래횟수 카운트
Lcnt = 0;
for cnt = 0 to N
{
if ExitDate(cnt) == sdate and PositionProfit(cnt) < 0 Then
Lcnt = Lcnt+1;
}
Condition2 = Lcnt < N;
condition1 == True Then{
if Condition2 == false then
buy("b",Atmarket,def,floor((투입금액)/NextBarOpen));
}
ExitLong("bx",Onclose);
5. 시스템
input : 날짜(20171127),설정자금(1500000),자금나누기(5);
if sdate == 날짜 and stime > 142900 and stime < 152000 then
buy("b",OnClose,def,floor((설정자금/자금나누기)/C));
if NextBarSdate > sdate Then
ExitLong("bx",AtMarket);
위와 같이 봉마다 분할매수를 하게 했는데요. 제가 생각한 것은 10분차트라면 143000분부터 매수가 시작되서 152000분까지 매수를 하는 것이었습니다. 그런데 실제 실행해보니 봉이 완성되고 다음봉부터(144000?)매수가 시작되더군요.(신호는 이미 30분부터 차트에 나왔습니다.) 그냥 임시방편으로 141900으로 돌려서 해볼 생각이긴 한데요. 코딩과 결과가 이해가 잘 안가서 설명 좀 부탁드립니다. 기술적지표가 들어가는 것이 아닌데도 봉완성시 매수가 되는 이유가 있는지요. 어떻게 수정하면 될까요? 그리고 리포트에 나오는 결과는 실제매매와 같은 봉 완성시를 기준으로 나오는 건가요?