카테고리 없음

[Python] 키움증권 OpenAPI 계좌번호 요청: 코드 및 함수 설명

indigenthuman 2024. 9. 7. 14:15

키움증권 OpenAPI 계좌번호 요청: 코드 및 함수 설명

키움증권 OpenAPI를 사용해 자동매매 프로그램을 개발하는 과정에서 계좌번호를 요청하는 기능은 필수적입니다. 이번 글에서는 키움증권 OpenAPI를 통해 로그인한 후 계좌번호를 요청하고 출력하는 방법에 대해 설명합니다.

1. Kiwoom 클래스 설정

먼저, 키움증권 OpenAPI와 상호작용하기 위해 QAxWidget 클래스를 상속받아 Kiwoom 클래스를 정의합니다. 이 클래스는 키움 API와 연결하고, 계좌번호 요청 및 처리를 담당하는 함수들이 포함되어 있습니다.

from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Kiwoom(QAxWidget):
    def __init__(self):
        super().__init__()
        self._make_kiwoom_instance()
        self._set_signal_slots()
        self._comm_connect()
        self.account_number = self.get_account_number()

    def _make_kiwoom_instance(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def _set_signal_slots(self):
        self.OnEventConnect.connect(self._login_slot)

    def _login_slot(self, err_code):
        if err_code == 0:
            print("connected")
        else:
            print("not connected")
        self.login_event_loop.exit()

    def _comm_connect(self):
        self.dynamicCall("CommConnect")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

2. 계좌번호 요청 함수

로그인이 성공적으로 완료되면, 계좌번호를 요청할 수 있습니다. 이를 위해 GetLoginInfo 메서드를 사용하며, 해당 메서드는 요청한 로그인 정보(계좌번호)를 반환합니다. 반환된 결과는 ;로 구분된 문자열 형태로 전달되므로, 이를 split을 통해 처리하고 첫 번째 계좌번호를 반환합니다.

def get_account_number(self, tag="ACCNO"):
    account_list = self.dynamicCall("GetLoginInfo(QString)", tag)
    account_number = account_list.split(';')[0]
    print(account_number)
    return account_number
  • dynamicCall("GetLoginInfo(QString)", tag): 키움 OpenAPI의 GetLoginInfo 메서드를 호출하여 로그인한 계좌 정보를 가져옵니다. tag="ACCNO"는 계좌번호를 요청할 때 사용하는 키입니다.
  • account_list.split(';')[0]: 여러 계좌가 있을 수 있으므로, ;로 구분된 문자열에서 첫 번째 계좌번호만 추출합니다.

3. 로그인 후 계좌번호 요청 흐름

계좌번호 요청 과정은 다음과 같은 순서로 이루어집니다:

  1. API 인스턴스 생성: QAxWidget을 상속받은 Kiwoom 클래스에서 OpenAPI와 연결을 설정합니다.
  2. 로그인 요청: CommConnect 메서드를 호출하여 로그인 창을 띄우고 로그인합니다.
  3. 로그인 성공 여부 확인: 로그인 이벤트가 발생하면 OnEventConnect 신호가 발생하고, err_code 값을 통해 성공 여부를 판단합니다.
  4. 계좌번호 요청: 로그인 성공 시 get_account_number 메서드를 호출하여 계좌번호를 요청하고 출력합니다.

4. 전체 코드 예시

계좌번호 요청과 관련된 핵심 코드만 포함된 전체 코드는 다음과 같습니다:

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

class Kiwoom(QAxWidget):
    def __init__(self):
        super().__init__()
        self._make_kiwoom_instance()
        self._set_signal_slots()
        self._comm_connect()
        self.account_number = self.get_account_number()

    def _make_kiwoom_instance(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def _set_signal_slots(self):
        self.OnEventConnect.connect(self._login_slot)

    def _login_slot(self, err_code):
        if err_code == 0:
            print("connected")
        else:
            print("not connected")
        self.login_event_loop.exit()

    def _comm_connect(self):
        self.dynamicCall("CommConnect")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

    def get_account_number(self, tag="ACCNO"):
        account_list = self.dynamicCall("GetLoginInfo(QString)", tag)
        account_number = account_list.split(';')[0]
        print(account_number)
        return account_number

# 키움증권 API에 로그인 요청 및 계좌번호 요청
if __name__ == "__main__":
    app = QApplication(sys.argv)
    kiwoom = Kiwoom()
    app.exec_()

 

6. 실행결과

위 코드를 실행하면 다음과 같이 로그인 후 계좌번호가 출력됩니다.

 

 

결론

이 코드는 키움증권 OpenAPI를 사용하여 자동매매 프로그램을 개발할 때 필수적인 계좌번호 요청 기능을 구현하는 간단한 예시입니다. 로그인 성공 후 GetLoginInfo 메서드를 통해 계좌번호를 요청하고 이를 처리할 수 있습니다.