커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
6064
글번호 230811
답변완료
차트 전체에서의 첫봉(한개)의 값
안녕하세요
차트 전체 기간(일봉) 중 첫날 종가를 알 수 있을까요?
구할 수 있다면 아래와같이 차트로 보고싶은데 수식 부탁드립니다.
차트 전체의 첫 날 종가 / 차트 전체의 첫 날 종가 * 100
차트 전체의 둘째날 종가 / 차트 전체의 첫 날 종가 * 100
차트 전체의 셋째날 종가 / 차트 전체의 첫 날 종가 * 100
차트 전체의 넷째날 종가 / 차트 전체의 첫 날 종가 *100
...
~~~
...
오늘 종가 / 차트 전체의 첫 날 종가*100
이렇게 일봉차트에서 조회되는 첫날부터 오늘까지의 종가를 계속 나누면서 와야하는 차트를 만들고 싶은데 부탁드립니다
2022-11-04
1126
글번호 163508
답변완료
문의드립니다
분봉차트에서 사용할 갭보정 볼린저밴드 지표식 부탁합니다
검색해서 찾아봤는데 이상하게 나오네요
감사합니다
2022-11-03
1087
글번호 163507
답변완료
문의 드립니다.
아래의 기준가 매매 로직에서 무포지션 일 때
미리 자동매매 설정하면 302.00 위에서 아래로 돌파하면
매도청산 완료 신호가 매도로 진입되는데요.
이 점을 보완하고 싶습니다.
무조건 진입은 기준가 아래서 위로 돌파 시 매수 진입하고
매수 포지션 있을 때 매도 청산완료가 진행되었으면 합니다.
혹시 이부분이 가능할까요.
부탁드립니다.
input : Price (302.00);
if crossup(C,price) Then
buy();
if CrossDown(C,price) Then
ExitLong();
2022-11-03
1344
글번호 163501
답변완료
조건을 만족하는 값 추리기
안녕하세요 항상 건강하셨으면 좋겠습니다.
코드 짜주시고 도움 주셔서 항상 고맙습니다 (__)
특정 조건을 만족하는 값만 추리길 원합니다 어떻게 해야할지 도움 주시면 감사하겠습니다
X = IFF(Y, 1, 0)이라고 가정하고 (X는 0 또는 1일수밖에 없음)
X가 1이었다가 0으로 바뀌었다는 가정하에,
X가 1이었을때의 봉들 중 가장 작은 거래량을 가진 봉의 저가 <--var1에 넣고싶습니다.
X가 0이었다가 1로 바뀌었다면, x가 0이었을떄의 봉들 중 가장 작은 거래량을 가진 봉의 저가 <-- var2에 넣고싶습니다
var2에 새로운 값이 저장되어있는 상태이고, 다시 x가 1이었다가 0으로 바뀌면, var1에 바로 전에 x가 1인 상황이었을때 만들어진 가장 작은 거래량을 가진 봉의 저가 값'을 다시 넣고, 그 전에 있던 var1 값은 var3에 저장이 되었으면 좋겠습니다.
var1에 새로운 값이 저장되어있고, x가 0이었다가 다시 1로 바뀌면, var2의 x가 1이었을때 만들어진 가장 적은 거래량을 가진 봉의 저가 값을 넣고, 그 전에있던 var2는 var4에 저장되었으면 좋겠습니다.
이렇게 하면 홀수 var에는 x가 1이었을때 값이 계속 갱신되었으면 좋겠습니다. ,
짝수 var에는 x가 0이었을때의 값들이 계속 갱신되었으면 좋겠습니다.
홀수, 짝수 var들은 위와 같은 갱신은 10번까지 할 수 있도록 도와주세요(var 값은 계속 바뀌지만 실제 사용은 홀수당 10개, 짝수당 10개까지 할 수 있도록)
부탁드립니다.
2022-11-03
1071
글번호 163500
답변완료
문의드립니다.
안녕하세요
사진파일 처럼 빨간 화살표 부분
사각 박스를 그린후 박스 시작세로선과 박스 끝세로선이 캔들의 세로부분 중심부분부터
그려지는데요.
검은색으로 빗금친 부분부터 그릴 수 있을까요?
시작세로선이 캔들의 맨 왼쪽 끝세로선이 캔들의 맨오른쪽까지 그릴 수 있을까요?
감사합니다.
if cond1 == True Then
{
if cond1[1] == False Then
{
Box1 = Box_New(sDate,sTime,Value10,NextBarSdate,NextBarStime,H);
Box_SetColor(Box1,Black);
Box_SetFill(Box1,True,70,True);
}
Else
{
Box_SetEnd(Box1,sDate,sTime,O);
}
}
2022-11-03
836
글번호 163496
답변완료
추세선 쓰리바닥
input : Period(12),선두께(1);
Var:상승색(Red), 하락색(Blue);
Var:j(0),T(0);
Var: date11(0),date12(0),time11(0),time12(0),TL1(0),TL(0),
date21(0),date22(0),time21(0),time22(0),
date31(0),date32(0),time31(0),time32(0),tx(0),tx1(0),tl4(0);
Array:HiVal[20](0),LoVal[20](0),HiBar[20](0),LoBar[20](0)/*,ZZ[20](0)*/;
Array:r[7](0),fr[7](0),TL2[7](0),TL3[7](0),TX2[7](0),TX3[7](0);
r[0] = 0;
r[1] = 2;
r[2] = 3.;
r[3] = -1;
r[4] = -2.;
r[5] = 1;
r[6] = 0.5;
For j = 0 To 19
{
HiBar[j] = HiBar[j] + 1;
LoBar[j] = LoBar[j] + 1;
}
if crossup(c,highest(H,Period)[1]) Then
T = 1;
if CrossDown(c,Lowest(L,Period)[1]) Then
T = -1;
If T == -1 Then
{
If T[1] != -1 Then
{
For j = 18 DownTo 0
{
LoVal[j+1] = LoVal[j];
LoBar[j+1] = LoBar[j];
//ZZ[j+1] = ZZ[j];
}
LoVal[0] = L;
LoBar[0] = 0;
//ZZ[0] = L;
date11 = date[HiBar[0]];
time11 = stime[HiBar[0]];
Value11 = HiVal[0];
date12 = date[LoBar[0]];
time12 = stime[LoBar[0]];
Value12 = LoVal[0];
TL_Delete(tl);
TL = TL_New(sdate,stime,Value12,NextBarSdate,NextBarStime,NextBarOpen);
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
TL_SetColor(TL1,하락색);
Tx = Text_New(date11,time11,Value11,"●");
#동그라미 색상, 빨강
Text_SetColor(Tx,Blue);
Text_SetStyle(Tx,2,2);
Text_SetSize(tx,7);
//tx = Text_New(date11,time11,Value11,NumToStr(value11,2)+NewLine+NumToStr(value11,2)+NewLine);
//Text_SetStyle(tx,2,1);
date21 = date[HiBar[0]];
time21 = stime[HiBar[0]];
date22 = date[0];
time22 = stime[0];
for j = 0 to 6
{
fr[j] = LoVal[1] + ((HiVal[0] - LoVal[1]) * r[j]);
}
#TL2[1] = TL_New(date21,time21,fr[1],date22,time22,fr[1]);
#TL_SetColor(TL2[1],RED);
#TL_SetStyle(TL2[1], 3);
#TL2[2] = TL_New(date21,time21,fr[2],date22,time22,fr[2]);
#TL_SetColor(TL2[2],RED);
#TL_SetSize(TL2[2],1);
#TX2[2] = Text_New(date22,time22,fr[2],NumToStr(fr[2],2));
#Text_SetColor(Tx2[2],BWHITE);
#Text_SetStyle(TX2[2],1,1);
#TL2[3] = TL_New(date21,time21,fr[3],date22,time22,fr[3]);
#TL_SetColor(TL2[3],RED);
#TL_SetStyle(TL2[3], 3);
#TL2[4] = TL_New(date21,time21,fr[4],date22,time22,fr[4]);
#TL_SetColor(TL2[4],RED);
#TL_SetSize(TL2[4],1);
#TX2[4] = Text_New(date22,time22,fr[4],NumToStr(fr[4],2));
#Text_SetColor(Tx2[4],BWHITE);
#Text_SetStyle(TX2[4],1,0);
}
If LoVal[0] > L Then
{
LoVal[0] = L;
LoBar[0] = 0;
//ZZ[0] = L;
date12 = date[LoBar[0]];
time12 = stime[LoBar[0]];
Value12 = LoVal[0];
TL_SetEnd(TL1, date12,time12,Value12);
date22 = date[0];
time22 = stime[0];
TL_SetEnd(TL2[0],date22,time22,fr[0]);
TL_SetEnd(TL2[1],date22,time22,fr[1]);
TL_SetEnd(TL2[2],date22,time22,fr[2]);
Text_SetLocation(TX2[2],date22,time22,fr[2]);
TL_SetEnd(TL2[3],date22,time22,fr[3]);
TL_SetEnd(TL2[4],date22,time22,fr[4]);
Text_SetLocation(TX2[4],date22,time22,fr[4]);
TL_SetEnd(TL2[5],date22,time22,fr[5]);
TL_SetEnd(TL2[6],date22,time22,fr[6]);
TL_Delete(tl);
TL = TL_New(sdate,stime,Value12,NextBarSdate,NextBarStime,NextBarOpen);
}
}
If T == 1 Then
{
If T[1] != 1 Then
{
For j = 18 DownTo 0
{
HiVal[j+1] = HiVal[j];
HiBar[j+1] = HiBar[j];
//ZZ[j+1] = ZZ[j];
}
HiVal[0] = H;
HiBar[0] = 0;
//ZZ[0] = H;
date11 = date[LoBar[0]];
time11 = stime[LoBar[0]];
Value11 = LoVal[0];
date12 = date[HiBar[0]];
time12 = stime[HiBar[0]];
Value12 = HiVal[0];
TL_Delete(tl);
TL = TL_New(sdate,stime,Value12,NextBarSdate,NextBarStime,NextBarOpen);
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
TL_SetColor(TL1,상승색);
Tx1 = Text_New(date11,time11,Value11,"●");
#동그라미 색상, 파랑
Text_SetColor(Tx1,Red);
Text_SetStyle(Tx1,2,2);
Text_SetSize(tx1,7);
//tx = Text_New(date11,time11,Value11,NewLine+NumToStr(value11,2)+NewLine+NumToStr(value11,2));
//Text_SetStyle(tx,2,0);
date31 = date[LoBar[0]];
time31 = stime[LoBar[0]];
date32 = date[0];
time32 = stime[0];
for j = 0 to 5
{
fr[j] = LoVal[0] + ((HiVal[1] - LoVal[0]) * r[j]);
}
}
If HiVal[0] < H Then
{
HiVal[0] = H;
HiBar[0] = 0;
//ZZ[0] = H;
date12 = date[HiBar[0]];
time12 = stime[HiBar[0]];
Value12 = HiVal[0];
TL_SetEnd(TL1, date12,time12,Value12);
date32 = date[0];
time32 = stime[0];
TL_SetEnd(TL3[0],date32,time32,fr[0]);
TL_SetEnd(TL3[1],date32,time32,fr[1]);
TL_SetEnd(TL3[2],date32,time32,fr[2]);
Text_SetLocation(TX3[2],date32,time32,fr[2]);
TL_SetEnd(TL3[3],date32,time32,fr[3]);
TL_SetEnd(TL3[4],date32,time32,fr[4]);
Text_SetLocation(TX3[4],date32,time32,fr[4]);
TL_SetEnd(TL3[5],date32,time32,fr[5]);
TL_SetEnd(TL3[6],date32,time32,fr[6]);
TL_Delete(tl);
TL = TL_New(sdate,stime,Value12,NextBarSdate,NextBarStime,NextBarOpen);
}
}
TL_SetSize(TL1,선두께);
//TL_SetEnd(tl,NextBarSdate,NextBarStime,NextBarOpen);
0.35p 내에서 쓰리바닥을 형성하는지를 실시간으로 보기위한 지표입니다.
1.추세선이 음전환될 때, 직전저점과 전전저점의 차이가 상하 관계없이 0.35p 이내이면 상단에 동그라미 표시.
2.동그라미 삭제 시점:직전저점과 전전저점 중에 "높은 저점"을 기준으로하여
가.아래로 -0.35p 도달 전에 양전환시.
나.계속 하락하여 -0.35p를 하향 붕괴할 때.
(동그라미는 생성과 삭제를 반복합니다.) 감사합니다.
2022-11-03
986
글번호 163495
답변완료
타주기 참조 시스템의 연산 속도를 높이려면 ?
안녕하세요.
1.
예스트레이더에서 기본 10틱 차트에 Data2 에는 4분봉을 설정하고, 4분봉이 완성되면 지표 를 계산하여 틱차트에서 매매를 하는 시스템입니다.
지표가 연산을 많이 해야 해서 4분봉이 완성되었을 때 한번만 연산을 하게 만들고 싶습니다.
아래 시스템을 시뮬레이션 해보면 4분에 한 번씩 제대로 실행하고 있지만,
전략실행차트에서 실행을 하면 bn4 는 맞게 나오는 반면, MessageLog 가 틱봉마다 계속 프린트 되고 있습니다.
MessageLog만 나오고 실제 연산은 제가 원하는 대로 4분에 한번만 하고 있는 걸까요?
만약 연산이 계속 되고 있다면 연산을 한번만 할 수 있도록 수식을 수정해 주시면 감사하겠습니다.
만약 연산이 4분에 한번만 이루어지고 있다면 틱 처리 속도를 높이기 위해 컴퓨터나 예스트레이더의 설정을 바꿔 줘야 하는 부분이 있다면 알려 주시면 감사하겠습니다.
vars: T4(0), bn4(0);
T4 = Data2(sTime);
if (T4 != T4[1]) Then {
MessageLog("%.0f %.0f T4 %.0f %.0f bn4 %.0f C4 %.2f", Date, Time, T4[1], T4, bn4, Data2(C[1]));
bn4 = bn4 + 1; // 4분봉 barIndex
//여기에 연산식이 있습니다
}
2.
하이투자증권예스트레이더에 64비트용이 있던데 여기서 해외선물(E-mini S&P 500, E-mini Nasdaq 100 등) 거래가 가능한가요?
감사합니다.
2022-11-03
1059
글번호 163494
답변완료
제 수식작성 구성 방식이 잘못되었나요
수식 코드 중에 아래의 수식이 들어가면 검색이 되고 이 수식을 빼면 검색이 되지 않습니다. 혹시 제가 작성하는 수식 방식에 문제가 있나요???
if ( V > nMav * 0.08 ) Then
{
Find(0);
}
3분봉 기준으로 당일 고가를 돌파하는 종목을 검색하는 수식입니다. 당일 분봉에서만 검색하고 싶고요. 제가 작성하는 방식이 잘못된건가요??
///////////////////////////////////////////////////////////////////
//// 종목검색 수식....
input : TargetDate(20221103);
var : nCnt(0), nSum(0), nMav(0), nMav1(0), nMav2(0), nMav3(0);
var : dwCloseRate(0), dwLowRate(0), dwLowCloseRate(0), dwAdjustedRate(0), dwRate(0);
var : bIsCond1(False), bIsCond2(False), bIsCond3(False), bIsCond4(False), bIsCond5(False);
var : nCondTime1(0), nCondTime2(0);
//////////////////////////////////////////////////////////////////////////////////
////// 전역변수 설정.
//////
////// var1 ==> 당일 캔들 인덱스....
////// var2 ==> 과거 (10/20/40일) 최소 일평균거래량
////// var3 ==> 당일 종가 상 고가 캔들 Index
////// var4 ==>
////// Var5 ==>
////// var6 ==>
////// var7 ==>
////// var8 ==> 5EMA의 20EMA 이탈 캔들 Index
////// var9 ==> 5EMA의 60EMA 이탈 캔들 Index
////// var10 ==> 과거 일평균거래량 대비 당일 거래량 비율
//////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
///// DataCompress = (0:틱, 1:초, 2:분, 3:일, 4:주, 5:월......)
if ( date != date[1] && date == TargetDate) Then
{
nSum = 0;
For nCnt = 1 to 40
{
nSum = nSum + DayVolume(nCnt);
if nCnt == 10 Then nMav1 = INT(nSum / 10);
Else if nCnt == 20 Then nMav2 = INT(nSum / 20);
Else if nCnt == 40 Then nMav3 = INT(nSum / 40);
}
//////////////////////////////////////////////////////////////////////////
//// 3분봉 기준으로으로 캔들 평균거래량
nMav = Min(nMav1, nMav2, nMav3);
var3 = 1;
var4 = H;
Var5 = 0;
Var6 = 0;
bIsCond1 = False;
bIsCond2 = False;
bIsCond3 = False;
bIsCond4 = False;
bIsCond5 = False;
}
else if ( date == TargetDate && nMav > 80000 ) Then
{
dwRate = (C - C[1])/C[1]*100;
dwCloseRate = (C - DayClose(1))/DayClose(1)*100;
dwLowRate = (DayLow(0) - DayClose(1))/DayClose(1)*100;
dwLowCloseRate = (DayClose(0) - DayLow(0))/DayLow(0)*100;
////////////////////////////////////////////////////
///// 이 코드가 들어가면 검색이 되고 이 코드를 빼면 검색이 되지 않아요.
///// 전혀 의미없는 코드 같은데.......
if ( V > nMav * 0.08 ) Then
{
Find(0);
}
//////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////// 장시작 후 하락하다가 고점 돌파 후 상승전환 한 경우.....
if ( C > H[Var3] && sTime >= 090900 && sTime <= 113000 && bIsCond1 == False ) Then
{
if ( dwCloseRate > 0 && dwLowRate < 0 && dwLowCloseRate > 1.5 ) Then
{
nCondTime1 = sTime;
bIsCond1 = True;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
////// 장시작 직후(10시이전) 거래량을 수반하면서 캔들 등락률이 1% 이상.....
if ( C > H[Var3] && sTime >= 090900 && sTime <= 100100 && bIsCond2 == False ) Then
{
if ( dwRate > 0.8 && dwCloseRate > 0 && (V > DayVolume(1)*0.1 || V > nMav/125*5) ) Then
{
nCondTime2 = sTime;
bIsCond2 = True;
}
}
if ( bIsCond1 == TRUE ) Then
Find(nCondTime1);
if ( bIsCond2 == TRUE ) Then
Find(nCondTime2);
if ( H >= H[Var3] ) Then
{
Var3 = 1;
}
Else
{
Var3 = var3+1;
}
}
2022-11-04
983
글번호 163493
답변완료
MACD + 스토캐스틱 수식 질문입니다.
질문 드립니다!
하고싶은 액션은,
· 스토캐스틱 %D가 과매수 구간 퇴장 후, B)%K가 %D를 하향돌파 & C)MACD가 시그널 선을 하향돌파 시 매도
· 스토캐스틱 %D가 과매도 구간 퇴장 후, B)%K가 %D를 상향돌파 & C)MACD가 시그널 선을 상향돌파 시 매수
여기서 주의점은
1) A)와C)는 누가 먼저 나오든 신호가 켜진 상태
2) 단 B)는 A)신호가 나온 후의 것만 신호접수 (ex.과매수 구간에서 이미 나온 %K %D교차는 무시)
-> 2)의 코딩을 잘 못하겠어서 도움을 요청드립니다.
아래는 사용한 코딩식입니다.
Var1 = StochasticsK(12,5);
Var2 = StochasticsD(12,5,5);
Var3 = MACD(12,26);
Var4 = Ema(Var3,9);
# %D 과열구간 내 추세전환(변곡점) 후, %K %D교차
if CrossDown(Var2, 80) then
if CrossDown(Var1,Var2) Then Condition1 = True;
if CrossDown(Var2,20) Then Condition1 = False;
if CrossUp(Var2, 20) then
if CrossUp(Var1,Var2) Then Condition2 = True;
if Crossup(Var2,80) Then Condition2 = False;
# 매수
if Condition1 == True && CrossDown(Var3,Var4) Then Sell();
# 매도
if Condition2 == True && CrossUp(Var3,Var4) Then Buy();
2022-11-02
1245
글번호 163492