커뮤니티
예스랭귀지 Q&A
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1317
글번호 230811
답변완료
부탁드립니다 항상 감사합니다
Input:
rsiLen(14), rsiCut(50),
macdFastLen(12), macdSlowLen(26), macdSignalLen(9),
tp1Ratio(1.005), tp2Ratio(1.010), tp3Ratio(1.015), slRatio(0.99),
volumeMultiplier(2.0), 평균거래량기간(20),
시작시간(93000), 종료시간(150000);
Var:
rsiVal(0), macdFastEMA(0), macdSlowEMA(0),
macdMain(0), macdSignal(0), macdHist(0),
진입가(0), TP1(0), TP2(0), TP3(0), SL(0),
거래량기준(0), 텍스트ID(0), 손익비텍스트(0),
TL1(0), TL2(0), TL3(0), TL4(0),
박스상(0), 박스하(0),
매수조건(false), 청산1(false), 청산2(false), 청산3(false);
// ① RSI + MACD 계산
rsiVal = RSI(rsiLen);
If CurrentBar = 1 Then
Begin
macdFastEMA = Close;
macdSlowEMA = Close;
End
Else
Begin
macdFastEMA = (Close * (2 / (macdFastLen + 1))) + macdFastEMA[1] * (1 - (2 / (macdFastLen + 1)));
macdSlowEMA = (Close * (2 / (macdSlowLen + 1))) + macdSlowEMA[1] * (1 - (2 / (macdSlowLen + 1)));
macdMain = macdFastEMA - macdSlowEMA;
macdSignal = (macdMain * (2 / (macdSignalLen + 1))) + macdSignal[1] * (1 - (2 / (macdSignalLen + 1)));
macdHist = macdMain - macdSignal;
End;
// ② 거래량 기준
거래량기준 = Average(Volume, 평균거래량기간);
// ③ 진입 조건 + 박스 + 라벨
If sTime >= 시작시간 and sTime <= 종료시간 and 매수조건 = false Then
Begin
If rsiVal > rsiCut and macdHist > 0 and macdHist[1] < 0 and Volume > 거래량기준 * volumeMultiplier Then
Begin
진입가 = Close;
TP1 = 진입가 * tp1Ratio;
TP2 = 진입가 * tp2Ratio;
TP3 = 진입가 * tp3Ratio;
SL = 진입가 * slRatio;
박스상 = TP3;
박스하 = SL;
// 자동 매수 진입
Buy("LongEntry") Next Bar at Market;
// 박스 표시 (TL 선 4개)
TL_Delete(TL1); TL_Delete(TL2); TL_Delete(TL3); TL_Delete(TL4); Text_Delete(손익비텍스트);
TL1 = TL_New(Date, Time, 박스상, Date + 1, Time, 박스상);
TL2 = TL_New(Date, Time, 박스하, Date + 1, Time, 박스하);
TL3 = TL_New(Date, Time, 박스상, Date, Time, 박스하);
TL4 = TL_New(Date + 1, Time, 박스상, Date + 1, Time, 박스하);
For TL in [TL1, TL2, TL3, TL4] Do
Begin
TL_SetColor(TL, RGB(200,255,200));
TL_SetSize(TL, 1);
End;
// 손익비 라벨
손익비텍스트 = Text_New(Date, Time, (TP3 + SL)/2,
"손익비 " + NumToStr(AbsValue(TP3 - 진입가) / AbsValue(진입가 - SL), 1) + ":1");
Text_SetColor(손익비텍스트, Green);
Text_SetStyle(손익비텍스트, 1, 0);
텍스트ID = Text_New(Date, Time, Low, "*매수 진입조건 만족");
Text_SetColor(텍스트ID, Green);
매수조건 = true;
청산1 = false; 청산2 = false; 청산3 = false;
End;
End;
// ④ TP별 청산 시뮬레이션
If 매수조건 Then
Begin
If 청산1 = false and Close >= TP1 Then
Begin
Alert("📈 TP1 도달 – 30% 청산");
청산1 = true;
End;
If 청산2 = false and Close >= TP2 Then
Begin
Alert("📈 TP2 도달 – 50% 청산");
청산2 = true;
End;
If 청산3 = false and Close >= TP3 Then
Begin
Alert("✅ TP3 도달 – 나머지 20% 청산 완료");
청산3 = true;
매수조건 = false;
End;
If Close <= SL Then
Begin
Alert("⛔ 손절가 도달 – 전체 청산");
청산1 = true; 청산2 = true; 청산3 = true;
매수조건 = false;
End;
End;
// ⑤ 목표가 시각화
If 매수조건 Then
Begin
Plot1(TP1, "TP1", RGB(0, 150, 255));
Plot2(TP2, "TP2", RGB(0, 100, 200));
Plot3(TP3, "TP3", RGB(0, 50, 150));
End;
지표작성시 오류가 나서 수정부탁드립니다.
2.
Input:
rsiLen(14), rsiCut(50),
macdFastLen(12), macdSlowLen(26), macdSignalLen(9),
tp1Ratio(0.995), tp2Ratio(0.990), tp3Ratio(0.985), slRatio(1.01),
volumeMultiplier(2.0), 평균거래량기간(20),
시작시간(93000), 종료시간(150000);
Var:
rsiVal(0), macdFastEMA(0), macdSlowEMA(0),
macdMain(0), macdSignal(0), macdHist(0),
진입가(0), TP1(0), TP2(0), TP3(0), SL(0),
거래량기준(0), 텍스트ID(0),
TL1(0), TL2(0), TL3(0), TL4(0),
박스상(0), 박스하(0),
매도조건(false);
// ▶? 1. RSI 계산
rsiVal = RSI(rsiLen);
// ▶? 2. MACD 수동 계산 (Index 기준 초기화 제거)
If CurrentBar == 1 Then
Begin
macdFastEMA = Close;
macdSlowEMA = Close;
macdMain = 0;
macdSignal = 0;
macdHist = 0;
End
Else
Begin
macdFastEMA = (Close * (2 / (macdFastLen + 1))) + macdFastEMA[1] * (1 - (2 / (macdFastLen + 1)));
macdSlowEMA = (Close * (2 / (macdSlowLen + 1))) + macdSlowEMA[1] * (1 - (2 / (macdSlowLen + 1)));
macdMain = macdFastEMA - macdSlowEMA;
macdSignal = (macdMain * (2 / (macdSignalLen + 1))) + macdSignal[1] * (1 - (2 / (macdSignalLen + 1)));
macdHist = macdMain - macdSignal;
End;
// ▶? 3. 평균 거래량 계산
거래량기준 = ma(Volume, 평균거래량기간);
// ▶? 4. 진입 조건 + 시간 필터
If sTime >= 시작시간 and sTime <= 종료시간 Then
Begin
If rsiVal < rsiCut and macdHist < 0 and macdHist[1] > 0 and Volume > 거래량기준 * volumeMultiplier Then
Begin
매도조건 = true;
진입가 = Close;
// 목표가 / 손절가 계산
TP1 = 진입가 * tp1Ratio;
TP2 = 진입가 * tp2Ratio;
TP3 = 진입가 * tp3Ratio;
SL = 진입가 * slRatio;
박스상 = SL;
박스하 = TP3;
// ?? 손익비 박스 (TL 선 4개)
TL1 = TL_New(sDate, sTime, 박스상, sDate, sTime, 박스하);
TL2 = TL_New(sDate[1], sTime[1], 박스상, sDate[1], sTime[1], 박스하);
TL3 = TL_New(sDate[1], sTime[1], 박스상, sDate, sTime, 박스상);
TL4 = TL_New(sDate[1], sTime[1], 박스하, sDate, sTime, 박스하);
TL_SetColor(TL1, RGB(255, 200, 200)); TL_SetSize(TL1, 1);
TL_SetColor(TL2, RGB(255, 200, 200)); TL_SetSize(TL2, 1);
TL_SetColor(TL3, RGB(255, 200, 200)); TL_SetSize(TL3, 1);
TL_SetColor(TL4, RGB(255, 200, 200)); TL_SetSize(TL4, 1);
// ?? 텍스트 알림
텍스트ID = Text_New(Date, Time, High, "*진입조건만족");
Text_SetColor(텍스트ID, RGB(255, 0, 0));
End;
End;
// ▶? 5. 목표가 / 손절가 Plot 시각화
If 매도조건 Then
Begin
Plot1(TP1, "TP1", RGB(0, 150, 255));
Plot2(TP2, "TP2", RGB(0, 100, 200));
Plot3(TP3, "TP3", RGB(0, 50, 150));
Plot4(SL, "손절", RGB(255, 0, 0));
End;
매수 버젼도 만들어주시면 감사드리겠습니다. 그리고 가능하다면 위 2번째 수식의 매수 매도 통합버젼도 부탁드리겠습니다 오늘도 고생많으십니다 감사합니다
2025-05-22
319
글번호 191063
우유 님에 의해서 삭제되었습니다.
2025-05-21
17
글번호 191062
답변완료
질문 부탁드립니다
수고가 많으십니다
질문 몇 가지 부탁드리겠습니다
질문1)
text함수에서 혹시 줄 바꾸기는 가능한가요??
txtt[0]=text_new(sd[0],st[0],aa[0],NumToStr(Var22,0)+" "+NumToStr((aa[0]-aa[1])/aa[1]*100,0)+"%");
위의 식 처럼 여러개의 값이 있을때 한줄이 아닌 값 사이에 줄 바꾸기 (엔터) 로 표시를 하고 싶습니다
질문2)
(질문2와 질문3 관련 수식은 맨 아래에 첨부하였습니다)
같은 텍스트 식 ( txtt[0] ) 에 aa[] 배열의 순서를 표시를 하고 싶습니다
현재봉이 몇 번째 aa[] 인지를 표시하려고 하는데 예를들어
가장 최근봉 (aa[0] ) 에서는 0, 그 전전 봉 ( aa[2] ) 에서는 2 라고 숫자를 나타내고 싶습니다
질문3)
for- if - else 문에 관련된 질문입니다
첨부된 식에다 아래 for 문을 추가했을때,
value1=0;
for cnt=1 to 5
{
if a[0]*1.1 < a[cnt] then
{
value1=a[cnt];
}
else
{
a[1]=a[0]*1.1;
}
}
이 조건의 의미는 for 문을 수행했을때 (cnt = 1 to 5)
a[0]*1.1 < a[cnt] 경우가 없다면 a[1] 에 a[0]*1.1 를 대입하라는 의미가 되는건가요??
그리고
for cnt=1 to 5
{
if a[0]*1.2 < a[cnt] then
{
value1=a[cnt];
}
else
{
if a[0]*1.05 < a[cnt] then
{
value1=a[cnt];
}
}
}
이렇게 작성한다면 if a[0]*1.1 < a[cnt] 의 경우가 없다면
if a[0]*1.05 < a[cnt] 를 for 루프 수행 하라는 의미가 되는게 맞나요?
감사합니다
var : cnt(0), sum1(0), sumi1(0),summ(0),tt(0),hh(0),ll(0),tl(0),tl1(0),n(0),ae(0);
var: sum2(0),sumi2(0),count(0),sumaa(0),sumai(0),avgaa(0);
var : t(0),StartBarIndex(0),dd(0),d1(0),d2(0),e1(0),e2(0);
Array : ii[50](0),aa[50](0),cc[50](0),ee[50](0),ttl[30](0),txtt[40](0),
tttl1[40](0),tttl2[40](0),sd[45](0),st[45](0),ad[50](0),at[50](0);
if Bdate != Bdate[1] Then
{
DD = DD+1;
}
if (h>l*1.08) and (d1 == 0 or (d1 > 0 and dd >= d1+5)) Then
{
d1 = dd;
hh = h;
var1 = Index;
Var2 = var1[1];
Var3 = Var2[1];
sum1=0; sumi1=0; sum2=0; sumi2=0;
For cnt = 1 to (var1-Var2)
{
sum1=sum1+l[cnt];
sumi1=sumi1+1;
}
value1=sum1/sumi1;
For cnt = 49 DownTo 1
{
aa[cnt] = aa[cnt-1];
sd[cnt] =sd[cnt-1];
st[cnt] =st[cnt-1];
txtt[cnt] = txtt[cnt-1];
tttl1[cnt]=tttl1[cnt-1];
}
aa[0] = value1;
sd[0] = sDate;
st[0] = sTime;
TL_SetExtRight( tttl1[3],False);
tttl1[0] = TL_New(sd[5],st[5],aa[5],sd[0],st[0],aa[0]);
TL_SetDrawMode( tttl1[0],0);
TL_Delete( tttl1[3]);
TL_SetExtRight( tttl1[0],true);
txtt[0]=text_new(sd[0],st[0],aa[0],NumToStr(Var22,0)+" "+
NumToStr((aa[0]-aa[1])/aa[1]*100,0)+"%");
Text_SetSize(txtt[0],15);
Text_SetBold(txtt[0],1);
Text_SetStyle(txtt[0], 0, 0);
}
if aa[0] >0 then Plot11(aa[0],"average",Cyan,Def,1);
2025-05-22
215
글번호 191060
답변완료
부탁드립니다
수식이 맞는지 확인 부탁합니다
input : len(100), th(3.0); // ZigZag 기준 변동폭(%)
var :
i(0),
dir(0),
ptCnt(0),
zzIdx(0),
zzPrice(0),
zzDir(0),
rise1(0), rise2(0),
valid(false);
// 배열 변수는 'Array :' 키워드를 사용하여 별도로 선언해야 합니다.
// 여기서 100은 배열의 최대 크기입니다. len의 최대값에 따라 적절히 조정하세요.
Array : zigzagPt[100](0);
Array : zigzagIdx[100](0);
// ZigZag 포인트 탐지
for i = 1 to len - 1 begin
if dir = 0 then begin // 초기 방향 설정
if H[i] > H[0] * (1 + th / 100.0) then begin // 상승 방향 시작
dir = 1;
zzPrice = H[i];
zzIdx = i;
zzDir = 1; // 상승
zigzagPt[0] = zzPrice;
zigzagIdx[0] = zzIdx;
ptCnt = 1;
end
else if L[i] < L[0] * (1 - th / 100.0) then begin // 하락 방향 시작
dir = -1;
zzPrice = L[i];
zzIdx = i;
zzDir = -1; // 하락
zigzagPt[0] = zzPrice;
zigzagIdx[0] = zzIdx;
ptCnt = 1;
end;
end
else if dir = 1 then begin // 현재 상승 중
if L[i] < zzPrice * (1 - th / 100.0) then begin // 하락 반전
dir = -1;
zzPrice = L[i];
zzIdx = i;
zzDir = -1;
if ptCnt < 100 then begin // 배열 범위 체크: 100은 zigzagPt 배열의 최대 크기
zigzagPt[ptCnt] = zzPrice;
zigzagIdx[ptCnt] = zzIdx;
ptCnt = ptCnt + 1; // <-- 이 부분을 수정했습니다. (이전 49줄 에러 관련)
end;
end;
end
else if dir = -1 then begin // 현재 하락 중
if H[i] > zzPrice * (1 + th / 100.0) then begin // 상승 반전
dir = 1;
zzPrice = H[i];
zzIdx = i;
zzDir = 1;
if ptCnt < 100 then begin // 배열 범위 체크: 100은 zigzagPt 배열의 최대 크기
zigzagPt[ptCnt] = zzPrice;
zigzagIdx[ptCnt] = zzIdx;
ptCnt = ptCnt + 1; // <-- 이 부분을 수정했습니다. (이전 62줄 에러 관련)
end;
end;
end;
end;
// 5파 시작점 (4파 저점) 탐색 조건
// 최소 5개의 ZigZag 포인트가 있어야 조건 검증 가능 (ptCnt >= 5)
// zigzagPt[0], zigzagPt[1], zigzagPt[2], zigzagPt[3], zigzagPt[4]까지 필요
if ptCnt >= 5 then begin
// 상승 5파동 구조 검증
if zigzagPt[0] < zigzagPt[1] and
zigzagPt[1] > zigzagPt[2] and
zigzagPt[2] < zigzagPt[3] and
zigzagPt[3] > zigzagPt[4] then begin
// 주어진 조건 1, 2, 3 적용
if (zigzagPt[1] < zigzagPt[2] and // 조건 1a (1파 고점 < 2파 저점 - 사용자 조건)
zigzagPt[2] < zigzagPt[3] and // 조건 1b (2파 저점 < 3파 고점)
zigzagPt[2] > zigzagPt[0] and // 조건 2 (2파 저점 > 1파 시작점)
zigzagPt[1] <= zigzagPt[4]) then begin // 조건 3 (1파 고점 <= 4파 저점)
valid = true;
end;
end;
end;
if valid then
find(1); // 조건 만족 시 검색
2025-05-22
211
글번호 191059
와우리 님에 의해서 삭제되었습니다.
2025-05-21
27
글번호 191058
답변완료
수식 문의 드립니다.
안녕하세요.
1. 돌파하는 종목을 검색하는 수식을 작성하고 있는데 LRL함수에 오류가 있는 것 같습니다.
시스템식에서는 문제 없는 것을 확인하였으나, 종목 검색식에서는
LRL함수에 maLine과 같은 변수가 들어가면 "데이터가 존재하지 않습니다" 라고
메시지가 뜹니다.
LRLval = LRL(C, 20)와 같이 쓰면 에러없이 검색이 됩니다.
제가 원하는 변수를 사용할 수 있도록 수정 검토 부탁드립니다.
maV = ma(C, 20);
midLine = (highest(H, KCLength)+lowest(L, KCLength)) / 2;
maLine = Close - (midLine+maV) / 2;
LRLval = LRL(maLine, 20);
If CrossUp(value1,value2) Then
{
If C == C[1] Then
value3 = 0.001;
Else
value3 = (C-C[1])/C[1]*100;
}
Else
value3 = 0;
Find(value3);
2. 또한 수식내에 value3 = 0.001;value3 = (C-C[1])/C[1]*100; value3 = 0; 와 같이
써주는 이유는 무엇인지 설명부탁드립니다.
감사합니다.
2025-05-21
228
글번호 191057
우유 님에 의해서 삭제되었습니다.
2025-05-22
15
글번호 191056
답변완료
추가분봉 데이터영역 문의
안녕하세요
건수를 적게잡고 종목추가를 하면 빠르게추가돼고 건수를 1000이상 설정하면
너무 오래걸립니다 제공돼는 건수가 10000바로 알고있읍니다
동일한 차트영역에 1분봉,60분봉 ,120분봉추가하는데 data봉이 너무늦게열립니다
주기차이가 있어 늦게열리는가 봅니다 시스템트레이딩할때 바 건수는 상관없나요
수식에 data 건수를 삽입가능하신지 문의 드립니다
input : short(12),long(26),sig(9),신고신저기간(100),최근N봉(20);
input : 진입시작시간(230000),당일청산시간(020000),손절틱(100),감시틱(70),되돌림틱(20);
var : S1(0),D1(0),TM(0),EP1(0),EP2(0),EP3(0);
var : macdv(0,Data1),macds(0,Data1);
var : macdv1(0,Data2),macds1(0,Data2);
var : macdv2(0,Data3),macds2(0,Data3);
var : NH(False,Data1),NL(False,Data1);
macdv = data1(macd(short,long));
macds = data1(Ema(macdv,sig));
macdv1 = data2(macd(short,long));
macds1 = data2(Ema(macdv1,sig));
macdv2 = data3(macd(short,long));
macds2 = data3(Ema(macdv2,sig));
NH = Data1(CountIf(H > highest(H,신고신저기간)[1],최근N봉) >= 1);
NL = Data1(countif(L < lowest(L,신고신저기간)[1],최근N봉) >= 1);
if sDate != sDate[1] Then
SetStopEndofday(당일청산시간);
if Bdate != Bdate[1] Then
SetStopEndofday(0);
var : Tcond(False);
if (sdate != sDate[1] and sTime >= 당일청산시간) or
(sdate == sDate[1] and sTime >= 당일청산시간 and sTime[1] < 당일청산시간) Then
Tcond = false;
if (sdate != sDate[1] and sTime >= 진입시작시간) or
(sdate == sDate[1] and sTime >= 진입시작시간 and sTime[1] < 진입시작시간) Then
Tcond = true;
if Tcond == true Then
{
if MarketPosition <= 0 and
NL == true and
CrossUp(MACDV,0) and
MACDV1 > 0 and
MACDV2 > 0 and
macdv > macds and
macdv1 > macds1 and
macdv2 > macds2 Then
Buy("b");
if MarketPosition >= 0 and
NH == true and
CrossDown(MACDV,0) and
MACDV1 < 0 and
MACDV2 < 0 and
macdv < macds and
macdv1 < macds1 and
macdv2 < macds2 Then
Sell("s");
if MarketPosition == 1 and (CrossDown(MACDV1,MACDS1) or CrossDown(MACDV2,MACDS2)) Then
ExitLong("bx");
if MarketPosition == -1 and (CrossUp(MACDV1,MACDS1) or CrossUp(MACDV2,MACDS2)) Then
ExitShort("sx");
if MarketPosition == 1 Then
{
if highest(H,BarsSinceEntry) >= EntryPrice+PriceScale*감시틱 Then
ExitLong("btrx",AtStop,highest(H,BarsSinceEntry)-PriceScale*되돌림틱);
}
if MarketPosition == -1 Then
{
if lowest(L,BarsSinceEntry) <= EntryPrice-PriceScale*감시틱 Then
ExitShort("strx",AtStop,lowest(L,BarsSinceEntry)+PriceScale*되돌림틱);
}
}
SetStopLoss(PriceScale*손절틱,PointStop);
감사합니다
2025-05-21
262
글번호 191055
답변완료
부탁드립니다
수고하십니다
아래수식을 예스로 부탁드립니다
//@version=2
study("Fractal Adaptive Moving Average",shorttitle="FRAMA",overlay=true)
price = input(hl2)
len = input(defval=10,minval=1)
FC = input(defval=1,minval=1)
SC = input(defval=150,minval=1)
len1 = len/2
w = log(2/(SC+1))
H1 = highest(high,len1)
L1 = lowest(low,len1)
N1 = (H1-L1)/len1
H2 = highest(high,len)[len1]
L2 = lowest(low,len)[len1]
N2 = (H2-L2)/len1
H3 = highest(high,len)
L3 = lowest(low,len)
N3 = (H3-L3)/len
dimen1 = (log(N1+N2)-log(N3))/log(2)
dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1]))
alpha1 = exp(w*(dimen-1))
oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1)
oldN = (2-oldalpha)/oldalpha
N = (((SC-FC)*(oldN-1))/(SC-1))+FC
alpha_ = 2/(N+1)
alpha = alpha_<2/(SC+1)?2/(SC+1):(alpha_>1?1:alpha_)
out = (1-alpha)*nz(out[1]) + alpha*price
plot(out,title="FRAMA",color=blue,transp=0)
2025-05-21
346
글번호 191054