반응형
이벤트 메소드와 일반 메소드를 사용하여 로그인 및 기본정보 요청 함수를 작성해 본다.
전체 FLOW
소스코드
import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
class KiwoomAPI:
def __init__(self):
# QAxWidget 객체 (키움 api연결)
self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
# 이벤트함수
self.kiwoom.OnEventConnect.connect(self.myOnEventConnect) # 로그인
self.kiwoom.OnReceiveTrData.connect(self.myOnReceiveTrData) # 통신 관련
# 로그인 요청함수
print("로그인 요청")
self.kiwoom.dynamicCall("CommConnect()")
def getData(self):
# 데이터 요청 함수
print("데이터요청")
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", "005385") # (아이템명, 입력값)
self.kiwoom.dynamicCall("CommRqData(QString, QString, QString, QString)", "test_opt10001", "opt10001", "0", "0101")
# ( sRQName(사용자구분), sTrCode(Tran명), nPrevNext(0:조회 2:연속), sScreenNo(화면번호) )
# TR종류는 KOA스튜디오에서 확인가능
# 화면목록은 KOA스튜디옹서 확인가능
def myOnEventConnect(self, nErrCode):
if nErrCode == 0:
print('로그인 성공')
# 로그인이 성공한 후 데이터를 받아와야 정상 동작한다.
self.getData()
else:
print('로그인 실패')
def myOnReceiveTrData(self, sScrNo, sRQName, sTrCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSplmMsg):
print("데이터 수신 성공")
# sScrNo(화면번호), sRQName(사용자구분), sTrCode(Tran명), sRecordName(레코드명), sPreNext(연속조회 유무) , 나머지 4개는 현재버전에서 사용x
if sRQName == 'test_opt10001':
print("화면번호 사용자구분 tran명 레코드명 연속조회유무")
print(sScrNo,sRQName,sTrCode,sRecordName,sPreNext)
name = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "종목명")
volume = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "거래량")
price = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "현재가")
# ( strTrCode(tran코드), strRecordName(레코드명), nIndex(복수데이터 인덱스), strItemName(아이템명) )
# 아이템명은 koa studio에 해당 tr의 output 에서 확인가능
print(name.lstrip(), volume.lstrip(), price.lstrip())
if __name__ == "__main__":
app = QApplication(sys.argv)
test = KiwoomAPI()
app.exec_()
(output)
주의할점
처음에 기본 정보데이터를 요청하는 함수인 getData()함수를 생성자에서 실행시키고 에러가 났다.
이는 getData함수에 있는 setinputvalue함수와 commrqdata함수가 로그인이 완료된 후 수행되어야 하는 함수이기 때문으로 보인다.
따라서 getData()함수를 로그인의 완료가 보장된 로그인이벤트 함수 myOnEventConnect 내부에서 실행시켰고 문제를 해결할 수 있었다.
* QeventLoop를 이용한 해결은 아래의 글에서 설명한다.
반응형