커뮤니티

예스랭귀지 Q&A

글쓰기
답변완료

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

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

텍스트 표시 위치 변경식 문의

수고하십니다. 현물 주봉 차트에서 아래와 같이 하니 20이평 우측끝에 ★표시가 됩니다. 이 때 차트 맨 우측에 표시되는데 글씨를 많이 쓰는 경우 X축 우측 여백이 많이 필요하네요.. 이것을 좌측으로 5캔들 이동하고, 그봉이 양봉인 경우 종가의 1.2배 위의 위치에, 음봉인 경우 그날 종가의 1.3배 아래에 ★표시가 표시되도록 이동하려면 어떻게 해야 되는지요? 수고하세요 ************* var : tx2(0); var2 = ma(C,20); Plot92(var2,"★표시"); Text_Delete(tx2); tx2 = Text_New(sdate,stime,var2,"★"); Text_SetStyle(tx2,0,2); Text_SetColor(tx2,blue); Text_SetBold(tx2,3); Text_SetLocation(tx2, currentdate, currentTime, var2); //
프로필 이미지
오이도인
2019-03-12
318
글번호 126999
지표
답변완료

당일 매수 다음날 시가매도

래리윌리엄스 변동성 돌파 전략을 하려고 합니다. 일간으로 적용. 당일 매수.(매도는 없음,아래 손절만 있고.) 2% 손절 다음날 9시30분 매도. 다시 전략 시작. 부탁드립니다.
프로필 이미지
와이비엘
2019-03-12
319
글번호 126998
시스템
답변완료

거래량 관련

안녕하세요 선물 10 분봉에서 앞선 10 개봉중에서 현재봉이 최저 거래량일경우, 다음봉에서 (특정 조건이 만족할 때, 매수 또는 매도) 진입하는 수식을 만들고 싶은데, 도움을 부탁드립니다. 감사합니다.
프로필 이미지
워싱턴
2019-03-12
290
글번호 126997
시스템
답변완료

수식변환 부탁드립니다

