티스토리 뷰

키움 Open API/개발가이드

조회처리

히처리 2018. 3. 8. 17:07

조회요청(조회처리)

조회요청은 키움OpenAPI가 제공하는 데이터를 서버에 요청해서 가져오는 것을 말한다. 조회요청은 TR(Transaction)이라는 단위로 처리된다. TR이란 서버와 데이터를 주고받을때 정의한 약속된 규약이며 입력부분(Input)과 데이터를 수신하는 출력부분(Output)을 가지고 있다. TR에 따라서 입력되는 값과 출력되는 값이 다르다. 그리고 TR의 출력되는 방식이 아래와 같이 3가지가 있다.

  • 싱글데이터
  • 멀티데이터
  • 싱글데이터 + 멀티데이터 (예: OPT10081 : 주식일봉차트조회요청)

싱글데이터는 출력이 한번에 가능하지만, 멀티데이터는 여러번의 출력을 가진다. 키움OpenAPI가 제공하는 TR은 KOA Studio의 TR목록 탭에서 찾아볼 수 있고 각 TR별로 조회도 가능하다.

 

조회제한

키움OpenAPI에서 시세조회는 1초당 5회로 제한되는데 관심종목 조회와 조건검색 조회 횟수도 포함된다. 만일 1초 동안 시세조회 2회 관심종목 1회 조건검색 2회 순서로 조회를 했다면 모두 합쳐서 5회이므로 모두 조회성공하겠지만 조건검색을 3회 조회하면 맨 마지막 조건검색 조회는 1초에 6번이 되어서 실패하게 된다.

 

조회관련 메서드

SetInputValue()

SetInputValue(

    BSTR sID,     // TR에 명시된 Input이름

    BSTR sValue   // Input이름으로 지정한 값

)

조회요청에 사용할 TR의 Input값을 지정하는 함수이다. 필요한 Input값만큼 반복해서 사용한다.

CommRqData()

CommRqData(

    BSTR sRQName,    // 사용자 구분명

    BSTR sTrCode,    // 조회하려는 TR이름

    long nPrevNext,  // 연속조회여부

    BSTR sScreenNo  // 화면번호

)

조회요청함수이다. 리턴값 0이면 조회요청 정상을 뜻한다. -200 시세과부하(조회 요청을 1초에 5회 초과), -201 조회전문작성 에러를 뜻한다.

 

CommKwRqData()

CommKwRqData(

    BSTR sArrCode,    // 조회하려는 종목코드 리스트

    BOOL bNext,   // 연속조회 여부 0:기본값, 1:연속조회

    int nCodeCount,   // 종목코드 갯수

    int nTypeFlag,    // 0:주식 관심종목, 3:선물옵션 관심종목

    BSTR sRQName,   // 사용자 구분명

    BSTR sScreenNo    // 화면번호

)

한번에 100종목을 조회할 수 있는 관심종목 조회함수인데 영웅문HTS [0130] 관심종목 화면과는 이름만 같은뿐 전혀관련이 없다. 함수인자로 사용하는 종목코드 리스트는 조회하려는 종목코드 사이에 구분자';'를 추가해서 만들면 된다.

GetRepeatCnt()

GetRepeatCnt(

    BSTR sTrCode, // TR 이름

    BSTR sRecordName // 레코드 이름

)

조회수신한 멀티데이터의 갯수(반복)수를 얻을수 있다. 예를들어 OPT10081 TR은 차트조회를 한번에 최대 900개 데이터를 수신할 수 있는데 이렇게 수신한 데이터 갯수를 얻을때 사용한다. 이 함수는 반드시 OnReceiveTRData()이벤트 함수가 호출될때 그 안에서 사용해야 한다.

// OPT10081 : 주식일봉차트조회요청 c++ 예시
OnReceiveTrDataKhopenapictrl(...)
{
    if(strRQName == _T("주식일봉차트"))
    {
        int nCnt = OpenAPI.GetRepeatCnt(sTrcode, strRQName);
        for (int nIdx = 0; nIdx < nCnt; nIdx++)
        {
            strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("종목코드"));   strData.Trim();
            strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("거래량"));   strData.Trim();
            strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("시가"));   strData.Trim();
            strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("고가"));   strData.Trim();
            strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("저가"));   strData.Trim();
            strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("현재가"));   strData.Trim();
        }
    }
}

GetCommData()

GetCommData(
    BSTR strTrCode,   // TR 이름
    BSTR strRecordName,   // 레코드이름
    long nIndex,      // TR반복부
    BSTR strItemName // TR에서 얻어오려는 출력항목이름

)

