정보

[파이썬] 주식 자동 매매 시스템 구현 #3 - 시스템트레이딩 프로젝트 생성 및 키움증권 로그인

바다♬~♪ 2022. 3. 21. 16:35

파이썬을 모르는 내가 파이썬을 활용하여 키움 자동 매매 시스템을 구현하는 과정을 정리하고자 한다. 1인칭 시점으로 이해한걸 정리하는 것으로 혹시나 잘못 이해하고 정리된 부분이 있을 수 있다.

 

1. 신규 프로젝트 생성

PyCharm에서 신규 프로젝트를 생성 후 api 폴더를 생성한다.

 

2. 통신 모듈 구성 파일 생성

생성된 api 폴더 (package) 에 키움증권과의 통신을 위한 파일 (모듈) kiwoom.py 를 생성한다.

 

3. 키움 객체 생성

  • Create Object
    • 앞서 설치 한 Kiwoom API는 Windows Registry에 'KHOPENAPI.KHOpenAPICtrl.1' 으로 등록되어 있다.
    • setControl 함수를 활용하여 객체를 생성한다. Kiwoom.setConrol("KHOPENAPI.KHOpenAPICtrl.1")
더보기

Kiwoom 클래스가 생성될 때 QAxContainer 패키지에 정의된 QAxWidget 클래스를 상속받는다.

QAxWidget 클래스는 QAxBase 클래스를 상속받는다.

setControl 함수는 QAxBase 클래스에 정의되어 있다.

 

4. 키움 로그인

 

키움 API 에 접근하기 위해서 Python 에서는 PyQt5 프레임워크를 활용한다.

키움 로그인 시 PyQt5 프레임워크의 signal / slot 개념에 대한 이해가 필요하며, 간단히 다음과 같이 로그인 프로세스에서 signal / slot 에 대해 확인 할 수 있다.

PyQt5 에서 키움 open API+ 를 활용한 키움증권 login 처리 흐름

  • 먼저 OnEventConnect 함수가 실행 될 때 _login_slot 함수가 실행되도록 연결 설정한다.
  • Python에서 키움 로그인 이벤트가 발생시킨다. 로그인 이벤트가 발생하면 키움 API에서는 OnEventConnect 함수가 실행된다. (KOA 문서 참조)
  • OnEventConnect 함수는 콜백함수로 _login_slot 함수를 실행한다.

 

4.1 이벤트 (Signal) 와 이벤트 핸들러 (Slot) 연결

KOA Studio에서 로그인 사용법에 대해 확인한다. 로그인 함수인 CommConnect() 함수를 호출하면 로그인 완료시 OnEventConnect 이벤트가 발생된다는 것을 확인할 수 있고, 그 인자값이 존재함을 알 수 있다. 

[로그인 사용법] 로그인은 CommConnect()함수를 호출합니다. 키움OpenAPI가 제공하는 로그인창이 실행됩니다. ID/Pw 입력 후 로그인완료시 OnEventConnect 이벤트가 발생됩니다. OnEventConnect 이벤트의 인자값으로 로그인 성공여부를 알수 있습니다. 이 값이 0이면 성공이고 나머지는 실패로 오류코드값을 수신합니다. CommConnect(사용자 호출) -> 로그인창 출력 -> OnEventConnect(이벤트 발생)

OnEventConnect 이벤트에 PyQt5 메쏘드인 connect 에 callback 함수를 인자로 전달하면서 OnEventConnect 의 상태 값에 따른 기능 구현을 callback 함수에 정의할 수 있다. 로그인 성공하면 "login success" 실패하면 "login failed" 를 콘솔에 출력한다.

...

class Kiwoom(QAxWidget):

...

    def comm_login(self):
        self.OnEventConnect.connect(self.login_slot)    # OnEventConnect 이벤트와 slot 을 메모리에 적재

...

    def login_slot(self, err_code):                     # OnEventConnect 함수의 return 값을 err_code로 받음
        if err_code == 0:
            print("login success")
        else:
            print("login failed")
        self.login_event_loop.exit()                    # loging event loop 종료

 

4.2 Login 실행 - Signal 발생 및 대기

위 코드에서 comm_login 함수에 이벤트와 slot 연결 이후 login 을 호출하는 구문을 넣어준다.

비동기 방식으로 인해 이벤트가 발생될 때 수신하지 못하는 문제를 해결하기 위해 미리 메모리에 적재하고 Event Loop를 사용하여 return 될 때까지 대기한다.

    def comm_login(self):
        self.OnEventConnect.connect(self.login_slot)    # OnEventConnect 이벤트와 slot 을 메모리에 적재
        self.dynamicCall("CommConnect()")               # signal 함수 호출 (login)
        self.login_event_loop = QEventLoop()            # login event loop 정의
        self.login_event_loop.exec_()                   # login event loop 실행

 

4.3 로그인 전체 코드

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


class Kiwoom(QAxWidget):        # PyQt5 패키지의 QAxContainer 모듈에 있는 QAxWidget 클래스를 상속받아 Kiwoom 클래스 객체를 정의한다.

    def __init__(self):         # Kiwoom 클래스의 생성자 : Kiwoom 클래스 객체가 생성될 때 호출되어 내부 정의된 구문 실행
        super().__init__()                  # 상속받은 QAxWidget 객체 초기화
        self.create_kiwoom_instance()       # 키움 인스턴스 생성
        self.comm_login()                   # 키움 연결 설정 / 로그인 실행

    def create_kiwoom_instance(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")    # Kiwoom Open API+를 설치하면서 registry에 등록된 값으로 Kiwoom 인스턴스 생성

    def comm_login(self):
        self.OnEventConnect.connect(self.login_slot)    # OnEventConnect 이벤트와 slot 을 메모리에 적재
        self.dynamicCall("CommConnect()")               # signal 함수 호출 (login)
        self.login_event_loop = QEventLoop()            # login event loop 정의
        self.login_event_loop.exec_()                   # login event loop 실행

    def login_slot(self, err_code):                     # OnEventConnect 함수의 return 값을 err_code로 받음
        if err_code == 0:
            print("login success")
        else:
            print("login failed")
        self.login_event_loop.exit()                    # loging event loop 종료

 

아직은 PyQt의 signal / slot 을 조금 이해하는 수준이지만 시간이 해결해 줄거라 믿는다.

 

 

2022.03.16 - [분류 전체보기] - [파이썬] 주식 자동 매매 시스템 구현 #2 - 키움 증권 API 활용 환경 구성

2022.03.16 - [분류 전체보기] - [파이썬] 주식 자동 매매 시스템 구현 #1 - 관련 프로그램 설치 (개발 환경 구성)

2022.03.16 - [정보] - [파이썬] 주식 자동 매매 시스템 구현