렌코차트를 활용하여 MACD 크로스 전략을 작성하여 보았습니다. 하나의 시그널 메이커 수식 입니다 벽돌크기는 20틱으로 설정했으며, 국내시간제한으로 09;00 - 익일05:00 까지로 강제청산되게 하였습니다 이익설정은 0.3% 이며, 0.2% 도달후 10%하락시도 이익청산 입니다 죄송 스럽지만 변환 부탁 드립니다 Params : vSSTIME(090000), vEETIME(050000); Vars : TCOND(False); If vSSTIME < vEETIME Then Begin IF vSSTIME <= TIME And TIME < vEETIME Then TCOND = True Else TCOND = False; End Else Begin IF vSSTIME <= TIME Or TIME < vEETIME Then TCOND = True Else TCOND = False; End; Param : BlockSize_Tick( 20 ); // 벽돌의 최소 변화폭(단위 : 틱) Vars : BlockSize( 0 ), // 벽돌크기 BlockN( 0 ), // 벽돌 개수 Trend( 0 ); // 추세 Arrays : HighValue[2](0), // 벽돌의 고가 LowValue[2](0); // 벽돌의 저가 If TCOND Then Begin If CB = 1 // 초기 벽돌의 고가와 저가 설정 Then Begin BlockSize = PriceScale * OneTick * BlockSize_Tick; HighValue[0] = Close; LowValue[0] = Close; End; // 렌코 계산 If Trend = 0 // 추세 없음 Then Begin // 종가가 현재 벽돌의 저가에서 벽돌크기 뺀 가격보다 내려가면 => 하락 추세 If Close < LowValue[0] - BlockSize Then Begin BlockN = IntPortion((LowValue[0] - Close)/BlockSize); LowValue[0] = LowValue[0] - (BlockSize * BlockN); Trend = -1; End // 종가가 현재 벽돌의 고가에서 벽돌크기 더한 가격보다 올라가면 => 상승 추세 Else if close > HighValue[0] + BlockSize Then Begin BlockN = IntPortion((Close - HighValue[0])/BlockSize); HighValue[0] = HighValue[0] + (BlockSize * BlockN); Trend = 1; End; End Else if Trend = -1 // 하락 추세 Then Begin // 종가가 현재 벽돌의 저가에서 벽돌크기 뺀 가격보다 내려가면 => 하락 추세 지속 If Close < LowValue[0] - BlockSize Then Begin BlockN = IntPortion((LowValue[0] - Close)/BlockSize); HighValue[0] = LowValue[0]; LowValue[0] = LowValue[0] - (BlockSize * BlockN); // 벽돌의 저가 갱신 End // 종가가 현재 벽돌의 고가에서 벽돌크기 더한 가격보다 올라가면 => 상승추세로 전환 Else If Close > HighValue[0] + BlockSize Then Begin BlockN = IntPortion((Close - HighValue[0])/BlockSize); HighValue[1] = HighValue[0]; HighValue[0] = HighValue[1] + (BlockSize * BlockN); LowValue[0] = HighValue[1]; Trend = 1; End; End Else if Trend = 1 // 상승 추세 Then Begin // 종가가 현재 벽돌의 고가에서 벽돌크기 더한 가격보다 올라가면 => 상승추세 지속 If Close > HighValue[0] + BlockSize Then Begin BlockN = IntPortion((Close - HighValue[0])/BlockSize); LowValue[0] = HighValue[0]; HighValue[0] = HighValue[0] + (BlockSize * BlockN); End // 종가가 현재 벽돌의 고가에서 벽돌크기 뺀 가격보다 내려가면 => 하락 추세로 전환 Else If Close < LowValue[0] - BlockSize Then Begin BlockN = IntPortion((LowValue[0] - Close)/BlockSize); LowValue[1] = LowValue[0]; LowValue[0] = LowValue[1] - (BlockSize * BlockN); HighValue[0] = LowValue[1]; Trend = -1; End; End; End; Var : Renko_price(0), oMACD(0), oSignal(0); // 렌코차트의 종가? : 상승벽돌에서는 고가, 하락벽돌에서는 저가 If trend = 1 Then Renko_price = HighValue[0] Else If trend = -1 Then Renko_price = LowValue[0]; // 최초 렌코차트의 MACD 값은 첫번째 렌코차트 값으로 정의 If Renko_price <> 0 And Renko_price[1] = 0 Then Begin oMACD = Renko_price; oSignal = Renko_price; End; input : period1(12), period2(26), period3(9); // 벽돌이 갱신될 때마다 MACD 와 시그널 계산 If Renko_price <> Renko_price[1] Then Begin oMACD = EMA(C, period1) - EMA(C, period2); oSignal = EMA(oMACD, period3); End; //////////////////////////////////////////////////////////////////////////////////////// Inputs: MyProfitTargetPercent(0.3); //////////////////////////////////////////////////////////////////////////////////////// Inputs: MyPercentTrailingBefore(0.2), MyPercentTrailingAfter(10); If TCOND Then Begin // MACD 가 시그널 상향돌파 시, 매수 If CrossUp(oMACD, oSignal) Then Buy(); // MACD 가 시그널 하향돌파 시, 매도 If CrossDown(oMACD, oSignal) Then Sell(); SetStopProfittarget( MyProfitTargetPercent, PercentStop ); SetStopTrailing( MyPercentTrailingAfter, MyPercentTrailingBefore, PercentStop ); End Else Begin SetStopProfitTarget(0); SetStopTrailing(0, 0); End; SetStopEndOfday(vEETIME);
프로필 이미지
vlfaud3
2019-03-12
307
글번호 126991
시스템
답변완료

종목 검색 날짜와 관련

