4. [키움 openAPI] 종목코드, 기업명 받아오기

2020. 12. 9. 21:49AI트레이딩/키움API

728x90
반응형

로그인 이후 사용 할 수 있다

3. GetMasterCodeName

종목코드로 한글 기업명을 반환한다.


4. GetCodeListByMarket

종목 코드를 6자리 숫자로 반환해 준다. 


  • 주식 시장별 종목코드 리스트를 ';'로 구분해서 전달. 
  • 시장구분값을 ""공백으로하면 전체시장 코드리스트를 전달
  •  [시장구분값]
     0 : 코스피
     10 : 코스닥
     3 : ELW
     8 : ETF
     50 : KONEX
     4 :  뮤추얼펀드
     5 : 신주인수권
     6 : 리츠
     9 : 하이얼펀드
     30 : K-OTC

코드 설명

 

  • class OpenAPI(QAxWidget):
    OpenAPI class의 instance가 QAxWidget class가 제공하는 method를 호출할 수 있게 된다.

 

  • setControl('KHOPENAPI.KHOpenAPICtrl.1')
    COM 오브젝트를 생성하려면 setControl method를 사용하여 ProgID인 "KHOPENAPI.KHOpenAPICtrl.1"를 전달해 준다

 

  • def comm_connect(self):
    self.dynamicCall('CommConnect()')
    OpenAPI class에서 로그인을 위해 comm_connect라는 method를 구현.
    해당 method에서는 CommConnect()를 dynamicCall function을 통해 호출 한다.

 

  • comm_connect 호출시 키움증권 로그인 창 -> 로그인 정보입력 -> 로그인정보 전송-> OnEventConnect 이벤트를 발생

 

  • exec_
    method를 호출해 이벤트 루프를 생성
    키움증권 서버로부터 OnEventConnect 이벤트가 발생할 때까지 종료하지 않은 상태로 남아 있는다

 

  • set_signal_slots
    키움증권 서버로부터 발생한 이벤트와 이를 처리할 메서드를 연결하기 위해 _set_signal_slots 메서드를 추가한다.
    이벤트 루프는 객체를 생성한 후 exec_ method를 호출하는 순간 생성

 

로그인 창이 나타나 사용자가 비밀번호를 입력해 정상적으로 로그인이 될 때까지 더는 파이썬 코드는 실행되지 않고 대기한다. 이것은 comm_connect method에서 QEventLoop 클래스를 통해 이벤트 루프를 생성했기 때문이다.

 

 

 

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

# get code & name from kiwoom API
TR_REQ_TIME = 0.2


class KiwoomAPI(QAxWidget):

    def __init__(self):
        print(f'openapi __name__:{__name__}')
        super().__init__()
        self._create_kiwoom_api_instance()
        self._set_signal_slots()

    # ////////////////////////////////////////////////////////////////
    # //           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)
            print('_set_signal_slots')

        except Exception as e:
            ana_64bit = sys.maxsize > 2 ** 32
            if ana_64bit:
                print('******[Anaconda 64-bit]******* 32-bit 환경 필요')
            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.event.exit()

    # ////////////////////////////////////////////////////////////////
    # //      Stock Code & Name      ////////////////////////////////
    # //////////////////////////////////////////////////////////////
    def get_code_list_by_market(self, market):
        code_list = self.dynamicCall('GetCodeListByMarket(QString)', market)
        code_list = code_list.split(';')
        return code_list[:-1]

    def get_name_by_code(self, code):
        name_list = self.dynamicCall("GetMasterCodeName(QString)", code)
        return name_list

if __name__ == '__main__':
    app = QApplication(sys.argv)
    kiwoomapi = KiwoomAPI()
    kiwoomapi.comm_connect()

    # login 후 사용가능
    code_list = kiwoomapi.get_code_list_by_market('0')

    codelist = []
    namelist = []
    for code in code_list:
        codelist.append(code)
        namelist.append(kiwoomapi.get_name_by_code(code))
    df = pd.DataFrame({'code': codelist, 'name': namelist})
    print(df)
반응형