커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
6526
글번호 230811
답변완료
문의드립니다.
선물차트 기준으로 문의드립니다.
봉의 몸통안에(시가와 종가사이에)
일목균형표 전환선20선, 삼각가중평균선30선, 삼각가중평균선60선이 모두 들어있는 봉을 검색하고 싶습니다.
검색되는 봉이 양봉이면 봉의 아래에 빨강색으로 표시되게 하고,
검색되는 봉이 음봉이면 봉의 위에 파랑색으로 표시되게 하고 싶습니다.
번거로우시겠지만 수식을 부탁드립니다. 감사합니다.
2015-10-28
216
글번호 91848
답변완료
Print 함수 문의
Print 함수를 예제를 보면
print("test.csv","시 %.2f 종 %.2f",Open,Close);
라고 되어 있는데 작성해도 어떻게 적용시키는지 모르겠네요
문의 내용
1. 수식 작성 후 어디서 어떻게 적용하는 건가요?
2. 예전 데이터도 저장이 되나요?
3. Print 함수도 차트를 열어서 적용하는 건가요? 종목번호로 돌려서 자동으로 백업하고 싶은데 차트를 이용하려면, 개별 차트를 열어서 다 적용해야 하나요?
2015-10-28
245
글번호 91847
답변완료
문의 드립니다.
조금전 "이동평균선 골든크로스"에 관해 문의 드렸습니다만,
예스랭귀지에서 기본으로 제공하는 이 검색식이
제대로 작동하지 않는 것인지, 아니면 제가 잘못 사용하고 있는 것인지 문의 드립니다.
첨부파일1과 같이 shortPeriod를 20, longPeriod를 60으로 설정했습니다.
(기본값은 shortPeriod 5, longPeriod 20 입니다.)
기본값으로 검색할 때는 종목들이 뜨는데,
20,60으로 설정하면 "데이터가 존재하지 않습니다" 라고 뜹니다.
제가 아는 몇몇 종목이 골든크로스 상향돌파 된 것으로 보이는데,
검색에 안나오는 것은 어떤 문제에서인지요?
아니면 20일 이평선이 60일 이평선 위에 있는 종목을 검색하기 위해서는,
어떤 검색식으로 하면 될까요? 이걸 보고싶어서 골든크로스를 찾아냈는데,
종목이 검색이 안되서 어렵습니다. 도움 부탁드립니다.
2015-10-28
211
글번호 91846
답변완료
수식 문의 드립니다.
안녕하세요.
예스랭귀지 기본 종목검색 중 "이동평균선 골든크로스"가 있습니다.
코드는 다음과 같고요,
=========================================================================
Input : shortPeriod(5), longPeriod(20);
value1 = ma(C, shortPeriod);
value2 = ma(C, longPeriod);
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);
=========================================================================
여기서 If CrossUp(value1,value2) <== 이 부분이 정확히 무슨 의미인지 모르겠습니다.
여쭤보는 이유는 위의 부분이 If (value1 > value2) 과
어떻게 다른지 정확히 알고 싶어서입니다.
두 개를 각각 검색하였을때, (당연할 수 있지만)
검색 결과가 서로 달랐습니다.
그런데 왜 다른지 모르겠습니다. 상향돌파라는 뜻은 가지고 있으나,
CrossUp 의 정확한 함수 내용을 알려주시면 고맙겠습니다. (코드로 알려주셔도 좋습니다)
2015-10-28
202
글번호 91845
답변완료
로직 재문의
아래글에 대한 2가지 재문의입니다.
1) 아래 로직을 적용해보니, 첫봉에서 매매신호가 뜨는 경우가
발생합니다.
예로, 전일 마지막봉이 빨간봉이고, 당일 첫봉이 빨간봉이면
빨간봉이 2개 연속뜬것으로 인식해 매수신호가 나옵니다.
전일봉은 무시하고, 당일 첫봉부터만 적용되도록 가능합니까?
2)아래 로직에서 십자봉을 제외한 로직은 어떻게 됩니까?
===========================================================
예스스탁입니다.
if countif(C>O or (C == O and c >= C[1]),2) == 2 Then
buy();
if countif(C<O or (C == O and c < C[1]),2) == 2 Then
sell();
즐거운 하루되세요
> 초록이 님이 쓴 글입니다.
> 연결선물지수 3분봉을 하고 잇읍니다.
봉 색깔이 2개 연속 빨간봉이면 매수, 2개연속 파란봉이면 매도
이렇게 하고 싶읍니다.
해당봉 종가가 직전봉 종가 대비 상승 또는 하락 여부는 따지지
않고, 오로지 봉 색깔만을 변수로 하고자 합니다.
(십자봉도 포함시키되, 십자봉 역시 봉 색깔만을 고려합니다).
매수,매도 포지션 모두 로직 부탁합니다.
2015-10-29
187
글번호 91844
답변완료
시스템식 수정 부탁드립니다.
안녕하세요..
어제 오후 44748번글에 답변해 주신 내용입니다.
-----------------------------------------------------------------
안녕하세요
예스스탁입니다.
120일 이평만 체크하는 식이었습니다.
2개조건이 동시만족하면 시장보정계수를 적용하고
아니면 적용하지 않게 수정했습니다.
2개조건 중 하나만 만족해도 시장보정계수를 적용하고자 하시면
if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{
로 변경하시면 됩니다.
------------------------------------------------------------------
보내주신 시스템식과 답변내용을 참고해서 최종적으로...
2개조건 중 하나만 만족해도 시장보정계수를 적용하여
if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{
로 해서 아래 시스템식과 같이 변경했습니다.
그러나 이식에서는
"갭하락(5)" 또는 "일봉이평기간(120)"과 관련해서 "시장보정계수(5)"를 동일하게 같이 적용했는데요,
"갭하락(5)"에 관련해서는 "시장보정계수(5)"를 적용하고
"일봉이평기간(120)"과 관련해서는 "이평보정계수(5)"를 새롭게 변수설정해서 적용하고 싶습니다.
정리하자면
1) 시장상황이 좋지 않아 5% 이상 시가가 갭하락하면 "시장보정계수"를 적용해 원래 매수하려던 1차매수의 자리에서 보정계수만큼 낮게 매수함.
2) 일봉상 120일 이동평균선이 우하향하면 "이평보정계수"를 적용해 원래 매수하려던 1차매수의 자리에서 보정계수만큼 낮게 매수함.
3) 기존에는 갭하락과, 이동평균선의 조건에 따라 하나의 보정계수를 동일하게 적용했으나, 수정될 시스템식에는 각 조건에 따라 보정계수를 독립적으로 다르게 적용함.
[질문]
수정된 시스템식에서 120일 이동평균선이 우하향하는 종목이 시가가 -5%이상 갭하락하면
즉, 보정계수를 적용해야 하는 경우가 동시에 2개가 발생하면 보정계수가 어떻게 적용되나요?
이경우 두개의 보정계수를 모두 적용하고 싶습니다.
즉, "시장보정계수(5)+이평보정계수(5)" 로 계산해서 전체보정계수 "10"의 효과를 보고 싶습니다.
------------------------------------------------------------------------------------
input : 전략식시작일자(20151028), 전략식시작시간(090000), 전략총매수금액(5000);
input : 전략식종료일자(20151231);
input : 갭하락(5), 시장보정계수(5), 일봉이평기간(120);
input : P(10), 매수위치1차(10), 매수위치2차(7), 매수위치3차(14);
input : 매수위치보정(1);
input : 매도위치1차(7), 매도위치2차(14);
input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35);
input : 매도비중1차(50), 매도비중2차(50);
input : 전략식진입횟수(100);
input : 타점보유일수(5);
var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0);
var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0);
var : Period(0),매수1차(0);
var : cum1(0),cum2(0),ma1(0),ma2(0);
# 일자수 계산
if date != date[1] Then
Didx = Didx+1;
# 일봉 120이평 계산(전일기준,전전일기준)
cum1 = 0;
cum2 = 0;
for cnt = 1 to 일봉이평기간{
cum1 = cum1+DayClose(cnt);
cum2 = cum2+DayClose(cnt+1);
}
# 전일기준 일봉 120일이평
ma1 = cum1/일봉이평기간;
# 전전일기준 일봉 120일이평
ma2 = cum2/일봉이평기간;
# 전일기준 120일이평이 전전일기준 120일이평보다 작거나 또는 갭하락이면
# 엔벨로프 기간은 P+시장보정계수
# 엔벨로프 Percent수치는 매수위치1차+시장보정계수
if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{
Period = P+시장보정계수;
매수1차 = 매수위치1차+시장보정계수;
}
else{ ##전일기준 120일이평이 전전일기준 120일이평 이상이거나 갭하락이 아니면
Period = P;
매수1차 = 매수위치1차;
}
#당일포함 일봉 Period개의 종가를 누적
sum = 0;
for cnt = 0 to Period-1{
sum = sum+DayClose(cnt);
}
#누적값을 Period로 나누어 평균값 산출
mav = sum/Period;
#상단계산
Eup = mav+mav*(매수1차/100);
#하단계산
Edn = mav-mav*(매수1차/100);
#지정일 지정시간이 되면 TimeCond는 True(그전에는 false)
if sdate == 전략식시작일자 and (stime == 전략식시작시간 or (stime > 전략식시작시간 and stime[1] < 전략식시작시간 )) then
TimeCond = true;
if sdate > 전략식종료일자 Then
TimeCond = false;
#TimeCond가 True가 된 후
if TimeCond == true then{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then
Ecnt = Ecnt+1;
#무포지션 상태에서 매수위치1차에 도달하면 매수
if MarketPosition == 0 and Ecnt < 전략식진입횟수 Then
buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100)));
#첫매수이후
if MarketPosition == 1 Then{
#최근 진입시점의 일자수 저장
if CurrentContracts > CurrentContracts[1] Then{
LatestEntryDidx = Didx;
LatestEntrylow = L;
}
#1차매수 발생 후 매수위치2차에 도달하면 매수
if MaxEntries == 1 Then
buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100)));
#1차매수 발생 후 매수위치3차에 도달하면 매수
if MaxEntries == 2 Then
buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100)));
#1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true
if LatestExitName(0) == "1차매도" then
Xcond1 = true;
#2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true
if LatestExitName(0) == "2차매도" then
Xcond2 = true;
#Xcond1이 false일때
#진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산
if Xcond1 == false Then
exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1);
#Xcond2가 false일
#진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산
if Xcond2 == false Then
exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100));
#최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가)
if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{
#최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산
if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{
Loss = daylow(1);
for cnt = 1 to 타점보유일수{
if daylow(cnt) < Loss Then
Loss = daylow(cnt);
}
}
#Loss값 이하로 가격하락하면 전량 청산
exitlong("손절",AtStop,Loss);
}
#최종 매수일 포함 3일경과되면 다음날 시가에 매도
if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{
exitlong("익절2",AtMarket);
}
# 1차매도가 발생한 상황
# 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산
# if L < LatestEntrylow and Xcond1 == false Then
# LatestEntrylow = L;
# if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{
# exitlong("익절1",AtStop,LatestEntrylow);
# }
}
else{ #매수포지션이 아니면 false로 초기화
Xcond1 = false;
Xcond2 = false;
}
}
2015-10-28
217
글번호 91843
답변완료
수식 부탁드립니다.
현재 예스트레이더4.0 사용중입니다.
기존 사용중인 종목검색에 다음과 같은 추가 사항을 넣어 종목검색하고 싶습니다.
당일, 전일,전전일 3일간 각각의 시초가와 종가(총6개의 값) 들이 5%내에 존재하는 종목을 추가하려는데,
어떻게 하면될까요.
즉, 6개 값의 최고값과 최소값의 차가 5%내에 존재.....
제가. 무식하게 해볼려고 했는데, 잘 안되네요.
시간되실때 부탁드리겠습니다.... 감사합니다.
2015-10-28
202
글번호 91838
답변완료
44741번글 관련 문의 드립니다.
오전에 부탁드린 "갭하락(5)" 관련 시스템식과
오후에 부탁드린 "일봉이평기간(120)" 관련 시스템식이 각각 별도로 적용된 시스템식인가요?
오후에 최종 변경해 주신 시스템식을 보니 오전 "갭하락(5)"에 관련된 부분을 제외하고
그자리에 "일봉이평기간(120)"을 적용하신것 같아 문의 드립니다.
"갭하락(5)"과 "일봉이평기간(120)"이 동시에 적용된 시스템식 부탁드립니다.
매번 번거롭게 해드려 죄송하고 감사드립니다.
수고하세요.
2015-10-28
204
글번호 91837
답변완료
함수수정요청(11-1호)_특이치제거
아래는 최근 10일동안 해외선물의 일중 움직임(시가와 고가, 고가와 저가, 시가와 저가)을 관찰하여 매매의 전략을 세우고자 했었습니다.
단순평균을 사용하다보니 특이치를 제거하고 싶습니다.
즉 최근 10일동안 (고가-저가) 의 값이 가장 큰 값과 가장 작은 값을 제거하고
8개 값을 평균하고 싶습니다.
만약에 동일한 값이 여러 개라면 각각 1개씩만 제거하여 8개의 변수를 평균내고가 합니다.
var : entry1(0);
var : ho1(0),OL1(0),HL1(0);
var : maho1(0),maOL1(0),maHL1(0);
var : cnt1(0),sumho1(0),sumOL1(0),sumHL1(0);
var : EntryCnt1(0);
var : V1(0),V2(0),V3(0),V4(0),V5(0);
var : V6(0),V7(0),V8(0),V9(0),V10(0);
if bdate != bdate[1] Then
entry1 = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
entry1 = entry1+1;
ho1 = Dayhigh-Dayopen;
OL1 = DayOpen-DayLow;
HL1 = DayHigh-DayLow;
sumho1 = 0;
sumOL1 = 0;
sumHL1 = 0;
for cnt1 = 1 to 10{
sumho1 = sumho1 + (dayhigh(cnt1)-dayopen(cnt1));
sumOL1 = sumOL1 + (DayOpen(cnt1)-DayLow(cnt1));
sumHL1 = sumHL1 + (DayHigh(cnt1)-DayLow(cnt1));
}
maho1 = sumho1/10;
maOL1 = sumOL1/10;
maHL1 = sumHL1/10;
V1 =
V2 =
V3 =
V4 =
V5 =
V6 =
V7 =
V8 =
V9 =
V10 =
if MarketPosition == 0 and entry1 == 0 Then{
if V7 > V8 Then
sell("s1",AtStop,V7-0.02);
if V7 < V8 Then
sell("s2",Atlimit,V8-0.02);
}
if MarketPosition == -1 and IsEntryName("s1") == true Then{
ExitShort("sp1",atlimit,V9-0.03);
ExitShort("sl1",AtStop,V6);
}
if MarketPosition == -1 and IsEntryName("s2") == true Then{
ExitShort("sp2",atlimit,V9-0.03);
ExitShort("sl2",AtStop,V6);
}
var : TF(0);
var : Xtime(0), Etime(false),cnt(0),mav1(0),mav2(0);
var : HV(0),LV(0),HV1(0),LV1(0),HV2(0),LV2(0);
Array : HH[50](0),LL[50](0),CC[50](0);
mav1 = ma(c,5);
mav2 = ma(C,20);
TF = TimeToMinutes(stime)%30;
if Bdate != Bdate[1] Then{
Etime = true;
if stime >= 090000 Then
Xtime = 050000;
Else
Xtime = 060000;
}
if Bdate != Bdate[1] or (TF < TF[1] and stime > stime[1]) or date != date[1] Then{
HH[0] = H;
LL[0] = L;
for cnt = 1 to 49{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if HH[25+2] > 0 Then{
HV = HH[0];
LV = LL[0];
HV1 = HH[1];
LV1 = LL[1];
HV2 = HH[2];
LV2 = LL[2];
for cnt = 0 to 25{
if HH[cnt] > HV Then
HV = HH[cnt];
if LL[cnt] < LV Then
LV = LL[cnt];
if HH[cnt+1] > HV Then
HV = HH[cnt+1];
if LL[cnt+1] < LV Then
LV = LL[cnt+1];
if HH[cnt+2] > HV Then
HV = HH[cnt+2];
if LL[cnt+2] < LV Then
LV = LL[cnt+2];
}
var1 = (HV+LV)/2;
var2 = (HV1+LV1)/2;
var3 = (HV2+LV2)/2;
if Etime == true then{
if MarketPosition == 0 and CC[0] > var1 and CC[1] < var2 and CC[2] < var3 and C >= daylow+0.5 Then
buy("b",AtMarket);
if MarketPosition == 1 and c <= highest(H,BarsSinceEntry)-0.5 and CrossDown(mav1,mav2) Then
ExitLong("bx",AtMarket);
}
}
if stime == Xtime or (stime > Xtime and stime[1] < Xtime) Then{
Etime = false;
ExitLong();
}
2015-10-28
222
글번호 91835