커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1533
글번호 230811
답변완료
예스스팟 스튜디오
처음 실행하다 보니 오류가 뜨네요. 도움 주시면 감사하겠습니다. 에러는 줄번호15, 17에서 SyntaxError이라고 뜹니다.
var timer5 = 2; // 2초
var 매수금 = 100000;
var 손절 = 0.95;
var 익절 = 1.05;
var OrderList = [];
var MKList = [];
var req;
?
// 종목 제한 수 (변수로 설정)
var 종목제한수 = 10;
?
function Main_OnStart() {
// 1번 타이머, 1초
Main.SetTimer(1, timer5 * 1000);
?
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
}
?
function Main_OnTimer(nEventID) {
var d = new Date();
YYYYMMDD = d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();
HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
?
if (nEventID == 1 && HHMMSS > 090000 && HHMMSS < 100000) {
// 종목검색 수행
Main.ReqPowerSearch("변동성 돌파전략");
}
?
if (nEventID == 2) {
Main.ReqMarketData(OrderList[req]);
}
}
?
function Main_OnRcvItemList(aItemList, nCount) {
Main.KillTimer(1);
?
OrderList = [];
?
if (nCount >= 1) {
if (MKList.length == 0) {
OrderList = aItemList.slice(0, 종목제한수); // 한정된 수만 가져오기
} else {
for (var a = 0; a < nCount; a++) {
var Add = true;
for (var b = 0; b < MKList.length; b++) {
if (aItemList[a] == MKList[b].code) {
Add = false;
}
}
?
if (Add == true && !IsStockInAccount(aItemList[a])) {
OrderList.push(aItemList[a]);
// 제한 수를 넘는 경우 break
if (OrderList.length >= 종목제한수) {
break;
}
}
}
}
?
if (OrderList.length == 0) {
Main.SetTimer(1, timer5 * 1000);
} else {
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
}
?
function Main_OnRcvMarketData(MarketData) {
if (MarketData.code == OrderList[req]) {
MKList.push(MarketData);
?
// 계좌에 같은 종목이 있는지 확인
if (!IsStockInAccount(MarketData.code)) {
// 계좌에 없는 경우에만 매수
Account1.OrderBuy(MarketData.code, 1, 0, 1);
//Account1.OrderBuy(MarketData.code, Math.floor(매수금 / MarketData.Ask(1)), 0, 1);
//Account1.OrderBuy(MarketData.code, Math.floor(매수금 / MarketData.Ask(1)), MarketData.Ask(1), 0);
?
// 지정가로 주문하고자 하시면 주문함수 내용을 위와 같이 변경하시면 됩니다.
Main.MessageList(MarketData.code + " 주식을 매수합니다.");
} else {
Main.MessageList(MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");
}
?
req = req + 1;
?
if (req < OrderList.length) {
var aa = Main.ReqMarketData(OrderList[req]);
if (aa == -1) {
Main.SetTimer(2, 15000);
}
} else {
Main.SetTimer(1, timer5 * 1000);
}
}
}
?
function IsStockInAccount(stockCode) {
// 계좌에 해당 종목이 있는지 확인하는 함수
var numberOfBalances = Account1.GetTheNumberOfBalances();
?
for (var i = 0; i < numberOfBalances; i++) {
Account1.SetBalance(i);
if (stockCode == Account1.Balance.code) {
return true; // 계좌에 같은 종목이 있으면 true 반환
}
}
?
return false; // 계좌에 같은 종목이 없으면 false 반환
}
2025-07-30
275
글번호 192865
답변완료
검색식 부탁드립니다. _(_ _)_
항상 도와주심에감사드립니다. _(__)_
이동평균선이 480 240 120 60 20 5에서 배열에 상관없이
한번에 이 모든 이평선을 돌파한 종목 검색식을 부탁드립니다.
2025-07-30
219
글번호 192861
답변완료
수퍼트랜드
수퍼트랜드 지표식부탁합니다
2025-07-29
216
글번호 192860
답변완료
검색식 부탁드립니다.
안녕하세요. 아래수식으로 검색식 부탁드립니다.
EMA1=eavg(C,기간1);
EMA2=eavg(EMA1,기간1);
EMA3=eavg(EMA2,기간1);
B=3*EMA1-3*EMA2+EMA3; // 테마선
E24=eavg(C,기간2);
W24=wavg(C,기간2);
A5=(C+nPreWC(1)+nPreWC(2)+nPreWC(3)+nPreWC(4))/5;
C>=W24 and C>=A5 and crossup(B,E24)
지표변수
기간1:20
기간2:224
주봉함수:nPreWC(n)------- n주전종가
현재가가 W24보다 크거나 같고 현재가가 5주이평(A5)보다 크거나 같을때 테마선(B)이 E24를 돌파
2025-07-29
236
글번호 192859
ujkl 님에 의해서 삭제되었습니다.
2025-07-30
8
글번호 192858
답변완료
간단식 부탁드립니다
거의 수동매식 인데요. 아래와 같은 식이 가능한지요?
-지정가를 변수로 처리하고,차트를 보다가 숫자를 수동으로 입력하면
-가격이 하락하다가 지정가 위에 일정틱에서 즉시주문이 나가도록 하고 싶습니다
-가령 변수로 설정해놓은 지정가를 1로 입력하면 가격이 하락해서 1.04 도달(atlimit)할
때 즉시매수
-아래와 같은 식으로 시뮬레이션 해보면 신호가 발생하는 데, 가격이 상승중일 때 신호가
발생하거나,장초반 그냥 신호발생, 두번째 이후 신호에서 1이하 0.1,0.3 이런 신호가 발생합니다. 수정부탁합니다.
-당일 매매 조건을 추가해주시면 감사
INPUT:횟수(10),지정가(0),진입틱(0.04),LOSS(30);
var : ii(0),entry(0),T1(0);
if Bdate != Bdate[1] Then
ii = 0;
if Bdate != Bdate[1] Then
T1 = TotalTrades;
if MarketPosition == 0 Then
entry = TotalTrades-T1;
Else
entry = TotalTrades-T1+1;
if MarketPosition==0 and entry< 횟수 Then//
{
Buy("nowb",AtLimit,지정가+PriceScale*진입틱);
}
SetStopLoss(LOSS,PercentStop);
SetStopEndofday(151500);
2025-07-29
200
글번호 192857
답변완료
변환 부탁드립니다.
트레이팅 뷰 수식입니다.
적용가능하도록 부탁 드립니다.
indicator("RSI Shift Zone [ChartPrime]", overlay = false, max_labels_count = 500)
// --------------------------------------------------------------------------------------------------------------------{
rsi_len = input.int(14, "RSI length")
upper_level = input.int(70, "Upper RSI Level", minval = 50)
lower_level = input.int(30, "Lower RSI Level", maxval = 50)
min_channel_len = input.int(15, "Minimal bars length of the channel")
display_rsi_val = input.bool(false, "Display RSI Values at the Zones")
upper_col = input.color(#21c997, "↑", inline = "colors")
lower_col = input.color(#cc24e2, "↓", inline = "colors")
var start = int(na)
var trigger = false
var float upper = na
var float lower = na
var channel_color = color(na)
color bar_color = na
// --------------------------------------------------------------------------------------------------------------------{
rsi = ta.rsi(close, rsi_len)
channel_upper = ta.crossover(rsi, 70) and not trigger
channel_lower = ta.crossunder(rsi, 30) and not trigger
rsi_color = color.from_gradient(rsi, 30, 70, lower_col, upper_col)
if channel_upper
label.new(bar_index, rsi, style = label.style_circle, size = size.tiny, color = color.new(rsi_color, 45))
label.new(bar_index, rsi, str.tostring(upper_level), style = label.style_label_center, size = size.small, color = color.new(rsi_color, 100))
start := bar_index
trigger := true
upper := high
lower := low
channel_color := rsi_color
bar_color := rsi_color
if display_rsi_val
label.new(bar_index, hl2, "RSI: " + str.tostring(upper_level), style = label.style_label_right, color = color.new(rsi_color, 100), textcolor = chart.fg_color, force_overlay = true)
if channel_lower
label.new(bar_index, rsi, style = label.style_circle, size = size.tiny, color = color.new(rsi_color, 45))
label.new(bar_index, rsi, str.tostring(lower_level), style = label.style_label_center, size = size.small, color = color.new(rsi_color, 100))
start := bar_index
trigger := true
upper := high
lower := low
channel_color := rsi_color
bar_color := rsi_color
if display_rsi_val
label.new(bar_index, hl2, "RSI: " + str.tostring(lower_level), style = label.style_label_right, color = color.new(rsi_color, 100), textcolor = chart.fg_color, force_overlay = true)
if bar_index-start >= min_channel_len
trigger := false
trigger_change = channel_upper != channel_upper[1] or channel_lower != channel_lower[1]
// --------------------------------------------------------------------------------------------------------------------}
// 📌 𝙑𝙄𝙎𝙐𝘼𝙇𝙄𝙕𝘼𝙏𝙄𝙊𝙉
// --------------------------------------------------------------------------------------------------------------------{
barcolor(bar_color)
prsi = plot(rsi, "RSI", color = rsi_color, linewidth = 2)
p50 = plot(50, color = color.gray, editable = false)
plower = plot(lower_level, "Lower RSI Level", color = bar_index % 3 == 0 ? na : color.gray)
pupper = plot(upper_level, "Upper RSI Level", color = bar_index % 3 == 0 ? na : color.gray)
fill(prsi, pupper, rsi >= upper_level ? color.new(rsi_color, 80) : na)
fill(prsi, plower, rsi <= lower_level ? color.new(rsi_color, 80) : na)
plot(trigger_change ? float(na) : upper, force_overlay = true, style = plot.style_linebr, offset = -1, color = channel_color, editable = false)
plot(trigger_change ? float(na) : lower, force_overlay = true, style = plot.style_linebr, offset = -1, color = channel_color, editable = false)
p1 = plot(trigger_change ? float(na) : upper, force_overlay = true, style = plot.style_linebr, color = color.new(channel_color, 70), linewidth = 3, editable = false)
p2 = plot(trigger_change ? float(na) : lower, force_overlay = true, style = plot.style_linebr, color = color.new(channel_color, 70), linewidth = 3, editable = false)
fill(p1, p2, color.new(channel_color, 90))
plot(trigger_change ? float(na) : math.avg(upper, lower), force_overlay = true, style = plot.style_linebr, offset = -1, color = color.gray, editable = false)
plot(trigger_change ? float(na) : math.avg(upper, lower), force_overlay = true, style = plot.style_linebr, color = color.gray, editable = false)
// --------------------------------------------------------------------------------------------------------------------}
2025-07-29
285
글번호 192856
답변완료
문의
수고 하십니다. 수식 문의 합니다
1 신 고가 10
첫 신 고가 에서만 진입하고 0.2 포인터 하락 시마다 5번 진입 합니다 (첫 신호 이후에 2.3.4.5....나오는 신호는 모두 무시합니다 - 첫 신호만 적용 합니다)
2 신 저가 10
첫 신 저가 에서만 진입하고 0.2 포인터 상승 시마다 5번 진입 합니다 (첫 신호 이후에 2.3.4.5....나오는 신호는 모두 무시합니다 - 첫 신호만 적용 합니다)
3 첫 신호만 적용하는 식 부탁합니다
2025-07-29
224
글번호 192855
답변완료
질문 부탁드립니다
수고하십니다
아래식에서 aa[y] 조건이 최초로 만족했을때만 var1 에 저장하려고 하면 아래와 같이 작성하면 되나요? 최초 만족했을때 for loop 를 중단하려고 합니다
이런경우 처럼 중첩 for문에서는 x, y 모두에 하나 더 큰 값을 주면 되는지 아니면 y에만 하면 되는가요?
그리고 수식 처음에 var1=0; 으로 초기화를 했는데
밑에서 if var1==0 and 라고 조건에 명시해야 하나요??
var1==0 조건을 안넣게 되면 어떻게 달라지나요??
감사합니다
var : x(0) , y(0);
var1=0;
for x = 0 to 5
{
for y= 0 to 4+(x*5)
{
if var1 ==0 and aa[y] >= aa[x] *2 then
{
var1= aa[y];
y=4+(x*5) + 1;
x=6;
}
}
}
2025-07-29
223
글번호 192854