커뮤니티

ReqMarketData -> OnRcvMarketData 0틱 현상 문의

프로필 이미지
megapro
2026-06-19 11:26:18
37
글번호 232507
답변완료

​안녕하세요. 예스스팟을 이용 중인 사용자입니다.

​장중에 스크립트에서 Main.ReqMarketData(종목코드)로 실시간 시세를 등록하면, **리턴값은 정상(양수, -1 아님)**으로 나옵니다.

​하지만 그 이후 **Main_OnRcvMarketData 이벤트가 단 한 번도 발생하지 않는 현상(0틱)**이 지속되고 있습니다.

​동일한 시점에 일반 HTS 내장 주문창이나 관심종목 창에서는 해당 종목의 현재가가 실시간으로 정상 변동하는 것을 확인했습니다. 스크립트에서 30초마다 ReqMarketData를 재등록하도록 유도해도 마찬가지로 0틱 상태가 유지됩니다.

​이와 관련하여 기술적 답변을 요청드립니다.

​1. 추가적인 권한이나 설정이 필요한지:

스크립트 영역에서 OnRcvMarketData로 실시간 시세를 받으려면, 일반 HTS 시세 외에 추가로 필요한 요건이 있습니까? (예: ① 실시간 시세 수신 권한/레벨 별도 신청, ② 계좌/시세 사용 설정에서 별도로 활성화해야 할 항목 등)

​2. 종목 객체 보관(참조) 관련:

ReqMarketData로 받아온 시세 객체(MarketData)를 전역 변수나 배열(예: MK.push(MarketData))에 명시적으로 보관해야만 이벤트가 유지되는 구조입니까? 전역 배열 보관 처리가 빠진 채 코드만 쓰면 가비지 컬렉션 등으로 인해 예스스팟 엔진이 콜백을 주지 않을 수도 있는지 확인 부탁드립니다.

3. ​기타 원인:

OnRcvMarketData 외에 다른 콜백 함수명이나 수신 조건을 사용해야 하는 경우가 있는지 답변 바랍니다

답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-06-22 09:44:06

안녕하세요 예스스탁입니다. 1 OnRcvMarketData는 ReqMarketData로 종목객체를 요청 후 객체생성이 완료되었을 떄 1회 발생하는 이벤트입니다. function Main_OnUpdateMarket(itemcode, updateID, exchangeKind) { } 만들어진 종목객체에 시세 업데이트는 위 이벤트를 사용하셔야 합니다. 2 종목의 시세 업데이트는 부하가 많이 걸릴수 있어 일반적으로 타이머 이벤트를 이용해 일정 시간가격으로 체크하게 많이 작성하는 편입니다. 아래 예제를 참고하시기 바랍니다. https://help.yesstock.com/350d121b-e719-800f-918f-e42a23111b99 3 아래는 종목객체 요청 -> 생성완료 -> 업데이트시 최고값 갱신 예입니다. var MK; var HH; function Main_OnStart() { //삼성전자 종목객체 요청 Main.ReqMarketData("005930"); } function Main_OnRcvMarketData(MarketData) { //삼성전자 종목객체 완성 if (MarketData.code == "005930") { //변수에 종목객체 저장 MK = MarketData; //최고값 초기값 HH = MK.current; } } function Main_OnUpdateMarket(itemcode, updateID, exchangeKind) { //삼성전자 체결시세가 발생할 떄만 if (updateID == 20001 && itemcode == MK.code) { //최고값 갱신 //현재가가 HH갑보다 크면 HH를 현재가로 변경 if (MK.current > HH) { HH = MK.current; } } } 4 종목이 많으면 부하가 많이 발생하므로 타이머를 이용해 일정간격으로 체크하게 변경한 식입니다. var MK; var HH; function Main_OnStart() { //삼성전자 종목객체 요청 Main.ReqMarketData("005930"); Main.SetTimer(1, 1000);//1번타이머 셋팅 1초 } function Main_OnRcvMarketData(MarketData) { //삼성전자 종목객체 완성 if (MarketData.code == "005930") { //변수에 종목객체 저장 MK = MarketData; //최고값 초기값 HH = MK.current; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { //최고값 갱신 //현재가가 HH갑보다 크면 HH를 현재가로 변경 if (MK.current > HH) { HH = MK.current; } } } 즐거운 하루되세요