앞서 _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)