커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1589
글번호 230811
답변완료
질문 드리겠습니다
답변 감사드립니다
지난 질문이어서 몇가지 부탁드립니다
질문1) 간단한 주석을 부탁드립니다
아래 식에서요,, 하루에 신호가 한번만 나오게 하는 식인데요
if Bdate != Bdate[1] Then
DD = DD+1;
이부분은 거래일이 변경될때마다 dd 에 1씩 더하고,
if H>l*1.1 Then
{
d1 = dd;
d2 = d1[1];
if d1 >= d2+1 Then
dd의 현재값과 이전값을 비교했을때, d1 >= d2+1 이면 왜 하루에 신호가 한번만 나오게 되는건지
그리고 if d2 == 0 or (d2 > 0 and d1 >= d2+3) Then 로 했을때는 3거래일 이상 떨어졌을때만 신호가 나타나게 되는건지 간략한 설명을 해주시면 감사하겠습니다
#수식
if Bdate != Bdate[1] Then
DD = DD+1;
if H>l*1.1 Then
{
d1 = dd;
d2 = d1[1];
if d1 >= d2+1 Then
{
var1 = Index;
Var2 = var1[1];
Var3= Var2[1];
sum1=0;
sumi1=0;
tl=TL_NEW(sDatE,sTimE,h*1.01,sDatE,sTimE,999999);
TL_SetSize(tl,0);
TL_SetColor(tl,Black);
질문2)
min , max 관련된 질문입니다
아래식에서 aa 배열 값들의 최고값, 최저값을 구할때요
aa[0]에서 aa[10] 까지의 최고값 (최저값)을 구하려면
max(aa[0],aa[1]...aa[10]) 이런식으로 나열 작성을 해야하는데,
만약 aa[0] 에서 aa[30] 까지의 최고값을 구할때처럼 식이 길어지면 for문으로 축약해서 작성한뒤 결과값을 변수에 저장하는것을 도와주셨으면 합니다
수식은 아래와 같습니다
var : cnt(0), sum1(0), sumi1(0),tt(0),hh(0),ll(0),tl(0);
var: sum2(0),sumi2(0),sumaa(0);
var : t(0),StartBarIndex(0),dd(0),d1(0),d2(0);
Array : ii[50](0),aa[50](0),bb[50](0),ttl[10](0);
if Bdate != Bdate[1] Then
DD = DD+1;
if H>l*1.08 Then
{
d1 = dd;
d2 = d1[1];
if d2 == 0 or (d2 > 0 and d1 >= d2+3) Then
{
var1 = Index;
Var2 = var1[1];
Var3= Var2[1];
tl=TL_NEW(sDatE,sTimE,h*1.01,sDatE,sTimE,999999);
TL_SetSize(tl,0);
TL_SetColor(tl,DarkGray);
For cnt = 1 to (var1-Var2)
{
sum1=sum1+h[cnt];
sumi1=sumi1+1;
}
value1=sum1/sumi1;
For cnt = 49 DownTo 1
{
aa[cnt] = aa[cnt-1];
}
aa[0] = value1;
}
}
질문3) 혹시 차트창에서 동일종목 차트 두개를 열고 각각 다른 지표를 적용 할 수 있는 방법이 있을까요?
감사합니다
2025-03-05
391
글번호 188763
답변완료
안녕하세요.
수고하십니다.
지표 챠트에 시가를 표시하고 싶습니다.
선물가격
콜350 가격과 프리미엄
풋350 가격과 프리미엄
을 고정
2025-03-04
397
글번호 188751
심홍 님에 의해서 삭제되었습니다.
2025-03-04
295
글번호 188750
답변완료
문의 드립니다!
안녕하세요!
콜옵션 챠트의 콜 시가선을 기준으로해서...
여기에 data1 이 콜이고 data2 가 풋인 복합챠트의 경우
이 콜풋캔들이 이동해서 각각 콜의 시가선을 만날때마다(상하 어느쪽에서 맞던 모두 해당)
각각 세로선과 알람신호가 발생되도록 부탁드립니다
*** 특히 풋캔들(data2)이 콜의 시가선을 맞는 경우가 더 중요합니다
* 세로선 발생시기는 n틱전으로,
세로선의 색상과 두께는 사용자지정이 가능토록해주세요
감사합니다!!!
2025-03-04
394
글번호 188743
답변완료
수식 확인 좀 부탁 드립니다.
var : Xidx(0), Xinx(0);
if Tcond == true and 300< H-L Then
{
Trade = False;
Xidx = Index;
}
if Tcond == False and Index == Xinx+5 Then
Trade = true;
장대봉 출현시 4번째봉까지는 진입금지라는 위의 식을 주셔서 적용해봐도 진입이 계속 됩니다. 수정 부탁드립니다.
2025-03-04
359
글번호 188741
답변완료
시스템 식 요청 드립니다.
답변 너무 감사드립니다.
그런데, 수정해주신 식으로 다시 한번 돌려보니...
그림 1,2 과 같이 bx 타점에서 자꾸 청산이 되더라구요
아마 수량이 줄어서 그런 것 같습니다. ㅜ.ㅜ
분할매수 4 5 6의 경우 청산 bx와 상관 없게 하고 싶은데...
해당 부분은 어떻게 수정해야 할지 요청 드립니다. ㅜ.ㅜ
bx에 관련된 청산 식을
if var1 > 0 and C < Var4 AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) then
ExitLong("bx");
이렇게 수정을 했더니
첨부그림 3, 4 처럼 되었습니다.
첨부그림 4에 시스템식이 적용이 안되는 부분 수기로 작성하였는데
수정 요청 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 시스템식 요청드립니다.
>
안녕하세요
예스스탁입니다.
청산식에 수량을 지정하면 기본적으로 첫진입부터 수량이 차감됩니다.
4~6차 수량만 청상하려면 별도로 청산함수에 진입명을 지정하셔야 합니다.
4차 이후 4~6차 진입들의 평단가보다 4% 상승하면 4~6차를 청산하고
이후 4~6차는 조건만족시 추가진입하게 됩니다.
input : N(14),금액(2000000);
input : 시작날짜 (20250109);
Input : 기준선기간(120);
Var : 기준선(0);
var : cntt(0),H1(0),L1(0);
var : cnt(0),sum(0),mav(0),DD(0);
var : AP(0),TT(0),entry(False);
var : LL(0),RR(0),rate(0);
var : 저항(0), B1(0) ;
Var : day(0),EntryDay(0),ddd(0),ED(0);
var : sum1(0),sum2(0),sum3(0),avg4(0);
#-------------------------------------
if sDate >= 시작날짜 Then
{
if Bdate != Bdate[1] Then
{
entry = true;
day = day+1;
dd = dd+1;
}
}
if TotalTrades > TotalTrades[1] Then
entry = False;
#-------------------------------------
#-------------------------------------
sum = 0;
For cnt = 0 to N-1
{
sum = sum + DayClose(cnt);
}
mav = (sum/N);
#-------------------------------------
#---------------------------------------
if (MarketPosition == 0) and (entry == true) and L > mav Then
Buy("1차매수",AtLimit,mav,Floor(금액/min(NextBarOpen,mav)));
if MarketPosition == 1 and (LatestEntryName(0) == "1차매수") and L > LatestEntryPrice(0)*0.95 Then
Buy("2차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.15/min(NextBarOpen,mav)));
if MarketPosition == 1 and (LatestEntryName(0) == "2차매수") and L > LatestEntryPrice(0)*0.95 Then
Buy("3차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.2/min(NextBarOpen,mav)));
if MarketPosition == 1 and (LatestEntryName(0) == "3차매수") and L > LatestEntryPrice(0)*0.95 Then
Buy("4차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.25/min(NextBarOpen,mav)));
if MarketPosition == 1 and (LatestEntryName(0) == "4차매수") and L > LatestEntryPrice(0)*0.95 Then
Buy("5차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.3/min(NextBarOpen,mav)));
if MarketPosition == 1 and (LatestEntryName(0) == "5차매수") and L > LatestEntryPrice(0)*0.95 Then
Buy("6차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.35/min(NextBarOpen,mav)));
#-----------------------------------
if MarketPosition == 1 Then
{
#전봉대비 수량 감소(일부 청산발생을 위미)
if CurrentContracts < CurrentContracts[1] Then
{
#청산가 저장
var1 = LatestExitPrice(0);
if LatestExitName(0) == "3%익절" or LatestExitName(0) == "3-D%익절" or LatestExitName(0) == "3-E%익절" Then
Condition1 = true;
if LatestExitName(0) == "4%익절" or LatestExitName(0) == "4-D%익절" or LatestExitName(0) == "4-E%익절" Then
Condition2 = true;
if LatestExitName(0) == "5%익절" or LatestExitName(0) == "5-D%익절" or LatestExitName(0) == "5-E%익절" Then
Condition3 = true;
if LatestExitName(0) == "7%익절" or LatestExitName(0) == "7-D%익절" Then
Condition4 = true;
}
#전봉대비 수량 증가(추가 진입발생을 의미)
if CurrentContracts > CurrentContracts[1] AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
{
#현재수량 저장
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
}
if CurrentContracts > CurrentContracts[1] AND ((LatestEntryName(0) == "4차매수")) Then
{
#현재수량 저장
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
}
if CurrentContracts > CurrentContracts[1] AND ((LatestEntryName(0) == "6차매수") or (LatestEntryName(0) == "5차매수")) Then
{
#현재수량 저장
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
}
if var1 > 0 and C < Var4 then
ExitLong("bx");
if Condition1 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") )Then
ExitLong("3%익절",AtLimit,Var4*1.03,"",Floor(Var3*0.2),1);
if Condition2 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
ExitLong("4%익절",AtLimit,Var4*1.04,"",Floor(Var3*0.3),1);
if Condition3 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
ExitLong("5%익절",AtLimit,Var4*1.05,"",Floor(Var3*0.4),1);
if Condition4 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
ExitLong("7%익절",AtLimit,Var4*1.07,"",Floor(Var3*0.1),1);
ExitLong("10%익절",AtLimit,Var4*1.10);
//4차 이상 진입
if CurrentEntries >= 4 Then
{
//4차 이후의 평듄
if CurrentContracts > CurrentContracts[1] Then
{
sum1 = sum1 + C*(CurrentContracts-CurrentContracts[1]);
sum2 = sum2 + (CurrentContracts-CurrentContracts[1]);
avg4 = sum1/sum2;
}
if CurrentEntries >= 4 Then
ExitLong("4차이후익절4",AtLimit,avg4*1.04,"4차매수");
if CurrentEntries >= 5 Then
ExitLong("4차이후익절5",AtLimit,avg4*1.04,"5차매수");
if CurrentEntries >= 6 Then
ExitLong("4차이후익절6",AtLimit,avg4*1.04,"6차매수");
}
Else
{
sum1 = 0;
sum2 = 0;
avg4 = 0;
}
}
Else#매수진입중이 아니면
{
#변수 0으로 초기화
var1 = 0;
Var2 = 0;
}
즐거운 하루되세요
> 맴맴잉 님이 쓴 글입니다.
> 제목 : 시스템식 요청드립니다.
> 아래의 식에서 수정이 필요한데 자꾸 오류가 생겨 요청드립니다.
아래의 시스템식은 주가가 14 이평선위에 있다가 해당 이평선을 하향돌파했을때
매수하는 시스템식으로 5% 하락할때마다 분할매수 하고
매도는 매수평단에서 3% 4% 5% 분할매도 하는 시스템 식입니다.
그림파일 1번이 보시면 현재 작성되어있는 식으로 제대로 작동하고 있습니다.
--수정하고 싶은 내용은--
4차 매수 이후부터는 각 차수(4,5,6차)에 매수한 평단에서 4%가 상승하면,
각 차수(4,5,6차)에 매수한 금액(수량) 만큼만 매도 하고,
다시 각 차수(4,5,6차) 매수자리에 오면 매수하는 시스템식으로 수정하고 싶습니다.
예를 들면 그림파일 2번 을 보시면
4차 매수 이후에 4차에 매수한 평단에서 4% 가 상승했을때, 4차에 매수한 금액(수량) 만큼만
매도 해야하고 다시 떨어졌을때, 4차에서 매수하고 싶습니다.
그래서 아래와 같이 4차매수 이후 분할매도식을 수정을 했는데,
4차이후 4% 상승했을때, 전부다 팔리는 상황이 벌어지는데
어떻게 수정을 해야 할지 몰라 요청드립니다.
if Condition1 == False AND ((LatestEntryName(0) == "4차매수"))Then
ExitLong("분할4익절",AtLimit,LatestEntryPrice(0)*1.04,"",Floor(금액*1.25/min(NextBarOpen,mav)));
if Condition1 == False AND ((LatestEntryName(0) == "5차매수"))Then
ExitLong("분할5익절",AtLimit,LatestEntryPrice(0)*1.04,"",Floor(금액*1.3/min(NextBarOpen,mav)));
if Condition1 == False AND ((LatestEntryName(0) == "6차매수"))Then
ExitLong("분할6익절",AtLimit,LatestEntryPrice(0)*1.04,"",Floor(금액*1.35/min(NextBarOpen,mav)));
---------------------------------------------------------------
input : N(14),금액(2000000);
input : 시작날짜 (20250109);
Input : 기준선기간(120);
Var : 기준선(0);
var : cntt(0),H1(0),L1(0);
var : cnt(0),sum(0),mav(0),DD(0);
var : AP(0),TT(0),entry(False);
var : LL(0),RR(0),rate(0);
var : 저항(0), B1(0) ;
Var : day(0),EntryDay(0),ddd(0),ED(0);
#-------------------------------------
if sDate >= 시작날짜 Then
{
if Bdate != Bdate[1] Then
{
entry = true;
day = day+1;
dd = dd+1;
}
}
if TotalTrades > TotalTrades[1] Then
entry = False;
#-------------------------------------
#-------------------------------------
sum = 0;
For cnt = 0 to N-1
{
sum = sum + DayClose(cnt);
}
mav = (sum/N);
#-------------------------------------
#---------------------------------------
if (MarketPosition == 0) and (entry == true) and L > mav Then
Buy("1차매수",AtLimit,mav,Floor(금액/min(NextBarOpen,mav)));
if (LatestEntryName(0) == "1차매수") Then
Buy("2차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.15/min(NextBarOpen,mav)));
if (LatestEntryName(0) == "2차매수") Then
Buy("3차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.2/min(NextBarOpen,mav)));
if (LatestEntryName(0) == "3차매수") Then
Buy("4차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.25/min(NextBarOpen,mav)));
if (LatestEntryName(0) == "4차매수") Then
Buy("5차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.3/min(NextBarOpen,mav)));
if (LatestEntryName(0) == "5차매수") Then
Buy("6차매수",AtLimit,LatestEntryPrice(0)*0.95,Floor(금액*1.35/min(NextBarOpen,mav)));
#-----------------------------------
if MarketPosition == 1 Then
{
#전봉대비 수량 감소(일부 청산발생을 위미)
if CurrentContracts < CurrentContracts[1] Then
{
#청산가 저장
var1 = LatestExitPrice(0);
if LatestExitName(0) == "3%익절" or LatestExitName(0) == "3-D%익절" or LatestExitName(0) == "3-E%익절" Then
Condition1 = true;
if LatestExitName(0) == "4%익절" or LatestExitName(0) == "4-D%익절" or LatestExitName(0) == "4-E%익절" Then
Condition2 = true;
if LatestExitName(0) == "5%익절" or LatestExitName(0) == "5-D%익절" or LatestExitName(0) == "5-E%익절" Then
Condition3 = true;
if LatestExitName(0) == "7%익절" or LatestExitName(0) == "7-D%익절" Then
Condition4 = true;
}
#전봉대비 수량 증가(추가 진입발생을 의미)
if CurrentContracts > CurrentContracts[1] AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
{
#현재수량 저장
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
}
if CurrentContracts > CurrentContracts[1] AND ((LatestEntryName(0) == "4차매수")) Then
{
#현재수량 저장
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
}
if CurrentContracts > CurrentContracts[1] AND ((LatestEntryName(0) == "6차매수") or (LatestEntryName(0) == "5차매수")) Then
{
#현재수량 저장
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
}
if var1 > 0 and C < Var4 then
ExitLong("bx");
if Condition1 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") )Then
ExitLong("3%익절",AtLimit,Var4*1.03,"",Floor(Var3*0.2),1);
if Condition2 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
ExitLong("4%익절",AtLimit,Var4*1.04,"",Floor(Var3*0.3),1);
if Condition3 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
ExitLong("5%익절",AtLimit,Var4*1.05,"",Floor(Var3*0.4),1);
if Condition4 == False AND ((LatestEntryName(0) == "1차매수") OR (LatestEntryName(0) == "2차매수") or (LatestEntryName(0) == "3차매수") ) Then
ExitLong("7%익절",AtLimit,Var4*1.07,"",Floor(Var3*0.1),1);
ExitLong("10%익절",AtLimit,Var4*1.10);
if Condition1 == False AND ((LatestEntryName(0) == "4차매수"))Then
ExitLong("3-D%익절",AtLimit,Var4*1.03,"",Floor(Var3*0.5),1);
if Condition2 == False AND ((LatestEntryName(0) == "4차매수")) Then
ExitLong("4-D%익절",AtLimit,Var4*1.04,"",Floor(Var3*0.45),1);
if Condition3 == False AND ((LatestEntryName(0) == "4차매수")) Then
ExitLong("5-D%익절",AtLimit,Var4*1.05,"",Floor(Var3*0.1),1);
if Condition1 == False AND ((LatestEntryName(0) == "6차매수") or (LatestEntryName(0) == "5차매수"))Then
ExitLong("3-E%익절",AtLimit,Var4*1.03,"",Floor(Var3*0.5),1);
if Condition2 == False AND ((LatestEntryName(0) == "6차매수") or (LatestEntryName(0) == "5차매수")) Then
ExitLong("4-E%익절",AtLimit,Var4*1.04,"",Floor(Var3*0.45),1);
if Condition3 == False AND ((LatestEntryName(0) == "6차매수") or (LatestEntryName(0) == "5차매수")) Then
ExitLong("5-E%익절",AtLimit,Var4*1.05,"",Floor(Var3*0.1),1);
}
Else#매수진입중이 아니면
{
#변수 0으로 초기화
var1 = 0;
Var2 = 0;
}
2025-03-04
371
글번호 188740
답변완료
문의
data2(TRIX(Period));
data2(ema(TRIX(Period),sigPeriod));
Oscillar
챠트는 그대로 두고 지표만 반대로(거꾸로)표현 할 수 있도록 부탁 드립니다
2025-03-04
351
글번호 188737
답변완료
문의 드립니다
안녕하세요
FVG Fair value gap 이라는 지표를 예스로
구현 할 수 있는지 궁금합니다.
미리 감사드립니다.
2025-03-04
409
글번호 188732
gogosing 님에 의해서 삭제되었습니다.
2025-03-04
23
글번호 188730