본문 바로가기
AyoProject/Ayotera-Trade

[AT] 04. 증권사 API 환경 구성

by 청양호박이 2020. 1. 25.

많은 증권사들이 HTS(Home Trading System)를 개발자들이 개발하여 목적에 맞게 트레이딩이 가능하게 API를 제공합니다. 그 중에서도 가장 많은 사람들이 사용한다고 생각되는 키움증권의 Open API+를 통해서 해당 프로젝트를 진행할 예정입니다.

 

우선 가장 기본적으로 해당 증권사의 계정이 있어야겠죠?? 그래야 실제 Trading에 참여하고 테스트를 할 수 있을테니까요. 모의투자도 가능하려면 결국은 가입해서 계정을 보유해야 합니다.

 

전체적인 진행은 아래와 같습니다.

 

  • 키움증권 회원 가입
  • Open API+ 설치
  • KOA Studio 설치
  • 상시 모의투자 신청하기
  • KOA Studio 사용해보기
  • Python을 통해서 OCX API로 로그인 하기

 

 

1. Open API+ 설치


회원가입은 각자의 몫으로 남기고 실제 Open API+를 설치하는 부분부터 알아보겠습니다. 우선 키움증권에 접속합니다.

https://www3.kiwoom.com/

 

키움증권-대한민국 주식시장 점유율 1위

 

www3.kiwoom.com

하단에 보면 아래와 같이 메뉴 트리가 있습니다. 여기서 트레이딩채널 -> Open API를 선택합니다.

그럼 Open API+에 대한 소개가 있고, 이것을 사용하는 방법은 자세하게 절차가 작성되어 있습니다. 우린 그냥 따라가면서 하면 됩니다.

[사용 신청하러 가기]

하단에 개인정보 수집 동의하고, 등록을 하면 끝입니다.

 

[Open API+ 모듈 다운로드 및 설치]

이건 그냥 다운받아서 설치하면 종료되는 부분입니다. 설치하고 나면 C드라이브에 OpenAPI 폴더에 핵심 OCX인 KHOpenAPI.ocx가 보이게 됩니다.

 

 

2. KOA Studio 설치


이 압축 파일을 받고 풀면... DLL과 실행파일이 있는데, OCX API를 테스트할 수 있는 개발 가이드 프로그램이라고 생각하면 됩니다. 

KOAStudioSA.exe를 실행해 보면, 

요렇게 정상적으로 뜹니다. Open API에 접속해 봅니다.

정보중에 ID와 비밀번호만 넣고 로그인을 해보면 엄청난 양의 패치가 진행됩니다. 

 

이렇게 뜨는데 확인을 누르지 마시고... 실행했던 KOAStudioSA.exe를 종료하고 확인을 누르시면 됩니다. 그렇게 정상적으로 단계를 진행하면...

요렇게 정상 알람이 뜨네용~ 그럼 확인을 누르고 KOA Studio를 다시 실행해서 로그인을 하면... 또 알림이 뜹니다. 

크으 이게 뭔가요... 

 

 

 

3. 상시 모의투자 신청하기


이제 마지막 단계 입니다. 단계 그림에서 마지막 버튼을 누르면 아래의 메뉴로 연결이 됩니다. 

여기서 참가 신청을 하면됩니다. 

친절하게 거래 비밀번호는 0000이라고 알려주고 몇가지 정보를 더 입력하면 아래과 같이 1억 가상 계좌가 생깁니다.

그럼 이제 다시 KOA Studio에 접속해볼까요?? 위와 동일하게 진행하면 정상적으로 접속이 될 것입니다.

 

 

4. KOA Studio 사용해보기


다음과 같이 하단에 TR목록 Tab을 선택하고 TR중에 가장 상단에 opt10001 : 주식기본정보요청 Transaction을 실행해 보겠습니다. 선택을 하면 속성을 넣을 수 있고 조회를 하게되면 해당하는 output이 나옵니다. '005930'을 입력하면 삼성전자에 대한 정보가 쭉 나옵니다.

 

 

5. Python을 통해서 OCX API로 로그인 하기


ActiveX Control이라고 불리는 OCX는 IE로 웹사이트를 검색하고 찾아다니다 보면 예전에는 자주... 하지만 요즘은 가끔 (어쩌면 이건 이미 많이 설치해서;;) 뭔가를 설치하라고 뜨는데... 그게 바로 이것입니다. 이게 설치가 되면 Windows Registry에 class에 등록이 되는데 각 각 고유한 ID를 가지고 있습니다 그게 CLSID(Class ID)이고 이를 알아야 호출이 가능하게 됩니다.

 

최근에는 많은 프로젝트에서 OCX를 걷어내는 방향으로 진행하지만 어쩔수 없는 경우는 그래도 사용을 합니다. Kiwoom도 이전에 말한것 처럼 OCX 방식의 API를 제공합니다. 그럼 이제는 Pyphon에서 OCX를 사용하기 위한 방법을 알아봐야겠죠??

 

