🚀 영웅문4 OpenAPI + Python 완전 정복 - 2단계: 이벤트 처리 & 실시간 데이터 받기

반응형

OpenAPI + Python 완전 정복 - 2단계: 이벤트 처리 & 실시간 데이터 받기

✅ 2단계 개요: 왜 이벤트 처리가 중요한가요?

키움 OpenAPI는 이벤트 기반 구조를 가지고 있어
데이터 요청 후, 결과를 비동기로 전달합니다.

즉, 아래 구조로 동작합니다:

  1. Python → OpenAPI에 데이터 요청 (CommRqData)
  2. 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 문서 확인 필수
반응형