키움증권 OpenAPI 자동매매 프로그램: 로그인 과정 설명
키움증권의 OpenAPI는 자동매매 프로그램을 개발할 때 필수적인 도구입니다. 이 글에서는 PyQt5를 사용해 키움 OpenAPI로 로그인 요청을 하고 로그인 성공 여부를 처리하는 간단한 코드 흐름을 설명합니다.
1. Kiwoom 클래스 설정
키움 OpenAPI를 사용하려면 먼저 QAxWidget을 상속받아 키움 API와 상호작용할 수 있는 클래스가 필요합니다. 이 클래스에서 OpenAPI와 연동하고 로그인 요청을 보냅니다.
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
class Kiwoom(QAxWidget):
def __init__(self):
super().__init__()
self._make_kiwoom_instance()
self._set_signal_slots()
self._comm_connect()
def _make_kiwoom_instance(self):
self.setControl("KHOPENAPI.KHOpenAPICtrl.1")
def _set_signal_slots(self):
self.OnEventConnect.connect(self._login_slot)
def _login_slot(self, err_code):
if err_code == 0:
print("connected")
else:
print("not connected")
self.login_event_loop.exit()
def _comm_connect(self):
self.dynamicCall("CommConnect")
self.login_event_loop = QEventLoop()
self.login_event_loop.exec_()
2. 키움 API와 연결
먼저, 키움증권의 OpenAPI를 사용할 수 있도록 API 인스턴스를 설정합니다. 이 과정은 setControl 메서드를 이용해 OpenAPI 컨트롤러를 설정하는 단계입니다.
def _make_kiwoom_instance(self):
self.setControl("KHOPENAPI.KHOpenAPICtrl.1")
이 부분은 키움 OpenAPI와 연결을 위한 필수 설정으로, OpenAPI와 상호작용할 수 있게 해줍니다.
3. 신호(Signal)와 슬롯(Slot) 연결
PyQt5에서는 특정 이벤트가 발생할 때 이를 처리하기 위해 신호와 슬롯을 연결하는 방식으로 동작합니다. 로그인 결과를 처리하기 위한 이벤트는 OnEventConnect로 설정합니다.
def _set_signal_slots(self):
self.OnEventConnect.connect(self._login_slot)
OnEventConnect는 로그인 과정에서 발생하는 이벤트를 의미하며, 로그인 성공 여부는 이 신호에 연결된 슬롯 함수에서 처리됩니다.
4. 로그인 성공 여부 처리
로그인 요청이 완료되면 err_code 값이 반환됩니다. 이 값을 통해 로그인 성공 여부를 확인할 수 있습니다. err_code가 0이면 성공, 그렇지 않으면 실패를 의미합니다.
def _login_slot(self, err_code):
if err_code == 0:
print("connected")
else:
print("not connected")
self.login_event_loop.exit()
로그인 성공 시 "connected", 실패 시 "not connected"라는 메시지가 출력됩니다. 그리고 이벤트 루프를 종료하여 로그인 프로세스를 끝냅니다.
5. 로그인 요청
로그인 요청은 dynamicCall("CommConnect") 메서드를 사용해 호출됩니다. 로그인 창이 뜨고 사용자가 직접 로그인 정보를 입력하는 방식입니다. 이후 로그인 결과에 따라 연결된 슬롯 함수가 호출됩니다.
def _comm_connect(self):
self.dynamicCall("CommConnect")
self.login_event_loop = QEventLoop()
self.login_event_loop.exec_()
- dynamicCall("CommConnect"): 키움증권의 OpenAPI에서 제공하는 로그인 창을 띄워 로그인을 시도합니다.
- QEventLoop: 로그인 절차가 끝날 때까지 프로그램이 멈추지 않도록 이벤트 루프를 사용하여 대기합니다.
6. 실행결과
이 코드를 실행하기 위해서는 main.py파일에 실행코드를 작성해야 합니다.
from api.Kiwoom import *
import sys
# 키움증권 API에 로그인 요청
app = QApplication(sys.argv)
kiwoom = Kiwoom()
app.exec_()
이 코드를 실행하면 다음과 같이 KiwoomAPI에 연동후 connected가 출력되는것을 알 수 있습니다.
로그인 절차 흐름
- API 인스턴스 생성: setControl로 키움 OpenAPI를 연결합니다.
- 신호와 슬롯 설정: 로그인 이벤트 발생 시 이를 처리할 슬롯을 설정합니다.
- 로그인 요청: dynamicCall("CommConnect")로 로그인 창을 띄웁니다.
- 로그인 성공 여부 처리: err_code로 로그인 성공 또는 실패 여부를 확인하고 이벤트 루프를 종료합니다.
결론
이 글에서는 키움증권 OpenAPI를 활용한 자동매매 프로그램에서 로그인 요청 후 로그인 처리를 다루었습니다. 프로그램이 시작될 때 OpenAPI 인스턴스를 생성하고, 로그인 요청을 보내며, 로그인 성공 여부를 확인한 후 이후 작업을 진행하는 구조로 설계되었습니다.