커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
3453
글번호 230811
답변완료
지표 수식 부탁드립니다
다음 TradingView 수식을 그림1과 같이 단순하게 녹색, 적색 삼각형만 표시하게끔 변환 부탁드려요. 모든 label과 수평선은 불필요합니다. 아래쪽에 GEMINI에 부탁해서 간략 버전도 있씁니다. 간략버전을 변환해 주십시오. 미리 감사드립니다.
//@version=6
indicator("Choch Pattern Levels [BigBeluga]", overlay = true, max_lines_count = 500, max_bars_back = 5000, calc_bars_count = 5000)
// INPUTS ――――――――――――――――――――{
len = input.int(10, "Length")
amount = input.int(10, "Amount of Patterns")
show_delta = input.bool(true, "Show Delta Volume", inline = "Delta")
sizeDelta = input.string("normal", "", ["tiny", "small", "normal", "large", "huge"], inline = "Delta")
col_plus = input.color(color.red, "ChoCh Up")
col_minus = input.color(color.lime, "ChoCh Dn")
var ph = float(na)
var pl = float(na)
var pl_index = int(na)
var ph_index = int(na)
var trend = false
type zone
line level
label label1
label label2
label label3
label label4
polyline poly
label label5
var ms_levels = array.new<zone>()
// }
// CALCULATIONS――――――――――{
pivotH = ta.pivothigh(len, len)
pivotL = ta.pivotlow(len, len)
if not na(pivotH)
ph_index := bar_index[len]
ph := pivotH
if not na(pivotL)
pl_index := bar_index[len]
pl := pivotL
if ta.crossover(high, ph) and not trend
check = false
l = low
lbl1 = label(na)
lbl2 = label(na)
lbl3 = label(na)
lbl4 = label(na)
lbl5 = label(na)
lne = line(na)
cp = array.new<chart.point>()
c_p1 = chart.point.from_index(ph_index, ph)
c_p2 = chart.point.from_index(bar_index, high)
cp.push(c_p1)
cp.push(c_p2)
lbl1 := label.new(c_p1, "", style = label.style_circle, color = color.new(col_plus, 30))
lbl2 := label.new(c_p2, "", style = label.style_circle, color = color.new(col_plus, 30))
delta = 0.
for i = 0 to bar_index-ph_index
l := math.min(l, low[i])
delta += close[i] > open[i] ? volume[i] : -volume[i]
for i = 0 to bar_index-ph_index
lo = low[i]
if lo == l and not check
check := true
cp.push(chart.point.from_index(bar_index-i, l))
lbl3 := label.new(bar_index-i, l, "", style = label.style_circle, color = color.new(col_plus, 30))
lne := line.new(bar_index-i, l, bar_index, l, color = col_plus)
lbl4 := label.new(bar_index, l, "◯", style = label.style_label_center, color = color.new(col_plus, 100), textcolor = col_plus)
if show_delta
lbl5 := label.new(int(math.avg(bar_index,ph_index)), math.avg(lo, high)+(high-lo)*0.1, (delta > 0 ? "+" : "") + str.tostring(delta, format.volume), style = label.style_label_center, color = color.new(col_plus, 100), textcolor = delta > 0 ? col_plus : col_minus, tooltip = "Delta Volume")
poly = polyline.new(cp, closed = true, fill_color = color.new(col_plus, 85), line_color = col_plus, line_width = 1)
z = zone.new(lne, lbl1, lbl2, lbl3, lbl4, poly, lbl5)
ms_levels.push(z)
trend := true
if ta.crossunder(low, pl) and trend
check = false
h = high
lbl1 = label(na)
lbl2 = label(na)
lbl3 = label(na)
lbl4 = label(na)
lbl5 = label(na)
lne = line(na)
cp = array.new<chart.point>()
c_p1 = chart.point.from_index(pl_index, pl)
c_p2 = chart.point.from_index(bar_index, low)
cp.push(c_p1)
cp.push(c_p2)
lbl1 := label.new(c_p1, "", style = label.style_circle, color = color.new(col_minus, 30))
lbl2 := label.new(c_p2, "", style = label.style_circle, color = color.new(col_minus, 30))
delta = 0.
for i = 0 to bar_index-pl_index
h := math.max(h, high[i])
delta += close[i] > open[i] ? volume[i] : -volume[i]
for i = 0 to bar_index-pl_index
hi = high[i]
if hi == h and not check
check := true
cp.push(chart.point.from_index(bar_index-i, h))
lbl3 := label.new(bar_index-i, h, "", style = label.style_circle, color = color.new(col_minus, 30))
lne := line.new(bar_index-i, h, bar_index, h, color = col_minus)
lbl4 := label.new(bar_index, h, "◯", style = label.style_label_center, color = color.new(col_minus, 100), textcolor = col_minus)
if show_delta
lbl5 := label.new(bar_index - i, math.avg(hi, low)-(hi-low)*0.2, (delta > 0 ? "+" : "") + str.tostring(delta, format.volume), style = label.style_label_center, color = color.new(col_minus, 100), textcolor = delta > 0 ? col_plus : col_minus)
poly = polyline.new(cp, closed = true, fill_color = color.new(col_minus, 80), line_color = col_minus, line_width = 1)
z = zone.new(lne, lbl1, lbl2, lbl3, lbl4, poly, lbl5)
ms_levels.push(z)
trend := false
body_h = close > open ? close : open
body_l = close < open ? close : open
for z in ms_levels
z.level.set_x2(bar_index+5)
z.label4.set_x(bar_index+5)
z.level.set_width(3)
z.label1.set_size(size.tiny)
z.label2.set_size(size.tiny)
z.label3.set_size(size.tiny)
z.label4.set_size(size.large)
z.label5.set_size(size.small)
if body_h > z.level.get_y1() and body_l < z.level.get_y1() or body_h[1] > z.level.get_y1() and body_l[1] < z.level.get_y1()
z.level.delete()
z.label1.delete()
z.label2.delete()
z.label3.delete()
z.label4.delete()
z.label5.delete()
z.poly.delete()
ms_levels.remove(ms_levels.indexof(z))
if ms_levels.size() > amount
z = ms_levels.shift()
z.level.delete()
z.label1.delete()
z.label2.delete()
z.label3.delete()
z.label4.delete()
z.label5.delete()
z.poly.delete()
// }
//==================================================================
// GEMINI에 부탁해서 간략화한 것입니다.
//==================================================================
//@version=6
indicator("Choch Pattern Levels[GEMINI]", overlay = true, max_lines_count = 500, max_bars_back = 5000, calc_bars_count = 5000)
// INPUTS ――――――――――――――――――――{
len = input.int(10, "Length")
amount = input.int(10, "Amount of Patterns")
col_plus = input.color(color.red, "ChoCh Up")
col_minus = input.color(color.lime, "ChoCh Dn")
var ph = float(na)
var pl = float(na)
var pl_index = int(na)
var ph_index = int(na)
var trend = false
// zone 타입에 삼각형의 기준선 정보 추가
type zone
polyline poly
float level_y
int level_bar_index
var ms_levels = array.new<zone>()
// }
// CALCULATIONS――――――――――{
pivotH = ta.pivothigh(len, len)
pivotL = ta.pivotlow(len, len)
if not na(pivotH)
ph_index := bar_index[len]
ph := pivotH
if not na(pivotL)
pl_index := bar_index[len]
pl := pivotL
if ta.crossover(high, ph) and not trend
check = false
l = low
cp = array.new<chart.point>()
c_p1 = chart.point.from_index(ph_index, ph)
c_p2 = chart.point.from_index(bar_index, high)
cp.push(c_p1)
cp.push(c_p2)
for i = 0 to bar_index-ph_index
l := math.min(l, low[i])
var found_l_index = int(na)
for i = 0 to bar_index-ph_index
lo = low[i]
if lo == l and not check
check := true
cp.push(chart.point.from_index(bar_index-i, l))
found_l_index := bar_index - i
poly = polyline.new(cp, closed = true, fill_color = color.new(col_plus, 85), line_color = col_plus, line_width = 1)
z = zone.new(poly, l, found_l_index)
ms_levels.push(z)
trend := true
// 'amount' 제한 로직
if ms_levels.size() > amount
removed_z = ms_levels.shift()
removed_z.poly.delete()
if ta.crossunder(low, pl) and trend
check = false
h = high
cp = array.new<chart.point>()
c_p1 = chart.point.from_index(pl_index, pl)
c_p2 = chart.point.from_index(bar_index, low)
cp.push(c_p1)
cp.push(c_p2)
for i = 0 to bar_index-pl_index
h := math.max(h, high[i])
var found_h_index = int(na)
for i = 0 to bar_index-pl_index
hi = high[i]
if hi == h and not check
check := true
cp.push(chart.point.from_index(bar_index-i, h))
found_h_index := bar_index - i
poly = polyline.new(cp, closed = true, fill_color = color.new(col_minus, 80), line_color = col_minus, line_width = 1)
z = zone.new(poly, h, found_h_index)
ms_levels.push(z)
trend := false
// 'amount' 제한 로직
if ms_levels.size() > amount
removed_z = ms_levels.shift()
removed_z.poly.delete()
// --- 캔들 교차 시 오래된 삼각형을 삭제하는 로직 ---
body_h = close > open ? close : open
body_l = close < open ? close : open
// **수정된 부분: 배열이 비어있지 않은지 먼저 확인**
if ms_levels.size() > 0
for i = ms_levels.size() - 1 to 0
z = ms_levels.get(i)
// level_y 또는 level_bar_index가 na 값이 아닌지 확인 (안전 장치)
if not na(z.level_y) and not na(z.level_bar_index)
if bar_index > z.level_bar_index and (
(body_h > z.level_y and body_l < z.level_y) or
(body_h[1] > z.level_y and body_l[1] < z.level_y)
)
z.poly.delete()
ms_levels.remove(i)
2025-07-31
475
글번호 192881
답변완료
수식 변환 부탁드립니다
다음수식 예스트레이더로 변환 부탁드립니다.
A = Sum(V);
A1 = ValueWhen(1,date(1)!= date, A(1));
B = A-A1;
B1 = ValueWhen(1,date(1)!= date, B(1));
CrossUp(B, B1)
2025-07-30
218
글번호 192880
답변완료
신호변환 부탁 드려요^^
키움에서 쓰던거라 지표는 다만들었는데...답답한게 많네요. 도움 주시면 감사하겠습니다.
1. 후팬볼밴(파랑)
Bu = BBandsUp(20,2);
Crossup(C, Bu(25))
2. 후팬볼밴5(핑크)
Bu = BBandsUp(20,2);
Crossup(C, Bu(25)) && C>C(1) * 1.05
3. 저점W패턴(녹색)
M = ma(C, 20);
T = LRL(20) + LRS(20);
T저점 = T>T(1) && T(1)<T(2);
shift(T저점, -1)
2025-07-30
272
글번호 192878
답변완료
질문 부탁드립니다
그럼 만약에 최초 조건 만족시가 아니라
조건 만족 할때마다 var1에 새로운 값이 들어가게 될때는 if var1 ==0 and 가 들어가야 하나요?
아니면 그냥 if aa[y] >= aa[x] *2 then 이라고 해도 되나요?
코드 진행 순서가 궁금한데요 for문을 반복 수행할때마다 다시 코드 시작점 (var1=0; 부터)으로 돌아가서 반복을 하는게 아니라 for 시작점 (for x = 0 to 5 )에서 다시 시작하는게 맞지 않나요??
감사합니다
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];
}
}
}
2025-07-30
235
글번호 192875
답변완료
검색식 부탁드립니다~
수고 많으십니다.
아래 조건을 만족할 때 검색식 부탁드립니다.
< 조건1 >
crossup(c,((predayhigh()+
predaylow()+predayclose())/3)
+(predayhigh()-predaylow()))
< 조건 2 >
s=sum(1);
valuewhen(1,624-s==20,(종가+시가)/2);
** 3분봉 상, 검색 조건 **
조건1이 2번 이상 발생 되고 난 후
조건2를 깨고 내려갔다가 다시 돌파 할 때 or 깨지 않고 조건2를 지지할 때
(당일 or 며칠 후)
2025-07-30
254
글번호 192868
답변완료
신호검색 부탁드립니다
Hu = WMa(WMa(c,Period/2)*2 - WMa(c, Period), floor(sqrt(Period)));
T = LRL(C,Period)+LRS(C,Period);
조건Up=CrossUp(Hu,T) && Hu>Hu(1) && T>T(1);
조건Dn=CrossDown(Hu,T) && Hu<Hu(1) && T<T(1);
최종=C>Hu && C>T && O<Hu && O<T && Hu>Hu(1) && T>T(1);
bs=BarsSince(조건up);
cnt=CountSince(조건Up,조건Dn)==1;
bs<봉수 && cnt(1) && 최종
Period=20
봉수=20
2025-07-30
233
글번호 192867
답변완료
예스스팟 스튜디오
처음 실행하다 보니 오류가 뜨네요. 도움 주시면 감사하겠습니다. 에러는 줄번호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
338
글번호 192865
답변완료
검색식 부탁드립니다. _(_ _)_
항상 도와주심에감사드립니다. _(__)_
이동평균선이 480 240 120 60 20 5에서 배열에 상관없이
한번에 이 모든 이평선을 돌파한 종목 검색식을 부탁드립니다.
2025-07-30
243
글번호 192861
답변완료
수퍼트랜드
수퍼트랜드 지표식부탁합니다
2025-07-29
238
글번호 192860