커뮤니티
예스랭귀지 Q&A
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
1326
글번호 230811
답변완료
부탁드립니다
아래수식은 수식지왕님의 수식입니다
이수식의 파동선을 가격봉에 나타내는 수식으로 변경부탁드랍니다
Input:Period(9),변동폭(20),선색(Red),선두께(2);
Var:rsiVal(0),TL1(0),신규여부(0),고점(1),저점(-1),신규(1),연장(2);
Array:고[10,4](0),저[10,4](0); // 1:가격,2:Index,3:sDate,4:sTime
#==========================================#
rsiVal = RSI(Period);
Plot1(rsiVal, "RSI");
PlotBaseLine1(30, "기준선 30");
PlotBaseLine2(70, "기준선 70");
If CurrentBar > 0 Then
Value1 = BrokenLine2(rsiVal,rsiVal,변동폭,고,저,신규여부);
If Value1 == 고점 Then {
If 신규여부 == 신규 Then TL1 = TL_New_Self(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
If 신규여부 == 연장 Then TL_SetEnd(TL1,고[1,3],고[1,4],고[1,1]);
}
If Value1 == 저점 Then {
If 신규여부 == 신규 Then TL1 = TL_New_Self(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
If 신규여부 == 연장 Then TL_SetEnd(TL1,저[1,3],저[1,4],저[1,1]);
}
TL_SetColor(TL1,선색);
TL_SetSize(TL1,선두께);
2025-04-08
370
글번호 189931
답변완료
수식수정 부탁드립니다
아래 내용을 보면 날짜가 바뀌면 초기화 시키는데
초기화 없이 그냥 INPUT : 적용시간
으로 받아서 현재 시간으로 부터 적용시간 만큼으로 변환 가능할깡?
input: 타임(15);
var:arr(0),k(0),tick(0),chk_cnt(0),ttm(0),t_val(0),max_tpo(0),tot_tpo(0),
sum(0),acc(0),mdl_prc(0),mdl_arr(0),range_u(0),range_d(0),base(0),
cal_tpo(0),up_tpo(0),dn_tpo(0),up_tail_u(0),up_tail_d(0),dn_tail_u(0),dn_tail_d(0),t1(0);
array:price_u[100](0),price_m[100](0),price_d[100](0),
status_u[100](0),status_m[100](0),status_d[100](0),
tpo_u[100](0),tpo_m[100](0),tpo_d[100](0);
tick = _TickValue();
if bdate != bdate[1] then //매일 첫번째 봉에서 해당 변수들의 값을 0으로 초기화
{
t1 = TimeToMinutes(sTime);
for arr = 0 to 99 {
price_u[arr] = 0;
price_m[arr] = 0;
price_d[arr] = 0;
status_u[arr] = 0;
status_m[arr] = 0;
status_d[arr] = 0;
tpo_u[arr] = 0;
tpo_m[arr] = 0;
tpo_d[arr] = 0;
}
max_tpo = 0;
tot_tpo = 0;
sum = 0;
acc = 0;
mdl_prc = 0;
mdl_arr = 0;
range_u = 0;
range_d = 0;
base = dayopen() + tick * 149; //300개 가격대중 최상단에 해당하는 가격
price_u[0] = base; //지수 배열 상단
for arr = 1 to 99 {
price_u[arr] = price_u[arr-1] - tick;
}
price_m[0] = price_u[99] - tick; //지수 배열 중단
for arr = 1 to 99 {
price_m[arr] = price_m[arr-1] - tick;
}
price_d[0] = price_m[99] - tick; //지수 배열 하단
for arr = 1 to 99 {
price_d[arr] = price_d[arr-1] - tick;
}
}
ttm = TimeToMinutes(stime); //시간을 30분,15분,10분등으로 나누기 쉽도록 환산
t_val = int((ttm-t1 )/interval) + 1; //540은 09:00. 9시를 빼고 나서 원하는 시간단위로 나눈다
for arr = 0 to 99 {
if l <= price_u[arr] and price_u[arr] <= h then
{
if status_u[arr] < t_val then //A가 찍혔는데 또 A를 찍을 필요가 없음. 그걸 확인
{
status_u[arr] = t_val; //중복을 막기 위해 마지막 time value 저장
tpo_u[arr] = tpo_u[arr] + 1; //현재 가격대의 TPO 누적
tot_tpo = tot_tpo + 1; //전체 TPO 누적
if max_tpo < tpo_u[arr] then //TPO 최빈값
{
max_tpo = tpo_u[arr];
sum = 0; //TPO가 동일한 가격대가 여러가격일 경우
acc = 0; //평균값을 구하기 위해 가격 누적변수와 가격대 수 초기화
}
if max_tpo == tpo_u[arr] then //최빈값과 동일하면
{
sum = sum + price_u[arr]; //해당 가격을 누적
acc = acc + 1; //가격대 개수 누적
}
}
}
//3개의 동일 성격을 지닌 배열에 대해 한꺼번에 처리 못하므로 동일 루틴으로 3회 처리
if l <= price_m[arr] and price_m[arr] <= h then
{
if status_m[arr] < t_val then
{
status_m[arr] = t_val;
tpo_m[arr] = tpo_m[arr] + 1;
tot_tpo = tot_tpo + 1;
if max_tpo < tpo_m[arr] then
{
max_tpo = tpo_m[arr];
sum = 0;
acc = 0;
}
if max_tpo == tpo_m[arr] then
{
sum = sum + price_m[arr];
acc = acc + 1;
}
}
}
if l <= price_d[arr] and price_d[arr] <= h then
{
if status_d[arr] < t_val then
{
status_d[arr] = t_val;
tpo_d[arr] = tpo_d[arr] + 1;
tot_tpo = tot_tpo + 1;
if max_tpo < tpo_d[arr] then
{
max_tpo = tpo_d[arr];
sum = 0;
acc = 0;
}
if max_tpo == tpo_d[arr] then
{
sum = sum + price_d[arr];
acc = acc + 1;
}
}
}
}
mdl_prc = round(sum/acc/tick,0)*tick; //평균하여 중심가격으로 삼음
mdl_arr = int((base-mdl_prc)/tick); //배열변수의 첨자는 정수이어야 함
//처음부터 int()를 생각해 냈던 것은 아니고 디버그 과정에서 알게 됨
range_u = mdl_arr;
range_d = mdl_arr;
//MessageLog(",%.2f",range_u);
// 전체 TPO의 70%가 될 때까지 상하값을 비교하면서 누적
cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200]));
for k = 0 to 150 {
// range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1)
// TPO가 많은 쪽의 TPO를 먼저 누적한다
var2 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200]));
var3 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200]));
if var2 > var3 then
{
cal_tpo = cal_tpo + var2;
range_u = range_u - 1;
}
else if var2 < var3 then
{
cal_tpo = cal_tpo + var3;
range_d = range_d + 1;
}
else if var2 == var3 and var2 > 0 and var3 > 0 then
{
cal_tpo = cal_tpo + var2;
range_u = range_u - 1;
}
if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then
k = 150;
}
up_tpo = 0; //중심가격의 상위 TPO
if tpo_u[0] == 1 then up_tail_u = 0; //윗꼬리 상단 경계선, 0행부터 1이면 윗꼬리 상단은 0행이 됨
else up_tail_u = 299; //윗꼬리를 못 찾을 경우를 대비해서 상단과 하단의 관계를 역으로 만듬
//꼬리 경계값을 찾는 루틴을 성공적으로 마치면 상단값 < 하단값 성립
up_tail_d = 0; //윗꼬리 하단 경계선
//0행부터 중심가격 이전행까지 아래로 내려가면서
for arr = 0 to mdl_arr-1 {
//현재 행의 tpo 값이 0이고 다음 행의 tpo값이 1이면 1의 시작으로 보고 다음 행의 행번호를 윗꼬리 상단으로 봄
if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and
iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then
up_tail_u = arr + 1; //윗꼬리 상단 경계선 array
//현재 행의 tpo 값이 1이고 다음 행의 tpo값이 1보다 크면 현재 행의 행번호를 윗꼬리 하단으로 봄
if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and
iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and
up_tail_d == 0 then //조건을 만족하는 경우가 여러번 발생하는데 up_tail_d가 0일때만
//즉, 처음에 찾아진 값만 유효한 것로 봄
up_tail_d = arr; //윗꼬리 하단 경계선 array
//TPO가 1보다 큰 상위 TPO 누적
if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then
up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200]));
}
dn_tpo = 0; //중심가격의 하위 TPO
dn_tail_u = 299; //아래꼬리 상단 경계선
if tpo_d[99] == 1 then dn_tail_d = 299;
else dn_tail_d = 0; //아래꼬리 하단 경계선
//299행부터 중심가격 이전행까지 위로 올라가면서
for arr = 299 downto mdl_arr+1 {
//TPO가 1보다 큰 하위 TPO 누적
if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then
dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200]));
//현재 행의 tpo 값이 1이고 윗행의 tpo값이 1보다 크면 현재 행의 행번호를 아랫꼬리 상단으로 봄
if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and
iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and
dn_tail_u == 299 then
dn_tail_u = arr; //아래꼬리 상단 경계선 array
//현재 행의 tpo 값이 0이고 윗행의 tpo값이 1이면 1의 시작으로 보고 윗행의 행번호를 아랫꼬리 하단으로 봄
if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and
iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then
dn_tail_d = arr - 1; //아래꼬리 하단 경계선 array
}
plot1(mdl_prc,"중심가격");
plot2(base-(range_u*tick),"가치영역(상)");
plot3(base-(range_d*tick),"가치영역(하)");
if up_tail_u <= up_tail_d then //꼬리의 경계값이 정상적으로 찾아졌다면
{
plot4(base-(up_tail_u*tick),"윗꼬리상단"); //점그래프로 표현
plot5(base-(up_tail_d*tick),"윗꼬리하단");
}
if dn_tail_u <= dn_tail_d then
{
plot6(base-(dn_tail_u*tick),"아랫꼬리상단");
plot7(base-(dn_tail_d*tick),"아랫꼬리하단");
}
//plot8(up_tpo,"상위TPO");
//plot9(dn_tpo,"하위TPO");
2025-04-08
429
글번호 189928
답변완료
re re : 수식 문의드립니다.
var : AA(-1);
-1로 하면 검색이 안되던데 변수가 0이 아닌가요?
추가로 3분봉 500봉 기준 검색입니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 수식 문의드립니다.
>
안녕하세요
예스스탁입니다.
var : AA(-1);
if cnt == 1 and cnt[1] == 0 and 당일 Then
AA = 0;
if count >= 0 and 기준선<L && C<O Then
AA = count+1;
즐거운 하루되세요
> 꿀떡 님이 쓴 글입니다.
> 제목 : 수식 문의드립니다.
> AA = CountSince(cnt==1 && cnt[1]==0 && 당일, 기준선 <L && C<O);
변환 바랍니다.
2025-04-08
327
글번호 189927
답변완료
질문드리겠습니다
추세선 색상에 대해서 질문 하나 부탁드리겠습니다
아래식에서 최근 5개 추세선은 컬러를 red로 변경하고자 합니다
감사합니다
For cnt = 45 DownTo 1
{
# ttl[cnt] =ttl[cnt-1];
tttl[cnt] = tttl[cnt-1];
sd[cnt] =sd[cnt-1];
st[cnt] =st[cnt-1];
}
TL_SetExtRight(ttl[10],False);
# ttl[0]=tl_new(sDate,sTime,cc[0],NextBarSdate,NextBarStime,CC[0]);
TL_SetSize(ttl[0],1);
TL_SetExtRight(ttl[0],true);
sd[0] = sDate;
st[0] = sTime;
TL_SetExtRight(tttl[30],False);
tttl[0]=tl_new(sd[1],st[1],aa[0],sd[0],st[0],aa[0]);
TL_SetSize(tttl[0],0);
TL_SetDrawMode(tttl[0],0);
TL_Delete(tttl[30]);
TL_SetExtRight(tttl[0],true);
2025-04-08
370
글번호 189920
답변완료
수식문의
안녕하세요?
수식 두개 부탁드립니다.
수식 1:
스토캐스틱이 시그널선을 상방으로 교차한 시점들을 기준으로 다이버전스가
발생한 종목들을 검색하고 싶습니다. 이때
1. 첫번째 교차가 일어났을 때는 교차 직전에 스토캐스틱이20선 아래여야 하고,
2. 첫번째 교차와 두번째 교차 사이는 k(10)봉 이상이 경과되어야 합니다.
3. 다이버전스란 말은 첫교차시점보다 두번째 교차시,
스토캐스틱값은 상승하고, C값은 하락했다는 뜻입니다.
수식 2:
위랑 비슷한데 이번에는 교차가 세번 일어납니다.
즉, 각 교차 사이는 k(10)봉 이상,
스토캐스틱은 점점 상승, C 는 점점 하락
첫번째 교차직전, 스톡캐스틱 값은 20 이하.
감사합니다.
2025-04-08
539
글번호 189919
고성 님에 의해서 삭제되었습니다.
2025-04-08
2
글번호 189918
답변완료
수식문의
안녕하세요?
제가 검색식은 처음이라, 기본적 사용방법도 같이 좀 알려주시면 감사하겠습니다.
검색식 두개 부탁드립니다.
검색식 1번:
1. 개별주식선물이 있는 종목들에 대해서
2. N일 전에 비해서 10% 이상 오른 종목(주식)들을 검색하되,
3. 가장 많이 오른 순으로 나열해서 보여주면 좋겠습니다.
1번 대신 아예, 개별주식선물들 가운데 n일 전에 비해 10% 이상 오른 선물들을
많이 오른 순서대로 나열해 주셔도 좋습니다.
검색식 2번:
개별주식선물이 있는 주식들에 대해서/또는 개별주식선물들에 대해서
N일 전에 비해서 10% 이상 오른 종목들을 1등부터 나열할 때,
10등부터 꼴등까지 순서대로 나열해 주면 좋겠습니다.
그러니까 1~9등은 제외합니다.
감사합니다.
2025-04-08
295
글번호 189917
답변완료
수식수정 부탁드립니다
var : cnt(0),WeekOC(0),MonthOC(0),WeekOL(0);
Array : WeekO[20](0),WeekC[20](0);
Array : MonthO[20](0),MonthC[20](0);
// 주봉의 시작일 판단 로직
if DayOfWeek(Bdate) < DayOfWeek(Bdate[1]) Then
{
WeekO[0] = O; #주봉시작일의 시가
For cnt = 1 to 19
{
WeekO[cnt] = WeekO[cnt-1][1];
WeekC[cnt] = WeekC[cnt-1][1];
}
WeekOC = C ; #주봉시작(변경)일의 캔들종가
WeekOL = L ; #주봉시작(변경)일의 캔들저가
}
WeekC[0] = C; #주봉의 종가
// 월봉의 시작일 판단 로직
if Bdate > Bdate[1]+30 Then
{
MonthO[0] = O; #월봉시작일의 캔들시가
For cnt = 1 to 19
{
MonthO[cnt] = MonthO[cnt-1][1];
MonthC[cnt] = MonthC[cnt-1][1];
}
MonthOC = C ; #월봉시작일의 캔들종가
}
MonthC[0] = C;
상기 수식은 일봉차트에 주봉시가와 월봉시가를 표시하는 수식입니다
일봉상 캔들의 시가갭이 3%이상인 경우 전일종가와 당일 시가라인을 그리는 수식입니다
Condition1 = ( O - C[1] ) / C[1] * 100 >= 3 ;
if Condition14 == true and C > O Then
{
Var1 = C[1] ;
Var2 = O ;
}
Plot1(Var1,"전일종가");
Plot2(Var2,"당일시가");
상기와 같이 하면 문제가 없는데 하기의 주봉과 월봉캔들로 일봉상에 표시하고자
하는 것은 제대로 그려지지 않아서 도움을 요청드립니다.
일봉상 주봉캔들의 상승갭라인 표시---수정요망
if WeekO[0] > WeekC[1] and ((WeekO[0] - WeekC[1]) / WeekC[1]) * 100 >= 3 Then
{
Plot3(WeekO[0], "상승갭 발생 시가"); // 현재 주 시가 표시
Plot4(WeekC[1], "전주 종가"); // 전주 종가 표시
}
일봉상 월봉캔들의 상승갭라인 표시---신규작성 요망
2025-04-08
384
글번호 189916
답변완료
지표 질문입니다
주화면에
10시
11시
12시
13시
14시
15시
stime 기준으로 선으로 나타내고 싶습니다
감사합니다
2025-04-07
340
글번호 189915