커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
3653
글번호 230811
답변완료
문의드립니다.
안녕하세요 연휴는 잘 보내셨나요?
제가 어떻게 한번 해보려고 했는데 랭귀지 해석이 안 되어서
이렇게 지표 변환을 부탁드립니다.
아래 게시물을 보니 RSI 밴드 지표가 있어서 제가 사용하는 보조지표를
캔들과 같이 볼 수 있도록 RSI 밴드처럼 바꾸고 싶습니다.
제가 사용하는 지표와 참고용으로 RSI밴드 수식도 같이 올립니다.
참고로 제가 원하는건 중심선, 상단선, 하단선입니다.
변환 부탁드리며 미리 감사합니다.
===============================
제가 사용하는 지표
===============================
input : st_mult(2),st_period(14),len(20);
var : price(0),up_lev(0),dn_lev(0),upz(0),downv(0);
var : trur(0),plus(0),minus(0),sum(0),adxv(0);
var : di(0),x(0),zz(0);
price = (H+L)/2;
up_lev = price - (st_mult * atr(st_period));
dn_lev = price + (st_mult * atr(st_period));
if CurrentBar >= 1 then
{
upz = up_lev-up_lev[1];
downv = -(dn_lev-dn_lev[1]);
trur = (TrueRange + (len - 1) * trur) / len;
var1 = iff(upz > downv and upz > 0 , upz , 0);
var11 = (var1 + (len - 1) * var11) / len;
plus = var11/trur;
var2 = iff(downv > upz and downv > 0 , downv , 0);
var22 = (var2 + (len - 1) * var22) / len;
minus = var22/trur;
sum = plus + minus;
var3 = abs(plus - minus) / iff(sum == 0 , 1 , sum);
adxv = (var3 + (len - 1) * adxv) / len;
di = plus - minus;
x=adxv-di*100;
zz=x/-1;
plot1(zz,"시그널");
plot2(20,"상단");
plot3(-20,"하단");
plot4(0,"중심");
===============================
RSI밴드지표
===============================
Input : Length(14),UpLevel(70),DnLevel(30), NxtYn(0);
var : oUpBand(0),oDnBand(0),oMidLine(0);
Var : Counter(0), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0),MidLevel(0);
If CurrentBar == 1 AND Length > 0 Then
Begin
UpSum = 0;
DownSum = 0;
For Counter = 0 To Length - 1
Begin
UpAmt = C[Counter] - C[Counter+1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
End;
UpAvg = UpSum / Length;
DownAvg = DownSum / Length;
End
Else If CurrentBar > 1 AND Length > 0 Then
Begin
UpAmt = C[0] - C[1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpAvg = (UpAvg[1] * (Length - 1) + UpAmt) / Length;
DownAvg = (DownAvg[1] * (Length - 1) + DownAmt) / Length;
End;
If UpAvg + DownAvg <> 0 Then
Value1 = 100 * UpAvg / (UpAvg + DownAvg);
Else
Value1 = 0;
If nxtYn == 1 Then // 다음 봉 여부가 1일 경우
{
If Value1 > UpLevel Then // 상단밴드
oUpBand = (((UpLevel - 100) / UpLevel * UpAvg) + DownAvg) * (Length - 1) + C;
Else
oUpBand = ((UpLevel / (100 - UpLevel) * DownAvg) - UpAvg) * (Length - 1) + C;
If Value1 > DnLevel Then // 하단밴드
oDnBand = (((DnLevel - 100) / DnLevel * UpAvg) + DownAvg) * (Length - 1) + C;
Else
oDnBand = ((DnLevel / (100 - DnLevel) * DownAvg) - UpAvg) * (Length - 1) + C;
MidLevel = (UpLevel + DnLevel) / 2; // 중간라인
If Value1 > MidLevel Then
oMidLine = (((MidLevel - 100) / MidLevel * UpAvg) + DownAvg) * (Length - 1) + C;
Else
oMidline = ((MidLevel / (100 - MidLevel) * DownAvg) - UpAvg) * (Length - 1) + C;
}
Else
{
If Value1[1] > UpLevel Then
oUpBand = (((UpLevel - 100) / UpLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + C[1];
Else
oUpBand = ((UpLevel / (100 - UpLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + C[1];
If Value1[1] > DnLevel Then
oDnBand = (((DnLevel - 100) / DnLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + C[1];
Else
oDnBand = ((DnLevel / (100 - DnLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + C[1];
MidLevel = (UpLevel + DnLevel) / 2;
If Value1[1] > MidLevel Then
oMidLine = (((MidLevel - 100) / MidLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + C[1];
Else
oMidline = ((MidLevel / (100 - MidLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + C[1];
}
Plot1(oUpBand);
Plot2(oMidLine);
Plot3(oDnBand);
2020-10-05
866
글번호 142860
답변완료
69400수식 제수정 부탁드립니다
다시 수정 부탁드립니다..
현제 텍스트 부분이 수직선으로 일부만 표기 되고 있습니다..
텍스트는 필요 없구요 텍스트자리에 수직선이 전부 표기가 될수 있도록 수정 부탁드려 봅니다
늘 감사드립니다..
2020-10-05
977
글번호 142858
답변완료
문의드립니다.
아래수식을 예스로 부탁합니다.
rsiSource = input(title="RSI Source", type=input.source, defval=close)
rsiLength = input(title="RSI Length", type=input.integer, defval=7)
rsiOverbought = input(title="RSI Overbought", type=input.integer, defval=70, minval=51, maxval=100)
rsiOvesold = input(title="RSI Oversold", type=input.integer, defval=30, minval=1, maxval=49)
// RSI value based on inbuilt RSI
rsiValue = rsi(rsiSource, rsiLength)
// Get the current state
isOverbought = rsiValue >= rsiOverbought
isOversold = rsiValue <= rsiOvesold
// State of the last extreme 0 for initialization, 1 = overbought, 2 = oversold
var laststate = 0
// Highest and Lowest prices since the last state change
var hh = low
var ll = high
// Labels
var label labelll = na
var label labelhh = na
// Swing lines
var line line_up = na
var line line_down = na
var last_actual_label_hh_price = 0.0
var last_actual_label_ll_price = 0.0
// FUNCTIONS
obLabelText() =>
if(last_actual_label_hh_price < high)
"HH"
else
"LH"
//plot(last_actual_label_hh_price)
osLabelText() =>
if(last_actual_label_ll_price < low)
"HL"
else
"LL"
// Create oversold or overbought label
createOverBoughtLabel(isIt) =>
if(isIt)
label.new(x=bar_index, y=na ,yloc=yloc.abovebar, style=label.style_label_down, color=color.red, size=size.tiny, text=obLabelText())
else
label.new(x=bar_index, y=na ,yloc=yloc.belowbar, style=label.style_label_up, color=color.green, size=size.tiny, text=osLabelText())
// Move the oversold swing and label
moveOversoldLabel() =>
label.set_x(labelll, bar_index)
label.set_y(labelll, low)
label.set_text(labelll, osLabelText())
line.set_x1(line_down, bar_index)
line.set_y1(line_down, low)
moveOverBoughtLabel() =>
label.set_x(labelhh, bar_index)
label.set_y(labelhh, high)
label.set_text(labelhh, obLabelText())
line.set_x1(line_up, bar_index)
line.set_y1(line_up, high)
// We go from oversold straight to overbought NEW DRAWINGS CREATED HERE
if(laststate == 2 and isOverbought)
hh := high
labelhh := createOverBoughtLabel(true)
last_actual_label_ll_price := label.get_y(labelll)
labelll_ts = label.get_x(labelll)
labelll_price = label.get_y(labelll)
line_up := line.new(x1=bar_index, y1=high, x2=labelll_ts, y2=labelll_price, width=1)
// We go from overbought straight to oversold NEW DRAWINGS CREATED HERE
if(laststate == 1 and isOversold)
ll := low
labelll := createOverBoughtLabel(false)
last_actual_label_hh_price := label.get_y(labelhh)
labelhh_ts = label.get_x(labelhh)
labelhh_price = label.get_y(labelhh)
line_down := line.new(x1=bar_index, y1=high, x2=labelhh_ts, y2=labelhh_price, width=1)
// If we are overbought
if(isOverbought)
if(high >= hh)
hh := high
moveOverBoughtLabel()
laststate := 1
// If we are oversold
if(isOversold)
if(low <= ll)
ll := low
moveOversoldLabel()
laststate := 2
// If last state was overbought and we are overbought
if(laststate == 1 and isOverbought)
if(hh <= high)
hh := high
moveOverBoughtLabel()
//If we are oversold and the last state was oversold, move the drawings to the lowest price
if(laststate == 2 and isOversold)
if(low <= ll)
ll := low
moveOversoldLabel()
// If last state was overbought
if(laststate == 1)
if(hh <= high)
hh := high
moveOverBoughtLabel()
// If last stare was oversold
if(laststate == 2)
if(ll >= low)
ll := low
moveOversoldLabel()
2020-10-05
891
글번호 142857
답변완료
청산로직 관련
주식 현물 시장에서
어떤 종목을 매수 했을경우
청산을 하기 위해서
수익률이 2~5% 일 경우 수익금이 절반이 되면 청산.
수익률이 6~10%일 경우 수익금이 2/3이 되면 청산..
이런 청산로직도 예스트레이더에서 가능 한지 궁금합니다.
2020-10-05
790
글번호 142850
답변완료
질문드립니다
안녕하세요
VAR1 = Data4(H[1]);
VAR2 = Data4(H[2]);
VAR3 = Data4(H[3]);
VAR4 = Data4(H[4]);
VAR5 = Data4(H[5]);
VAR6 = Data4(H[6]);
VAR7 = Data4(H[7]);
VAR8 = Data4(H[8]);
VAR9 = Data4(H[9]);
VAR10 = Data4(H[10]);
VAR11 = Data4(H[11]);
VAR12 = Data4(H[12]);
기준 : 차트 기준은 일봉차트에서 참조종목으로 같은 종목 월봉을 넣었습니다
질문1. 일봉차트 변경하면 참조종목도 동시에 자동변경되나요?
질문2. 일봉차트의 현재가와 var1~var12를 비교해서 현재가가 크면 +1, 작으면 -1
그러면 -12 ~ +12 까지의 지표가 표시될수있도록 부탁드립니다.
질문3. 어떤 지표값이 소수점일때 절삭하는 방법이 궁금합니다.
질문4. 기준에서 월봉을 참조종목으로 넣었는데 일봉기준으로 참조종목인 월봉을 넣지않고
지표 표현할수있으면 더욱 좋겠습니다. 가능할까요?
2020-10-05
679
글번호 142847
답변완료
재문의
1.매번 감사드립니다
작성해준 지표(69392)에 (H+L+O)/3를 추가 해서 지표를 띄우니 표시가 안돼요
좀 봐주세요
#==========================================#
Input : Length(13),UpLevel(70),DnLevel(30), NxtYn(0);
var : oUpBand(0),oDnBand(0),oMidLine(0);
Var : Counter(0), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0),MidLevel(0);
#==========================================#
Var :CC(0);
CC = (H+L+O)/3;
#==========================================#
If CurrentBar == 1 AND Length > 0 Then
Begin
UpSum = 0;
DownSum = 0;
For Counter = 0 To Length - 1
Begin
UpAmt = CC[Counter] - CC[Counter+1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
End;
UpAvg = UpSum / Length;
DownAvg = DownSum / Length;
End
Else
IF CurrentBar > 1 AND Length > 0 Then
Begin
UpAmt = CC[0] - CC[1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpAvg = (UpAvg[1] * (Length - 1) + UpAmt) / Length;
DownAvg = (DownAvg[1] * (Length - 1) + DownAmt) / Length;
End;
If UpAvg + DownAvg <> 0 Then
Value1 = 100 * UpAvg / (UpAvg + DownAvg);
Else
Value1 = 0;
If nxtYn == 1 Then // 다음 봉 여부가 1일 경우
{
If Value1 > UpLevel Then // 상단밴드
oUpBand = (((UpLevel - 100) / UpLevel * UpAvg) + DownAvg) * (Length - 1) + CC;
Else
oUpBand = ((UpLevel / (100 - UpLevel) * DownAvg) - UpAvg) * (Length - 1) + CC;
If Value1 > DnLevel Then // 하단밴드
oDnBand = (((DnLevel - 100) / DnLevel * UpAvg) + DownAvg) * (Length - 1) + CC;
Else
oDnBand = ((DnLevel / (100 - DnLevel) * DownAvg) - UpAvg) * (Length - 1) + CC;
MidLevel = (UpLevel + DnLevel) / 2; // 중간라인
If Value1 > MidLevel Then
oMidLine = (((MidLevel - 100) / MidLevel * UpAvg) + DownAvg) * (Length - 1) + CC;
Else
oMidline = ((MidLevel / (100 - MidLevel) * DownAvg) - UpAvg) * (Length - 1) + CC;
}
Else
{
If Value1[1] > UpLevel Then
oUpBand = (((UpLevel - 100) / UpLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + CC[1];
Else
oUpBand = ((UpLevel / (100 - UpLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + CC[1];
If Value1[1] > DnLevel Then
oDnBand = (((DnLevel - 100) / DnLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + CC[1];
Else
oDnBand = ((DnLevel / (100 - DnLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + CC[1];
MidLevel = (UpLevel + DnLevel) / 2;
If Value1[1] > MidLevel Then
oMidLine = (((MidLevel - 100) / MidLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + CC[1];
Else
oMidline = ((MidLevel / (100 - MidLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + CC[1];
}
Plot1(oUpBand,"몸통", RGb(225,220,0));
Plot2(oMidLine);
Plot3(oDnBand,"몸통", BLACK);
2.그럼 즐거운 하루 되세요.
2020-10-05
805
글번호 142838
답변완료
수식을 어떻게 해야되나요
1. t-2 ~t-4 가격이동평균 20일선이 점덤 내려가는 상태 조건식
2. t-2 캔들이 rsl 30이하 (같거나 작은 경우 ) 조건식과 수식
3 t-1 캔들이 종가가 t-2 캔들이 시가보다 같거나 높은 조건식
4 t-1 캔들의 종가가 t-2캔들이 몸통보다 같거나 높은 조건식
5 t-1 캔들의 몸통보다 아랫꼬리가 2배이상인 조건식
6 ㅅ-1캔들이 몸통보다 윗꼬리와 아랫꼬리가 2배 조건식
2020-10-05
738
글번호 142835
답변완료
수식부탁드립니다
수고많으십니다.
아래 조건을 수식으로 부탁드립니다.
--- 매수 기준 ---
1. 일봉기준으로
2. 시가보다 10틱 아래면 매수
3. 만약 매수진입 후 MACD(10,20,9)조건으로 매도 사인이 나오면 매도(청산)
4. 만약 3번 조건이 2번 조건보다 먼저 나오면 매매 성립 안됨, 즉 3번의 매도가 안됨
5. 2번 조건이 성립되어 매수 후 3번 조건이 안되어 계속 홀딩될 경우 새벽 5시 30분에 청산
--- 매도 기준 ----
1. 일봉기준으로
2. 시가보다 10틱 위면 매도
3. 만약 매수진입 후 MACD(10,20,9)조건으로 매수 사인이 나오면 매수(청산)
4. 만약 3번 조건이 2번 조건보다 먼저 나오면 매매 성립 안됨, 즉 3번의 매수가 안됨
5. 2번 조건이 성립되어 매도 후 3번 조건이 안되어 계속 홀딩될 경우 새벽 5시 30분에 청산
2020-10-05
758
글번호 142824
chunsk 님에 의해서 삭제되었습니다.
2020-10-05
9
글번호 142823