커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
8165
글번호 230811
답변완료
수식 간소화
MACD 다이버젼스 수식을 아래와 같이 만들었었는데요.. 간략하게 수정 또는 같은 내용으로 재작성 부탁드립니다.
Input: Period(60), ShortPeriod(12), longPeriod(26), Highperiod(30);
Var: Formula0(0), Formula1(0), Formula2(0), Formula3(0);
Formula0 = iff(macd(shortPeriod,longPeriod)>macd(shortPeriod,longPeriod)[1] &&
macd(shortPeriod,longPeriod)[1] <= macd(shortPeriod,longPeriod)[2] &&
lowest(macd(shortPeriod,longPeriod)[2],Period) < macd(shortPeriod,longPeriod)[1] &&
(L<Lowest(L[1],Period)||L[1]<Lowest(L[2],Period)||
L[2]<Lowest(L[3],Period)),
iff(C==C[1],0.001,(C-C[1])/C[1]*100), 0);
Formula1 = iff(macd(shortPeriod,longPeriod)<macd(shortPeriod,longPeriod)[1]&&
macd(shortPeriod,longPeriod)[1] >= macd(shortPeriod,longPeriod)[2]&&
highest(macd(shortPeriod,longPeriod)[2],period)>macd(shortPeriod,longPeriod)[1]&&
(H>Highest(H[1],Period)||H[1]>Highest(H[2],Period)||
H[2]>Highest(H[3],Period)),
iff(C==C[1],0.001,(C[1]-C)/C[1]*100), 0);
Formula2 = iff(macd(shortPeriod,longPeriod)<macd(shortPeriod,longPeriod)[1]&&
macd(shortPeriod,longPeriod)[1] >= macd(shortPeriod,longPeriod)[2] &&
highest(macd(shortPeriod,longPeriod)[2],period)>macd(shortPeriod,longPeriod)[1]&&
(H>Highest(H[1],Period)||H[1]>Highest(H[2],Period)||
H[2]>Highest(H[3],Period)),
iff(C==C[1],0.001,(C[1]-C)/C[1]*100), 0);
Formula3 = iff(macd(shortPeriod,longPeriod)>macd(shortPeriod,longPeriod)[1]&&
macd(shortPeriod,longPeriod)[1] <= macd(shortPeriod,longPeriod)[2] &&
lowest(macd(shortPeriod,longPeriod)[2],Period) < macd(shortPeriod,longPeriod)[1] &&
(L<Lowest(L[1],Period)||L[1]<Lowest(L[2],Period)||
L[2]<Lowest(L[3],Period)),
iff(C==C[1],0.001,(C-C[1])/C[1]*100), 0);
if Formula0 Then
Buy();
if Formula1 Then
Exitlong();
if Formula2 Then
Sell();
if Formula3 Then
Exitshort();
2016-07-20
223
글번호 100249
답변완료
문의드립니다
Input : Af(0.02), MaxAf(0.2);
Var : direction(0), sar1(0), afval(0), ep(0),lowval(0),highval(0),count(0);
if count == 0 then //변수들의 초기화
{
highval = High;
lowval = Low;
direction = 0;
sar1 = 0;
afval = 0;
ep = 0;
count = 1;
}
if(ep != 0 ) then // 추세가 진행중
{
if(direction == 1) then // 상승추세이면
{
ep = highval;
sar1 = sar1 + afval*(ep-sar1); // 상승추세에서 SAR값 계산
if(high > highval) then // 신고가 발생
{
highval = high;
afval = afval+Af; // 상승추세에서 신고가가 발생했으므로 가속변수 증가
if(afval >= MaxAf) then // 가속변수가 최대값과의 비교 (가속변수는 최대 가속값 보다 클 수 없다)
afval = MaxAf;
}
if( low < sar1) then // 추세변경(상승->하락)
{ // 다음 SAR값을 계산할 때 필요한 전SAR값은 하락추세로 전환되기 직전의
direction = -1; // 최고가를 사용하므로 sar1 = ep (ep에는 highval 들어있다)
sar1 = ep; // 추세가 변경되었으므로 가속변수 및 EP, highval 초기화
afval = 0;
ep = 0;
lowval = low;
}
}
else // 하락 추세
{
ep = lowval; // 하락추세에서는 EP로 저가 사용
sar1 = sar1 + afval*(ep-sar1);
if(low < lowval) then // 신저가 발생
{
lowval = low;
afval = afval + Af;
if( afval >= MaxAf) then // 가속변수가 최대값과의 비교 (가속변수는 최대 가속값 보다 클 수 없다)
afval = MaxAf;
}
if(high > sar1) then // 추세 변경(하락->상승)
{ // 다음 SAR 값을 계산할 때 필요한 전SAR값은 상승추세로 전환되기 직전의
direction = 1; // 최저가를 사용하므로 sar1 = ep (ep에는 lowval값이 들어있다)
sar1 = ep; // 추세가 변경되었으므로 가속변수 및 EP, highval 초기화
afval = 0;
ep = 0;
highval = high;
}
}
}
else if(sar1 != 0 && ep == 0) then //추세가 변경된후 첫번째 SAR계산
{
if(direction == 1) then // 상승 추세
{
ep = highval; // 상승추세에서는 신고가를 EP로 사용하므로
afval = Af; // 가속변수의 초기값인 AF(0.02) 적용
sar1 = sar1 + afval*(ep-sar1);
if ( high > highval) then // 신고가가 발생
{
Highval = high;
afval = afval + Af; // 가속변수 증가
if(afval >= MaxAf) then // 가속변수가 최대값과의 비교 (가속변수는 최대 가속값 보다 클 수 없다)
afval = MaxAf;
}
}
else // 하락추세
{
ep = lowval;
afval = Af; // 가속변수의 초기값인 AF(0.02) 적용
sar1 = sar1 + afval*(ep-sar1);// 하락추세에서 SAR 계산
if(low < lowval) then // 신저가 발생
{
lowval = low;
afval = afval + Af; // 가속변수 증가
if(afval >= MaxAf) then // 가속변수가 최대값과의 비교 (가속변수는 최대 가속값 보다 클 수 없다)
afval = MaxAf;
}
}
}
else // SAR 첨 시작
{
if direction == 0 then // 추세가 없으므로
{
if(c > c[1]) then // 상승추세로 시작
direction = 1;
else if( c < c[1]) then // 하락추세로 시작
direction = -1;
}
else if direction == 1 then // 상승추세(추세변경이 일어날 경우 SAR 계산하기 시작)
{
if(c < c[1]) then // 추세 변경 (상승->하락) SAR 계산하기 시작
{
direction = -1;
sar1 = highval; // 하락추세로 전환시 다음 SAR값을 계산할 때 필요한 전 SAR값은 추세직전의 최고가를 사용하므로
}
}
else if direction == -1 then // 하락추세(추세변경이 일어날 경우 SAR 계산하기 시작)
{
if( c > c[1]) then // 추세 변경 (하락->상승) SAR 계산하기 시작
{
direction = 1;
sar1 = lowval; // 상승추세로 전환시 다음 SAR값을 계산할 때 필요한 전 SAR값은 추세직전의 최저가를 사용하므로
}
}
lowval = min(low, lowval); // 추세 변경시 전 SAR값으로 최고가나 최저가가 필요하므로
highval = max(high,highval); // low, high를 전의 최고가, 최저가와 비교하여 최고가, 최저가를 저장
}
//처음 시작할 때 다음 추세 변경이 일어날 때까지 SAR는 invalid
#if(sar1 != 0) then
# User_Func_Sar = sar1;
if sar1 > sar1[1] and C > sar1 Then
buy("매수");
if sar1 <= sar1[1] and C < sar1 Then
sell("매도");
사진상 첫부분에서 바로 신호가 뜨면좋겠습니다
수정가능한지좀 부탁드립니다..
2016-07-20
312
글번호 100248
답변완료
서로 다른 지표간의 돌파 검색
볼린저 밴드 10, 6 상한
엔벨로프 20, 5 저항
볼린저밴드가 엔벨로프를 상향돌파하는 종목검색식을 작성하고 싶은데
가능할까요??
2016-07-20
244
글번호 100247
답변완료
수식 부탁드립니다.
20일선과 5일선을 이용한 추세 매매 수식 부탁드립니다.
1. 매수 신호 : 새로운 캔들이 형성될 때 20일선이 우 상향하면 5일선 아래로 양봉 발생 시 매수 신호 발생
2. 매도 신호 : 새로운 캔들이 형성될 때 20일선이 우 하향하면 5일선 아래로 음봉 발생 시 매도 신호 발생
(실시간 캔들에서 신호 발생되어야 합니다.)
3. 수량 : 2계약
3. 청산 조건 : 익절 = 1차 : 20틱, 2차 : 30틱, 손절 = 15틱
4. 먼저 진입한 포지션이 청산 완료된 후 다음 신호 진입
5. 매매 종료 시간 설정 : 01:00
2016-07-20
225
글번호 100229
답변완료
부탁드립니다
선물 매매;2분챠트
#단순이평 20일선이 120 위로 돌파시 매수,or 20일선이 위로 240 돌파시
매도분 청산과 동시 매수
# 20일선이 120 아래로 이탈시 매도,or 20일선이 아래로 240 이탈시
매수분 청산과 동시 매도,
#당일 청산,손절매 6틱,매매수량 3
2016-07-20
215
글번호 100228
답변완료
문의
안녕하세요
밑에수식에서 하루진입횟수제한 조정가능하게부탁합니다.감사합니다
var : diff(0);
diff = bids-asks;
if crossup(diff,1000) Then
buy();
if CrossDown(diff,-1000) Then
sell();
2016-07-20
213
글번호 100225
우섭 님에 의해서 삭제되었습니다.
2016-07-20
2
글번호 100224
답변완료
시스템오류 문의
항상 감사드립니다
아래식을 시스템에 적용해보면 타주기식을 적용할때와 안할때가 신호가 다르게나옵니다
타주기식은 크루드 5분봉입니다
주챠트는 크루드 20틱이고
제가 구현하고자 하는 식은
타주기5분선의 v50을 주챠트20틱의 현재가가 상향,하향돌파시 청산식입니다
위청산식을 적용하면 매매신호가 다르게 나옵니다
(청산식 적용전과 적용후의 신호가 다름)
제가 어느부분을 잘못했는지 수정부탁드립니다
##############################
### 거래선_240_120_10 ########
##############################
var : upv1(0),upv2(0),upv3(0);
var : dnv1(0),dnv2(0),dnv3(0);
If V== highest(V,10) then{
Var71 = C;
var72 = var71[1];
if var71 > var72 Then{
upv1 = var71;
upv2 = upv1[1];
upv3 = upv2[1];
if upv1 > upv2 and upv2 > upv3 Then
var70 = 1;
}
if var71 < var72 Then{
dnv1 = var71;
dnv2 = dnv1[1];
dnv3 = dnv2[1];
if dnv1 < dnv2 and dnv2 < dnv3 Then
var70 = -1;
}
}
if var70 != var70[1] Then{
var50 = c;
}
#++++++++++++++++++++++++++++++++++++++++++++++++++++#
var : upv11(0,data2),upv12(0,data2),upv13(0,data2);
var : dnv11(0,data2),dnv12(0,data2),dnv13(0,data2);
var : V11(0,data2),V12(0,data2),V20(0,data2),V50(0,data2);
If data2(V== highest(V,10)) then{
v11 = data2(C);
v12 = v11[1];
if v11 > v12 Then{
upv11 = v11;
upv12 = upv11[1];
upv13 = upv12[1];
if upv11 > upv12 and upv12 > upv13 Then
v20 = 1;
}
if v11 < v12 Then{
dnv11 = v11;
dnv12 = dnv11[1];
dnv13 = dnv12[1];
if dnv11 < dnv12 and dnv12 < dnv13 Then
v20 = -1;
}
}
if v20 != v20[1] Then{
v50 = data2(c);
}
if MarketPosition == 1 and CrossDown(c,v50) Then
exitlong("eB_타10");
if MarketPosition == -1 and crossup(c,v50) Then
ExitShort("eS_타10");
2016-07-20
220
글번호 100223
답변완료
48706 재질의
실제 시스템을 돌려보니 시장이 빨리 움직이는 경우 진입을 놓치는 경우들이 발생하네요.
1) 진입주문은 지정가 주문이 아닌 시장가 주문으로 하려면 어떻게 해야 하나요?
2) 지정가 주문에 대해 실제 진입이 안되었는데도 청산주문은 시스템대로 내보내게 되면 원치 않는 포지션을 갖게 되는데요, 가령 매수진입 주문이 체결되지 않으면 매도 청산 신호가 나오더라도 청산주문을 넣지 않게 할 수는 없나요? 원치 않는 매도 포지션을 갖고 싶지 않아서...
------------------------------------------------
추가로 진입조건을 넣었으면 하는데요. 아래 조건 추가 부탁드립니다.
60 지수이평선 위에 있으면서 (i) 스토캐스틱 K가 20 아래로 내려갔다가 올라갈 때 또는 (ii) 스토캐스틱 K가 스토캐스틱 D를 상향돌파할 때 매수,
60 지수이평선 아래에 있으면서 (i) 스토캐스틱 K가 80 위로 올라갔다가 내려갈 때 또는 (ii) 스토캐스틱 K가 스토캐스틱 D를 하향돌파할 때 매도.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 시스템 문의
> 안녕하세요
예스스탁입니다.
Input : Period(12), Period1(5), Period2(5);
var : StoK(0),StoD(0);
StoK = StochasticsK(Period,Period1);
StoD = StochasticsD(Period,Period1,Period2);
if CrossDown(stok,80) or CrossDown(stok,stod) Then
sell();
if CrossUp(stok,20) or Crossup(stok,stod) Then
buy();
if MarketPosition == -1 and (CrossDown(stok,20) or CrossUp(stok,stod)) Then
ExitShort();
if MarketPosition == 1 and (CrossUp(stok,80) or CrossDown(stok,stod)) Then
ExitLong();
즐거운 하루되세요
> aaaaa 님이 쓴 글입니다.
> 제목 : 시스템 문의
> 슬로우 스토캐스틱을 기초로 시스템을 만드려고 합니다.
1. (A) 매도 진입조건으로 (i) 스토캐스틱 K가 80 위로 올라갔다가 내려갈 때 또는 (ii) 스토캐스틱 K가 스토캐스틱 D를 하향돌파할 때 매도.
(B) 매수진입조건으로 (i) 스토캐스틱 K가 20 아래로 내려갔다가 올라갈 때 또는 (ii) 스토캐스틱 K가 스토캐스틱 D를 상향돌파할 때 매수.
2. 매도 포지션 청산조건으로 (i) 스토캐스틱 K가 20 아래로 하향돌파할 때 또는 (ii) 스토캐스틱 K가 스토캐스틱 D를 상향돌파할 때 매도포지션 청산.
매수 포지션 청산조건으로 (i) 스토캐스틱 K가 80 위로 상향돌파할 때 또는 (ii) 스토캐스틱 K가 스토캐스틱 D를 하향돌파할 때 매수포지션 청산.
2016-07-20
210
글번호 100222