커뮤니티

예스랭귀지 Q&A

글쓰기
답변완료

[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내

안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
프로필 이미지
예스스탁
2026-02-27
8053
글번호 230811
지표
답변완료

수식 문의

아래 수식을 osc 지표로 만들고 싶습니다. --- 아래 --- 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); 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 { 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; 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); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l <= price_u[arr] and price_u[arr] <= h 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 <= 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); 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 { 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; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_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])); } dn_tpo = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; 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)); } ---------------------------- macd는 장기이평을 0으로 긋고 장기이평(0선)과 단기이평의 이격을 확인하는 지표라고 할 수 있겠습니다. 이와 같은 원리로, 위 수식에서 plot1을 수평선 0값으로 만들고 plot2~7을 plot1과의 비율에 맞추어 (plot1에 대한 이격만큼) 지표에 뿌려줍니다. data1 과 data1에 대한 지수이평값도 마찬가지로 plot1의 이격만큼 뿌려줍니다. 항상친절한 답변 감사드립니다.
프로필 이미지
흑수돌
2019-02-12
273
글번호 126070
지표
답변완료

수식 문의드립니다.

if bdate != bdate[1] Then plot1(O); 이 수식이 3% 이상 오른봉에만 표시할 수는 없나요?
프로필 이미지
haha1122
2019-02-11
230
글번호 126069
검색

haha1122 님에 의해서 삭제되었습니다.

프로필 이미지
haha1122
2019-02-11
0
글번호 126068
검색
답변완료

문의드립니다 !

안녕하세여 !!! 1, 아래수식에서 "추세선"이 봉과같이 진행되다가 멈추는 경우... 그 "멈춘봉"에서 "세로"로 "선"이 발생되도록 부탁드립니다 "상승추세선"이 멈춘경우는 "파란색 세로선" "하락추세선"이 멈춘경우는 "붉은색 세로선" 2, 위와는 반대로, 멈춰있던 "추세선"이 얼마간의 봉이 진행후 다시 봉과 연결되면서 새롭게 진행이 될경우 이 "연결봉"에도 "세로선이 발생되었으면합니다 "상승추세선"이 연결된 경우는 "붉은색 세로선" "하락추세선"이 연결된 경우는 "파란색 세로선"으로 부탁드립니다 *** 특히 이경우에는 가능하면 음성신호도 같이 나올수있으면 더 좋겠습니다 3,"선두께"는 경우에 따라서 조정이 가능하도록 부탁드립니다 감사합니다 ^^ ========================================================================== input : len(11), period(200); var : Lbar1(0), Lbar2(0), Lval1(0), Lval2(0), Hbar1(0), Hbar2(0), Hval1(0), Hval2(0); var : UpTrend(0), DnTrend(0),TL1(0),TL2(0),TL3(0); Lbar1 = swinglowbar(1, low, len, len, period); Lbar2 = swinglowbar(2, low, len, len, period); Lval1 = swinglow(1, low, len, len, period); Lval2 = swinglow(2, low, len, len, period); Hbar1 = swinghighbar(1, high, len, len, period); Hbar2 = swinghighbar(2, high, len, len, period); Hval1 = swinghigh(1, high, len, len, period); Hval2 = swinghigh(2, high, len, len, period); If Lval1 > Lval2 Then { var1 = 1; UpTrend = (Lval1 - Lval2)/(Lbar2 - Lbar1)*Lbar1 + Lval1; plot1(UpTrend, "상승추세선"); } Else var1 = 0; If Hval1 < Hval2 Then { var2 = 1; DnTrend = (Hval1 - Hval2)/(Hbar2 - Hbar1)*Hbar1 + Hval1 ; plot2(DnTrend, "하락추세선"); } Else var2 = 0; if var1 == 1 and var1[1] != 1 or (Lbar1 < Lbar1[1]) Then { var11 = sdate; var12 = stime; var13 = H; Condition1 = false; } if var1 == 1 then { if H > var13 Then var13 = H; if var1[1] == 1 and Condition1 == false and CrossDown(L,UpTrend) Then { Condition1 = true; var14 = UpTrend; var15 = var14-(var13-var14); TL1 = TL_New(var11,var12,var15,sdate,stime,var15); TL_SetColor(TL1,CYAN); } if Condition1 == true then { TL_SetEnd(TL1,sdate,stime,var15); } } if var2 == 1 and var2[1] != 1 or (Hbar1 < Hbar1[1]) Then { var21 = sdate; var22 = stime; var23 = L; Condition2 = false; } if var2 == 1 then { if L < var23 Then var23 = L; if var2[1] == 1 and Condition2 == false and CrossDown(H,DnTrend) Then { Condition2 = true; var24 = DnTrend; var25 = var24+(var24-var23); TL2 = TL_New(var21,var22,var25,sdate,stime,var25); TL_SetColor(TL2,MAGENTA); } if Condition2 == true then { TL_SetEnd(TL2,sdate,stime,var25); } }
프로필 이미지
유로파54
2019-02-12
251
글번호 126067
지표
답변완료

