키움 OpenAPI는 주식 종목 조회를 위해서 TR(Transaction) 이라는 단위로 처리를 진행한다.
실시간 업데이트가 되는 주식 특성상 데이터 주고 받는 통신 방법을 하나의 규약으로 만들어 놨다.
그래서 결론은
클라이언트(사용자)가 TR을 통해 서버(증권사)에 요청하면 서버(증권사)가 클라이언트(사용자)에게 데이터를 전달하는 것이다.
그럼 TR의 종류가 무엇인지 보자.
이보다 훨씬 더 있어서 다 첨부하긴 어렵다...너무 많아서 일부만 짤랐다..
전체 리스트는 키움증권에서 제공하는 KOA StudioSA 프로그램을 통하면 전체 리스트를 볼 수 있다.
실제 프로그램을 통해 저 TR을 어떻게 이용하는지 보려면 메소드를 살펴보자.
먼저 TR을 요청을 해야하는데 이때 사용해야 하는 함수가 SetInputValue() 함수이다.
TR 요청에 대한 입력할 값이 준비가 되면 이제 요청을 서버로 전송할 때 사용할 함수가 CommRqData() 함수이다.
서버에서 TR 요청에 대한 데이터가 준비되면 클라이언트에게 OnReceiveTrData라는 이벤트를 발생시켜준다.
그때 발생하는 이벤트가 OnReceiveTrData() 이다.
마지막으로 데이터를 수신하기 위한 함수가 GetCommData() 함수이다.
결국 조회 요청 후 수신을 위한 순서는 다음과 같다.
SetInputValue(사용자) -> CommRqData(사용자) -> OnReceiveTrData(이벤트) -> GetCommData()
먼저 Kiwoom.py 에 위 기능을 추가한 코드를 보자.
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QAxContainer import *
import pythoncom
class OpenApi:
def __init__(self):
self.woom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
self.woom.OnEventConnect.connect(self.OnEventConnect)
self.woom.OnReceiveTrData.connect(self.OnReceiveTrData)
self.login = False
self.tr = False
def CommConnect(self):
self.woom.dynamicCall("CommConnect()")
while not self.login:
pythoncom.PumpWaitingMessages()
def OnEventConnect(self, err_code):
self.login = True
print("Connect = OK")
def GetMasterCodeName(self, code):
name = self.woom.dynamicCall("GetMasterCodeName(QString)", code)
return name
def GetCodeListByMarket(self, market):
codelist = self.woom.dynamicCall("GetCodeListByMarket(QString)", market)
return codelist
def SetInputValue(self, id, value):
self.woom.dynamicCall("SetInputValue(QString, QString)", id, value)
def CommRqData(self, rqname, trcode, next, screen):
self.tr = False
self.woom.dynamicCall("CommRqData(QString, QString, int, QString)", rqname, trcode, next, screen)
while self.tr is False:
pythoncom.PumpWaitingMessages()
def GetCommData(self, trcode, record, index, item):
data = self.woom.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, record, index, item)
return data.strip()
def OnReceiveTrData(self, screen, rqname, trcode, record, next):
print(screen, rqname, trcode, record, next)
self.tr = True
name = self.GetCommData(trcode, record, next, "종목명")
nPrice = self.GetCommData(trcode, record, next, "현재가")
volume = self.GetCommData(trcode, record, next, "거래량")
print("종목명", name)
print("현재가", nPrice)
print("거래량", volume)
그럼 이번에는 실행할 Stock.py 를 보자.
import sys
from PyQt5.QtWidgets import *
from Kiwoom import OpenApi
import pythoncom
class App(QWidget):
def __init__(self):
super().__init__()
kiwoom = OpenApi()
kiwoom.CommConnect()
kiwoom.SetInputValue("종목코드", "005930")
kiwoom.CommRqData("opt10001", "opt10001", 0, "0101")
if __name__ == "__main__":
app = QApplication(sys.argv)
myApp = App()
app.exec_()
실행해보면 다음과 같은 결과가 출력된다.
최대한 짧게 적으려고 노력했는데 잘안된다...ㅜㅜ
글이 길면 집중도 안되고 다시 볼때도 힘들어서 줄이고 줄여봤는데....후우
이 이상은 안넘어가도록 노력해봐야겠다.
'c. 파이썬' 카테고리의 다른 글
[파이썬 / 증권사 API활용](7) 조건식 불러오기 (0) | 2024.09.02 |
---|---|
[파이썬 / 증권사 API활용](5) No module named 'pythoncom' 에러 (0) | 2024.08.31 |
[파이썬 / 증권사 API활용](4) Kiwoom.py 클래스화 (0) | 2024.08.28 |
[파이썬 / 증권사 API활용](3) OpenAPI+ 메소드 사용 (0) | 2024.08.27 |
[파이썬 / 증권사 API활용](2) QAxcontainer 사용 및 키움 모의투자 신청 (0) | 2024.08.26 |
[파이썬 / 증권사 API활용](1) 키움 Open API+ 적용 (0) | 2024.08.25 |
[파이썬 / 매크로 만들기](8) 키보드 keyboard 입력으로 시작, 정지 (0) | 2024.08.24 |
[파이썬 / 매크로 만들기](7) Thread 실행 중 강제 종료 버튼 이벤트 (0) | 2024.08.23 |