5.[키움증권 오픈 API] 계좌 정보 가져오기

2021. 7. 11. 15:57AI트레이딩/키움API

728x90
반응형

계좌 정보 가져오기


 로그인 후 사용할 수 있으며 인자값에 대응하는 정보를 얻을 수 있다.       


          "ACCOUNT_CNT" : 보유계좌 갯수를 반환.
          "ACCLIST" 또는 "ACCNO" : 구분자 ';'로 연결된 보유계좌 목록을 반환.
          "USER_ID" : 사용자 ID를 반환.
          "USER_NAME" : 사용자 이름을 반환.
          "GetServerGubun" : 접속서버 구분을 반환.(1 : 모의투자, 나머지 : 실거래서버)
          "KEY_BSECGB" : 키보드 보안 해지여부를 반환.(0 : 정상, 1 : 해지)
          "FIREW_SECGB" : 방화벽 설정여부를 반환.(0 : 미설정, 1 : 설정, 2 : 해지)

 

[보유계좌 목록 예시]
';'로 보유계좌가 분리된다
예시) "3040525910;5678905510;3040526010"

import sys
from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *
import pandas as pd
from log import *


TR_REQ_TIME = 0.2

# ------------------------------------------------

class KiwoomAPI(QAxWidget):
    """ 키움증권 OPENAPI+ 라이브러리 쓰기위해 PyQt5 상속
    기본세팅
    초당 5회 제한 -> 최소한 0.2초 대기
    1시간에 1000회 제한 -> 3.6초 이상 대기 """

    def __init__(self):
        print(f'openapi __name__:{__name__}')
        super().__init__()
        # openapi 호출 횟수를 저장하는 변수
        # 키움 openapi 연결
        self._create_kiwoom_api_instance()
        self._set_signal_slots()


        # 요청 결과
        self.event = None
        self.result = {}


    # ////////////////////////////////////////////////////////////////
    # //           login             ////////////////////////////////
    # //////////////////////////////////////////////////////////////
    def _create_kiwoom_api_instance(self):
        """ PyQt의 QAxWidget class를 사용해 API instance 생성
        """
        self.setControl('KHOPENAPI.KHOpenAPICtrl.1')

    def _set_signal_slots(self):
        try:
            self.OnEventConnect.connect(self._on_event_connect)
            self.OnReceiveMsg.connect(self._on_receive_msg)
        except Exception as e:
            ana_64bit = sys.maxsize > 2 ** 32
            if ana_64bit:
                print('******[Anaconda 64bit]******* need to be 32bit')
            else:
                print(f'{e}')


    def comm_connect(self, **kwargs):
        """"로그인 요청 -> 키움증권 로그인창 띄워줌. 자동로그인 설정시 바로 로그인 진행
        	OnEventConnect() callback
            :param kwargs:
            :return: 0: 로그인 요청 성공
        """
        lRet = self.dynamicCall('CommConnect()')
        self.event = QEventLoop()
        print("event loop 전")
        self.event.exec_()
        print("event loop 후")
        print("lRet", lRet)
        return lRet

    def _on_event_connect(self, nErrCode, **kwargs):
        """로그인 처리 이벤트, 로그인 상태 전달
        	로그인 성공시 0, 음수면 실패
            :param ErrCode: 0: 로그인 성공, 100: 사용자 정보교환 실패, 101: 서버접속 실패, 102: 버전처리 실패
            :param kwargs:
            :return:
        """
        if nErrCode == 0:
            print('[*----------[ 연결성공 ]----------*]')
        elif nErrCode == -100:
            print('********[사용자 정보교환 실패]********')
        elif nErrCode == -101:
            print('********   [서버접속 실패]   ********')
        elif nErrCode == -102:
            print('********   [버전처리 실패]   ********')

        self.result['result'] = nErrCode
        if self.event is not None:
            self.event.exit()

    def get_connect_state(self, **kwargs):
        """ 로그인 상태 확인
            OnEventConnect callback
            :param kwargs:
            :return: 0: 연결안됨, 1: 연결됨
        """
        ret = self.dynamicCall("GetConnectState()")
        # time.sleep(TR_REQ_TIME_INTERVAL)
        return ret

    # ////////////////////////////////////////////////////////////////
    # //        account info         ////////////////////////////////
    # //////////////////////////////////////////////////////////////

    def account_info(self):
        """ 계좌번호 받아서 ; 기준으로 잘라서 앞에 10자리 반환
        	접속서버 구분: 1 : 모의투자, 나머지 : 실거래서버
        	키보드 보안 해지여부: 0 : 정상, 1 : 해지
        	방화벽 설정여부: 0 : 미설정, 1 : 설정, 2 : 해지
            :return: accout:list

        """
        print('[*----------[ 연결성공 ]----------*]')
        print('[*--------[ AccountInfo ]--------*]')
        account_number = self.get_login_info('ACCNO')
        account_cnt = self.get_login_info('ACCOUNT_CNT')
        account_id = self.get_login_info('USER_ID')
        account_server = self.get_login_info('GetServerGubun')
        account_key = self.get_login_info('UKEY_BSECGB')
        account_firew = self.get_login_info('FIREW_SECGB')
        print(f"보유 계좌 개수   {account_cnt}")
        print(f"ID            	{account_id}")
        print(f"서버구분         {account_server}")
        print(f"키보드보안       {account_key}")
        print(f"방화벽          {account_firew}")
        print(account_number)
        res0 = account_number.split(';')[0]
        print('===================================')
        print(f'*     [계좌번호 : {res0}]      *')
        print('===================================')
        return res0


    def get_login_info(self, sTag):
        """ OpenAPI+에서 계좌 정보 및 로그인 사용자 정보를 가져오는 메서드 GetLoginInfo
        """
        try:
            raw = self.dynamicCall('GetLoginInfo(QString)', sTag)
            # print(ret)
            return raw
        except Exception as e:
            print(e)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    kiwoom = KiwoomAPI()
    kiwoom.comm_connect()
    kiwoom.account_info()
반응형