커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
6665
글번호 230811
답변완료
종목검색식 부탁드립니다.
1.15분봉기준으로 n봉전부터 20-60이평선 역배열상태에서 주가가 60이평을 양봉(해당봉시가보다1.5%이상상승)으로 상향돌파했던(현재봉포함)종목의검색식 부탁드립니다.
n봉은 변수로해주시고 예를들어 장마감시점에서 기준봉에 24를 넣어서 검색하면 n봉부터 금일 첫봉까지 검색되는 조건입니다.
즉 n을 24로넣고 기준봉을 22로 검색하면 금일 첫봉부터 3개봉에서 조건 발생한 종목이 검색되고 기준봉을 0으로하면 장시작부터 현재까지 조건발생한 종목이 모두 검색되게 부탁드립니다.
n 범위는 15분봉기준 2일도 50봉이면 좋겠습니다
2.15분봉기준으로 n봉전부터 20-60이평선 역배열상태에서 주가가 60이평을 양봉(해당봉시가보다1.5%이상상승)으로 상향돌파했던(현재봉포함)종목의 "현재가가 앞에검색된 봉의 고점과 저점의 중간(+-1%)이거나 20이평선 또는 60이평선에 +-1%로 근접한 종목색식" 부탁드립니다.다른조건은1번과 동일합니다.
3.전일거래량대비 금일거래량이 n%인종목 검색식 부탁드립니다.단순거래량입니다.
4.첨부한 차트의 전고점을 최초로 돌파하는 종목 검색식 부탁드립니다.
감사합니다.
2015-01-23
213
글번호 82529
회원 님에 의해서 삭제되었습니다.
2015-01-22
8
글번호 82528
부양가족 님에 의해서 삭제되었습니다.
2015-01-22
1
글번호 82527
답변완료
지표식 수정 한번더 부탁드립니다.
아래의 수식도 수식지왕님 블로그에서 얻은 마켓프로파일이라는 지표식인데요.
저는 주로 1분차트에서 봅니다.
이것을 해외선물에서 보고자 하니 부탁드립니다.
요청사항은
1. 예를 들어 5분차트의 20이동평균선은 1분차트에서 100이동평균선으로 보듯이
아래의 지표식의 어떤변수를 바꿔야 이동평균선처럼 다른 시간대의 차트에서 동일하게 볼수있는지 알고싶습니다.
(국내선물에서 볼때 1분, 30분, 5분 다 적용해보니 선들이 다 틀리게 나오는것 같습니다.)
(틱 차트에서도 틀린데 이 지표는 틱차트에서 사용하는것이 아닌가요?)
2. 해외선물 즉 현재로서는 아침 8시 시작해서 그 다음날아침 7시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);
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);
if CodeCategoryEX() == 11 then //Kospi 주식
{
if C >= 500000 then tick = 1000;
else if C >= 100000 then tick = 500;
else if C >= 50000 then tick = 100;
else if C >= 10000 then tick = 50;
else if C >= 5000 then tick = 10;
else tick = 5;
}
if CodeCategoryEX() == 12 then //Kosdaq 주식
{
if C >= 50000 then tick = 100;
else if C >= 10000 then tick = 50;
else if C >= 5000 then tick = 10;
else tick = 5;
}
if CodeCategoryEX() == 21 then //Kospi200 선물
tick = 0.05;
if CodeCategoryEX() == 31 or CodeCategoryEX() == 32 then //Kospi200 콜옵션,풋옵션
{
if C >= 3.0 then tick = 0.05;
else tick = 0.01;
}
if dayindex()==0 then //매일 첫번째 봉에서 해당 변수들의 값을 0으로 초기화
{
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-540)/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;
// 전체 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),"가치영역(상)"); //0행의 값 base가 가장 큰 값이므로 해당 행(row)에
//단위(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");
2015-01-22
232
글번호 82521
답변완료
오류 보고 관련 수식 첨부
if (nEventID == 1)
{
var d = new Date();
if (BuyCond == 6)
if( Amount < Bottom-400 && M1.current < BP-0.2 && Buytime > 0 && d.getTime() = Buytime+60000 && Timechk1 == 0)
{
A1.OrderSell(Callcode, Bvol-Math.floor(Bvol*0.1)*1, Option.GetBidByCode(Callcode, 3), 0);
Exvol = Exvol+1;
Timechk1 = 1;
}
if( Amount < Bottom-300 && M1.current < BP-0.15 && Buytime > 0 && d.getTime() = Buytime+180000 && Timechk2 == 0)
{
A1.OrderSell(Callcode, Bvol-Math.floor(Bvol*0.1)*2, Option.GetBidByCode(Callcode, 3), 0);
Exvol = Exvol+2;
Timechk2 = 1;
}
현재 "invalid left-hand side in assignment" 표시되는 부분은 마지막 if 문구인 Amount < Bottom-300 열 입니다.
위에 Amount < Bottom-400 열에는 문제가 없는데 동일한 수식인데 왜 해당 오류 문구가 나는지 궁금합니다.
시간에 따라서 해당조건이 충족되면 거래를 하는 수식입니다.
혹시 전체 수식을 보셔야 한다면 해당 파일 별도로 메일 보내드리겠습니다.
답면에 메일 주소 알려주세요
2015-01-22
240
글번호 82513
답변완료
수식문의barindex
현재의 봉과 현 포지션 직전포지션(marketposition[1]) 진입 봉 사이의 최고값을 가지는 인덱스의 번호를 표시하는 식을 부탁드립니다.
2015-01-22
177
글번호 82504
답변완료
신호표시
수고 많으십니다.
아직 시스템 트레이딩에 대해서는 잘 모름니다. 따라서 00랭귀지라고 있던데 그것도 잘 모릅니다. 우선 예스트레이더 차트를 사용해 가면서 차츰차츰 공부하고 써 보고 싶습니다.
그래서 말슴입니다만,
제가 차트에
직전봉의 시가, 종가, 고가를 상향돌파시 적색 매수신호,
시가 종가, 저가를 하향돌파시 청색 매도신호,
를 표시하고 싶은데 할줄을 몰라서 "수식"과 "수식 입력방법"을 자세히 알려주시면
알려주시는 대로 쫓아 구현해 보겠습니다.
(참고 파일보시면 적색신호, 청색 신호입니다)
제가 너무 몰라 죄송합니다. 이렇게해서 하나하나 공부해 나가겠습니다.
좋은 하루 되세요....
2015-01-22
197
글번호 82503
답변완료
수정식 부탁드려요..
var : entry(false);
#첫봉에서는 false
if dayindex == 0 Then
entry = false;
#무포지션 상태이고
#두번째봉 부터
#당일 최저가가 갱신되면
#entry는 true
if MarketPosition == 0 and
dayindex > 0 and
L < daylow[1] Then
entry = true;
#entry가 true인 상태에서 청산발생하면
#entry는 false
if entry == true And
MarketPosition == 0 and
MarketPosition != MarketPosition[1] Then
entry = false;
#entry가 true인 상태에서
#당일저가+12틱이면 매수
if MarketPosition == 0 and entry == true and stime < 150000 Then
sell("s1",AtLimit,daylow()+PriceScale*12);
SetStopLoss(PriceScale*20,PointStop);
SetStopProfittarget(PriceScale*25,PointStop);
## 안녕하세요 ... 지난번 만들어주신 수식을 잘 사용하고 있습니다.
수익실현, 손절이 나가도 나간 가격에서 신호가 재발생하지 않아서 좋았습니다.
이수식을 조금 변경하고 싶은 것이 있어서. 수고스럽드래도 한번 더 부탁드릴께요
조건:
1. 캔들3개이상이 정배열이 만들어지면 매수포지션....40이평가격(1차매수진입),60이평가격
(2차매수진입)
2. 캔들3개이상이 역배열이 만들어지면 매도포지션....40이평가격(1차매도진입),60이평가격
(2차매도진입)
3. 매수진입, 매도진입시 ------> 소리출력....
감사합니다.
2015-01-22
145
글번호 82502
회원 님에 의해서 삭제되었습니다.
2015-01-22
11
글번호 82500