반응형
✅ 2단계 개요: 왜 이벤트 처리가 중요한가요?
키움 OpenAPI는 이벤트 기반 구조를 가지고 있어
데이터 요청 후, 결과를 비동기로 전달합니다.
즉, 아래 구조로 동작합니다:
- Python → OpenAPI에 데이터 요청 (CommRqData)
- OpenAPI → 이벤트 핸들러를 통해 응답 전달 (OnReceiveTrData, OnReceiveRealData)
🛠️ STEP 1. 이벤트 핸들러 클래스 만들기
🔹 QAxWidget 객체와 이벤트 연결
Python에서는 win32com.client.WithEvents를 사용하여
OpenAPI의 이벤트를 처리할 수 있습니다.
python
import pythoncom
import win32com.client
class KiwoomEventHandler:
def OnReceiveTrData(self, scrNo, rqName, trCode, recordName, prevNext, dataLen, errorCode, message, splmMsg):
print(f"[TR 응답] 요청명: {rqName}")
if rqName == "opt10001_req":
price = self.kiwoom.GetCommData(trCode, rqName, 0, "현재가")
print("현재가:", price)
def OnEventConnect(self, err_code):
if err_code == 0:
print("✅ 로그인 성공")
else:
print("❌ 로그인 실패:", err_code)
# 연결
kiwoom = win32com.client.DispatchWithEvents("KHOPENAPI.KHOpenAPICtrl.1", KiwoomEventHandler)
kiwoom.kiwoom = kiwoom # 인스턴스 내부에서 사용 위해 설정
🔗 STEP 2. 로그인 → TR 요청 → 데이터 수신
python
kiwoom.CommConnect() # 로그인 창 띄우기
while kiwoom.GetConnectState() == 0:
pythoncom.PumpWaitingMessages()
# 주가 조회
kiwoom.SetInputValue("종목코드", "005930")
kiwoom.CommRqData("opt10001_req", "opt10001", 0, "0101")
# 이벤트 루프 유지
while True:
pythoncom.PumpWaitingMessages()
✅ 이렇게 하면 OnReceiveTrData() 이벤트에서 현재가를 자동으로 출력합니다.
🧪 실습 예시
📷 실행 화면 예시
text
✅ 로그인 성공
[TR 응답] 요청명: opt10001_req
현재가: 79,300
🧠 STEP 3. TR 구조 이해
함수 | 설명 |
SetInputValue("종목코드", "005930") | 조건 입력 |
CommRqData("opt10001_req", "opt10001", 0, "0101") | 요청 송신 |
OnReceiveTrData(...) | 응답 수신 이벤트 |
GetCommData(...) | 수신 데이터 추출 |
📌 실전 팁
- 여러 요청을 동시에 보낼 수 있지만 스크린 번호("0101")는 유일해야 합니다
- 응답 데이터는 GetCommData()로 1줄씩만 추출 가능
- TR마다 데이터 구조가 다릅니다 → API 문서 확인 필수
반응형