일반적으로 Python에서 OCX방식의 API는 PyQt를 사용하고, COM방식은 win32com을 가용해서 구현이 가능합니다. 

PyQt가 뭐냐!! 역시 공식 사이트에 접근해봅니다.

https://pypi.org/project/PyQt5/

 

PyQt5

Python bindings for the Qt cross platform application toolkit

pypi.org

여기를 들어가니 Qt에 대한 설명이 있네요?? 그럼 Qt로 가보겠습니다.

https://www.qt.io/

 

Qt | Cross-platform software development for embedded & desktop

Qt is the faster, smarter way to create innovative devices, modern UIs & applications for multiple screens. Cross-platform software development at its best.

www.qt.io

Qt는 "One framework. One codebase. Any platform." 이라는 표어를 제시하는, GUI 개발에 많이 쓰이는 프레임워크 입니다. 그럼PyQt는Qt의Python버전입니다. 실제로 정보를 얻기 위해서는 https://doc.qt.io/ 에서 좀 얻을 수 있습니다.

 

이제 실제 Qt를 Python에 사용하기 위해서는 아래의 단계로 진행이 필요합니다.

 

  • Anaconda에 해당 패키지가 있는지 확인하고 없으면 pip install 진행필요
  • QAxWidget을 통한 OCX API 컨트롤
  • 개발가이드에 가장 첫 메서드(Method) 실행

[PyQt 패키지 설치확인]

기본적으로 Anaconda를 설치하면, 아래와 같이 base env에 pyqt version 5.9.2가 기본적으로 설치가 됩니다. Anaconda를 32비트로 설치한 분들은 그냥 사용하시면 됩니다. 혹시 64비트에 Virtual env로 32비트를 생성해서 하신다면 확인이 필요합니다.

 

기존에 만든 conda activate py37_32로 들어가서 확인해보면... 없네요... 설치를 해야겠습니다.

위에 링크를 드린 PyQt5 사이트에서 가이드하는대로... 아래와 같이 입력하여 설치합니다.

pip install PyQt5

 

 

[QAxWidget을 통한 OCX API 컨트롤]

Qt가 제공하는 AcitveX class를 사용하기 위해서는 상속관계를 다 무시하고 QAxWidget이 있습니다. 이름만 봐도 약간 느낌이 오지 않나요?? Q (Qt) + Ax (ActiveX) + Widget... ㅎㅎㅎ doc.qt.io에서 검색해보면 위에서 보는바와 같이 이는 QWidget과 QAxBase를 상속받고 있습니다.

 

이 Class는 인스턴스를 생성할때, 당연히 __init__생성자를 통해 인스턴스를 생성하며, 인자는 CLSID나 ProgID로 가능합니다. 그런데 이 식별자를 어떻게 아나요... 이건 제공자가 알려줘야 합니다. 따라서 개발자 가이드에 보면... v1.5의 12페이지에 기술되어 있습니다. 

A1574A0D-6BFA-4BD7-9020-DED88711818D

그럼 이 CLSID와 맞는 ProgID는 어디에 있을까요?? 이를 레지스터 편집기에서 검색해서 찾아보면...

값이 다음과 같음을 알 수 있습니다. 

    def __init__(self):
        self.OCXconn = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        
                             or
                             
    def __init__(self):
        self.OCXconn = QAxWidget("A1574A0D-6BFA-4BD7-9020-DED88711818D")

 

[Open API+의 메서드 사용]

QAxWidget의 부모 Class인 QAxBase에서 제공하는 dynamicCall method를 사용해서 Open API+에서 제공하는 메서드를 사용할 수 있습니다.

이 메서드는 로그인 윈도우를 실행하고, 윈도우가 잘 실행되면 0 실패는 - 를 반환한다고 합니다.

(비고의 이벤트는 다음에 처리하겠습니다.)

    def login(self):
        ret = self.OCXconn.dynamicCall("CommConnect()")
        print(ret)

 

자 그럼 거의 다 됬습니다. 이제 Widget을 시작하고 종료를 처리해 주는 QApplication class를 추가해주고 실행하면 됩니다. 전체 코드는 아래와 같습니다. 실행을 하면 로그인창이 뜨고, return은 0을 하는 것을 볼 수 있습니다.

 

import sys
from PyQt5.QAxContainer import QAxWidget
from PyQt5.QtWidgets import QApplication


class KiwoomAPI:
    def __init__(self):
        self.OCXconn = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")

    def login(self):
        ret = self.OCXconn.dynamicCall("CommConnect()")
        print(ret)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    test = KiwoomAPI()
    test.login()
    app.exec_()

코드는 간단하네요....;;ㅎㅎ

 

다음부터는 각 메서드를 좀 더 구체적으로 구현해 보겠습니다.

 

-Ayotera Lab-

 

댓글