부탁 드립니다.

도움 주심에 감사 드립니다. 어제 변환 부탁 드렸사오나 barssince(m(1)>m,a1=m); barssince(m(1)<=m,a1=m); 위 내용이 어떤 의미인지 모르겠습니다 또한 수식에 알수없는 변수 m1이 있습니다. 위와 같은 답변에 대하여 그림과 같이 참고 자료를 첨부 합니다. m1 값은 임의로 처리 부탁 합니다. 1)변환해야할 수식 m=ma(c,p); valuewhen(1,m(1)>m,m); valuewhen(1,m(1)<=m,m); barssince(m(1)>m,a1=m); barssince(m(1)<=m,a1=m); atan((m1-a1)/b1/10000)*180/3.14;
프로필 이미지
뮬리
2019-02-11
310
글번호 126066
지표
답변완료

수식부탁드립니다.

5일선이 20일선위에 있으며, 종가가 5일선 아래일 경우 매수, 5일선이 20일선밑에 있으며, 종가가 5일선 위일 경우 매도 감사드립니다. ^^
프로필 이미지
고나리자
2019-02-11
281
글번호 126065
시스템
답변완료

수식 문의

지그재그 오실레이터를 구하고 싶습니다. 위 그림은 대신 사이보스에 있는 zigzag osc 입니다. 그림을 보면, 지그재그 파동의 꼭지점과 현재가격의 이격을 막대그래프로 표현한 지표입니다. 물론, 지그재그 파동은 여러가지 조건으로 그릴 수 있다고 알고 있습니다. 일전에 아래의 지그재그 파동선 수식을 도움 받은바 있습니다. 본 수식을 바탕으로 부탁드립니다. n봉의 고/저가를 넘어가면 파동선이 그어지는 방식입니다. --------- 아래 -------------- input:length(6); Var:j(0),jj(0),HH(0),LL(0),최종고가(0),최종저가(0),최종꼭지점(""),처리구분(""), TL1(0),Text1(0),TL2(0),TL3(0),TL4(0),TL5(0),TL12(0),TL13(0),TL14(0),TL15(0),T(0); Array:고[10,4](0),저[10,4](0); // 1:가격,2:Index,3:sDate,4:sTime #==========================================# HH = IFF(0==1,C,H); LL = IFF(0==1,C,L); If Index == 0 Then { 고[1,1] = HH; 저[1,1] = LL; } Condition1 = Highest(HH,length) == HH and 최종고가 <> HH; Condition2 = Lowest (LL,length) == LL and 최종저가 <> LL; 처리구분 = ""; If Condition1 and Condition2 Then // 기간고점과 기간저점 동시 발생 { If 최종꼭지점 == "저점" Then { If 저[1,1] > LL Then 처리구분 = "저점처리"; Else 처리구분 = "고점처리"; } Else If 최종꼭지점 == "고점" Then { If 고[1,1] < HH Then 처리구분 = "고점처리"; Else 처리구분 = "저점처리"; } } Else If Condition1 Then 처리구분 = "고점처리"; Else If Condition2 Then 처리구분 = "저점처리"; #==========================================# If 처리구분 == "고점처리" Then { T = 1; 최종고가 = HH; // 신규고점을 체크하기 위해 저장 If 최종꼭지점 == "저점" Then { For j = 10 DownTo 2 { For jj = 1 To 4 { 고[j,jj] = 고[j-1,jj]; } } 고[1,1] = HH; 고[1,2] = Index; 고[1,3] = sDate; 고[1,4] = sTime; TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]); If 1 == 1 Then { Text1 = Text_New(고[1,3],고[1,4],고[1,1],NumToStr(고[1,1],2)); Text_SetStyle(Text1, 0, 1); Text_SetColor(Text1,BLACK); } TL_SetSize(TL1,1); TL_SetColor(TL1,RED); } Else If 고[1,1] < HH Then // 1번 고점보다 높은 고가 출현 { 고[1,1] = HH; 고[1,2] = Index; 고[1,3] = sDate; 고[1,4] = sTime; TL_SetEnd(TL1,고[1,3],고[1,4],고[1,1]); // 시작점은 변동없고 끝점의 위치가 현재 봉으로 연장된 것임 If 1 == 1 Then { Text_SetLocation(Text1,고[1,3],고[1,4],고[1,1]); Text_SetString(Text1,NumToStr(고[1,1],2)); } } 최종꼭지점 = "고점"; } #==========================================# If 처리구분 == "저점처리" Then { T = -1; 최종저가 = LL; If 최종꼭지점 == "고점" then { For j = 10 DownTo 2 { For jj = 1 To 4 { 저[j,jj] = 저[j-1,jj]; } } 저[1,1] = LL; 저[1,2] = Index; 저[1,3] = sDate; 저[1,4] = sTime; TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]); If 1 == 1 Then { Text1 = Text_New(저[1,3],저[1,4],저[1,1],NumToStr(저[1,1],2)); Text_SetStyle(Text1, 0, 0); Text_SetColor(Text1,BLACK); } TL_SetSize(TL1,1); TL_SetColor(TL1,GREEN); } Else If 저[1,1] > LL then { 저[1,1] = LL; 저[1,2] = Index; 저[1,3] = sDate; 저[1,4] = sTime; TL_SetEnd(TL1,저[1,3],저[1,4],저[1,1]); If 1 == 1 Then { Text_SetLocation(Text1,저[1,3],저[1,4],저[1,1]); Text_SetString(Text1,NumToStr(저[1,1],2)); } } 최종꼭지점 = "저점"; }
프로필 이미지
흑수돌
2019-02-12
279
글번호 126064
지표
답변완료

