커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1691
글번호 230811
답변완료
주봉 인덱스
안녕하세요 이전 답변에 대한 재질문 드립니다.
말씀하신 주봉, 월봉에 인덱스를 부여할 수 있을까요..?
마치 주봉 차트에서 인덱스가 있듯이 일봉에서 함수로 표현된 주봉,월봉이 모두 인덱스 할당이 가능하여 맨 초기 주봉부터 현 주봉까지의 종가의 합을 구한다던가 그런 식의 구현이 가능한지 궁금합니다!
///////////////////////////////////////////////////////////////////////////
안녕하세요
예스스탁입니다.
주봉, 월봉의 시고저종은 별도로 불러오는 함수가 없습니다.
아래와 같이 계산해 사용하셔야 합니다.
각 배열변수 [0]은 당주/당월, [1]은 전주, 전월, [2]는 전전주, 전전월..순으로 값이 저장됩니다.
var : cnt(0);
Array : MO[50](0),MH[50](0),ML[50](0),MC[50](0);
Array : WO[50](0),WH[50](0),WL[50](0),WC[50](0);
if bdate > bdate[1]+30 Then
{
MO[0] = O;
MH[0] = H;
ML[0] = L;
for cnt = 1 to 49
{
MO[cnt] = MO[cnt-1][1];
MH[cnt] = MH[cnt-1][1];
ML[cnt] = ML[cnt-1][1];
MC[cnt] = MC[cnt-1][1];
}
}
MC[0] = C;
if H > MH[0] Then
MH[0] = H;
if L < ML[0] Then
ML[0] = L;
if DayOfWeek(bdate) < DayOfWeek(bdate[1]) Then
{
WO[0] = O;
WH[0] = H;
WL[0] = L;
for cnt = 1 to 49
{
WO[cnt] = WO[cnt-1][1];
WH[cnt] = WH[cnt-1][1];
WL[cnt] = WL[cnt-1][1];
WC[cnt] = WC[cnt-1][1];
}
}
if H > WH[0] Then
WH[0] = H;
if L < WL[0] Then
WL[0] = L;
즐거운 하루되세요
> 히익 님이 쓴 글입니다.
> 제목 : 주봉 월봉
> 혹시 일봉 차트에서 예스랭귀지 작성 시 주봉, 월봉데이터를 불러오는 함수값이 있울까요?
2022-07-11
1599
글번호 160615
답변완료
지표수식
안녕하세요 늘...항상 감사 드립니다
30분봉에 볼린저 밴드를 더 작은봉에 표현하고 싶습니다
예를들면 3분봉이나 5분봉에요..
그리고 30분봉의 이평도 3분봉이나 5분봉에 볼 수 있게요...
부탁드립니다 꾸벅
2022-07-11
1626
글번호 160614
답변완료
수식 의뢰 드립니다!
안녕하세요!
궁금한게 있어서 문의드립니다!
1. 해외선물(국내선물 포함) > 예) 호주 달러와 뉴질랜드 달러 2종목을 한 챠트에 합쳐서 매매에 도움을 받고 싶습니다! 합치는 과정을 알려 주시길 부탁 드립니다!
2. 챠트에서 합쳐진 호주 달러의 현재가 와 뉴질랜드 달러의 현재가 간에 진폭 (가격의 격차)를 실시간으로 챠트에 숫자로 나타나는 수식을 만들어 매매에 도움을 받고 싶습니다!
항상 노고에 다시 한번 감사드립니다!
2022-07-11
1545
글번호 160613
답변완료
데이타2수식으로 부탁드립니다.
var : price(0),a(0),b(0),size(0);
price = close;
size = iff((a[1]-a[2]) > 0 or (b[1]-b[2]) < 0 , atr(20) ,TrueRange);
if a[1] > a[2] Then
{
Condition1 = true;
var1 = 0;
}
Else
{
if Condition1 == true Then
var1 = var1+1;
}
a = max(price,a[1]) - size/pow(10,2)*(var1*2);
plot1(a,"a");
2022-07-10
1407
글번호 160612
답변완료
수식 부탁드립니다
수고하십니다.
아래 지표에서
첨부 그림처럼 변곡점 상하 +/- 0.5 위치에 점표시를 하고 싶습니다.
수고하세요..
##########
Input:length(30);
Var:최종고가(0),최종저가(0),최종변곡점(""),처리구분(""),sBar(0),TL1(0),
고추세기울기(0),고추세봉개수(0),고추세시작(0),고추세시작IDX(0),고추세최종(0),
저추세기울기(0),저추세봉개수(0),저추세시작(0),저추세시작IDX(0),저추세최종(0);
Var:고1(0),고2(0),고3(0),고4(0),고5(0),고6(0),고7(0),고8(0),고9(0),고10(0),
저1(0),저2(0),저3(0),저4(0),저5(0),저6(0),저7(0),저8(0),저9(0),저10(0),
고1IDX(0),고2IDX(0),고3IDX(0),고4IDX(0),고5IDX(0),
고6IDX(0),고7IDX(0),고8IDX(0),고9IDX(0),고10IDX(0),
저1IDX(0),저2IDX(0),저3IDX(0),저4IDX(0),저5IDX(0),
저6IDX(0),저7IDX(0),저8IDX(0),저9IDX(0),저10IDX(0);
var : t(0),ii(0);
#==========================================#
Condition1 = Highest(C,length) == C and 최종고가 <> C;
Condition2 = Lowest (C,length) == C and 최종저가 <> C;
처리구분 = "";
If Condition1 and Condition2 Then // 기간고점과 기간저점 동시 발생
{
If 최종변곡점 == "저점" Then 처리구분 = "고점처리"; // 저 - 고 순으로 처리
Else 처리구분 = "저점처리"; // 고 - 저 순으로 처리
}
Else If Condition1 Then 처리구분 = "고점처리";
Else If Condition2 Then 처리구분 = "저점처리";
#==========================================#
If 처리구분 == "고점처리" Then
{
최종고가 = C; // 신규고점을 체크하기 위해 저장
If 최종변곡점 == "저점" Then
{
고9 = 고8; 고9IDX = 고8IDX;
고8 = 고7; 고8IDX = 고7IDX;
고7 = 고6; 고7IDX = 고6IDX;
고6 = 고5; 고6IDX = 고5IDX;
고5 = 고4; 고5IDX = 고4IDX;
고4 = 고3; 고4IDX = 고3IDX;
고3 = 고2; 고3IDX = 고2IDX;
고2 = 고1; 고2IDX = 고1IDX;
고1 = C; 고1IDX = Index;
sBar = Index - 저1IDX; // 추세선 시작점의 위치, n봉전으로 표시
TL1 = TL_New(sDate[sBar],sTime[sBar],저1,sDate[0],sTime[0],고1);
TL_SetSize(TL1,1);
TL_SetColor(TL1,ReD);
}
Else If 고1 < C Then // 1번 고점보다 높은 고가 출현
{
고1 = C; 고1IDX = Index;
TL_SetEnd(TL1,sDate[0],sTime[0],고1);
// 시작점은 변동없고 끝점의 위치가 현재 봉으로 연장된 것임
}
/* 고점추세선 */
If 고2IDX[1] <> 고2IDX Then // 고2의 Index값이 변동 없음 즉, 새로운 고점이 생기지 않았음
{
고추세최종 = 0; 고추세기울기 = 0; 고추세시작 = 0; 고추세봉개수 = 0;
If 고2 < 고3 Then
{
고추세기울기 = (고2 - 고3)/(고2IDX - 고3IDX);
고추세시작 = 고3;
고추세시작IDX = 고3IDX;
}
Else If 고2 < 고4 Then
{
고추세기울기 = (고2 - 고4)/(고2IDX - 고4IDX);
고추세시작 = 고4;
고추세시작IDX = 고4IDX;
}
Else If 고2 < 고5 Then
{
고추세기울기 = (고2 - 고5)/(고2IDX - 고5IDX);
고추세시작 = 고5;
고추세시작IDX = 고5IDX;
}
Else If 고2 < 고6 Then
{
고추세기울기 = (고2 - 고6)/(고2IDX - 고6IDX);
고추세시작 = 고6;
고추세시작IDX = 고6IDX;
}
Else If 고2 < 고7 Then
{
고추세기울기 = (고2 - 고7)/(고2IDX - 고7IDX);
고추세시작 = 고7;
고추세시작IDX = 고7IDX;
}
Else If 고2 < 고8 Then
{
고추세기울기 = (고2 - 고8)/(고2IDX - 고8IDX);
고추세시작 = 고8;
고추세시작IDX = 고8IDX;
}
Else If 고2 < 고9 Then
{
고추세기울기 = (고2 - 고9)/(고2IDX - 고9IDX);
고추세시작 = 고9;
고추세시작IDX = 고9IDX;
}
고추세봉개수 = Index - 고추세시작IDX;
고추세최종 = 고추세기울기 * 고추세봉개수 + 고추세시작;
}
Else If 고추세최종[1] > 0 Then
{
고추세최종 = 고추세기울기 * (Index - 고추세시작IDX) + 고추세시작;
}
If 저추세최종[1] > 0 Then
{
저추세최종 = 저추세기울기 * (Index - 저추세시작IDX) + 저추세시작;
}
최종변곡점 = "고점";
}
#==========================================#
If 처리구분 == "저점처리" Then
{
최종저가 = C;
If 최종변곡점 == "고점" then
{
저9 = 저8; 저9IDX = 저8IDX;
저8 = 저7; 저8IDX = 저7IDX;
저7 = 저6; 저7IDX = 저6IDX;
저6 = 저5; 저6IDX = 저5IDX;
저5 = 저4; 저5IDX = 저4IDX;
저4 = 저3; 저4IDX = 저3IDX;
저3 = 저2; 저3IDX = 저2IDX;
저2 = 저1; 저2IDX = 저1IDX;
저1 = C; 저1IDX = Index;
sBar = Index - 고1IDX;
TL1 = TL_New(sDate[sBar],sTime[sBar],고1,sDate[0],sTime[0],저1);
TL_SetSize(TL1,1);
TL_SetColor(TL1,BluE);
}
Else If 저1 > C then
{
저1 = C; 저1IDX = Index;
TL_SetEnd(TL1,sDate[0],sTime[0],저1);
}
/* 저점추세선 */
If 저2IDX[1] <> 저2IDX Then
{
저추세최종 = 0; 저추세기울기 = 0; 저추세시작 = 0; 저추세봉개수 = 0;
If 저2 > 저3 and 저3 > 0 Then
{
저추세기울기 = (저2 - 저3)/(저2IDX - 저3IDX);
저추세시작 = 저3;
저추세시작IDX = 저3IDX;
}
Else If 저2 > 저4 and 저4 > 0 Then
{
저추세기울기 = (저2 - 저4)/(저2IDX - 저4IDX);
저추세시작 = 저4;
저추세시작IDX = 저4IDX;
}
Else If 저2 > 저5 and 저5 > 0 Then
{
저추세기울기 = (저2 - 저5)/(저2IDX - 저5IDX);
저추세시작 = 저5;
저추세시작IDX = 저5IDX;
}
Else If 저2 > 저6 and 저6 > 0 Then
{
저추세기울기 = (저2 - 저6)/(저2IDX - 저6IDX);
저추세시작 = 저6;
저추세시작IDX = 저6IDX;
}
Else If 저2 > 저7 and 저7 > 0 Then
{
저추세기울기 = (저2 - 저7)/(저2IDX - 저7IDX);
저추세시작 = 저7;
저추세시작IDX = 저7IDX;
}
Else If 저2 > 저8 and 저8 > 0 Then
{
저추세기울기 = (저2 - 저8)/(저2IDX - 저8IDX);
저추세시작 = 저8;
저추세시작IDX = 저8IDX;
}
Else If 저2 > 저9 and 저9 > 0 Then
{
저추세기울기 = (저2 - 저9)/(저2IDX - 저9IDX);
저추세시작 = 저9;
저추세시작IDX = 저9IDX;
}
저추세봉개수 = Index - 저추세시작IDX;
저추세최종 = 저추세기울기 * 저추세봉개수 + 저추세시작;
}
Else If 저추세최종[1] > 0 Then
{
저추세최종 = 저추세기울기 * (Index - 저추세시작IDX) + 저추세시작;
}
If 고추세최종[1] > 0 Then
{
고추세최종 = 고추세기울기 * (Index - 고추세시작IDX) + 고추세시작;
}
최종변곡점 = "저점";
}
2022-07-10
1709
글번호 160611
답변완료
상승률 합
안녕하세요 개발자님.
차트 초기 봉부터 가격 상승률의 총합을 구하려고 합니다. 근데 거의 모든 자산에서 1025 봉 부터 오류가 나오더라구요. 올바른 값이 나오게 하려면 어떻게 해야할까요?
항상 도움주셔서 감사합니다.
Var11=Round((C/C[1]-1)*100,2);
Var10=0;
//////////////////////////////////////////////////////////
Var : cnt(0);
For cnt = 0 to Index-1 step 1
{
Var10=Var10+Var11[cnt];
}
/////////////////////////////////////////////////////////
MessageLog("%.2f %.2f %.2f",Var11,Var10,Index);
2022-07-10
1573
글번호 160610
답변완료
super trend 지표
갬블러님의 super trend지표를 보고 매수/매도 시스템식으로 하고 싶은데 이렇게하면 되는지 검토 부탁드립니다.
[지표식]
input : factor(3), AtrPeriod(10);
var : src(0), AtrV(0),upperBand(0),lowerBand(0), prevLowerBand(0), prevUpperBand(0);
var : prevSuperTrend(0), superTrend(C), direction(0),alpha(0),source(0);
if CurrentBar > 1 Then {
src = (H+L)/2;
// ATR계산(ATR 계산시 지수가중이동평균(rma)이용)
alpha = 1 / AtrPeriod ;
source = max(high - low, abs(high - close[1]), abs(low - close[1]));
ATrV = alpha * source + (1 - alpha) * ATrV[1];
upperBand = src + factor * AtrV;
lowerBand = src - factor * AtrV;
prevLowerBand = lowerBand[1];
prevUpperBand = upperBand[1];
if lowerBand > prevLowerBand or close[1] < prevLowerBand Then
lowerBand = lowerBand;
Else
lowerBand = prevLowerBand;
if upperBand < prevUpperBand or close[1] > prevUpperBand Then
upperBand = upperBand;
Else
upperBand = prevUpperBand;
if C > UpperBand Then
direction = 1;
if C < LowerBand Then
direction = -1;
if direction == 1 Then
supertrend = lowerband;
Else
supertrend = upperband;
}
if C > superTrend Then {
Plot1(superTrend,"UpTrend", Pink, 0, 5);
NoPlot(2);
}
Else {
Plot2(superTrend,"DnTrend", green, 0, 5);
NoPlot(1);
}
if direction == 1 and direction[1] == -1 Then
plot3(superTrend,"BuyStart",Red,0,15);
if direction == -1 and direction[1] == 1 Then
plot4(superTrend,"SellStart",Blue,0,15);
[매수매도 시스템식]
input : factor(3), AtrPeriod(10);
var : src(0), AtrV(0),upperBand(0),lowerBand(0), prevLowerBand(0), prevUpperBand(0);
var : prevSuperTrend(0), superTrend(C), direction(0),alpha(0),source(0);
if CurrentBar > 1 Then {
src = (H+L)/2;
// ATR계산(ATR 계산시 지수가중이동평균(rma)이용)
alpha = 1 / AtrPeriod ;
source = max(high - low, abs(high - close[1]), abs(low - close[1]));
ATrV = alpha * source + (1 - alpha) * ATrV[1];
upperBand = src + factor * AtrV;
lowerBand = src - factor * AtrV;
prevLowerBand = lowerBand[1];
prevUpperBand = upperBand[1];
if lowerBand > prevLowerBand or close[1] < prevLowerBand Then
lowerBand = lowerBand;
Else
lowerBand = prevLowerBand;
if upperBand < prevUpperBand or close[1] > prevUpperBand Then
upperBand = upperBand;
Else
upperBand = prevUpperBand;
if C > UpperBand Then
direction = 1;
if C < LowerBand Then
direction = -1;
if direction == 1 Then
supertrend = lowerband;
Else
supertrend = upperband;
}
if direction == 1 and direction[1] == -1 Then
Buy();
if direction == -1 and direction[1] == 1 Then
Sell();
2022-07-10
1907
글번호 160609
답변완료
수식 부탁합니다
MACD(12,26,9) Golden Cross 발생종목
전제 조건
1) MACD Dead cross 발생 한후 2번째 Golden Cross 일것
2022-07-10
1541
글번호 160608
답변완료
문의 드립니다.~~~~
전에 올려주신 답변인데 이해가 부족하여 공부를 위해
자세한 주석 부탁드립니다.
그리고 고점 저점에 대한 판단은
n틱이상 조정 받은 전고점과 전저점을 고점과 저점의 판단 기준으로 삼고 싶습니다.
> 예스요 님이 쓴 글입니다.
> 제목 : 문의 드립니다.~~~~
> 항상 감사합니다.
-전저점 대비 a틱(변수)이상 상승 후 b틱(변수)이상
하락시 고점처리 ( 챠트에 저점과 고점을 차이 틱수를 고점에 출력하고
저점과 고점을 연결하는 추세선(빨강)그림 )
-전고점 대비 b틱(변수)이상 하락 후 a틱(변수)이상
상승시 저점 처리( 챠트에 고점과 저점의 차이 차이 틱수를 저점에 출력하고
고점과 저점을 연결하는 추세선(파랑)그림)
-매수진입: 저점 형성후 전고점을 돌파하여 전고점대비 c틱(변수) 상승지점에서
매수 진입.
-매도진입: 고점 형성후 전저점을 돌파하여 전저점대비 c틱(변수) 하락지점에서
매도 진입.
- 장중 내내 위 진입을 계속 반복하는 수식 부탁드립니다.
안녕하세요
예스스탁입니다.
올리신 내용에 기준이 되는 고점과 저점 판단에 대한 내용이 없습니다.
게시판에 많이 사용되는 지그재그 식을 이용해 작성해 드립니다.
input:length(5),a틱(10),b틱(10),c틱(5);
Var:j(0),lastHiVal(0),lastLoVal(0),sBar(0),eBar(0),TL1(0),Text1(0),process(0),T(0);
Array:HH[10,2](0),LL[10,2](0);
process = 0;
If Highest(H,length) == H and lastHiVal <> H and Lowest(L,length) == L and lastLoVal <> L Then
{
If LL[1,1] > L Then process = -1;
If HH[1,1] < H Then process = 1;
}
Else If Highest(H,length) == H and lastHiVal <> H Then process = 1;
Else If Lowest(L,length) == L and lastLoVal <> L Then process = -1;
If process == 1 Then
{
T = 1;
lastHiVal = H;
If HH[1,2] < LL[1,2] Then
{
For j = 10 DownTo 2
{
HH[j,1] = HH[j-1,1];
HH[j,2] = HH[j-1,2];
}
}
If HH[1,2] < LL[1,2] or HH[1,1] < H Then
{
HH[1,1] = H;
HH[1,2] = Index;
sBar = Index - LL[1,2];
eBar = 0;
If TL_GetBeginDate(TL1) == sDate[sBar] and TL_GetBeginTime(TL1) == sTime[sBar] Then
{
TL_Delete(TL1);
Text_Delete(Text1);
}
if LL[1,1] > 0 Then
{
TL1 = TL_New(sDate[sBar],sTime[sBar],LL[1,1],sDate[eBar],sTime[eBar],HH[1,1]);
Text1 = Text_New(sDate[eBar],sTime[eBar],HH[1,1],"+"+NumToStr(abs(HH[1,1]-LL[1,1])/PriceScale,0));
Text_SetStyle(Text1, 2, 1);
}
Else
{
Text_Delete(text1);
Text1 = Text_New(sDate[eBar],sTime[eBar],HH[1,1],"+"+NumToStr(abs(HH[1,1]-LL[1,1])/PriceScale,2));
Text_SetStyle(Text1, 2, 1);
}
Text_SetStyle(Text1, 2, 1);
}
if MarketPosition <= 0 and
HH[2,1] >= LL[2,1]+PriceScale*a틱 and
LL[1,1] <= HH[2,1]-PriceScale*b틱 Then
Buy("b",AtStop,HH[2,1]+PriceScale*c틱);
}
If process == -1 Then
{
T = -1;
lastLoVal = L;
If LL[1,2] < HH[1,2] Then
{
For j = 10 DownTo 2
{
LL[j,1] = LL[j-1,1];
LL[j,2] = LL[j-1,2];
}
}
If LL[1,2] < HH[1,2] or LL[1,1] > L Then
{
LL[1,1] = L;
LL[1,2] = Index;
sBar = Index - HH[1,2];
eBar = 0;
If TL_GetBeginDate(TL1) == sDate[sBar] and TL_GetBeginTime(TL1) == sTime[sBar] Then
{
TL_Delete(TL1);
Text_Delete(Text1);
}
if HH[1,1] > 0 Then
{
TL1 = TL_New(sDate[sBar],sTime[sBar],HH[1,1],sDate[eBar],sTime[eBar],LL[1,1]);
Text1 = Text_New(sDate[eBar],sTime[eBar],LL[1,1],"-"+NumToStr(abs(HH[1,1]-LL[1,1])/PriceScale,0));
Text_SetStyle(Text1, 2, 0);
}
Else
{
Text_Delete(text1);
Text1 = Text_New(sDate[eBar],sTime[eBar],LL[1,1],"-"+NumToStr(abs(HH[1,1]-LL[1,1])/PriceScale,0));
Text_SetStyle(Text1, 2, 0);
}
}
if MarketPosition >= 0 and
LL[2,1] <= HH[2,1]-PriceScale*a틱 and
HH[1,1] >= LL[2,1]+PriceScale*b틱 Then
Sell("s",AtStop,LL[2,1]-PriceScale*c틱);
}
2022-07-10
1912
글번호 160607