본문 바로가기
대동단결 Python

돈키움에서 TR 과 이벤트처리

by 즐거운 지니 2020. 9. 12.
반응형

돈키움에서 TR요청은 아래와 같은 형식을 따른다. 

여기서 callBack=콜백함수주소 인자는 해당 TR요청의 응답이벤트가 도착했을 때 실행할 콜백함수의 주소이다.

1
2
donkiwoom.set_input_value("종목코드", code)
donkiwoom.comm_rq_data( "주식기본정보요청""opt10001"0"2400", callBack=self.주식기본정보가져오기)
cs

이벤트 콜백함수는 아래와 같은 형식을 따른다. 

1
2
def 주식기본정보가져오기(self, rqname, trcode, screen_no, next, record_name):
    pass
cs

donkiwoom.comm_rq_data 코드를 살펴보자.

1
2
3
4
5
def comm_rq_data(self, rqname, trcode, next, screen_no, callBack=None):
    if not callBack == None:
        self.callBack[rqname + str(screen_no)] = callBack
    ret = self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", rqname, trcode, next, screen_no)
    return ret
cs

위와 같이 self.callBack 변수를 두어 콜백함수의 주소를 별도 관리하도록 하였다. rqname+screen_no 별로 콜백함수를 배정하였다. 

 

openAPI에서는 모든 TR 요청에 대한 응답이벤트를 OnReceiveTrData 이벤트 하나로 관리하므로 해당 이벤트에 대한 콜백함수는 아래와 같이 하나로 해야 한다. 

1
self.kiwoom.OnReceiveTrData.connect(self._receive_tr_data)
cs

다만, self.recieve_tr_data 함수 내부에서 TR요청에 따라 실제 처리해야할 각각의 콜백함수를 호출하도록 하였다. 

1
2
3
4
5
def _receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
    try#콤백함수 지정
        self.callBack[rqname+screen_no](rqname, trcode, screen_no, next, record_name)
    exceptpass
    self.kwPrint(f'요청에 대한 수신접수 : screenNo={screen_no}, rqName={rqname}, trCode={trcode}')
cs

원래는 self.recieve_tr_data 내부에서 콜백함수의 rqname, trcode, screen_no 조건에 따라 if 문을 써서 각각 실제콜백함수를 호출하도록 코딩하였는데, 이는 TR 요청이 다양해 질수록 if문이 많아지게되어 무척 불편하였다. 

새로운 TR요청을 코딩할 때 마다 이제는 더이상 self.recieve_tr_data 내부를 수정할 필요 없이 TR요청 단계에서 콜백함수를 지정하는 것으로 해결되었다. 

 


 

반응형

댓글