파이썬을 모르는 내가 파이썬을 활용하여 키움 자동 매매 시스템을 구현하는 과정을 정리하고자 한다. 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 에 대해 확인 할 수 있다.
- 먼저 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 - 관련 프로그램 설치 (개발 환경 구성)
'정보' 카테고리의 다른 글
맥북 특정 포트 사용 여부 확인 및 Kill (0) | 2022.03.21 |
---|---|
[파이썬] 주식 자동 매매 시스템 구현 #4 - 로그인 정보 가져오기 (0) | 2022.03.21 |
[파이썬] 주식 자동 매매 시스템 구현 #2 - 키움 증권 API 활용 환경 구성 (0) | 2022.03.16 |
[파이썬] 주식 자동 매매 시스템 구현 #1 - 관련 프로그램 설치 (개발 환경 구성) (0) | 2022.03.16 |
[파이썬] 주식 자동 매매 시스템 구현 (0) | 2022.03.16 |