커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4736
글번호 230811
답변완료
부분적인 재문의
먼저 항상 답변 감사드립니다. 아래는 어제 받은 답변입니다.
3
신호타입 중 atstop은
봉완성시 지정한 가격을 셋팅하고
다음봉에서
매수에서는 지정한 가격 이상
매도에서는 지정한 가격 이하의 시세가
발생하면 즉시 신호가 발생합니다.
전일 마지막봉에서 셋팅하면
전일자기준 nday일전 고가와 저가로 다음날
첫봉에 신호가 발생합니다
아래와 같이 마지막봉에는 셋팅이 되지 않도록
시간조건을 주시면 됩니다.
당일 청산시간이 14시 59분이므로
14시 59분 이전에만 가격 감시하도록 하셔야 합니다.
-------------------------------
1. 9시1분봉 시가는 ~.85이며 고가는 ~.00입니다. 진입하고 싶은 포인트는 ~.95입니다.
그러므로 1분봉에서 진입을 하길 원하지만, 말씀하신 것 처럼 그 다음인 2분봉에 atlimit으로 진입하는 신호를 보입니다.
그렇다면 1분봉에서 진입할 수 있도록 할 수는 없는 것인가요?
2. 또한 그림처럼 종종 하루에 두 번 진입하는 경우가 꽤 발생하더라구요. 하루에 한 번만 진입하고 싶습니다.
--------------------------------
아래는 만들어주신 함수입니다. 부탁드리겠습니다.
input : N(1),nday(2),pt(0.5),시간(93000);
var : Entry(0);
if bdate != Bdate[1] Then
Entry = 0;
if MarketPosition != 0 and MarketPosition != MarketPosition[1] Then
Entry = Entry+1;
if stime >= 시간 and stime < 145900 then{
if entry < N and H < dayhigh(nday)+pt Then
buy("b",AtStop,dayhigh(nday)+pt);
if entry < N and H > dayhigh(nday)+pt Then
buy("bb",AtLimit,dayhigh(nday)+pt);
if entry < N and L > daylow(nday)-pt Then
sell("s",AtStop,daylow(nday)-pt);
if entry < N and L < daylow(nday)-pt Then
Sell("ss",AtLimit,daylow(nday)-pt);
}
SetStopProfittarget(0.5,PointStop);
SetStopLoss(0.5,PointStop);
SetStopEndofday(145900);
2015-10-29
200
글번호 91851
답변완료
함수부탁드립니다
항상 수고많으십니다
아래시스템함수에 트릭스가
Period(5) > sigPeriod(12) 일때 매수
Period(5) < sigPeriod(12) 일때 매도
를 추가하고싶습니다
Var : value(0);
value = 0;
# 매수 / 매도청산
If CCI(9) > 0 Then
value = 1;
If MACD(12,26) > 0 Then
value = value+1;
If DIPlus(14) > DIMinus(14) Then
value = value+1;
If StochasticsK(12,5) > StochasticsD(12,5,5) Then
value = value+1;
# 매수/매도청산
If value >= 3 Then
{
Buy();
}
value = 0;
# 매도/매수청산
If CCI(9) < 0 Then
value = 1;
If MACD(12,26) < 0 Then
value = value+1;
If DIPlus(14) < DIMinus(14) Then
value = value+1;
If StochasticsK(12,5) < StochasticsD(12,5,5) Then
value = value+1;
If value >= 3 Then
{
Sell();
}
2015-10-29
186
글번호 91850
답변완료
부탁 드립니다.
항상 만족한 수식으로 도움 주셔셔
깊이 감사 드립니다.
저점과 저점,고점과 고점끼리 연결했을때
연장선과 끝의 현재 가격을
그림과 같이 부탁 드립니다.
미리 감사 드립니다.
Var:j(0),lastHiVal(0),lastLoVal(0),turnPntBit(""),TL1(0);
Array:valArr[10](0),barArr[10](0),turnPntArr[10]("");
For j = 0 To 9
{
barArr[j] = barArr[j] + 1;
}
Condition1 = Min(valArr[1],valArr[2]) * (1 + (0.3/100)) < H and lastHiVal < H;
Condition2 = Max(valArr[1],valArr[2]) * (1 - (0.3/100)) > L and (lastLoVal > L || lastLoVal == 0);
If Condition1 Then { lastHiVal = H; lastLoVal = 0; }
If Condition2 Then { lastLoVal = L; lastHiVal = 0; }
turnPntBit = "";
If Condition1 and Condition2 Then
{
If Max(valArr[1],valArr[2]) < H and Min(valArr[1],valArr[2]) > L Then
turnPntBit = "HiLo";
Else If Max(valArr[1],valArr[2]) < H Then turnPntBit = "Hi";
Else If Min(valArr[1],valArr[2]) > L Then turnPntBit = "Lo";
}
Else If Condition1 Then turnPntBit = "Hi";
Else If Condition2 Then turnPntBit = "Lo";
If turnPntBit <> "" Then
{
If turnPntBit == "HiLo" Then
{
valArr[1] = IFF(turnPntArr[1] == "Hi",H,L);
barArr[1] = 0;
TL_SetEnd(TL1,sDate[barArr[1]],sTime[barArr[1]],valArr[1]);
If turnPntArr[1] == "Hi" Then
turnPntBit = "Lo";
Else
turnPntBit = "Hi";
}
If turnPntBit <> turnPntArr[1] Then
{
for j = 8 downto 1
{
valArr[j+1] = valArr[j];
barArr[j+1] = barArr[j];
turnPntArr[j+1] = turnPntArr[j];
}
}
If turnPntBit <> turnPntArr[1] or
(turnPntBit == turnPntArr[1] and
((turnPntBit == "Hi" and valArr[1] < H) or
(turnPntBit == "Lo" and valArr[1] > L))) Then
{
valArr[1] = IFF(turnPntBit == "Hi",H,L);
barArr[1] = 0;
turnPntArr[1] = turnPntBit;
If turnPntArr[1][1] <> turnPntArr[1][0] Then
TL1 = TL_New(sDate[barArr[2]],sTime[barArr[2]],valArr[2],sDate[barArr[1]],sTime[barArr[1]],valArr[1]);
Else
TL_SetEnd(TL1,sDate[barArr[1]],sTime[barArr[1]],valArr[1]);
}
}
TL_SetSize(TL1,1);
TL_SetColor(TL1,black);
2015-10-29
254
글번호 91849
답변완료
문의드립니다.
선물차트 기준으로 문의드립니다.
봉의 몸통안에(시가와 종가사이에)
일목균형표 전환선20선, 삼각가중평균선30선, 삼각가중평균선60선이 모두 들어있는 봉을 검색하고 싶습니다.
검색되는 봉이 양봉이면 봉의 아래에 빨강색으로 표시되게 하고,
검색되는 봉이 음봉이면 봉의 위에 파랑색으로 표시되게 하고 싶습니다.
번거로우시겠지만 수식을 부탁드립니다. 감사합니다.
2015-10-28
201
글번호 91848
답변완료
Print 함수 문의
Print 함수를 예제를 보면
print("test.csv","시 %.2f 종 %.2f",Open,Close);
라고 되어 있는데 작성해도 어떻게 적용시키는지 모르겠네요
문의 내용
1. 수식 작성 후 어디서 어떻게 적용하는 건가요?
2. 예전 데이터도 저장이 되나요?
3. Print 함수도 차트를 열어서 적용하는 건가요? 종목번호로 돌려서 자동으로 백업하고 싶은데 차트를 이용하려면, 개별 차트를 열어서 다 적용해야 하나요?
2015-10-28
220
글번호 91847
답변완료
문의 드립니다.
조금전 "이동평균선 골든크로스"에 관해 문의 드렸습니다만,
예스랭귀지에서 기본으로 제공하는 이 검색식이
제대로 작동하지 않는 것인지, 아니면 제가 잘못 사용하고 있는 것인지 문의 드립니다.
첨부파일1과 같이 shortPeriod를 20, longPeriod를 60으로 설정했습니다.
(기본값은 shortPeriod 5, longPeriod 20 입니다.)
기본값으로 검색할 때는 종목들이 뜨는데,
20,60으로 설정하면 "데이터가 존재하지 않습니다" 라고 뜹니다.
제가 아는 몇몇 종목이 골든크로스 상향돌파 된 것으로 보이는데,
검색에 안나오는 것은 어떤 문제에서인지요?
아니면 20일 이평선이 60일 이평선 위에 있는 종목을 검색하기 위해서는,
어떤 검색식으로 하면 될까요? 이걸 보고싶어서 골든크로스를 찾아냈는데,
종목이 검색이 안되서 어렵습니다. 도움 부탁드립니다.
2015-10-28
197
글번호 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
185
글번호 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
173
글번호 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
195
글번호 91843