커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1693
글번호 230811
답변완료
재문의드립니다.
안녕하세요.
아래수식을 돌리면 매매가 일어나지가 않습니다.
수정을 부탁드립니다.
그리고
if SPrice == 0 and
Bdate == bdate[2] and
C > mav and
C <= O and
C[1] > O[1] and C[2] > O[2] and
C <= DayClose(1)*1.15 Then
SPrice = C;
수식에서 SPrice = C; 가 아니고 종가가 아니고 시가이므로 SPrice = O;
인것 같습니다.
안녕하세요
예스스탁입니다.
input : 시작날짜(20210429),시작시간(110000);
input : 금액(3000000),진입횟수(3);
var : mav(0),SPrice(0),tcond(False);
var : 상한가(0), UpLimit(0),entry(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if sDate == 시작날짜 and sTime >= 시작시간 Then
Tcond = true;
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;
}
}
mav = ma(C,33);
if Bdate != Bdate[1] Then
{
SPrice = 0;
entry = 0;
}
if (MarketPosition != 0 and MarketPosition != MarketPosition[1]) or
(MarketPosition == MarketPosition[1] and TotalTrades > TotalTrades[1]) Then
entry = entry+1;
if SPrice == 0 and
Bdate == bdate[2] and
C > mav and
C <= O and
C[1] > O[1] and C[2] > O[2] and
C <= DayClose(1)*1.15 Then
SPrice = C;
if MarketPosition == 0 and Tcond == true and SPrice > 0 and CrossUp(C,SPrice) and entry < 0 and 진입횟수 Then
Buy("b",OnClose,DEf,Floor(금액/C));
if MarketPosition == 1 Then
{
Sprice = 0;
if TimeToMinutes(sTime) >= TimeToMinutes(EntryTime(0))+60 Then
ExitLong("bx");
if CurrentContracts == MaxContracts Then
ExitLong("bp",AtLimit,EntryPrice*1.05,"",Floor(MaxContracts*0.5),1);
Else
ExitLong("be",AtStop,EntryPrice);
ExitLong("bu",AtLimit,상한가);
}
SetStopLoss(3,PercentStop);
SetStopProfittarget(15,PercentStop);
SetStopEndofday(151500);
즐거운 하루되세요
> 종호 님이 쓴 글입니다.
> 제목 : 조건식 수정 문의합니다
> 아래에서 주문시 300만원 해당되게 매수되도록 수정하고요.
매수하고 나서 수익 청산이던지 본절,손절 어떤 청산이던지 매수 잔고가 0 이
되면 초기화하도록 부탁드립니다.
초기화 이후 조건이 만족하면 또 반복 메수되고 청산하도록 하고요.
1일에 최대 매수 횟수를 3회만 되도록 부탁드립니다.
안녕하세요
예스스탁입니다.
날짜시간을 지정해서 해당일시 이후에 신호가 발생하게 하는 방법뿐이 없습니다.
input : 시작날짜(20210429),시작시간(110000);
var : mav(0),SPrice(0),tcond(False);
var : 상한가(0), UpLimit(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if sDate == 시작날짜 and sTime >= 시작시간 Then
Tcond = true;
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;
}
}
mav = ma(C,33);
if Bdate != Bdate[1] Then
SPrice = 0;
if SPrice == 0 and
Bdate == bdate[2] and
C > mav and
C <= O and
C[1] > O[1] and C[2] > O[2] and
C <= DayClose(1)*1.15 Then
SPrice = C;
if Tcond == true and SPrice > 0 and CrossUp(C,SPrice) Then
Buy();
if MarketPosition == 1 Then
{
if TimeToMinutes(sTime) >= TimeToMinutes(EntryTime(0))+60 Then
ExitLong("bx");
if CurrentContracts == MaxContracts Then
ExitLong("bp",AtLimit,EntryPrice*1.05,"",Floor(MaxContracts*0.5),1);
Else
ExitLong("be",AtStop,EntryPrice);
ExitLong("bu",AtLimit,상한가);
}
SetStopLoss(3,PercentStop);
SetStopProfittarget(15,PercentStop);
SetStopEndofday(151500);
즐거운 하루되세요
> 종호 님이 쓴 글입니다.
> 제목 : 문의합니다.
> 주식종목을 검토하다 장중에 좋은 주식이 나오면
장중 시간에 들어가서 시스템으로 매매하고 싶습니다.
그런데
예를 들어 11시에 시스템을 돌렸다면
11시 이전에 매수신호가 나온 것이 있을 수 있어서 피라미딩은 안한다는 전제하에
11시 이후에는 다시 진입을 할 수가 없다는 것입니다.
그래서 input 변수로 날자와 시간을 변수로 집어넣고 11시 이후로
시간을 변경하고서 시스템을 가동되도록 하면 되겠다는 생각이 들었습니다.
이 방법밖에 없는지요? 다른 방법이 있으면 가르쳐 주시고요.
장중 중간에 들어가서도 작동할 수 있도록 부탁드립니다.
이하 매매 방법입니다.
매수 준비 : 3분봉에서 주가가 주기가 33 이평선 위에 있고
현재봉이 도지 또는 음봉이 생기면 현재봉 바로 직전 첫째봉과
둘째봉이 연속 양봉이어야 합니다.
이 때 현재봉의 도지나 음봉의 시가를 매수기준가 라고 정의합니다.
매수 : 매수 기준가가 전날의 일봉 종가 대비 115% 이하이고 현재가가 매수 기준가를 돌파할 때 매수합니다.
손절 :3% 손실시 손절합니다.
이익청산 : 매수 후 5% 이익시 절반청산하고 이후에 하락하면 매수가 본전에서 나머지 전량청산합니다.
그리고
나머지 절반을 일단 상한가 매도를 걸어놓고 또 15 % 이익이 나면 나머지 전량 청산합니다.
안팔리면 매수이후에 1시간 될 때 전량 청산하고 메수후 혹시 1시간 이전에 장이 끝나게 되면 종가에 전량 청산합니다.
2021-05-04
1083
글번호 148656
답변완료
수식 질문드립니다.
아래는 이상없이 잘 되고 있습니다.
혹시 30분봉의 (20,2)를 1분봉에 그릴수있는지 궁금합니다.
부탁드립니다.
감사합니다!!
## 분봉에서 일봉 볼린져밴드 계산 시작
input : dayPeriod(20),dayDv(2);
Input : Period7(1000);
var : daysum(0),daycnt(0),dayma(0),daySumSqrt(0),dayStdv(0);
var : dayBBup(0),dayBBdn(0),dayCounter(0);
var1 = ma(C,Period7);
#일봉 이동평균 계산
daysum = 0;
for daycnt = 0 to dayPeriod-1{
daysum = daysum + DayClose(daycnt);
}
dayma = daysum/dayPeriod;
#표준편차 계산
If DayClose(dayPeriod) != 0 Then {
daySumSqrt = 0;
For dayCounter = 0 To dayPeriod - 1 {
daySumSqrt = daySumSqrt + (DayClose(dayCounter) - dayma)^2;
}
dayStdv = SquareRoot(daySumSqrt / dayPeriod);
}
Else
dayStdv = 0;
# 일봉 볼린져밴드 계산
dayBBup = dayma + (dayDv * dayStdv);
dayBBdn = dayma - (dayDv * dayStdv);
plot1(dayBBup ,"상단");
plot2(dayma,"중단");
plot3(dayBBdn,"하단");
Plot4(var1, "777");
2021-05-04
1067
글번호 148655
답변완료
수식작성
진행중인 캔들 9개중 5개가 양봉으로 봉 완성시 5분선 위에 있을때 buy 진입신호
진행중인 캔들 9개중 5개가 음봉으로 봉 완성시 5분선 아래에 있을때 sell 진입신호의
수식어를 부탁드립니다.
매매시간은 10 :30 ~ 21: 30 그리고 22 :00 ~ 익일 03 :50 각각 부탁 드립니다
익절 70틱 손절 20틱 목표수익 120틱
2021-05-04
981
글번호 148654
답변완료
수식작성
진행중인 캔들 9개중 5개가 양봉으로 봉 완성시 5분선 위에 있을때 buy 진입신호
진행중인 캔들 9개중 5개가 음봉으로 봉 완성시 5분선 아래에 있을때 buy 청산신호의
수식어를 부탁드립니다.
매매시간은 10 :30 ~ 21: 30 그리고 22 :00 ~ 익일 03 :50 각각 부탁 드립니다
익절 70틱 손절 20틱 목표수익 120틱
---------------------------------------
진행중인 캔들 9개중 5개가 음봉으로 봉 완성시 5분선 아래에 있을때 sell 진입신호
진행중인 캔들 9개중 5개가 양봉으로 봉 완성시 5분선 위에 있을때 sell 청산신호의
수식어를 부탁드립니다.
매매시간은 10 :30 ~ 21: 30 그리고 22 :00 ~ 익일 03 :50 각각 부탁 드립니다
익절 70틱 손절 20틱 목표수익 120틱
2021-05-04
894
글번호 148653
답변완료
검토좀 부탁합니다
안녕하세요
게시글 72215 와 기존 식을 추가 했습니다
이렇게 해도 저렇게 작동이 되지 않습니다
검토좀 해주시고요
문제점 1 틱차트 사용합니다
시간제한에 문제가 있습니다
문제점 2 문제점1의 문제를 해결하고자 게시글 72215 를 추가했는데도
역시 문제점이 해결되지 않습니다
참고로 봉갯수도 변경해보아도 같네요
이미지를 보시면 특정 이평선 위에 아래를 기준은 준것입니다
갯수제한 때문인지 작동이 되지 않습니다
수정좀 부탁합니다
input : 완전청산 (260);
input : 손절가 (65);
var : T1(0),T2(0);
#var : tX(0),BH(0),SH(0); #수익 틱수조건
var : T21(0),T26(0),T23(0),T24(0),T25(0); #수익틱수
var : T11(0),T22(0),T33(0),T44(0),T55(0); #수익틱수
var : Tcond(false); # 시간제한
var : mav1(0),mav2(0),Lcnt(0),Hcnt(0),BH(0),SL(0); #손절식 조건
var : T(0),S(0),idx(0),entry2(False); # 딱 한번 매매
var1 = ma(c,0);
var2 = ma(C,0);
var3 = ma(C,0);
var4 = ma(c,0);
//시간타이머식
if (sdate != sdate[1] and stime >= 101600) or
(sdate == sdate[1] and stime >= 101600 and stime[1] < 101600) Then
Tcond = true;
if (sdate != sdate[1] and stime >= 1720000) or
(sdate == sdate[1] and stime >= 1720000 and stime[1] < 1720000) Then
{
Tcond = false;
if MarketPosition == 1 Then
ExitLong();
if MarketPosition == -1 Then
ExitShort();
}
if Tcond == true then
{
if var1 > var2 and var1 > var3 and var1 > var4 and var4 > var2 Then
T1 = 1;
if var1 < var2 and var1 < var3 and var1 < var4 and var4 < var2 Then
T1 = -1;
if T1 == 1 and T1[1] == -1 Then
buy("매수");
if T1 == -1 and T1[1] == 1 Then
sell("매도");
####################################################
#딱 한번 매매
if Bdate != Bdate[1] Then
{
idx = 0;
entry2 = true;
}
idx = idx+1;
if idx <= 10 then
{
if MarketPosition != 0 and MarketPosition != MarketPosition[1] and
(IsEntryName("매수1") == true or IsEntryName("매도1") == true) Then
entry2 = False;
}
var5 = ma(C,100);
if CrossUp(C,var5) Then
{
T = 1;
S = 0;
}
if CrossDown(C,var5) Then
{
T = -1;
S = 0;
}
if T == 1 Then
{
S = S+1;
if idx >= 10 and entry2 == true and S == 10 Then
{
Entry2 = False;
Buy("매수2");
}
}
if T == -1 Then
{
S = S+1;
if idx >= 10 and entry2 == true and S == 10 Then
{
entry2 = False;
Sell("매도2");
}
}
}
#매수 손절식
if MarketPosition == 1 Then
{
ExitLong("bx5",AtLimit,EntryPrice+PriceScale*완전청산,"",5,1);
ExitLong("bx6",AtStop,EntryPrice-PriceScale*손절가,"",5,1);
}
Else
Lcnt = 0;
#매도 손절식
if MarketPosition == -1 Then
{
ExitShort("sx5",AtLimit,EntryPrice-PriceScale*완전청산,"",5,1);
ExitShort("sx6",AtStop,EntryPrice+PriceScale*손절가,"",5,1);
}
Else
Hcnt = 0;
2021-05-04
893
글번호 148652
답변완료
색상 좀 요청 드립니다.
* 항상 많은 도움에 고맙습니다.
*
아래 지표 스톡에서 "StoD" 지표가 80 이상이면 "RED"
80~ 20 이면 무색
20 이하면 GREEN 색상으로 부탁 좀 드립니다.
Input : Period(12), Period1(5), Period2(5);
var : StoK(0),StoD(0);
StoK = StochasticsK(Period,Period1);
StoD = StochasticsD(Period,Period1,Period2);
Plot1(StoK, "StochasticsK");
Plot2(StoD, "StochasticsD");
PlotBaseLine1(20, "기준선20");
PlotBaseLine2(80, "기준선80");
고맙습니다.
2021-05-03
885
글번호 148651
러블리 님에 의해서 삭제되었습니다.
2021-05-03
6
글번호 148650
답변완료
도무지 이해가 되지 않습니다
var1 = dayopen(0);
if C > var1 and var1 > O Then
Buy("b");
if C < var1 and var1 < O Then
Sell("s");
분봉에서 예를 들어서 60분봉에서
일봉의 시가선을 그리고 싶다고 말씀 드렸는데
지표가 아닌 시스템으로 아무 의미가 없는 수식을 작성해 주셨습니다
전에 제가 질문 하셨던 거 기억하시죠?
하루가 분봉에서 일봉의 시가선을 구현하고 싶습니다
참고로 예스코인트레이더 쓰고 있씁니다
하루종일 장이 돌아 갑니다
1년 내내 쉬지 않고 장이 돌아 갑니다
방법을 찾아서 강구해 주셨으면 합니다
늘 감사드립니다 ()
2021-05-03
656
글번호 148649
답변완료
산식검토 72242번 계속입니다
작성해주신 산식이
그림에서 보듯이 일부는 수평을 보이고 일부는 변화를 하고 있습니다
그리고 N값이 0이거나 0이상이든지 변화가 전혀 없습니다
재검토 및 주석 부탁드립니다
Input : P(5),N(2);
Var : Gap(0),SumGap(0),DGO(0), DGH(0), DGL(0),DGC(0),DGC1(0);
var : cnt(0),DTH(0),DTL(0),Sum(0),DGatr(0);
Array : DTR[100](0);
If Date != Date[1] Then
{
#Gap = Open-Close[1];
#sumGap = sumGap+gap;
DGC1 = DGC[1];
DGO = O-sumGap;
DGH = H-sumGap;
DGL = L-sumGap;
For cnt=1 to 99
{
DTR[cnt]=DTR[cnt-1][1];
}
}
If H-sumGap>DGH Then
DGH=H-sumGap;
If L-sumGap<DGL Then
DGL=L-sumGap;
DGC = C-sumGap;
If DGC1>DGH Then
DTH=DGC1;
Else
DTH=DGH;
If DGC1<DGL Then
DTL=DGC1;
Else
DTL=DGL;
DTR[0]=DTH-DTL;
If DTR[P]>0 Then
{
sum=0;
For cnt=N To P+N-1
{
sum=sum+DTR[cnt];
}
DGatr=sum / P;
}
Plot1(DGatr);
2021-05-03
802
글번호 148648