커뮤니티

예스랭귀지 Q&A

글쓰기
답변완료

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

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

함수 활용 중 질문

안녕하세요. 항상 자세한 답변 감사드립니다. 1. 내부변수 선언할때 'Var=숫자'되어야 하는 건 알겠는데요 'Value = ?'에는 뭐가 들어가야 하나요? Value와 Var의 차이가 뭔가요? 2. '수식그룹1'이 약 100줄짜리 수식이라고 칩시다. 수식을 아래와 같이 짰을 때 (아래) 조건식1 만족시 수식그룹1 실행 조건식2 만족시 수식그룹1 실행 조건식3 만족시 수식그룹1 실행 이런 방식이 사람 눈에는 매우 길어보이나 기계에게는 맞는 조건식이 나와야 그 이후(수식그 룹1)을 실행하므로 그 정도까지로 길지는 않겠죠? 3. 위에서처럼 '수식그룹1'이 함수호출처럼 계속 사용될 때 이것을 함수처럼 따로 저장했다가 호출하는 방법이 있나요? 랭귀지에서 안되면 예스스팟의 객체로는 가능할까요? 아니면 단순 복사해넣는 수밖에는 없나요. (여러개 값을 리턴하는 함수에 대해) 4. 게시판 검색해보니 13704번 글에서 예스스탁에서 아래와 같은 답변을 주셨습니다. 여러개 값을 리턴하는 함수의 구현이 이 방법 말고는 없나요? C언어의 포인터 개념은 없나요? 위 방식이 2015년 현재도 동일한가요? 5. 아래의 예제에서 함수 Ref는 ref1 = ref1+1; //수식1개 ref2 = ref2+1; //수식1개 이렇게 2개의 수식을 수행한다는 뜻이죠? 저기서 마지막 줄에 ref = 0; 이라고 쓴 이유는 수치들을 리턴받는 함수의 초기 설정값은 0 이 되어야 하기 때문인가요? ref = 1; 이라고 쓰면 그냥 오류나는 건가요? (아래) ================================ 안녕하세요 예스스탁입니다. 배열을 리턴하는 함수를 만드실 수는 없고 NumericRef나 NumericArrayRef를 이용하시면 여러개의 값을 리턴하는 함수를 구현하실 수 있습니다. 가령 아래와 같은 함수를 만들고 외부변수를 NumericRef를 사용하시면 사용자함수명 : Ref input : ref1(NumericRef),ref2(NumericRef); ref1 = ref1+1; ref2 = ref2+1; ref = 0; 지표식으로 아래와 같이 작성하면 var1 = 111; var2 = 222; var3 = ref(var1,var2); plot1(var1); plot2(var2); var1과 var2값이 ref 함수를 거쳐 112와 223값으로 변경되는 것을 확인하실 수 있습니다. 이용에 참고하시기 바랍니다. 즐거운 하루되세요 > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 배열 반환 함수 > 안녕하세요 예스스탁입니다. 함수는 단일값으로 리턴이 되므로 해당내용은 제공되지 않습니다. 도움을 드리지 못해 죄송합니다. 즐거운 하루되세요 > salbang 님이 쓴 글입니다. > 제목 : 배열 반환 함수 > 함수 작성시 배열을 리턴하는 함수를 만들 수 있을까요? 꼭 배열이 아닌 방식이더라도 여러개의 값을 리턴하는 함수를 만들 수 있으면 좋겠습니다. 전역 변수라던가 포인터 혹은 핸들을 사용 하는 방식이 있을 수 있겠네요. ==================================
프로필 이미지
로봇짱
2015-09-04
160
글번호 90052
사용자 함수
답변완료

부탁합니다

