커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
3437
글번호 230811
답변완료
알려주신 수식(매수버전)을 매도 버전으로 변경했는데... 수식에는 이상이 없다고 나?
알려주신 수식(매수버전)을 매도 버전으로 제가 임의로 변경해 보았는데 ...
수식에는 이상이 없다고 나오는데 거래이력이 나오질 않네요...
어떤것을 바꿨냐면
buySetup --> sellSetup
data2(c>sarv) --> data2(c<sarv)
변경하였는데...또 바꿀게 있나요?
사용은 하고 있는데 잘모르겠어요..맞게 사용하고 있는지..ㅠㅠ
Input : RSIPeriod(7),RSI매수값(65),SimPeriod(7),심리도값(45);
Input : N1(1),초기화(7);
Input : CCI기간(20),CCI값(400);
Input : 하락틱수(5);
Input : 즉시익절1(180),즉시손절1(60);
Input : 분할매수횟수(1),분할매수틱수(50);
Input : RSIPeriod1(8),A(40),B(25);
Input : N2(0.6),N3(0.02);
Input : tr수익(150),tr하락(25);
Input : 거래량1(0),거래량2(14000);
Input : 저점손절틱수(0);
Input : N4(0.6);
Input : 본전생각틱(32);
input : af(0.02),maxaf(0.2);
var : BBup(0,data1),cond1(false,data1),cond2(false,data1),v1(0,data1),v2(0,data1);
var : cnt(0,data1),SigSum(0,data1),count2(0,data1),RSIsig(0,data1);
Var : Counter(0,data1), DownAmt(0,data1), UpAmt(0,data1), UpSum(0,data1), DownSum(0,data1), UpAvg(0,data1), DownAvg(0,data1);
var : idx(0,data1), PreUpAvg(0,data1), preDownAvg(0,data1),RSIVv(0,data1);
var : CCIv(0,data1),RSIv(0,data1),Simri(0,data1),sellSetup(false,data1),DD(0,data1),entry(0,data1);
var : sarv(0,data2);
Array : C1[100](0,data1);
CCIv = data1(CCI(CCI기간));
RSIV = data1(RSI(RSIPeriod));
Simri = data1(Simrido(SimPeriod));
sarv = data2(sar(af,maxaf));
if Bdate != Bdate[1] Then
{
for cnt = 1 to 99
{
C1[cnt] = C1[cnt-1][1];
}
PreUpAvg = UpAvg[1];
preDownAvg = DownAvg[1];
idx = idx + 1;
}
C1[0] = C;
If idx == RSIPeriod1+2 Then
{
UpSum = 0;
DownSum = 0;
For Counter = 0 To RSIPeriod1 - 1
{
UpAmt = C1[Counter] - C1[Counter+1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
{
DownAmt = -UpAmt;
UpAmt = 0;
}
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
}
UpAvg = UpSum / RSIPeriod1;
DownAvg = DownSum / RSIPeriod1;
}
If idx > RSIPeriod1+2 Then
{
UpAmt = C1[0] - C1[1];
If UpAmt >= 0 Then
DownAmt = 0;
Else
{
DownAmt = -UpAmt;
UpAmt = 0;
}
UpAvg = (PreUpAvg * (RSIPeriod1 - 1) + UpAmt) / RSIPeriod1;
DownAvg = (preDownAvg * (RSIPeriod1 - 1) + DownAmt) / RSIPeriod1;
}
If UpAvg + DownAvg <> 0 Then
RSIvv = 100 * UpAvg / (UpAvg + DownAvg);
Else
RSIvv = 0;
if data1(bdate != bdate[1]) Then
{
Entry = 0;
Cond2 = true;
}
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry = entry+1;
if TotalTrades > TotalTrades[1] and
(IsExitName("즉시손절1",1) == true or IsExitName("본전청산1",1)) then
Condition2 = false;
Condition1 = RSIv > RSI매수값 and Simri > 심리도값 and RSIVV < A and RSIVV > B and v > 거래량1 and v < 거래량2 ;
if bdate != bdate[1] Then
{
DD = DD+1;
if var2 > 0 and DD == var2+초기화 Then
SellSetup = false;
}
if SellSetup == false and Condition1 == true and Condition1[1] == false Then
{
v1 = data1(C);
v2 = DD;
SellSetup = true;
}
if Condition2 == true and MarketPosition == 0 and SellSetup == true and C > O and entry == 0 and data2(c<sarv) Then
sell("매도",AtStop,var1+PriceScale*하락틱수);
2020-03-31
577
글번호 137401
답변완료
수식수정부탁드립니다
Input:Period1(17),Period2(17),Period3(17),n1(0),n2(0),n3(0), multi1(1),multi2(2),multi3(2);
Var:기울기1(0),절편1(0),회귀선1(0),회귀선tmp(0),
기울기2(0),절편2(0),회귀선2(0),
기울기3(0),절편3(0),회귀선3(0),
채널폭(0),j(0),표준오차(0),표준편차(0);
Var : nn1(0),xx1(0),yy1(0),Intercept1(0);
Var : nn2(0),xx2(0),yy2(0),Intercept2(0);
Var : nn3(0),xx3(0),yy3(0),Intercept3(0);
var: y4(0),x4(0),n4(0),j4(0),∑y(0),∑y²(0),∑x(0),∑x²(0),∑xy(0),StdErr(0);
nn1 = Period1;
xx1 = Index;
yy1 = c;
Intercept1 = ma(yy1,nn1) - (ma(xx1*yy1, nn1) - ma(xx1,nn1) * ma(yy1,nn1)) /
(ma(xx1^2,nn1) - (ma(xx1,nn1)^2)) * ma(xx1,nn1);
nn2 = Period2;
xx2 = Index;
yy2 = c;
Intercept2 = ma(yy2,nn2) - (ma(xx2*yy2, nn2) - ma(xx2,nn2) * ma(yy2,nn2)) /
(ma(xx2^2,nn2) - (ma(xx2,nn2)^2)) * ma(xx2,nn2);
nn3 = Period2;
xx3 = Index;
yy3 = c;
Intercept3 = ma(yy3,nn3) - (ma(xx3*yy3, nn3) - ma(xx3,nn3) * ma(yy3,nn3)) /
(ma(xx3^2,nn3) - (ma(xx3,nn3)^2)) * ma(xx3,nn3);
y4 = c;
n4 = Period2;
∑y = accumN(y4,n4);
∑y² = accumN(y4^2,n4);
∑x = 0;
∑x² = 0;
∑xy = 0;
for j4 = 1 to n4{
∑x = ∑x + j4;
∑x² = ∑x² + j4^2;
∑xy = ∑xy + (j4 * y4[n4-j4]);
}
StdErr = sqrt(1/(n4*(n4-2)) * (n4*∑y² - ∑y^2 - (n4*∑xy - ∑x*∑y)^2 / (n4*∑x² - ∑x^2)));
기울기1 = LRS(C, Period1)[n1];
절편1 = Intercept1[n1];
회귀선1 = 기울기1 * Index + 절편1;
채널폭 = 0;
for j = n1 to Period1 + n1 - 1 {
회귀선tmp = 기울기1 * Index[j] + 절편1;
채널폭 = max(채널폭,max(abs(H[j] - 회귀선tmp),abs(회귀선tmp - L[j])));
}
기울기2 = LRS(C, Period2)[n2];
절편2 = intercept2[n2];
회귀선2 = 기울기2 * Index + 절편2;
표준오차 = StdErr[n2];
기울기3 = LRS(C, Period3)[n3];
절편3 = intercept3[n3];
회귀선3 = 기울기3 * Index + 절편3;
표준편차 = STD(C,Period3)[n3];
value1=기울기3;
value2=절편3;
상기수식을 지표수식(라인 혹은 오실레이터)으로 부탁드립니다.
2020-03-31
880
글번호 137399
답변완료
수식 문의
친절한 답변 미리 감사드립니다. ^.^
질문 :
차트 뒤집기를 data2 종목만 하고 싶습니다.
그게 불가능하다면,
지표처럼 가져와서 뒤집어 표현하고 싶은데요,
즉,
//=== 현재가 지정 ===
D1현재가 = Data1(c);
D2현재가 = Data2(c);
D2현재가 = data2(c); 만 y축을 뒤집어서 보고 싶습니다.
2020-03-31
578
글번호 137398
답변완료
함수변환 요청
안녕하세요?
아래는 키움에서 사용했던 전략입니다.
예스에서 사용할 수 있도록 함수변환 요청드립니다.
아울러 스크립트에 각 주석도 좀 부탁드립니다.
감사합니다.
Vars : st(0), et(0);
V1 = Dayofweek((10000 * Year(D)) + (100 * 3) + 1);
If V1 = 0 Then Value2 = 8
Else Value2 = 15 - V1; // 3월 두번째 일요일 날짜
V2 = Dayofweek((10000 * Year(D)) + (100 * 11) + 1);
If V2 = 0 Then Value4 = 1
Else value4 = 8 - V2; // 11월 첫번째 일요일 날짜
If date > (10000 * Year(D)) + (100 * 3) + value2
And date < (10000 * Year(D)) + (100 * 11) + value4 Then
Begin
st = 070000; // 써머타임 적용 시, 장시작 시간
et = 060000; // 써머타임 적용 시, 장종료 시간
End
Else
Begin
st = 080000; // 장 시작 시간
et = 070000; // 장 종료 시간
End;
condition1 = (IntPortion(time/10000) > IntPortion(et/10000)
And IntPortion(time[1]/10000) <= IntPortion(et/10000)) Or st <> st[1];
/////////////////////////////////////////////////////////////////
If condition1 Then v99 = 0;
Vars : SP(0);
SP = SignalPosition;
If SP[1] <> SP And SP <> 0 Then v99 = v99 + 1;
Vars : pDayClose(0), vDayOpen(0);
pDayClose = DayClose(1);
vDayOpen = DayOpen(0);
If v99 = 0 Then
Begin
If pDayClose < vDayOpen Then Buy("B", atmarket)
Else IF pDayClose > vDayOpen Then Sell("S", atmarket);
End;
SetExitOnClose;
2020-03-31
574
글번호 137396
답변완료
지표 부탁 드립니다.
안녕하세요. 매일 수고가 많으십니다.
특정캔들(지정한 캔들만)의 중심가격을 수평으로 표시하고 그값을 우측에 표시할수 있는 식을 부탁 드립니다.지정캔들이라 함은 현재봉에서 몇번째 전 봉을 의미 합니다.
코로나에 감염되지 않도록 주의하시기 바라며 항상 건강한 생활 되시기 바랍니다.
2020-03-31
522
글번호 137395
답변완료
지표부탁드립니다
안녕하세요
매도1호가와 매수1호가는 데이타를 나타낼 수 없다고 알고있습니다
그래서 대부분이 업틱에서 거래되면 거래종가가 매도1호가라고 생각하고
코딩을 해봤는데,,계속 에러가 납니다
90프로 이상이 업볼룸이면 매도1호가가 종가라는 가정이 정확하지 않더라고
현재가와 함께 매도호가 매수호가 그래프로 그릴수 있도록 도움부탁드립니다
근사값이나와도 됩니다
감사합니다
---------------------------------------
INPUT : ratio(90) ; # 업볼룸 혹은 다운볼룸 비율
VAR : bid_c(0),ask_c(0) ; # 매도1호가, 매수1호가 변수로 만듬
if Upvol/V >= ratio then # 업틱에서 체결이 90% 이상이면 매도호가에 거래 되었으므로 종가가 매도호가로 표시
{
bid_c == c and ask_c= c- PriceScale ; # 매수1호가는 호가단위만큼 빼 준값
}
if downvol/V > ratio then # 다운틱에서 체결이 90% 이상이면 종가는 매수호가
{
bid_c == c- PriceScale and ask_c= c ;
}
PLOT1(bid_c, “매도1호가”);
PLOT2(ask_c, “매수1호가”);
PLOT3(c, “현재가”);
2020-03-31
544
글번호 137384
답변완료
문의 드립니다.
안녕하세요
항상 빠른 답변 감사드립니다.
오전에 전화 문의 드렸던
하루에 한번만 시스템 매수식이 작동하는 진입회수에 관한 문의들 드린바
아래와 같이 시스템식에 , 1%로스컷 설정을 적용 하였으나
제대로 적용이 안되어 재차 문의 드립니다.
1분봉상 가비아 1분봉에 적용하여 두번의 매수진입과 손절이 발생하였습니다.
그럼 좋은 하루 되세요
#당일진입횟수 카운트
var : entry(0);
if bdate != bdate[1] Then
entry = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry = entry+1;
Input : 투입금액(10000000);
Var : 진입수량(0);
진입수량 = int(투입금액/C);
##################################################################################################
var : bbup1(0),bbup2(0);
var : bbdn1(0),bbdn2(0);
var : mav1(0),mav2(0),mav3(0);
bbup1 = BollBandUp(20,1);
bbdn1 = BollBandDown(20,1);
bbup2 = BollBandUp(20,2);
bbdn2 = BollBandDown(20,2);
mav1 = ma(C,1);
mav2 = ma(C,5);
mav3 = ma(c,240);
##################################################################################################
If CrossUp(C, DayOpen) && CountIF(H < DayOpen,5) > 0 && (C > ma(c,240)*0.95 or C < ma(c,240)*1.05) && (C < DayClose(1)*1.20) &&
MarketPosition == 0 and entry < 1 && mav3[1] <= mav3 && CurrentDate == sDate Then
buy("시초돌파",OnClose,def,진입수량);
##################################################################################################
if mav1 > mav2 and
C >= bbup1 and
bbup2 > c and C > bbdn2 and
countif(crossup(c,bbup2),5) >= 1 && Condition1 == false && (C < DayClose(1)*1.25) &&
MarketPosition == 0 and entry < 1 && CurrentDate == sDate then
buy("눌림",OnClose,def,진입수량);
##################################################################################################
If CurrentContracts == MaxContracts
&& C >= EntryPrice*1.05 // 1%이상
Then
ExitLong("5%일부익절",OnClose,def,"",int(MaxContracts*(40/100)),2);
If CurrentContracts == MaxContracts
&& C >= EntryPrice*1.10 // 1%이상
Then
ExitLong("10%일부익절",OnClose,def,"",int(MaxContracts*(40/100)),2);
If CurrentContracts == MaxContracts
&& C >= EntryPrice*1.15 // 1%이상
Then
ExitLong("15%일부익절",OnClose,def,"",int(MaxContracts*(40/100)),2);
If sTime > 150500 Then ExitLong("장마감",atlimit,def);
##################################################################################################
var : 상한가(0), UpLimit(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if date >= 19981207 then {
if date < 20050328 && CodeCategory() == 2 then
UpLimit = (BP[0] * 1.12);
Else if date >= 20050328 and date < 20150615 Then
UpLimit = (BP[0] * 1.15);
Else
UpLimit = (BP[0] * 1.30);
if CodeCategory() == 2 then
{
if date >= 20030721 then
{
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
else
{
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
up7 = int(UpLimit/1+0.00001)*1;
}
}
Else
{
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
if CodeCategory() == 1 || CodeCategory() == 2 then
{
if sdate < 20101004 Then
{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up6);
}
Else
{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up7);
}
}
else if CodeCategory() == 8 || CodeCategory() == 9 then { // ETF
상한가 = up6;
}
}
if MarketPosition == 1 Then
{
ExitLong("상한가",atlimit,상한가);
if CurrentContracts == MaxContracts and C >= EntryPrice*1.03 Then
ExitLong("3%익절",atlimit,def,"",int(MaxContracts*(50/100)),2);
if CurrentContracts < MaxContracts then
{
if highest(c,BarsSinceEntry) >= EntryPrice*1.10 and
highest(c,BarsSinceEntry) < EntryPrice*1.15 and
C < EntryPrice*1.10 Then
ExitLong("10%");
if highest(c,BarsSinceEntry) >= EntryPrice*1.15 and
highest(c,BarsSinceEntry) < EntryPrice*1.20 and
C < EntryPrice*1.15 Then
ExitLong("15%");
if highest(c,BarsSinceEntry) >= EntryPrice*1.20 and
C < EntryPrice*1.20 Then
ExitLong("20%");
}
}
2020-03-31
591
글번호 137383
답변완료
문의 드립니다.
호가잔량 비율지표를 만들고 싶습니다.
호가잔량을 0을 기준으로 표시하는 지표는
아래와 같이 만들어 사용하고 있는데요.
이것을 비율로 바꾸고 싶은데 잘 안 되서 문의 드립니다.
비율이기 때문에,
매도잔량 > 매수잔량일 경우와
매수잔량 > 매도잔량일 경우를 구분해야 하고,
매도잔량이 클 경우에는 결과값에 -1를 곱해줘야 될 것 같은데
어렵네요. 도와 주십시요.
아래는 단순하게 잔량차이를 표시하는 수식인데
이를 비율로 바꿔 주시면 감사하겠습니다.
Input : Period(5);
Var : value(0);
value = ma(bids,period)-ma(asks,period);
If value > 0 Then
{
Plot1(value, "매수총잔량 우위");
Plot2(0, "매도총잔량 우위");
}
Else
{
Plot1(0, "매수총잔량 우위");
Plot2(value, "매도총잔량 우위");
}
PlotBaseLine1(0,"기준선");
2020-03-31
582
글번호 137382
답변완료
시스템 질문입니다
1.
시가 첫 봉이 양봉이면 첫봉에 1차 매수,시가-2.0 에 2차 매수하여 시가+3.0 에 모두 익절
시가 첫 봉이 음봉이면 첫봉에 1차 매도,시가+2.0 에 2차 매도하여 시가-3.0 에 모두 익절
2.
시가 첫 봉 포함 2연속 양봉일때 1차 매수,시가-2.0 에 2차 매수하여 시가+3.0 에 모두 익절
시가 첫 봉 포함 2연속 음봉일때 1차 매도,시가+2.0 에 2차 매도하여 시가-3.0 에 모두 익절
3.
시가 첫 봉 이후 시가 이상에서 최초로 나타난 2연속 양봉에 1차 매수,시가-2.0 에 2차 매수하여 시가+3.0 에 모두 익절
시가 첫 봉 이후 시가 이하에서 최초로 나타난 2연속 음봉에 1차 매도,시가+2.0 에 2차 매도하여 시가-3.0 에 모두 익절
감사합니다
2020-03-31
519
글번호 137376