더북(TheBook)

앞서 _on_receive_tr_data는 사용되는 모든 TR의 응답을 수신하는 함수이기에 rqname을 통해 TR별로 구분하여 응답을 받아 와야 한다고 설명했습니다. 따라서 TR 이름(호출할 때 지었던 별명)이 담긴 rqname 변수 값을 가지고 응답을 구분 짓습니다.

if rqname == "opt10081_req":

OPT10081 TR의 응답이 온 경우 우리가 가져올 수 있는 데이터는 일자, 시가, 고가, 저가, 현재가, 거래량 등이 있으며, GetRepeatCnt 함수로 얻어 온 데이터 개수만큼 반복해서 추출하여 ohlcv라는 딕셔너리에 저장합니다.

이 과정이 복잡하다면 단순히 ohlcv에는 다음과 같은 값(open: 시가, high: 고가, low: 저가, close: 현재가=종가, volume: 거래량)이 저장된다고 생각해도 좋습니다. 그러면 코드를 조금 더 추가해 보겠습니다.

def _on_receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
    print("[Kiwoom] _on_receive_tr_data is called {} / {} / {}".format(screen_no, rqname, trcode))
    tr_data_cnt = self.dynamicCall("GetRepeatCnt(QString, QString)", trcode, rqname)
 
    if next == '2':
        self.has_next_tr_data = True
    else:
        self.has_next_tr_data = False

    if rqname == "opt10081_req":
        ohlcv = {'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}

        for i in range(tr_data_cnt):
            date = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "일자")
            open = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "시가")
            high = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "고가")
            low = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "저가")
            close = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "현재가")
            volume = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "거래량")

            ohlcv['date'].append(date.strip())
            ohlcv['open'].append(int(open))
            ohlcv['high'].append(int(high))
            ohlcv['low'].append(int(low))
            ohlcv['close'].append(int(close))
            ohlcv['volume'].append(int(volume))

        self.tr_data = ohlcv

    self.tr_event_loop.exit()
    time.sleep(0.5)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.