안녕하세요 오늘도 시스템 식하나 부탁합니다 모든식에 한글 설명도 부탁합니다 20일 이평선을 사용해서 매매식을 만들고자 합니다 매수1 주가가 20일 이평선아래 있다가 위로 돌파시 매수 단 돌파봉은 양봉이어야 하고 양봉은 몸통이 있는경우에만 가능하고 시가 종가의 2/1 이상이 20일 이평선 위에 있을시에만 매수2 주가가 20일 이평선아래 있다가 위로 돌파시 매수 단 돌파봉이 양봉이어야 하고 종가만 20일 이평선 위에 있으면 됩니다 그리고 다음봉은 양봉 음봉은 상관없으나 저가 20일 이평선 위에서 있는경우 입니다 매수 3 주가가 20일 이평선 위에 있다가 아래로 내려가서 20일 이평선을 터치하고 다음봉이 그 터치봉의 고가를 종가상 돌파하는 양봉에 매수 모든식은 반대경우도 부탁합니다 예를 들어 매수1 이 진입상태면 다음 신호를 무시
프로필 이미지
효효효효효
2015-09-04
130
글번호 90051
시스템

외부의도 님에 의해서 삭제되었습니다.

프로필 이미지
외부의도
2015-09-04
1
글번호 90050
지표
답변완료

두수식을동시에사용

Input : shortPeriod(1), longPeriod(20) ; Var : value(0); value = OSCP(shortPeriod, longPeriod); If CrossUP(value, 0) Then Buy(); If CrossDown(value,0) Then Sell(); Input : shortPeriod(2), longPeriod(20); value1 = ma(C, shortPeriod); value2 = ma(C, longPeriod); # 매수/매도청산 If CrossUP(value1, value2) Then { Buy(); } # 매도/매수청산 If CrossDown(value1, value2) Then { Sell(); } 위두수식을 동시에사용할수 있게해주세요
프로필 이미지
큰바위얼굴
2015-09-03
121
글번호 90049
시스템
답변완료

수식 부탁드려요..

항상 감사 합니다. 질문 선물 1분봉 에서 9시에서 10시 사이에 저점대비 고가가 1포인트 이상 상승한적이 있다 이것을 수식으로 표현해 주세요..
프로필 이미지
지킴이
2015-09-03
116
글번호 90048
시스템
답변완료

볼린져밴드 참조데이타

현재 저는 볼린져 밴드 5분봉을 작성중에 있습니다. 참조데이타를 일봉으로 보고 작성을 할려고 하는데요 var1 = BollBandup(20,2) === 이조건은 5분봉에만 적용됩니다 참조데이타 일봉일때 볼린져 밴드 조건식을 알려주시면 고맙겠습니다.
프로필 이미지
새마귀
2015-09-03
153
글번호 90047
시스템
답변완료

가격 이동평균

안녕하세요 선물지수 분봉에서, 실시간으로 가격이동평균선 100의 1P 위의 선은 빨간선으로 그리고 1P 아래의 선은 파란색으로 표시하는 지표식 부탁합니다.
프로필 이미지
날샘
2015-09-03
138
글번호 90039
지표
답변완료

부탁 드립니다.

