커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4375
글번호 230811
qormswhd 님에 의해서 삭제되었습니다.
2018-04-25
0
글번호 118470
답변완료
지표문의
1.아래는 수식지님이 작성한 수식입니다
참조 종목(data2)으로 사용 할수있게
좀 수정 해주세요
2.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),Start(420),
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);
tick = PriceScale;
if Bdate != Bdate[1] then //매일 첫번째 봉에서 해당 변수들의 값을 0으로 초기화
{
Start = 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;
}
}
if stime >= 0 and stime < 080000 then
ttm = timetominutes(stime)+1440-Start;
else
ttm = timetominutes(stime)-Start;
#ttm = TimeToMinutes(stime); //시간을 30분,15분,10분등으로 나누기 쉽도록 환산
t_val = int((ttm)/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");
3.그럼 수고하세요
2018-04-25
296
글번호 118469
답변완료
피보나치 조정대 수식 점검 부탁드립니다.
아래의 수식을 챠트에 적용해 보니 생각과 맞지 않는 부분이 있어서 문의 드립니다.
1. 일봉상의 피보나치 조정대의 가격을 기준으로 분봉에서 매매되는 수식이 맞는지요??
2. 0.500에서 매수하여 0.382에서 수익매도 0.618에서 손절이 되길를 원하는데요.
어떻게 수정을 하면 될런지요??
- 아 래 -
input : n(100);
input : 지정일(20180405);
var : 매수금액(3000000);
var : hh(0),ll(0),rr(0),cnt(0);
if DayHigh(n) > 0 and DayLow(n) > 0 then{
hh = dayhigh(1);
ll = daylow(1);
for cnt = 1 to n{
if dayhigh(cnt) > hh Then
hh = DayHigh(cnt);
if daylow(cnt) < ll Then
ll = daylow(cnt);
}
rr = hh-ll;
var1 = hh;
var2 = hh - rr*0.382;
var3 = hh - rr*0.500;
var4 = hh - rr*0.618;
var5 = ll;
if crossup(c,var3) Then
Buy("매수");
if (CrossDown(c,var1) or CrossDown(c,var2) or CrossDown(c,var4)) Then
ExitLong("매도");
}
2018-04-25
264
글번호 118468
답변완료
종목검색 수식 부탁드립니다.
1. 일봉상 최근 100봉 이내에 최저점대비 100%이상 상승한 종목
2. 당일 개래대금 100억 이상
2018-04-25
220
글번호 118467
답변완료
키움영웅문 표현방식의 강세약세 수식 부탁드립니다.
input : k(60);
var:HH(0),LL(0);
HH = highest(h,k);
LL = lowest(l,k);
그림에서 고점을 갱신하면 바탕강세
저점을 갱신하면 바탕약세
를 키움영웅문식 강세약세 표현하는 예스 수식을 부탁드립니다.
2018-04-25
411
글번호 118466
답변완료
재문의 부탁드립니다~^^
재문의드립니다~^^
국내선물 틱차트에서~실시간~
*매수조건이 만족(참이면)할때만~매수신호~*//매도조건이 만족(참이면)할때만 매도신호~
*5 이평선이 20 이평선뚫으면 ~{이때,(조건,5 이평>=일목,기준선 and 5 >= 20 이평)조건이 참이면}~ 매수신호.
** 실시간현재가 > 일목기준선 and,5 이평 >= 일목,기준선 and 5 이평>=20 이평)조건이참이면 실시간 현재가가눌릴때~실시간현재가가 일목기준선값(지지선)에 닿으면 매수신호.
*** (5 이평 > 20 이평 > 일목기준선) 참이고~ 실시간 현재가가 일목,기준선(값) 보다 14틱이상가면(상승) ~~실시간현재가가~눌릴때~20 이평선(값)에~닿으면 매수신호.
**** 실시간 현재가가~60 이평선 뚫고~6틱이상가면~(이때조건=5 이평 >= 40 이평)조건이참이면~ 눌릴때~60 이평선에 닿으면(지지선) 매수신호(하루 2회이내만).
**** 실시간 현재가가`120 이평선 뚤고~120 이평선값보다~6틱이상더가면(조건,5 이평 >= 90 이평)조건이참이면~눌림목~120 이평(선)값에닿으면~매수신호(하루2회이내만).
* * * 위모든 매수신호자리에서~조건이 참이여만 매수신호나타나게 해주시면됩니다~^^
매도신호는~~ 위와 반대로~부탁드립니다~^^
2018-04-25
219
글번호 118464
베롱나무 님에 의해서 삭제되었습니다.
2018-04-25
4
글번호 118458
답변완료
문의드립니다.
도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
input: 진입시간(153400);
if 조건 and stime == 진입시간 then
buy("b",OnClose);
선물에 적용해봤는데요.
신호는 차트에 나오는데 매수는 되지 않았습니다. 35분 딱 동시호가 들어가기전 매수되는 줄 알았으나 리포트에만 그렇게 나오고 실매매에는 안되는가 봅니다. 동시호가전 마지막봉 매수는 다른 방법을 써야만 되는건가요? 전에 한번 일러주신 것 같은데 잊어 먹었습니다. 또 한번 가르침 부탁드립니다.
2018-04-25
209
글번호 118457
답변완료
수식문의드립니다.
아래식으로 스위칭시스템을 만들고 싶은데요
몇가지 내용을 추가 하고 싶습니다.
부탁드립니다.
1. 직전 진입이 매수 였으면 다음진입은 매도진입으로
2. 직전 진입이 매도 였으면 다음진입은 매수진입으로
3. 3계약들어가서 아래 청산식으로 청산하되 반대신호가 나오면 직전포지션을 모두 청산하고 스위칭하게 하고 싶습니다.
If C > top
Then
Buy("매수", AtStop, C,3);
If C < bot
Then
Sell("매도", AtStop, C,3);
if MarketPosition == 1 Then{
exitlong("bx1",Atlimit,EntryPrice+PriceScale*10,"",1,1);
exitlong("bx2",Atlimit,EntryPrice+PriceScale*20,"",1,1);
exitlong("bx3",Atlimit,EntryPrice+PriceScale*30,"",1,1);
}
if MarketPosition == -1 Then{
ExitShort("sx1",Atlimit,EntryPrice-PriceScale*10,"",1,1);
ExitShort("sx2",Atlimit,EntryPrice-PriceScale*20,"",1,1);
ExitShort("sx3",Atlimit,EntryPrice-PriceScale*30,"",1,1);
}
2018-04-25
213
글번호 118455