반응형
돈키움에서 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)
except: pass
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요청 단계에서 콜백함수를 지정하는 것으로 해결되었다.
반응형
'대동단결 Python' 카테고리의 다른 글
돈키움의 종목정보 실시간 처리 (0) | 2020.09.24 |
---|---|
OpenAPI, TR 수신 이벤트가 뜨지 않는다. (0) | 2020.09.12 |
스크립트언어 파이썬에서 변수 유효범위 및 접근범위 (0) | 2020.07.12 |
파이썬으로 웹서비스 하기 (0) | 2020.06.28 |
Python 에서 R 스크립트 실행 (0) | 2020.06.24 |
댓글