키움증권 서버에 주식기본정보를 TR을 사용해서 요청함으로써
알고 싶은 종목의 액면가, 자본금, 상장주식, PER, EPS, ROE 등등 기본 정보들을 가져올 수 있습니다.
TR(TRansaction) 목록과 input데이터, output데이터 등은 KOA Studio에서 확인 할 수 있습니다.
오늘 포스팅에서 완성하고자 하는 최종 결과물은 다음과 같습니다.
먼저 최종 코드를 보시고 하나하나 설명드리겠습니다.
import sys import time import pandas as pd
from PyQt5.QtWidgets import * from PyQt5.QAxContainer import * from PyQt5.QtGui import *
class Kiwoom(QMainWindow): def __init__(self): super().__init__()
# 로그인 self.kiwoom = QAxWidget() self.kiwoom.setControl("KHOPENAPI.KHOpenAPICtrl.1") self.kiwoom.dynamicCall("CommConnect()")
# OpenAPI+ Event self.kiwoom.OnEventConnect.connect(self.event_connect) self.kiwoom.OnReceiveTrData.connect(self.receive_tr_data)
# GUI 세팅 self.setWindowTitle("opt10001") self.setGeometry(300, 300, 300, 150)
label = QLabel('종목코드', self) label.move(20, 20)
self.code_edit = QLineEdit(self) self.code_edit.move(80, 20) self.code_edit.setText('종목코드를 입력하세요')
btn1 = QPushButton('조회', self) btn1.move(190, 20) btn1.clicked.connect(self.btn1_clicked)
self.text_edit = QTextEdit(self) self.text_edit.setGeometry(10, 60, 280, 80) self.text_edit.setEnabled(False)
def event_connect(self, err_code): if err_code == 0: self.text_edit.append("로그인 성공")
def btn1_clicked(self): code = self.code_edit.text() self.text_edit.append("종목코드:" + code)
# SetInputValue self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", code) # CommRqData self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt10001_req", "opt10001", 0, "0101")
def receive_tr_data(self, screen_no, rqname, trcode, recordname, prev_next, data_len, err_code, msg1, msg2): print("리시브로 들어옴") if rqname == "opt10001_req": name = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString", trcode, recordname, 0, "종목명") volume = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString", trcode, recordname, 0, "거래량") numStocks = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString", trcode, recordname, 0, "상장주식") prices = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString", trcode, recordname, 0, "시가")
self.text_edit.append("종목명:" + name.strip()) self.text_edit.append("거래량:" + volume.strip()) self.text_edit.append("상장주식:" + numStocks.strip()) self.text_edit.append("시가:" + prices.strip())
if __name__=="__main__":
app = QApplication(sys.argv) myWindow = Kiwoom() myWindow.show() app.exec_()
|
로그인과 GUI 세팅은 저번 포스팅에서 설명드렸었습니다.
오늘 새로 나오는 개념은 이벤트와 관련된 내용과 키움증권 OpenAPI+ 메서드 입니다.
먼저 이벤트는 클라이언트가 필요한 정보를 먼저 세팅하고 그 세팅값을 서버에 요청합니다.
요청 후 서버가 반응이 올 때까지 기다렸다가 서버의 반응(이벤트발생)을 수신하여 정보를 캐치합니다.
먼저 보실 이벤트는 로그인 관련 이벤트 입니다.
로그인을 실행했을 때 정상적으로 로그인이 되었다면 서버에서 에러코드를 0으로 쏴줍니다.
그때(서버가 에러코드를 쏴줄 때) OnEventConnect.connect 안의 함수가 자동으로 실행됩니다.
self.kiwoom.OnEventConnect.connect(self.event_connect)
def event_connect(self, err_code):
if err_code == 0:
self.text_edit.append("로그인 성공")
그러면 event_connect함수가 실행되고 "로그인 성공" 이라는 텍스트가 출력됩니다.
또 서버가 반응할 때가 언제일까요?
바로 클라이언트가 정보를 요청했을 때 그 정보를 클라이언트에게 쏴주는 반응(이벤트)이 발생합니다.
기본적으로 tr코드를 이용한 요청을 할 때에 서버가 반응하면
self.kiwoom.OnReceiveTrData.connect(self.receive_tr_data)
다음과 같이 OnReceiveTrData 가 실행되고 여기에 연결되어 있는 함수 receive_tr_data 가 실행됩니다.
자 이렇게 이벤트에 반응하는 방법에 대해서 알아봤습니다.
이제 키움증권 OpenAPI+ 메서드에 대해서 알아보겠습니다.
이 메서드들은 KOA Studio의 개발가이드 탭에서 자세히 설명되어있습니다.
즉, tr코드를 이용해서 주식기본정보(opt10001)을 서버에 요청하고 싶다면 먼저
SetInputValue 메서드를 이용해서 tr코드의 input 에 맞는 데이터를 설정해 줍니다.
이렇게 설정된 값을 가지고 서버에 데이터 요청을 해야겠죠?
그때 사용하는 메서드가 바로
CommRqData 메서드 입니다.
요청 후 서버의 반응을 기다렸다가 반응이 왔을 때 서버에서 보내 준 데이터에서 원하는 데이터를
받아오는 메서드가 바로
GetCommData 메서드 입니다.
이렇게 3가지 키움증권 OpenAPI+ 메서드를 알아보았습니다.
파이썬 코드 파일도 첨부해 드리니 보시고 안되시거나 이해가 안되시는 부분은 댓글로 문의하셔도 됩니다!
다음 포스팅에서는 본인의 계좌정보를 가져오는 것과 나머지 잔잔한 키움증권 OpenAPI+메서드를 알아보겠습니다.