커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
7745
글번호 230811
답변완료
종목검색 수식요청드립니다..
안녕하세요.
영웅문에서의 수식인데 이것을 예스랭귀지로의 변경이 필요해서 문의드립니다.
1,2번이 기본검색식(영웅문 검색식)
3번이 응용검색식입니다..가능하다면 셋 다 구현해주시면 감사하겠습니다.
3번의 조건이 너무 조잡하여 구현이 안되면
1번,2번만이라도 잘 부탁드리겠습니다.. 꾸벅..
1.지수이동평균선240(M240)을 상향돌파 이후 이평선을 '한번'도 하향 이탈하지 않고
상향돌파 이후 최소 '20'봉 이상 진행 후
( 지수이동평균선240을 상향돌파 한 후의) 전고점 상향 돌파 시
(N번째신호) 표시
2.지수이동평균선240(M240)을 상향돌파 이후 이평선을 '한번'도 하향 이탈하지 않고
상향돌파 이후 최소 '20'봉 이상 진행 후
( 지수이동평균선240을 상향돌파 한 후의) 전고점 상향 돌파 시
(첫번째신호) 표시
3.1번의 조건에서 몇가지 수정하겠습니다..
지수이동평균선240을 이탈한 후
25일이 초과되면 돌파를 초기화한다.
(즉, 25일내로 회복하면 하나의 돌파로 간주한다.)
지수이동평균선240(M240)을 상향돌파 이후
이평선을 '2번'까지는 하향 이탈해도 괜찮다.
(단, 이탈했을시 각 이탈 시 '25'일 내로 다시 이동평균선240 위로 올라와야한다.
(예) 2번이탈시, 첫번째 이탈 시 20일후 회복, 2번째이탈 시 15일 후
회복 총합은 35일이 넘었지만, 각각 25일 이내면 가능함
(이탈 전 '첫' )상향돌파 이후 최소 '20'봉 이상 진행 후
(이탈하더라도 20봉의 갯수는 계속 카운트 된다. 첫 상향돌파 후 20봉이므로)
(이탈 전 '첫' 지수이동평균선240을 상향돌파 한 후의) 전고점 상향 돌파 시
(첫신호 or 2번째신호 or 3번째신호) 표시
영웅문 수식1:
M= ma(c, 240, 종류); //종류:지수
HH= Highestsince(1, crossup(c,m), H);
Bs= barssince(crossup(c,M))+1;
cnt= countsince(crossup(c,m), C>M);
Bs == cnt and crossup(c, hh(1)) and
Bs > 지연일 //지연일:20일
영웅문 수식2:
M= ma(c, 240, 종류); //종류:지수
HH= Highestsince(1, crossup(c,m), H);
Bs= barssince(crossup(c,M))+1;
cnt= countsince(crossup(c,m), C>M);
조건=
Bs == cnt and crossup(c, hh(1)) and
Bs > 지연일; //지연일:20일
첫신호= countsince(crossup(c,m), 조건);
첫신호==1 and 첫신호(1)==0
2024-01-22
1122
글번호 175944
답변완료
문의
안녕하세요
예스스탁입니다.
var : cnt(0);
Array : WeekH[10](0),WeekL[10](0),WeeKC[10](0);
if DayOfWeek(Bdate) < DayOfWeek(Bdate[1]) Then
{
For cnt = 9 DownTo 1
{
WeekH[cnt] = WeekH[cnt-1];
WeekL[cnt] = WeekL[cnt-1];
WeekC[cnt] = WeekC[cnt-1];
}
WeekH[0] = H;
WeekL[0] = L;
}
if WeekH[0] > 0 and H > WeekH[0] Then
WeekH[0] = H;
if WeekL[0] > 0 and L < WeekL[0] Then
WeekL[0] = L;
WeekC[0] = c;
if WeekH[1] > 0 and WeekL[1] > 0 Then
{
Plot1(WeekH[1],"전주고가");
Plot2(WeekL[1],"전주저가");
Plot3(WeekC[1],"전주종가");
}
if WeekH[0] > 0 and WeekL[0] > 0 Then
{
Plot4(WeekH[1],"이번주고가");
Plot5(WeekL[1],"이번주저가");
}
여기에서 이번주 시가를 외부변수로 해서 밤11시반으로 나타나게 부탁드립니다
2024-01-21
1251
글번호 175943
답변완료
수식 도움 요청드립니다
수고에 늘 감사드립니다.
아래 수식을 예스랭귀지로 변환하고자 도움을 요청 드립니다.
매번 수고에 거듭 감사드립니다.
//@version=5
indicator(title='Super trend B', overlay=true)
length = input.int(20, minval=1)
src = close
mult1 = input.float(0.5, minval=0.001, maxval=50, title=" multiflier")
basis = ta.sma(src, length)
upper1 = basis + mult1 * ta.stdev(src, length)
lower1 = basis - mult1 * ta.stdev(src, length)
plot(basis, "Basis", color=#FF6D00)
plot(upper1, "Upper 1", color=#2962FF)
plot(lower1, "Lower 1", color=#2962FF)
// INPUTS //
st_mult = input.float(3, title='SuperTrend Multiplier', minval=0, maxval=100, step=0.01)
st_period = input.int(7, title='SuperTrend Period', minval=1)
// CALCULATIONS //
up_lev = upper1 - st_mult * ta.atr(st_period)
dn_lev = lower1 + st_mult * ta.atr(st_period)
up_trend = 0.0
up_trend := close > up_trend ? math.max(up_lev, up_trend) : up_lev
down_trend = 0.0
down_trend := close < down_trend ? math.min(dn_lev, down_trend) : dn_lev
// Calculate trend var
trend = 0
trend := close > down_trend ? 1 : close < up_trend ? -1 : nz(trend, 1)
// Calculate SuperTrend Line
st_line = trend == 1 ? up_trend : down_trend
// Plotting
//plot(st_line[1], color=trend == 1 ? color.green : color.red, style=plot.style_cross, linewidth=2, title='SuperTrend')
buy = ta.crossover(close, st_line)
sell = ta.crossunder(close, st_line)
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
//plotshape(buy, title='buy', text='Buy', color=color.new(color.green, 0), style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.new(color.white, 0)) //plot for buy icon
plotshape(sell, title='sell', text='Sell', color=color.new(color.red, 0), style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.new(color.white, 0)) //plot for sell icon
//
multiplier = input.float(title='DEV', defval=2, minval=1)
src5 = close
len5 = input.int(title='Linear length', defval=150, minval=1)
offset = 0
calcSlope(src5, len5) =>
sumX = 0.0
sumY = 0.0
sumXSqr = 0.0
sumXY = 0.0
for i = 1 to len5 by 1
val = src5[len5 - i]
per = i + 1.0
sumX += per
sumY += val
sumXSqr += per * per
sumXY += val * per
sumXY
slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
average = sumY / len5
intercept = average - slope * sumX / len5 + slope
[slope, average, intercept]
var float tmp = na
[s, a, i] = calcSlope(src5, len5)
vwap1 = i + s * (len5 - offset)
sdev = ta.stdev(close, len5)
dev = multiplier * sdev
top = vwap1 + dev
bott = vwap1 - dev
//
z1 = vwap1 + dev
x1 = vwap1 - dev
low1 = ta.crossover(close, x1)
high1 = ta.crossunder(close, z1)
plotshape(low1, title='b', text='BUY', color=color.new(color.green, 0), style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.new(color.white, 0)) //plot for buy icon
//plotshape(high1, title='high', text='HIGH', color=color.new(color.green, 0), style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.new(color.white, 0)) //plot for sell icon
/////// Alerts /////
//alertcondition(buy, title='buy')
alertcondition(sell, title='sell')
alertcondition(low1, title='buy')
//alertcondition(high1, title='buy tp')
2024-01-21
1390
글번호 175942
답변완료
부탁좀 드립니다.
상승 하는 20일선을
15일 기간안에서 (5일도 좋고, 7일도 좋고..)
20선을 돌파 했다가, 이탈 하고
재 돌파한 종목을 찾을 수 있을까요?
부탁 드립니다.
2024-01-21
1282
글번호 175941
답변완료
수식요청
안녕하세요
수식부탁드립니다
이평60선
볼밴과 이평폭 +- 10틱이내
매수식
가격이 이평 60선을 하락이나 상승후
이평 60선이 볼밴 하한선과의 폭이 +- 10틱이내인 상태에서
가격이 이평 60선을 터치나 하락후 상승시
첫봉에서 매수
매도식
가격이 이평60선을 상승이나 하락후
이평 60선이 볼밴 상한선과의 폭이 -+10틱이내
가격이 이평60선을 터치나상승후 하락시 첫봉에서 매도
2024-01-21
1206
글번호 175940
고래상어의꿈 님에 의해서 삭제되었습니다.
2024-01-21
3
글번호 175939
답변완료
질문드려요
두가지 신호를 동시에 만족시키는 종목을 검색하고 싶어요
부탁드립니다.
신호1
a=avg(c,5);
b=avg(c,20);
d=avg(c,60);
D1=(A+B+D)/3;
A1=(highest(high,9)+lowest(low,9))/2;
B1=(highest(high,26)+lowest(low,26))/2;
B2=(A1+B1)/2;
A3=RSI(9)-50;
B3=CMO(12)*0.5;
B4=A3+B3;
B5=eavg(C,120);
(crossup(B2,D1) or crossup(D1,B5) or crossup(B2,B5))
신호2
Bu=BBandsUp(20,2);
CrossUp(C, Bu(25))
2024-01-21
1180
글번호 175938
답변완료
질문드려요
신호수식인데 이신호로 종목검색하고 싶어요
부탁드립니다.
M= ma(C, 240, 삼각);
HH = HighestSince(1, CrossUp(C, M), H);
Bs = BarsSince(CrossUp(C, M))+1;
cnt = CountSince(CrossUp(C, M), C>M);
조건=
Bs == cnt &&
CrossUp(C, HH(1)) &&
Bs>20;
첫신호 = CountSince(CrossUp(C, M), 조건);
첫신호 ==1 && 첫신호(1)==0
2024-01-21
1231
글번호 175937
답변완료
문의드립니다
렌코차트식 검색하다 발견한 지표식인데요
주봉에 적용하니까 이상하게 나옵니다 (오류)
그리고 upperline, lowline 등은 아예 표시도 안되네요
수정 좀 부탁합니다
감사합니다
input:renkoSize(0.5),length(10),NumATRs(1.5);
var:j(0),k(0),renkoCnt(0),gubun(0),Sum(0),trSum(0),atrV(0),time1(0),filename("renko3.txt"),printOK(False);
array:OO[50](0),HH[50](0),LL[50](0),CC[50](0),
TR[50](0), //True Range
upperLine[50](0), //상단채널
lowerLine[50](0), //하단채널
maV[50](0); //이평선
if stime >= 180000 or stime < 090000 then{
If index == 0 or (stime == 180000) or (stime > 180000 and stime[1] < 180000) Then { //break on session에 해당, 즉 일자가 바뀌면 새로 계산
gubun = 0; //방향을 초기화한다. 이후 형성되는 가격에 의해 방향이 계산
For j = 49 DownTo 1 { //금일 시가봉을 신규 추가
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
TR[j] = TR[j-1];
maV[j] = maV[j-1];
upperLine[j] = upperLine[j-1];
lowerLine[j] = lowerLine[j-1];
}
OO[0] = C; //분봉의 종가를 기반으로 계산하기 때문에 당일 시초가 아니다
HH[0] = C;
LL[0] = C;
CC[0] = C;
}
Else {
If gubun == 0 and CC[0] > 0 Then { //일 첫봉이 완성되지 않은 시점
If OO[0] - renkoSize >= C Then {
gubun = -1; //하락 방향
CC[0] = OO[0] - renkoSize; //음봉
HH[0] = OO[0];
LL[0] = CC[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]); //true range 계산식 참조
//macd 계산 당시와 마찬가지로 sum 값이 있을 때만 처리
If sum > 0 Then {
sum = sum + CC[0] - CC[length]; //이평선 계산 원리 그대로, 현재가를 더하고 n봉전 가격 뺌
trSum = trSum + TR[0] - TR[length]; //true range의 합을 계산
maV[0] = Sum / length; //n개의 종가 합을 n으로 나누어 이동평균 계산
atrV = trSum / length; //ATR 계산식 참조
upperLine[0] = maV[0] + atrV * NumATRs; //상단 밴드 계산
lowerLine[0] = maV[0] - atrV * NumATRs; //하단 밴드 계산
}
j = 0;
if printOK then print(filename,"1=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
Else If OO[0] + renkoSize <= C Then {
gubun = 1; //상승 방향
CC[0] = OO[0] + renkoSize; //양봉
HH[0] = CC[0];
LL[0] = OO[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
If sum > 0 Then { //계속 반복되는 공통 루틴이므로 if문 바깥으로 뺄까도 했으나
sum = sum + CC[0] - CC[length]; //더 복잡해지므로 copy & paste로 처리
trSum = trSum + TR[0] - TR[length];
maV[0] = Sum / length;
atrV = trSum / length;
upperLine[0] = maV[0] + atrV * NumATRs;
lowerLine[0] = maV[0] - atrV * NumATRs;
}
j = 0;
if printOK then print(filename,"2=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
If LL[0] - renkoSize >= C Then {
gubun = -1;
renkoCnt = Int(Round((LL[0]-C)/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
TR[j] = TR[j-renkoCnt];
maV[j] = maV[j-renkoCnt];
upperLine[j] = upperLine[j-renkoCnt];
lowerLine[j] = lowerLine[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = LL[j+1];
CC[j] = LL[j+1] - renkoSize;
HH[j] = OO[j];
LL[j] = CC[j];
TR[j] = max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
If sum > 0 Then {
sum = sum + CC[j] - CC[j+length];
trSum = trSum + TR[j] - TR[j+length];
maV[j] = Sum / length;
atrV = trSum / length;
upperLine[j] = maV[j] + atrV * NumATRs;
lowerLine[j] = maV[j] - atrV * NumATRs;
}
if printOK then print(filename,"3=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If HH[0] + renkoSize <= C Then {
gubun = 1;
renkoCnt = Int(Round((C-HH[0])/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
TR[j] = TR[j-renkoCnt];
maV[j] = maV[j-renkoCnt];
upperLine[j] = upperLine[j-renkoCnt];
lowerLine[j] = lowerLine[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = HH[j+1];
CC[j] = HH[j+1] + renkoSize;
HH[j] = CC[j];
LL[j] = OO[j];
TR[j] = max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
If sum > 0 Then {
sum = sum + CC[j] - CC[j+length];
trSum = trSum + TR[j] - TR[j+length];
maV[j] = Sum / length;
atrV = trSum / length;
upperLine[j] = maV[j] + atrV * NumATRs;
lowerLine[j] = maV[j] - atrV * NumATRs;
}
if printOK then print(filename,"4=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If sTime >= 45500 and stime < 090000 Then { //당일 종가봉에서
For j = 49 DownTo 1 {
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
TR[j] = TR[j-1];
maV[j] = maV[j-1];
upperLine[j] = upperLine[j-1];
lowerLine[j] = lowerLine[j-1];
}
If LL[1] > C Then { //종가가 이전 봉보다 아래 형성
OO[0] = LL[1];
CC[0] = C;
HH[0] = OO[0];
LL[0] = CC[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
} Else If HH[1] < C Then { //종가가 이전 봉보다 위에 형성
OO[0] = HH[1];
CC[0] = C;
HH[0] = CC[0];
LL[0] = OO[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
} Else { //종가가 이전 봉의 중간에 형성
OO[0] = C;
CC[0] = C;
HH[0] = C;
LL[0] = C;
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
}
If sum > 0 Then {
sum = sum + CC[0] - CC[length];
trSum = trSum + TR[0] - TR[length];
maV[0] = Sum / length;
atrV = trSum / length;
upperLine[0] = maV[0] + atrV * NumATRs;
lowerLine[0] = maV[0] - atrV * NumATRs;
}
j = 0; //채널 값을 새로이 계산
if printOK then print(filename,"5=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
if sum == 0 and CC[length] > 0 then {
for j = 0 to length - 1 {
sum = sum + CC[j];
trsum = trsum + max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
}
}
}
If OO[0] > 0 Then Plot1(OO[0],"OO",iff(OO[0] > CC[0],black,MAGENTA)); //지표속성 -> 차트표시 -> 채우기 -> OO < CC 면 빨강 추가
If CC[0] > 0 Then Plot2(CC[0],"CC"); // OO > CC 면 파랑 추가
if upperLine[0] > 100 then plot3(upperLine[0],"UpperBand");
if lowerLine[0] > 100 then plot4(lowerLine[0],"LowerBand");
if maV[0] > 100 then plot5(maV[0],"MidLine");
2024-01-21
1330
글번호 175936