재 문의 드립니다.

제가 올린 수식 중에 누락된 것이 있어 만들어 주신 수식이 작동이 안 되어서 다시 올립니다. 번거롭게 해서 너무 죄송합니다... ============================ < 아래 수식 적용 시간이 국내 증권사 개장 시간인 09:00로 되어 있습니다. 이 수식을 증권사 개장 시간이 아닌 오전 00:00부터 오후 24:00까지 적용할 수 있는 수식으로 변경부탁드립니다.> ============================= var: HH(0),LL(0),RR(0); <== 누락된 부분입니다. HH=dayhigh; LL=DayLow; RR=HH-LL; plot1(HH,"당일최고가"); plot2(HH-RR*0000, "0000%"); plot3(HH-RR*0000, "0000%"); plot4(HH-RR*0000, "0000%"); 늘 감사드립니다.
프로필 이미지
태양같이
2019-02-11
255
글번호 126062
지표
답변완료

문의 드립니다

좋은 답변 너무 감사합니다. 너무 좋은데 기대에 못미쳐서 보완을 부탁드립니다. 상승, 하락 동일추세 반복을 조금 더 잘 활용하고 싶습니다. *******목표: 추세가 반복될 때 좀 더 자주 매매하도록 하고자 합니다. *******연속된 하락추세에서 매수하는 방법 -추세 4,8,12 .....파에서 매수하고자 할 경우인데요 먼저 ,하락 3파가 끝나고 하락 4파가 막 만들어져 나타나는 시점에 추세와 역방향으로 매수 진입합니다. -손절은 지정틱(-10,-20,-30,-40 ......) 조건이 충족하면 무조건 손절합니다. -연속된 파동 사이에 낀 1개의 반대 추세선은 연속된 추세선과 같은 추세선 1개로 본다. -연속된 하락파동에서 손절되고 잔량이 없으면 다음 하락7, 11 ......파가 끝나고 하락8 ,12 ......파가 막 만들어져 나타나는 시점에 매수 재진입합니다. -손절되지 않고 잔량 보유 중에는 하락7, 11 ......파가 끝나고 하락8, 12 ......파가 막 만들어져 나타나는 시점에도 추가매수하지 않고 현상 유지합니다. -청산과 역방향 진입은 추세가 반대 방향으로 바뀌어 상승 3파가 끝나고 상승 4파가 막 만들어져 나타나는 시점에 잔량의 청산과 동시에 추세와 역방향으로 매도 진입합니다. -이후 손절, 재진입, 추가진입은 이전 방법과 동일하게 합니다. -손절이나 청산시에 손익 결과 틱 수가 나나타게 해주시면 좋겠습니다.
프로필 이미지
번성
2019-02-12
249
글번호 126056
시스템