커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4736
글번호 230811
답변완료
수식 부탁드립니다.
현재 예스트레이더4.0 사용중입니다.
기존 사용중인 종목검색에 다음과 같은 추가 사항을 넣어 종목검색하고 싶습니다.
당일, 전일,전전일 3일간 각각의 시초가와 종가(총6개의 값) 들이 5%내에 존재하는 종목을 추가하려는데,
어떻게 하면될까요.
즉, 6개 값의 최고값과 최소값의 차가 5%내에 존재.....
제가. 무식하게 해볼려고 했는데, 잘 안되네요.
시간되실때 부탁드리겠습니다.... 감사합니다.
2015-10-28
189
글번호 91838
답변완료
44741번글 관련 문의 드립니다.
오전에 부탁드린 "갭하락(5)" 관련 시스템식과
오후에 부탁드린 "일봉이평기간(120)" 관련 시스템식이 각각 별도로 적용된 시스템식인가요?
오후에 최종 변경해 주신 시스템식을 보니 오전 "갭하락(5)"에 관련된 부분을 제외하고
그자리에 "일봉이평기간(120)"을 적용하신것 같아 문의 드립니다.
"갭하락(5)"과 "일봉이평기간(120)"이 동시에 적용된 시스템식 부탁드립니다.
매번 번거롭게 해드려 죄송하고 감사드립니다.
수고하세요.
2015-10-28
189
글번호 91837
답변완료
함수수정요청(11-1호)_특이치제거
아래는 최근 10일동안 해외선물의 일중 움직임(시가와 고가, 고가와 저가, 시가와 저가)을 관찰하여 매매의 전략을 세우고자 했었습니다.
단순평균을 사용하다보니 특이치를 제거하고 싶습니다.
즉 최근 10일동안 (고가-저가) 의 값이 가장 큰 값과 가장 작은 값을 제거하고
8개 값을 평균하고 싶습니다.
만약에 동일한 값이 여러 개라면 각각 1개씩만 제거하여 8개의 변수를 평균내고가 합니다.
var : entry1(0);
var : ho1(0),OL1(0),HL1(0);
var : maho1(0),maOL1(0),maHL1(0);
var : cnt1(0),sumho1(0),sumOL1(0),sumHL1(0);
var : EntryCnt1(0);
var : V1(0),V2(0),V3(0),V4(0),V5(0);
var : V6(0),V7(0),V8(0),V9(0),V10(0);
if bdate != bdate[1] Then
entry1 = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry1 = entry1+1;
ho1 = Dayhigh-Dayopen;
OL1 = DayOpen-DayLow;
HL1 = DayHigh-DayLow;
sumho1 = 0;
sumOL1 = 0;
sumHL1 = 0;
for cnt1 = 1 to 10{
sumho1 = sumho1 + (dayhigh(cnt1)-dayopen(cnt1));
sumOL1 = sumOL1 + (DayOpen(cnt1)-DayLow(cnt1));
sumHL1 = sumHL1 + (DayHigh(cnt1)-DayLow(cnt1));
}
maho1 = sumho1/10;
maOL1 = sumOL1/10;
maHL1 = sumHL1/10;
V1 =
V2 =
V3 =
V4 =
V5 =
V6 =
V7 =
V8 =
V9 =
V10 =
if MarketPosition == 0 and entry1 == 0 Then{
if V7 > V8 Then
sell("s1",AtStop,V7-0.02);
if V7 < V8 Then
sell("s2",Atlimit,V8-0.02);
}
if MarketPosition == -1 and IsEntryName("s1") == true Then{
ExitShort("sp1",atlimit,V9-0.03);
ExitShort("sl1",AtStop,V6);
}
if MarketPosition == -1 and IsEntryName("s2") == true Then{
ExitShort("sp2",atlimit,V9-0.03);
ExitShort("sl2",AtStop,V6);
}
var : TF(0);
var : Xtime(0), Etime(false),cnt(0),mav1(0),mav2(0);
var : HV(0),LV(0),HV1(0),LV1(0),HV2(0),LV2(0);
Array : HH[50](0),LL[50](0),CC[50](0);
mav1 = ma(c,5);
mav2 = ma(C,20);
TF = TimeToMinutes(stime)%30;
if Bdate != Bdate[1] Then{
Etime = true;
if stime >= 090000 Then
Xtime = 050000;
Else
Xtime = 060000;
}
if Bdate != Bdate[1] or (TF < TF[1] and stime > stime[1]) or date != date[1] Then{
HH[0] = H;
LL[0] = L;
for cnt = 1 to 49{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if HH[25+2] > 0 Then{
HV = HH[0];
LV = LL[0];
HV1 = HH[1];
LV1 = LL[1];
HV2 = HH[2];
LV2 = LL[2];
for cnt = 0 to 25{
if HH[cnt] > HV Then
HV = HH[cnt];
if LL[cnt] < LV Then
LV = LL[cnt];
if HH[cnt+1] > HV Then
HV = HH[cnt+1];
if LL[cnt+1] < LV Then
LV = LL[cnt+1];
if HH[cnt+2] > HV Then
HV = HH[cnt+2];
if LL[cnt+2] < LV Then
LV = LL[cnt+2];
}
var1 = (HV+LV)/2;
var2 = (HV1+LV1)/2;
var3 = (HV2+LV2)/2;
if Etime == true then{
if MarketPosition == 0 and CC[0] > var1 and CC[1] < var2 and CC[2] < var3 and C >= daylow+0.5 Then
buy("b",AtMarket);
if MarketPosition == 1 and c <= highest(H,BarsSinceEntry)-0.5 and CrossDown(mav1,mav2) Then
ExitLong("bx",AtMarket);
}
}
if stime == Xtime or (stime > Xtime and stime[1] < Xtime) Then{
Etime = false;
ExitLong();
}
2015-10-28
183
글번호 91835
답변완료
함수수정요청(11-1호)_특정시간대 변수 산출
아래는 최근 10일동안 해외선물의 일중 움직임(시가와 고가, 고가와 저가, 시가와 저가)을 관찰하여 매매의 전략을 세우고자 했었습니다.
그런데 최근 10일동안에 영업일의 하루 종일이 아닌 하루동안의 특정시간대의 움직임을 관찰하여 매매에 활용하고자 합니다.
즉 최근 10일동안 우리시간으로 오후 17시부터 익일 3시까지의 움직임으로 아래와 같은 함수를 짜보고 싶습니다.
수정부탁드립니다.
var : entry1(0);
var : ho1(0),OL1(0),HL1(0);
var : maho1(0),maOL1(0),maHL1(0);
var : cnt1(0),sumho1(0),sumOL1(0),sumHL1(0);
var : EntryCnt1(0);
var : V1(0),V2(0),V3(0),V4(0),V5(0);
var : V6(0),V7(0),V8(0),V9(0),V10(0);
if bdate != bdate[1] Then
entry1 = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry1 = entry1+1;
ho1 = Dayhigh-Dayopen;
OL1 = DayOpen-DayLow;
HL1 = DayHigh-DayLow;
sumho1 = 0;
sumOL1 = 0;
sumHL1 = 0;
for cnt1 = 1 to 10{
sumho1 = sumho1 + (dayhigh(cnt1)-dayopen(cnt1));
sumOL1 = sumOL1 + (DayOpen(cnt1)-DayLow(cnt1));
sumHL1 = sumHL1 + (DayHigh(cnt1)-DayLow(cnt1));
}
maho1 = sumho1/10;
maOL1 = sumOL1/10;
maHL1 = sumHL1/10;
V1 =
V2 =
V3 =
V4 =
V5 =
V6 =
V7 =
V8 =
V9 =
V10 =
if MarketPosition == 0 and entry1 == 0 Then{
if V7 > V8 Then
sell("s1",AtStop,V7-0.02);
if V7 < V8 Then
sell("s2",Atlimit,V8-0.02);
}
if MarketPosition == -1 and IsEntryName("s1") == true Then{
ExitShort("sp1",atlimit,V9-0.03);
ExitShort("sl1",AtStop,V6);
}
if MarketPosition == -1 and IsEntryName("s2") == true Then{
ExitShort("sp2",atlimit,V9-0.03);
ExitShort("sl2",AtStop,V6);
}
var : TF(0);
var : Xtime(0), Etime(false),cnt(0),mav1(0),mav2(0);
var : HV(0),LV(0),HV1(0),LV1(0),HV2(0),LV2(0);
Array : HH[50](0),LL[50](0),CC[50](0);
mav1 = ma(c,5);
mav2 = ma(C,20);
TF = TimeToMinutes(stime)%30;
if Bdate != Bdate[1] Then{
Etime = true;
if stime >= 090000 Then
Xtime = 050000;
Else
Xtime = 060000;
}
if Bdate != Bdate[1] or (TF < TF[1] and stime > stime[1]) or date != date[1] Then{
HH[0] = H;
LL[0] = L;
for cnt = 1 to 49{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if HH[25+2] > 0 Then{
HV = HH[0];
LV = LL[0];
HV1 = HH[1];
LV1 = LL[1];
HV2 = HH[2];
LV2 = LL[2];
for cnt = 0 to 25{
if HH[cnt] > HV Then
HV = HH[cnt];
if LL[cnt] < LV Then
LV = LL[cnt];
if HH[cnt+1] > HV Then
HV = HH[cnt+1];
if LL[cnt+1] < LV Then
LV = LL[cnt+1];
if HH[cnt+2] > HV Then
HV = HH[cnt+2];
if LL[cnt+2] < LV Then
LV = LL[cnt+2];
}
var1 = (HV+LV)/2;
var2 = (HV1+LV1)/2;
var3 = (HV2+LV2)/2;
if Etime == true then{
if MarketPosition == 0 and CC[0] > var1 and CC[1] < var2 and CC[2] < var3 and C >= daylow+0.5 Then
buy("b",AtMarket);
if MarketPosition == 1 and c <= highest(H,BarsSinceEntry)-0.5 and CrossDown(mav1,mav2) Then
ExitLong("bx",AtMarket);
}
}
if stime == Xtime or (stime > Xtime and stime[1] < Xtime) Then{
Etime = false;
ExitLong();
}
2015-10-28
171
글번호 91834
답변완료
다시 문의드립니다.
이전 문의드린 내용에서 아래와 같이 그대로 적용했더니 전환선 윗쪽은 분홍색으로 나타나는데 아랫쪽은 색깔이 나타나지 않습니다.
다시 한번 살펴보시고 답을 부탁드립니다. 감사합니다.
==============================
그림 1
그림1
그림 2
그림2
그림 3
그림3
안녕하세요
예스스탁입니다.
특정값을 기준으로
위와 아래의 색을 달리하고자 하시면
기본차트속성과 지표속성에서 사용자분이
몇가지 직접 설정하셔야 합니다.
1. 지표속성 설정
우선 아래식을 지표식으로 작성하신 후에
input : P(60);
Var : 전환선(0);
전환선 = (Highest(High,P) + Lowest(Low, P)) / 2;
plot1(전환선,"전환선");
plot2(999999999,"상단");
plot3(0,"하단");
f4키를 눌러 문법검증을 하고
f5키를 누르면 지표속성창이 나타납니다.
지표속성창의 차트표시탭에서
첨부된 그림과 같이 채우기 설정을 하시고
지표속성창이 Y축표시탭에서 Y축표시를 가격으로 설정합니다.
2. 기본차트속성설정
기본차트속성은 차트에서
봉을 마우스로 더블클릭하면 나타납니다.
Y축에서 화면(기본차트)로 설정합니다.
3
위 설정을 모두 마친후에 지표적용하시면 됩니다.
2015-10-28
191
글번호 91829
답변완료
시스템식 부탁드려용.
안녕하세요. 수고가 많으십니다.
시스템식부탁드립니다.
1. 매수조건
-20이평의 기울기가 양
-볼린저밴드의 상하폭이 40틱이상
-윌리엄R(14) -80우상향 과 스토캐스틱(5,3,3)이 20 우상향할때인데
둘간의 시간차가 3분이내로 둘다 돌파되었을경우
-RSI 50이하
-ADX는 우상향하고 있어야합니다.
-RSI우상향
2. 매도조건
위와 반대로이며 볼밴의 폭은 똑같습니다.
-ADX는 우상향하고 있어야합니다.
-RSI는 우하향
늘수고가 많으십니다.
고생해주세요. 감사합니다.
2015-10-28
194
글번호 91826
관리자에 의해 프로그램 사용법 QnA로 이동되었습니다
2015-10-28
2
글번호 91821
답변완료
추가 질문입니다. 감사합니다.
매번 감사합니다.
input : N(1),nday(2),pt(0.5);
var : Entry(0);
if bdate != Bdate[1] Then
Entry = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
Entry = Entry+1;
if entry < N and H < dayhigh(2)+1 Then
buy("b",AtStop,dayhigh(2)+1);
if entry < N and H > dayhigh(2)+1 Then
buy("bb",AtLimit,dayhigh(2)+1);
if entry < N and L > daylow(2)-1 Then
sell("s",AtStop,daylow(2)-1);
if entry < N and L < daylow(2)-1 Then
Sell("ss",AtLimit,daylow(2)-1);
SetStopProfittarget(0.5,PointStop);
SetStopLoss(0.5,PointStop);
SetStopEndofday(145900);
함수는 보내 주신 것에서 반대 진입도 허용할 수 있도록 제가 조금 수정한 것입니다.
설명해 드리면, 이틀전 최고가+1/최저가-1에서 정방향반대방향 매수/매도 진입 입니다.
하루 한번만 진입합니다.
1. 제가 조금 수정한 위 함수가 제대로 작동할 수 있는 것이 맞나요?
2. 위에 input괄호 안에 있는 수는 변경하여도 수식에 변화가 없나요?
3. 신호를 쭉 살펴보니 매수/매도가 이루어 지지 않아야 할 시점에서 진입이 되는 것들이 있더라구요. 장시작 봉 근처에서 오류가 좀 발생하던데, 정정할 수 있는 방법이 없을까요?
4. 위 함수에 진입 시작시간과 제한 시간을 둘 수 있나요?(가령 진입은 9시 2분부터 11시까지, 강제청산은 15시)
감사합니다!
2015-10-28
168
글번호 91820
답변완료
시스템식에서 일부 추가 부탁드립니다.
항상 감사드립니다.
시스템식에서 일부 추가 부탁드립니다.
input:매수기준이평(120); 으로 설정하고
"매수기준이평" 즉, 120일선이 차트상 우상향이면 이전과 동일하게 매수하고, "매수기준이평"이 차트상 우하향이면 "매수위치1차"를 "시장보정계수" 만큼 낮게 매수하는 시스템식으로 다음과 같이 수정해 주시면 감사하겠습니다.
#매수기준이평(120)이 우상향인지 우하향인지 판단을 하고,
#엔벨로프 기간은 우상향이면 P, 우하향이면 (P+시장보정계수)
#엔벨로프 Percent수치는 우상향이면 매수위치1차, 우하향이면 (매수위치1차+시장보정계수)
시스템식은 아래와 같습니다.
---------------------------------------------------------------------------------------
input : 전략식시작일자(20151028), 전략식시작시간(090000), 전략총매수금액(5000); # 금액은 만원단위
input : 전략식종료일자(20151231);
input : 갭하락(5),시장보정계수(5);
input : P(10),매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매수위치보정(1);
input : 매도위치1차(7), 매도위치2차(14);
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);
#일자수 계산
if date != date[1] Then
Didx = Didx+1;
#일정%이상 갭하락이면
#엔벨로프 기간은 P+시장보정계수
#엔벨로프 Percent수치는 매수위치1차+시장보정계수
if dayopen < DayClose(1)*(1-갭하락) Then{
Period = P+시장보정계수;
매수1차 = 매수위치1차+시장보정계수;
}
else{ ##일정%이상 갭하락이 아니면 기존 설정된 p와 매수위치1차로 계산
Period = P;
매수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 < 전략식진입횟수 Then
buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntrylow = L;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 Then
buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 Then
buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if LatestExitName(0) == "1차매도" then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if LatestExitName(0) == "2차매도" then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false 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 타점보유일수{
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;
}
}
2015-10-28
195
글번호 91817