커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
5492
글번호 230811
사공하늘 님에 의해서 삭제되었습니다.
2025-05-22
63
글번호 191065
답변완료
수식 부탁드립니다
다음신호의 수식변환을 부탁드립니다.'
감사합니다.
A=shift(c,-12+1);
B=shift(c,-26+1);
BB=BBandsUp(70,3);
M=Macd(5,52);
조건1=CrossUp(A,BB(0)) && !(M>0);
S2=Valuewhen(1,조건1&&!조건1(1),L);
T=Ttsf(C, 50);
CrossUp(T, S2)
2025-05-22
305
글번호 191064
답변완료
부탁드립니다 항상 감사합니다
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
598
글번호 191063
회원 님에 의해서 삭제되었습니다.
2025-05-21
18
글번호 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
396
글번호 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
364
글번호 191059
회원 님에 의해서 삭제되었습니다.
2025-05-21
28
글번호 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
333
글번호 191057
회원 님에 의해서 삭제되었습니다.
2025-05-22
16
글번호 191056