안녕하세요? 2018년 1월 1일부터 2019년 오늘까지, 60일선과 120일선의 골든크로스가 발생한 적이 있는 종목들을 검색한다면 어떻게 식을 작성하나요? 감사합니다
프로필 이미지
스테디어드밴서
2019-03-12
304
글번호 126976
검색
답변완료

문의드립니다.

도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다. 1. 트레이드스테이션 보면 OpenPositionProfit, NetProfit 이렇게 시스템리포트 항목에 대한 함수가 있어서 이걸로 수량 추가하고 이런 게 있던데요. 이런 것도 예스에서 변환되고 작동도 하나요? 2. 이거 변환가능한가요? OpenEquity=OpenPositionProfit+NetProfit; openpositionprofit은 아래 내용입니다. OpenPositionProfit Returns a numerical value, indicating the current unrealized profit or loss for the open position.
프로필 이미지
잡다백수
2019-03-12
302
글번호 126975
시스템
답변완료

다시 문의 드립니다.

안녕하세요 파동선 질문에서 확정된 마지막 고점과 현재 고점 그리고 확정된 마지막 저점과 현재 저점에서 수평선을 나오게 부탁을 드렸는데 그것은 안나오는 것 같습니다. 다시 부탁드립니다. 현재 고점과 전고점 그리고 현재 저점과 전저점 이렇게 4선이 수평으로 나오게 부탁드립니다 감사합니다.
프로필 이미지
동해바다01
2019-03-12
336
글번호 126973
지표
답변완료

수식 작성좀 부탁드립니다

Input : shortPeriod(10), longPeriod(20); var : PriceOsc(0); PriceOsc = OSCP(shortPeriod, longPeriod); if PriceOsc > 0 Then { Plot1(PriceOsc, "OSCP+"); Plot2(0, "OSCP-"); } Else { plot1(0,"OSCP+"); Plot2(PriceOsc, "OSCP-"); } PlotBaseLine1(0, "기준선 0"); ----------------------------------------- 위 Price Oscillator 보조지표를 이용하여 진입하는 수식을 작성하려고 합니다. 변수 값은 shortPeriod 6 longPeriod 78 이렇게 설정하고 Price Oscillator 값이 5 이상이면 매수, -5 이하이면 매도하는 수식 작성 좀 부탁합니다.
프로필 이미지
천왕봉
2019-03-12
321
글번호 126971
시스템
답변완료

특정 시간대의 최고/최저 및 시가/종가를 구하는 함수 도움 부탁드립니다.