43839번의 재 질문 입니다. 아래 지표를 해선 영업 시간인 07:00~익일06:00으로 나타 날수 있도록 부탁 드립니다. 미리 감사 드립니다. input : renkoSize(0.5),p1(12),p2(26),p3(9); input : 마지막봉시간(155500); var:j(0),k(0),renkoCnt(0),gubun(0),filename("renko2.txt"),printOK(False), sum(0),ema1_OK(false),ema2_OK(false),sig_OK(False); array:OO[50](0),HH[50](0),LL[50](0),CC[50](0),ma1[50](0),ma2[50](0), ema1[50](0),ema2[50](0),macdVal[50](0),macdSig[50](0); If Bdate != Bdate[1] Then { //break on session에 해당, 즉 일자가 바뀌면 새로 계산 gubun = 0; //방향을 초기화한다. 이후 형성되는 가격에 의해 방향이 계산 For j = 49 DownTo 1 { //금일 시가봉을 신규 추가 OO[j] = OO[j-1]; HH[j] = HH[j-1]; LL[j] = LL[j-1]; CC[j] = CC[j-1]; ema1[j] = ema1[j-1]; ema2[j] = ema2[j-1]; macdVal[j] = macdVal[j-1]; macdSig[j] = macdSig[j-1]; } OO[0] = C; //분봉의 종가를 기반으로 계산하기 때문에 당일 시초가 아니다 HH[0] = C; LL[0] = C; CC[0] = C; } Else { If gubun == 0 and CC[0] > 0 Then { //일 첫봉이 완성되지 않은 시점 If OO[0] - renkoSize >= C Then { gubun = -1; CC[0] = OO[0] - renkoSize; HH[0] = OO[0]; LL[0] = CC[0]; //지수이평을 계산할 수 있을 만큼 렌코가 만들어진 이후 계산 시작 if ema1_OK then ema1[0] = (CC[0]-ema1[1])*(2/(p1+1))+ema1[1]; if ema2_OK then ema2[0] = (CC[0]-ema2[1])*(2/(p2+1))+ema2[1]; if ema2_OK then macdVal[0] = ema1[0] - ema2[0]; if sig_OK then macdSig[0] = (macdVal[0] - macdSig[1])*(2/(P3+1))+macdSig[1]; j = 0; if printOK then print(filename, "1=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f", j,gubun,OO[j],HH[j],LL[j],CC[j]); } Else If OO[0] + renkoSize <= C Then { gubun = 1; CC[0] = OO[0] + renkoSize; HH[0] = CC[0]; LL[0] = OO[0]; if ema1_OK then ema1[0] = (CC[0]-ema1[1])*(2/(p1+1))+ema1[1]; if ema2_OK then ema2[0] = (CC[0]-ema2[1])*(2/(p2+1))+ema2[1]; if ema2_OK then macdVal[0] = ema1[0] - ema2[0]; if sig_OK then macdSig[0] = (macdVal[0] - macdSig[1])*(2/(P3+1))+macdSig[1]; j = 0; if printOK then print(filename, "2=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f", j,gubun,OO[j],HH[j],LL[j],CC[j]); } } If LL[0] - renkoSize >= C Then { gubun = -1; renkoCnt = Int(Round((LL[0]-C)/renkoSize,9)); if renkoCnt > 49 then renkoCnt = 49; For j = 49 DownTo renkoCnt { OO[j] = OO[j-renkoCnt]; HH[j] = HH[j-renkoCnt]; LL[j] = LL[j-renkoCnt]; CC[j] = CC[j-renkoCnt]; if ema1_OK then ema1[j] = ema1[j-renkoCnt]; if ema2_OK then ema2[j] = ema2[j-renkoCnt]; if ema2_OK then macdVal[j] = macdVal[j-renkoCnt]; if sig_OK then macdSig[j] = macdSig[j-renkoCnt]; } For j = renkoCnt-1 DownTo 0 { OO[j] = LL[j+1]; CC[j] = LL[j+1] - renkoSize; HH[j] = OO[j]; LL[j] = CC[j]; if ema1_OK then ema1[j] = (CC[j]-ema1[j+1])*(2/(p1+1))+ema1[j+1]; if ema2_OK then ema2[j] = (CC[j]-ema2[j+1])*(2/(p2+1))+ema2[j+1]; if ema2_OK then macdVal[j] = ema1[j] - ema2[j]; if sig_OK then macdSig[j] = (macdVal[j] - macdSig[j+1])*(2/(P3+1))+macdSig[j+1]; if printOK then print(filename, "3=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]); } } Else If HH[0] + renkoSize <= C Then { gubun = 1; renkoCnt = Int(Round((C-HH[0])/renkoSize,9)); if renkoCnt > 49 then renkoCnt = 49; For j = 49 DownTo renkoCnt { OO[j] = OO[j-renkoCnt]; HH[j] = HH[j-renkoCnt]; LL[j] = LL[j-renkoCnt]; CC[j] = CC[j-renkoCnt]; ema1[j] = ema1[j-renkoCnt]; ema2[j] = ema2[j-renkoCnt]; macdVal[j] = macdVal[j-renkoCnt]; macdSig[j] = macdSig[j-renkoCnt]; } For j = renkoCnt-1 DownTo 0 { OO[j] = HH[j+1]; CC[j] = HH[j+1] + renkoSize; HH[j] = CC[j]; LL[j] = OO[j]; if ema1_OK then ema1[j] = (CC[j]-ema1[j+1])*(2/(p1+1))+ema1[j+1]; if ema2_OK then ema2[j] = (CC[j]-ema2[j+1])*(2/(p2+1))+ema2[j+1]; if ema2_OK then macdVal[j] = ema1[j] - ema2[j]; if sig_OK then macdSig[j] = (macdVal[j] - macdSig[j+1])*(2/(P3+1))+macdSig[j+1]; if printOK then print(filename, "4=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f", j,gubun,OO[j],HH[j],LL[j],CC[j]); } } Else If stime >= 마지막봉시간 and stime[1] < 마지막봉시간 Then { //당일 종가봉에서 For j = 49 DownTo 1 { OO[j] = OO[j-1]; HH[j] = HH[j-1]; LL[j] = LL[j-1]; CC[j] = CC[j-1]; ema1[j] = ema1[j-1]; ema2[j] = ema2[j-1]; macdVal[j] = macdVal[j-1]; macdSig[j] = macdSig[j-1]; } If LL[1] > C Then { //종가가 이전 봉보다 아래 형성 OO[0] = LL[1]; CC[0] = C; HH[0] = OO[0]; LL[0] = CC[0]; } Else If HH[1] < C Then { //종가가 이전 봉보다 위에 형성 OO[0] = HH[1]; CC[0] = C; HH[0] = CC[0]; LL[0] = OO[0]; } Else { //종가가 이전 봉의 중간에 형성 OO[0] = C; CC[0] = C; HH[0] = C; LL[0] = C; } if ema1_OK then ema1[0] = (CC[0]-ema1[1])*(2/(p1+1))+ema1[1]; if ema2_OK then ema2[0] = (CC[0]-ema2[1])*(2/(p2+1))+ema2[1]; if ema2_OK then macdVal[0] = ema1[0] - ema2[0]; if sig_OK then macdSig[0] = (macdVal[0] - macdSig[1])*(2/(P3+1))+macdSig[1]; j = 0; //마지막 1봉만 출력 if printOK then print(filename, "5=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f", j,gubun,OO[j],HH[j],LL[j],CC[j]); } } if ema1_OK == False and CC[p1] > 0 then { //지수이평 계산 가능할 때까지 대기 sum = 0; for j = 0 to p1 - 1 { sum = sum + CC[j]; } ema1[0] = sum/p1; //처음 값은 단순이평값으로 ema1_OK = True; //다음 봉부터 지수이평 계산되도록 설정 } if ema2_OK == False and CC[p2] > 0 then { sum = 0; for j = 0 to p2 - 1 { sum = sum + CC[j]; } ema2[0] = sum/p2; ema2_OK = True; } if sig_OK == False and CC[P2+p3] > 0 then { sum = 0; for j = 0 to p3 - 1 { sum = sum + macdVal[j]; } macdSig[0] = sum/p3; sig_OK = True; } Plot1(macdVal[0],"macd"); Plot2(macdSig[0],"macd signal");
프로필 이미지
yes
2015-09-03
159
글번호 90035
지표
답변완료

수식 요청

안녕하세요. 항상 도움에 다시한번 감사드립니다. 하기 조건에 대한 3가지 수식 부탁드립니다. * 1번 * 1. 수식A신호 매수매도 및 청산 2. 수식A신호 진입후 8틱이상 움직인 이후 수식B에서 스위칭 신호발생시 Only 청산만 (수식B 신호로 진입불가) * 2번 * 1. 수식A신호 매수매도 및 청산 2. 지표C 기준 (0선 이상 매수 진입불가 / 0선 이하 매도 진입불가) * 3번 * 1. 수식A신호 매수매도 및 청산 2. 단, 수식B와 같을 경우만 - 수식A - Input : Period(12), Period1(5), Period2(5); value1 = StochasticsK(Period,Period1); value2 = StochasticsD(Period,Period1,Period2); # 매수/매도청산 If CrossUP(value1, value2) Then { Buy(); } # 매도/매수청산 If CrossDown(value1, value2) Then { sell(); } - 수식B - Input : af(0.02), maxAF(0.2) ; Var : value(0); value = csar(af,maxAF); # 매수/매도청산 If C > value Then { Buy(); } # 매도/매수청산 If C < value Then { Sell(); } - 지표C - Input : Period(100),기준값(0); var : CCIv(0); CCIv = CCI(Period);
프로필 이미지
한국사람73
2015-09-03
128
글번호 90033
시스템