20211206 man kiwoom_api continue 2

abraxas·2021년 12월 6일
0

tamagotchi

목록 보기
7/21

PyQt를 이용해 키움 Open API+를 사용하는 방법의 기초를 이어서 공부한다.

아래의 WikiDocs를 공부했다.

https://wikidocs.net/4239

이번에는 GetLoginInfo() method를 이용해서 계좌 정보를 가져온다. 이 method는 한 개의 인자를 전달하고 계좌 개수, 계좌번호, 사용자 ID, 사용자 이름, 키보드 보안 해지 여부, 그리고 방화벽 설정 여부를 가져올 수 있다. 아래는 위 WikiDocs의 예제 12.8의 코드이다.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import  *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # Kiwoom Login
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        self.kiwoom.dynamicCall("CommConnect()")

        # OpenAPI+ Event
        self.kiwoom.OnEventConnect.connect(self.event_connect)

        self.setWindowTitle("계좌 정보")
        self.setGeometry(300, 300, 300, 150)

        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)

    def btn1_clicked(self):
        account_num = self.kiwoom.dynamicCall("GetLoginInfo(QString)", ["ACCNO"])
        self.text_edit.append("계좌번호: " + account_num.rstrip(';'))

    def event_connect(self, err_code):
        if err_code == 0:
            self.text_edit.append("로그인 성공")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()

위 코드에서 새로운 부분은 바로 이 부분이다.

    def btn1_clicked(self):
        account_num = self.kiwoom.dynamicCall("GetLoginInfo(QString)", ["ACCNO"])
        self.text_edit.append("계좌번호: " + account_num.rstrip(';'))

dynamicCall() method를 이용해 GetLogInfo() method를 사용한다. 리스트에 "ACCNO"만 전달해 계좌번호를 요청한다.

다음으로 할 것은 종목 코드 및 한글 종목명을 가져오기이다. GetCodeListByMarket() method에 sMarket을 인자로 전달해주면 해당 시장에 속한 종목 코드 목록이 반환된다. 그리고 GetMasterCodeName() method에 종목 코드를 인자로 전달해주면 한글 종목명을 받는다. 아래는 예제 12.9의 코드이다.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import  *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        self.kiwoom.dynamicCall("CommConnect()")

        self.setWindowTitle("종목 코드")
        self.setGeometry(300, 300, 300, 150)

        btn1 = QPushButton("종목 코드 얻기", self)
        btn1.move(190, 10)
        btn1.clicked.connect(self.btn1_clicked)

        self.listWidget = QListWidget(self)
        self.listWidget.setGeometry(10, 10, 170, 130)

    def btn1_clicked(self):
        ret = self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["0"])
        kospi_code_list = ret.split(';')
        kospi_code_name_list = []

        for x in kospi_code_list:
            name = self.kiwoom.dynamicCall("GetMasterCodeName(QString)", [x])
            kospi_code_name_list.append(x + " : " + name)

        self.listWidget.addItems(kospi_code_name_list)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    sys.exit(app.exec_())

여기서도 btn1_clicked() method의 기능을 변경해준다.

    def btn1_clicked(self):
        ret = self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["0"])
        kospi_code_list = ret.split(';')
        kospi_code_name_list = []

        for x in kospi_code_list:
            name = self.kiwoom.dynamicCall("GetMasterCodeName(QString)", [x])
            kospi_code_name_list.append(x + " : " + name)

        self.listWidget.addItems(kospi_code_name_list)

GetCodeListbyMarket() method에 ["0"] 리스트를 전달해주면 유가증권시장의 종목 코드 목록을 받아온다. 그다음 ";"으로 구분되는 문자열을 리스트로 만들어준다. 마지막으로 이 리스트에 있는 종목 코드마다 GetMasterCodeName() method를 이용해 한글 종목명을 받아온다. 여기서 QListWidget 이라는 widget을 사용하는데, 위의 "종목 코드: 종목명" 리스트를 여기에 추가해준다.

예제 코드를 그대로 따라 할 경우 윈도우 크기와 widget들 크기가 작게 출력된다. setGeometry()와 move() method들을 좀 더 공부할 필요가 있다. 그리고 Ahn Lab Safe Transaction 프로그램을 제거했더니 이제 다음과 같은 에러 메시지가 출력된다.

[0x32a4100f] 보안프로그램이 정상적으로 설치 되지 않았습니다. [2] 해당 현상이 반복될 경우 키움금융센터(1544-9000)로 문의하여 주시기 바랍니다.

확인을 누르면 더 문제가 발생하지 않지만, 자동화하는데 걸림돌이 될 수 있으니 키보드 보안 프로그램을 재설치해 봐야 할 것 같다.

오늘은 여기까지.

다음은 첫 미니 프로젝트의 계획을 세울 것이다.

0개의 댓글