커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
3546
글번호 230811
답변완료
수식 문의
아래는 본 게시판에 수식지왕님이 공개해 주신 지표 입니다.
질문 :
ㄱ.
매일매일 만들어지는 plot 1,2,3을 당일만 뿌리지 말고,
n봉이상으로 쭉 늘려서 뿌려주고 싶습니다.
n봉의 값에 따라, 4일전 만들어진 plot1,2,3도 오늘 차트에 뿌려지고,
3일전 만들어진 polt1,2,3도 오늘 차트에 뿌려지고... 뭐 그런 식으로 되겠죠..
ㄴ.
ㄱ. 지표를 data2 에 적용할 수 있도록 수정하고 싶습니다.
##############################
input:n(1), 인타발(15);
var:arr(0),j(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;
}
var1 = dayindex();
//전일 데이터를 이용하는 로직이므로 과거참조가 들어가는데 dayindex()의 경우
//dayindex()[n]으로 사용할 수 없어 dayindex()값을 일반변수에 move하여 사용하여야 합니다.
//예전에도 이런 경험을 했었는데 기억력이 나쁘다보니 요번에도 여기서 좀 헤맸습니다.
if dayindex()==0 then //당일 첫번째 봉에서만 계산
{
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;
//n일 동안의 봉의 개수를 계산하여 계산할 첫번째 봉의 위치를 찾음
if n > 0 then
{
var2 = 0;
for j = 1 to index {
if var1[j] == 0 then var2 = var2 + 1; //dayindex()가 0 즉, 09시인 봉을 n번 찾음
if var2 == n then {
var3 = j;
j = index;
}
}
}
base = dayopen(n) + tick * 149; //n일전 시초가를 기준으로 가격대중 가장 상위의 가격 계산
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;
}
for j = var3 downto 1 { //n일전 시초봉에서부터 현재봉 1봉 이전 봉까지 순차적으로 계산
//이후 내용은 당일 지표식과 동일하므로 윗글 참조
ttm = TimeToMinutes(stime[j]);
t_val = int((ttm-540)/인타발) + 1;
for arr = 0 to 99 {
if l[j] <= price_u[arr] and price_u[arr] <= h[j] then
{
if status_u[arr] < t_val then
{
status_u[arr] = t_val;
tpo_u[arr] = tpo_u[arr] + 1;
tot_tpo = tot_tpo + 1;
if max_tpo < tpo_u[arr] then
{
max_tpo = tpo_u[arr];
sum = 0;
acc = 0;
}
if max_tpo == tpo_u[arr] then
{
sum = sum + price_u[arr];
acc = acc + 1;
}
}
}
if l[j] <= price_m[arr] and price_m[arr] <= h[j] 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[j] <= price_d[arr] and price_d[arr] <= h[j] 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);
range_u = mdl_arr;
range_d = mdl_arr;
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를 먼저 누적한다
var4 = 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]));
var5 = 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 var4 > var5 then
{
cal_tpo = cal_tpo + var4;
range_u = range_u - 1;
}
else if var4 < var5 then
{
cal_tpo = cal_tpo + var5;
range_d = range_d + 1;
}
else if var4 == var5 and var4 > 0 and var5 > 0 then
{
cal_tpo = cal_tpo + var4;
range_u = range_u - 1;
}
if cal_tpo >= tot_tpo * 0.7 or var4 + var5 == 0 then
k = 150;
}
up_tpo = 0;
dn_tpo = 0;
if tpo_u[0] == 1 then up_tail_u = 0;
else up_tail_u = 299;
up_tail_d = 0;
dn_tail_u = 299;
if tpo_d[99] == 1 then dn_tail_d = 299;
else dn_tail_d = 0;
for arr = 0 to mdl_arr-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;
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 = arr;
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]));
}
for arr = 299 downto mdl_arr+1 {
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]));
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;
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;
}
}
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),"아랫꼬리하단");
}
2019-12-07
290
글번호 134208
답변완료
수식 검증 부탁드림니다.
조건: 해외선물 쿠루드 오일 1분봉
매수 진입 조건 :
1.RSI(14) <15
2.심리도(14) < 15
1+2 동시에 만족할때 그 시점 부터 500틱 이하로 떨어졌을때 매수진입
(1.2동시 되는 시점에서 500틱이 떨어진 지점에서 1과 2의 조건이 되지 않아도 매수 진입 )
-->단 1+2조건을 동시에 만족하는 가격으로 부터 매수전까지 아래 매수청산
신호가 발생시 매수 진입 취소
매수 청산
CCI값이 crossdown(cci(14),50) 일때 청산
* 참고로 당일 내 매수진입이 되지 않았을경우 명일 세로 셋팅
예를 들어 1과 2조건에 들었지만 -500틱이하로 되지 않아 매수진입이 되지않
는경우라도 다음날은 처음부터 다시 시작하는 조건으로 시행해야함.
=======================================================
위 조건을 아래와 같이 했는데 완성을 못하겠네요..ㅠㅠ 도와주세요...
Input : RSIPeriod(14),RSI매수값(15),SimPeriod(14),심리도값(15);
Input : N1(1);
Input : CCI기간(14),CCI값(50);
value = CCI(CCI기간);
RSIV = RSI(RSIPeriod);
Simri = Simrido(SimPeriod);
if MarketPosition <= 0 and
countif( RSIV < RSI매수값 and Simri < 심리도값 ,N1 ) == N1 Then
buy("매수",? ????) ; <-- 해당조건에서 -500틱 이하 될때 매수진입
-- countif( RSIV < RSI매수값 and Simri < 심리도값 ,N1 ) == N1 이 조건에서
-500틱이하되서 매수되기 전에 아래 청산 신호발생시 매수 진입 취소
if MarketPosition == 1 then
{
if CrossDown(value,CCI값) Then
ExitLong("CCI청산");
}
2019-12-09
333
글번호 134207
답변완료
지표 의뢰드려요
안녕하세요!
지난번 교차가격생성은 매매에 잘 활용하고 있습니다. 정말 감사드립니다.
매매를 하면서 또 도움을 받고져 문의드립니다.
옵션의 콜 과 풋 상관없이 임의로 10개의 가격들을 미리 정해놓고 ,
콜 또는 풋의 가격이 그 가격들에 도달하면 자동으로 선물가격에 라인이
가로로 생성되는 수식을 만들고 싶습니다.
가능할까요?
선의 색상과 굵기는 제가 정하고 싶습니다
정리하자면
---------------------------------------------------------------------
1.
data2~data11 까지 옵션 콜 5개 가격 과 풋 5개 가격의 교차 챠트를 만들고 미리 정해놓은
가격선에 콜이나 풋이 도달하면 선물가격인 data1에 선이 자동으로 그어지도록 만들고 싶습니다. 미리정해진 옵션 가격선은 옵션교차차트에 선과 가격을 나타나게 하고 싶습니다.선의 색상과 굵기는 제가 선택할 수 있도록 하고 싶습니다.
----------------------------------------------------------------------
2.
data2~data3 / data4~data5 / data6~data7 / data8~data9 / data10~data11 / 콜풋 교챠차트를 각각 5개로 제가 만들고 각각의 교차차트에 미리 정해놓은 가격선에 콜이나 풋이 도달하면 선물가격인 data1에 선이 자동으로 그어지도록 만들고 싶습니다. 미리 정해놓은 옵션 가격선은 옵션교차차트에 선과 가격을 나타나게 하고 싶습니다.선의 색상과 굵기는 제가 선택할 수 있도록 하고 싶습니다.
----------------------------------------------------------------------
부탁드립니다.
2019-12-09
254
글번호 134206
답변완료
변수 선택
첨부파일은
강제청산 최적화 결과입니다.
0.50이 최고의 결과인데 선택하자니 0.52 부터 상당히 낮아집니다.
일반적인 변수이면 0.48을 선택하는데요.
setstoploss로 처리하는 강제손절인 경우는
0.50을 선택해도 되는 것 아닌가 해서요.
2019-12-06
226
글번호 134203
답변완료
문의 드립니다
MACD 12 26 9 골든 크로스 상태 이면서
스토케스틱 10 5 5 신호도 같은 골든 크로스 일 때 매수
손절과 익절은 스토케스틱 10 5 5 가 데드 크로스 할 때 한다.
MACD 12 26 9 데드 크로스 상태 이면서
스토케스틱 10 5 5 신호도 같은 데드 크로스 일 때 매도
손절과 익절은 스토케스틱 10 5 5 가 골든 크로스 할 때 한다.
(MACD와 스토케스틱이 같은 방향 일때 보유하고 아니면 무포지션을 원하는 것입니다.)
부탁드립니다.
2019-12-06
178
글번호 134196
답변완료
시스템 문의드립니다.
항상 친철한 도움에 감사드립니다.
다음 내용으로 시스템 문의드립니다.
1. 당일 변동폭을 계산해서
당일폭이 50틱 (변수로 지정) 이 되는 시점을 기준하여 (상승하면서 50틱이 되는 경우)
당일폭 51틱이 되면서 상승방향이면 매수진입,
당일 49틱 가격으로 가면서 하락방향이면 매도진입.
또는
당일폭이 50틱이 되는 시점을 기준하여 (하락하면서 50틱이 되는 경우)
당일폭 51틱이 되면서 하락방향이면 매도진입,
당일 49틱 가격으로 가면서 하락방향이면 매도진입.
당일폭이 51틱에서 다시 49틱가격으로 되면, 청산후 진행방향 진입
당일폭이 49틱에서 51틱 가격으로 되면, 청산후 진행방향으로 진입
(청산 및 재진입 계속반복)
봉완성전에도 진입가능하면, 봉완성전 진입으로 수식부탁드립니다
2. " 당일 변동폭을 계산해서
당일폭이 50틱 (변수로 지정) 이 되는 시점을 기준하여 (상승하면서 50틱이 되는 경우)
당일폭 51틱이 되면서 상승방향이면 매수진입,
당일 49틱 가격으로 가면서 하락방향이면 매도진입.
또는
당일폭이 50틱이 되는 시점을 기준하여 (하락하면서 50틱이 되는 경우)
당일폭 51틱이 되면서 하락방향이면 매도진입,
당일 49틱 가격으로 가면서 하락방향이면 매도진입. " 까지는 1번과 동일
손절기준 5틱을 기준으로 손절되면, 기존포지션 반대방향으로 재진입
이상 2가지 시스템 수식을 부탁드립니다.
감사합니다.
2019-12-06
181
글번호 134195
답변완료
수식 부탁 드립니다
a=if(predayclose()>predayopen(),
(predayhigh()+predaylow()+predayclose()+predayhigh())/2-predaylow(),
(if(predayclose()<predayopen(),
(predayhigh()+predaylow()+predayclose()+predaylow())/2-predaylow()
(predayhigh()+predaylow()+predayclose()+predayclose())/2-predaylow())
)
);
b=if(predayclose()>predayopen(),
(predayhigh()+predaylow()+predayclose()+predayhigh())/2-predayhigh(),
(if(predayclose()<predayopen(),
(predayhigh()+predaylow()+predayclose()+predaylow())/2-predayhigh()
(predayhigh()+predaylow()+predayclose()+predayclose())/2-predayhigh())
)
);
(a+b)/2
---------------------------
(predayhigh()+predaylow()+predayclose())/3
지표에 2 라인을 그리고 싶읍니다
2019-12-06
214
글번호 134193
답변완료
수식
항상 그런 경우가 아닌 하기 조건이 발생시에 필요한 수식 조건입니다.
다시 한번 검토해서 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 수식
>
안녕하세요
예스스탁입니다.
if C[1] < O[1] and C > H[1] Then
buy();
if C[1] > O[1] and C < L[1] Then
sell();
즐거운 하루되세요
> 한국사람73 님이 쓴 글입니다.
> 제목 : 수식
> 항상 감사드립니다.
하기 수식 부탁드립니다.
Condition 수식으로 부탁드립니다.
* 매수 - 전봉이 음봉일 경우 전봉 고가 이상에서 매수
* 매도 - 전봉이 양봉일 경우 전봉 저가 이하에서 매도
감사합니다.
2019-12-06
162
글번호 134191
답변완료
문의 드립니다
MACD 12 26 9는 기준선 0 위에 있고
스토케스틱 10 5 5는 기준선 50 아래에서 골든 크로스 발생 시 매수
손절은 50틱/ 익절은 50틱
MACD 12 56 9는 기준선 0 아래 있고
스토케스틱 10 5 5는 기준선 50위에서 데드 크로스 발생시 매도
손절은 50틱/ 익절은 50틱
부탁 드립니다. 감사합니다.
2019-12-06
162
글번호 134187