아래 함수는, 예를 들어 전전일 09시부터 전일 08시까지의 최고/최저값과 시가/고가를 구하거나 할때 사용하고자 하는 함수입니다. 이것을 실행해본 즉, 지표에서 이 함수를 딱 한번만 부르게 특정일 특정시간으로 한정시켜 놓았는데 로그를 찍어보면 매 봉마다 함수도 실행되는 모습을 발견하였습니다. TS에서도 함수뒤에 []를 붙이면 위와 같은 메커니즘으로 실행하는 것은 아는데, 저는 굳이 과거값이 필요없기 때문에 매 봉마다 저 함수가 자동으로 실행되는 것을 피하는 방법이나 또는 매 봉마나 내부적으로 저 함수가 실행되야만 한다면 오버헤드를 최소한 하는 방식으로 함수를 고치는 것이 필요합니다. HighD의 코드를 보고 수정하려 하였는데, 그럼 유사한 방법으로 barnumber가 0인것부터 현재까지 순차적으로 진행하면서 O H L C 배열을 각각 만들어서 만들어야 하나 하는 생각을 하다보니 HighD의 입력값처럼 배열의 인자로 쓸 수 있는게 아니라 입력값이 몇일전, 몇시 등과 같이 여러개로 구성된 것이라서 유사하게는 적용하긴 어렵고, 과연 어떻게 구현을 접근해야 할 지 난해한 상황입니다. 아래 코드를 보시면 아시겠지만 특정 시간대의 고가와 저가를 구하고 시가와 종가도 같이 구해서 함수 하나에서 OHLC를 한번에 문자열로 반환하는 함수입니다. 이것을 시뮬레이션챠트에서, 해외선물(예:나스닥) 5분봉 2년치에 적용해서 돌려보시면 1회 실행시간이 10분이 넘어버립니다. 함수를 테스트하기 위해 만든 지표 예제도 함께 첨부합니다. 지표의 인풋값으로는 (090000, 1, 093000, 1, 143000)을 입력하셔 테스트 해 보셔도 됩니다. 적용한 상황에서의 디버깅창 출력 내용도 첨부합니다. 지금 방금 1만개 봉 챠트에서 적용하니 대략 10초 정도 걸리네요. 그럼 도움 부탁드리겠습니다~ ps : 아 그리고 CurrnetTime은 초단위까지 조회가 되던데 밀리세컨드까지 측정할 수 있는 예약어나 함수는 혹시 있을까요? // 지표로 만든 함수 사용예제 input: st(0), d1(0), t1(0), d2(0), t2(0); var: val(""), hval(0), lval(0); if BarIndex == 0 then { ClearDebug; } if sdate == 20190311 and stime == st then { MessageLog("sdate %.f stime %.f st %.f", sdate, stime, st); val = OHLCduring(d1, t1, d2, t2); // hval = ValueOfOHLC(val, 2); // lval = ValueOfOHLC(val, 3); } Plot1(1, "H"); //Plot1(hval, "high"); //Plot2(lval, "low"); ----------------------------------------------------------------------- /* 함수 코드 : OHLCduring */ input: 시작일수(NumericSimple), 시작(NumericSimple), 끝일수(NumericSimple), 끝(NumericSimple); //시각포맷은 HHMMSS형태로 입력한다. var: srcidx(0), ii(0), jj(0), baridx(0), dayidx(0), 시가(0), 고가(0), 저가(0), 종가(0); var: retval(""); var: 끝도달(0), 시작도달(0); 끝도달 = 0; 시작도달 = 0; retval = "X333"; dayidx = 0; 종가 = 0; for ii = 0 to CurrentBar-1 { if dayidx == 끝일수 then { 끝도달 = 1; baridx = ii; ii = CurrentBar; } else { if date[ii] <> date[ii+1] then { dayidx = dayidx + 1; } } } if 끝도달 <> 1 then { retval = "X000"; baridx = CurrentBar; } for ii = baridx to CurrentBar-1 { if time[ii] == 끝 then { baridx = ii; 종가 = C[ii]; 고가 = H[ii]; 저가 = L[ii]; 끝도달 = 2; } } if 끝도달 == 1 then { retval = "X111"; baridx = CurrentBar; } for ii = baridx to CurrentBar-1 { if dayidx < 시작일수 then { for jj = ii to CurrentBar-1 { if H[jj] > 고가 then 고가 = H[jj]; if L[jj] < 저가 then 저가 = L[jj]; if date[jj] <> date[jj+1] then { dayidx = dayidx + 1; ii = jj; jj = CurrentBar; } } } else { for jj = ii to CurrentBar-1 { if H[jj] > 고가 then 고가 = H[jj]; if L[jj] < 저가 then 저가 = L[jj]; if time[jj] > 시작 then { // Do nothing } else { 시가 = O[jj]; baridx = jj; // baridx는 시작봉의 위치를 가리킨다. ii = CurrentBar; jj = CurrentBar; 시작도달 = 1; } } } } if 시작도달 == 1 Then retval = "O"+NumToStr(시가, 2)+"H"+NumToStr(고가, 2)+"L"+NumToStr(저가, 2)+"C"+NumToStr(종가, 2)+"E"; Else if 끝도달 == 2 and 시작도달 == 0 Then retval = "X222"; MessageLog("%s", retval); OHLCduring = retval;
프로필 이미지
온고지신
2019-03-12
369
글번호 126970
사용자 함수