OnReceiveTRData()이벤트 함수가 호출될때 조회데이터를 얻어오는 함수이다. 이 함수는 반드시 OnReceiveTRData()이벤트 함수가 호출될때 그 안에서 사용해야 한다.

GetCommDataEx()

GetCommDataEx(

    BSTR strTrCode,   // TR 이름

    BSTR strRecordName  // 레코드이름

)     

조회 수신데이터 크기가 큰 차트데이터를 한번에 가져올 목적으로 만든 전용함수이다.

 

DisconnectRealData()

DisconnectRealData(
    BSTR sScnNo // 화면번호
)
화면번호 설정한 실시간 데이터를 해지한다.

 

GetCommRealData()

GetCommRealData(

    BSTR strCode,   // 종목코드

    long nFid   // 실시간 타입에 포함된FID

)

OnReceiveRealData()이벤트 함수가 호출될때 실시간데이터를 얻어오는 함수이다. 이 함수는 반드시 OnReceiveRealData()이벤트 함수가 호출될때 그 안에서 사용해야 한다.

 

조회 관련 이벤트 메서드

OnReceiveTrData() 이벤트 메서드

void OnReceiveTrData(

    BSTR sScrNo,       // 화면번호

    BSTR sRQName,      // 사용자 구분명

    BSTR sTrCode,      // TR이름

    BSTR sRecordName,  // 레코드 이름

    BSTR sPrevNext,    // 연속조회 유무를 판단하는 값 0: 연속(추가조회)데이터 없음, 1:연속(추가조회) 데이터 있음

    LONG nDataLength,  // 사용안함.

    BSTR sErrorCode,   // 사용안함.

    BSTR sMessage,     // 사용안함.

    BSTR sSplmMsg     // 사용안함.

)

조회요청 응답을 받거나 조회데이터를 수신했을때 호출된다. 조회데이터는 이 이벤트 함수내부에서 GetCommData()함수를 이용해서 얻어올 수 있다.

 

OnReceiveRealData() 이벤트 메서드

OnReceiveRealData(

    BSTR sCode,        // 종목코드

    BSTR sRealType,    // 리얼타입

    BSTR sRealData    // 실시간 데이터 전문

)

실시간 데이터를 수신할때마다 호출되며 SetRealReg()함수로 등록한 실시간 데이터도 이 이벤트 함수에 전달된다. GetCommRealData()함수를 이용해서 실시간 데이터를 얻을 수 있다.

 

OnReceiveMsg() 이벤트 메서드

OnReceiveMsg(

    BSTR sScrNo,   // 화면번호

    BSTR sRQName,  // 사용자 구분명

    BSTR sTrCode,  // TR이름

    BSTR sMsg     // 서버에서 전달하는 메시지

)

서버통신 후 수신한 메시지를 알려준다. 메시지에는 6자리 코드번호가 포함되는데 이 코드번호는 통보없이 수시로 변경될 수 있다. 따라서 주문이나 오류관련처리를이 코드번호로 분류하시면 안된다.

 

 

조회 처리과정

 

 

조회를 하기 위해서는 우선 SetInputValue()메서드를 이용하여 Tr에 필요한 입력값을 입력한다. 그리고 CommRqData()메서드를 이용하여 서버로 조회를 요청한다. 서버로부터 조회에 대한 결과로 OnReceiveMsg()이벤트 메서드와 OnReceiceTrData()이벤트 메서드를 발생시킨다. OnReceiveTrData()이벤트 메서드 내에서 GetRepeatCnt()와 CommGetData()를 이용하여 데이터를 얻을 수 있다.

 

연속조회 처리과정

TR별로 한번에 전달할 수 있는 데이터 갯수가 정해져 있다. 그런데 이 갯수보다 데이터가 많을때 이 데이터는 멀티데이터가 되고 연속조회를 써서 모든 데이터를 조회해야 한다. 연속조회는 모든 조회처리에 적용되는 공통사항이다. 연속조회하는 방법은 CommRqData()에서 3번째 인자값(nPrevNext)만 바꿔서 다시 서버로 조회를 요청하고 OnReceiveTrData()이벤트 메서드로 데이터를 얻는 과정을 반복하면 된다.

 

실시간 데이터

 

조회요청이 성공하면 관련 실시간 데이터를 서버에서 자동으로 OnReceiveRealData()이벤트 함수로 발생시킨다. 이때 결과값은 여러 FID를 묶은 RealType(리얼타입)으로 보낸다. FID와 RealType은 KOA Studio의 실시간 탭에서 자세하게 확인할 수 있다.

 

실시간 데이터 처리 과정

'키움 Open API > 개발가이드' 카테고리의 다른 글

로그인 예제  (0) 2018.03.08
로그인과 버전관리  (0) 2018.03.08
키움 openAPI  (0) 2018.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함