개발 이야기/주식 자동 매매 프로그램

키움 증권 API를 이용하여 주식 자동 매매 프로그램 개발하기 - 로그인하는 방법 [Python]

제이온 (Jayon) 2021. 1. 15.

 

 

안녕하세요? 코딩중독입니다.

 

저번 시간에는 VS CODE에서 키움증권 API 모듈을 불러오는 방법을 알아 보았습니다. 오늘은 로그인하는 방법을 설명하겠습니다.

 

 

키움증권 OpenAPI 기본 설명

키움증권 OpenAPI(Application Programing Interface)는 국내주식상품과 코스피200 지수선물/옵션, 주식선물을 거래할 수 있는 거래/분석프로그램을 개발 할 수 있는 일종의 프로그램이며 COM형태로 제공합니다. 주요 기능은 시세 데이터 조회와 실시간 데이터 제공, 주문기능, 조건검색기능(주식만 가능)을 제공하며 모두 로그인 이후 가능합니다.

 

 

키움증권 OpenAPI 통신 처리 방식

OpenAPI 함수 호출과 이벤트는 모두 비동기 방식으로 서버에 시세 조회나 주문 등을 함수 호출로 요청하면 처리 결과를 전용 이벤트를 호출해서 전달합니다. 여기서 수신 데이터를 가져오려면 반드시 이벤트 리턴 전에 적절한 데이터 획득 함수를 사용해서 얻어와야 합니다. 이벤트가 호출하기 전에 데이터 획득 함수를 사용하거나 이벤트 리턴 후에 호출하게 되면 혹은 임의로 이벤트를 호출하면 정상적인 데이터를 얻을 수 없습니다.

 

지금까지 설명한 내용을 조회 요청을 예로 들어 정리해 보겠습니다.

 

기능 요청(조회 함수 CommRqData, CommKwRqData 호출)  ---> 이벤트 호출(OnReceiveTRData) ---> 데이터 획득 (GetCommData함수) 

 

먼저, '기능 요청'은 시그널에 해당하는 것으로, 우리가 증권 서버에 요청하는 함수라고 생각하시면 됩니다. 시그널 함수를 호출한 뒤, 전용 이벤트를 호출해서 처리 결과를 전달하는데, 이 이벤트가 끝나기 전에 데이터 획득 함수(슬롯)으로 처리 결과를 받아옵니다. 저는 데이터 획득 함수 대신에 슬롯이라는 표현을 사용할 것입니다.

 

그리고 개발 가이드에 의하면, 이벤트는 일반 함수와 구별하기 위하여 이름 앞에 'On'을 붙였다고하니, 이를 바탕으로 이벤트인지 일반 함수인지 구분할 수 있겠습니다.

 

 

로그인에 필요한 함수

이제, 로그인을 하기 위해서는 어떠한 함수가 쓰이는지 살펴봅시다. 먼저, KOA Studio를 실행한 다음 [개발 가이드] - [로그인 버전처리]로 들어갑니다. 기본 설명은 가볍게 읽어보시고, 관련 함수를 눌러줍시다.

 

 

 

 

위와 같은 함수가 보이는데, 이번 시간에는 "CommConnect()"와 "OnEventrConnect(long nErrCode)" 함수만 사용할 것입니다. 그리고 KOA Studio보다는 공식 개발가이드가 각 함수의 역할을 잘 설명해주므로 2가지 함수의 설명을 자세히 봅시다.

 

 

 

 

이것은 시그널 함수이며, 이를 호출할 시 "OnEventConnect()" 이벤트를 발생시키는 것을 알 수 있습니다. 그리고 설명에서 로그인 윈도우를 실행한다고 되어있는데, KOA Studio에서 로그인을 할 때 그 창이 실행되는 것입니다.

 

 

 

 

서버 접속 관련 이벤트로, CommConnect() 시그널 함수에 의하여 호출이 됩니다. 인자로는 nErrCode를 요구하는데, 이것이 우리가 따로 만들어서 제공해야하는 슬롯입니다. OnEventConnect의 인자로 슬롯을 넘기면, 이벤트가 끝나기 전에 슬롯에게 데이터를 넘겨주는 것이죠. 여기서는 슬롯에 nErrcode의 값이 0이면 로그인 성공이고, 음수면 실패라고 합니다. 또한, 음수인 경우 에러 코드를 참조하라고하였는데, KOA Studio에 나와 있는 에러코드를 확인한다음 공식 가이드를 보면 됩니다.

 

 

 

 

KOA Studio의 OnEventConnect() 설명을 보면, 에러코드가 나와있습니다.

 

 

 

 

이를 바탕으로 공식 개발가이드의 에러코드표를 보면, 위와 같이 리턴 코드와 설명이 있는 것을 알 수 있습니다. 이들을 딕셔너리로 표현하면 됩니다.

 

 

로그인 구현

지금까지의 개념을 익혔다면, 구현은 쉽게 할 수 있습니다. 먼저, 전체 코드를 보겠습니다.

 

 

 

 

__init__()에서 추가된 것은 self.login_event_loop와 login() 밖에 없습니다. 저번 시간에는 메인 함수에서 이벤트 루프를 수행하였는데, 이것은 프로그램이 종료되지 않기 위한 큰 틀의 이벤트 루프였고, 이 이벤트 루프 안에서 동작하는 각 기능을 구현하면서도 중간 중간 또 다른 이벤트 루프를 생성해서 데이터의 간섭을 막아야 합니다. 가령, 로그인을 하고 있는데, 그 다음 코드가 실행되면 안 되겠죠?

 

이번에는 QEventLoop를 사용하였는데, PyQt5.Core 모듈이 있어야 동작이 가능합니다. _exec()를 통하여 이벤트 루프를 실행하고, exit()를 이용하여 이벤트 루프를 종료할 수 있습니다.

 

 

다음으로, 중요한 login() 함수입니다.

 

 

 

 

앞서 말했듯이, CommConnect() 시그널 함수를 호출하여 OnEventConnect() 이벤트를 발생시킨 다음, 요청 결과를 슬롯으로 받아와서 로그인이 성공했는지 실패했는지 판단합니다.

 

여기서 중요한 메소드 2가지가 쓰입니다. 전자는 connect()이고, 후자는 dynamicCall()입니다.

 

connect()는 PyQt 문법으로 이벤트.connect(슬롯) 형태로 사용하여 이벤트와 슬롯을 연결하는 역할을 합니다. dynamicCall()도 PyQt5에서 제공하는 함수로, 서버에 데이터를 송수신해주는 기능을 담당합니다. 이를 이용하여 서버에 로그인을 요청할 수 있습니다.

 

 

여기서 한 가지 의문이 있습니다. 분명 위에서 통신 처리 방식을 설명할 때, 시그널 함수를 호출하고 그것에 맞는 이벤트 함수를 호출하여 슬롯으로 요청 결과를 받아온다고 하였습니다. 그렇다면, 소스코드도 dynamicCall() 함수로 시그널 함수를 호출하고, 이벤트와 슬롯을 연결하는 것이 순서에 맞는 것처럼 보입니다.

 

하지만, 이것은 한 가지 문제가 있습니다. 운좋게, 로그인을 요청하고 개발자 서버로부터 로그인 결과가 우리한테 도착하기 전에 이벤트와 슬롯이 연결되어 OnEventConnect() 이벤트가 실행된다면 괜찮습니다. 하지만, 로그인 결과가 우리한테 도착하였는데 이벤트와 슬롯이 아직 연결되지 않았다면, 요청 결과를 받을 수가 없습니다. 따라서, 안전하게 메모리에 이벤트와 슬롯을 연결한 다음, 시그널 함수를 호출함으로써 이벤트를 정상적으로 발생시키는 것입니다.

 

그리고 시그널 함수를 호출한다음, 다른 데이터의 간섭을 막기 위하여 이벤트를 루프를 수행합니다.

 

 

시그널 함수와 이벤트 함수는 이미 만들어진 함수로서 API에서 제공하기때문에 우리는 슬롯만 만들어서 요청 결과를 받아오면 됩니다. 저는 로그인 슬롯의 이름을 login_slot라고 지었고, OnEventConnect()의 요청 결과를 어떻게 이용하였는지 보겠습니다.

 

 

 

 

OnEnventConnect()의 요청 결과로, 0 또는 음수의 err_code를 받아왔습니다. 그렇다면, 사용자에게 로그인의 성공 여부를 알려주기 위하여 간단한 print문을 작성하면 됩니다. 이때, errors()는 제가 에러코드표를 정리한 함수입니다. 이를 모듈에 추가하여 사용하시면 됩니다. 저는 config 디렉토리 안에 errCode.py를 생성하였습니다.

 

 

 

 

앞으로 기능을 구현하면서 다양한 에러 코드를 추가하게 될 것입니다.

 

 

이제, 한 번 실행해 볼까요?

 

 

 

 

이렇게 로그인 창이 뜨고, 로그인을 그대로 하시면 됩니다.

 

 

 

 

다음과 같이 출력되고, 프로그램이 종료되지 않는다면 올바르게 코드를 작성하신 겁니다.

 

 

정리

시그널, 이벤트, 슬롯은 앞으로 쭈우우욱 사용될 개념입니다. 어렵더라도, 이번 기회에 확실히 익히시고 로그인 과정을 이해하시면 좋겠습니다.

 

 

출처

프로그램 동산(장용준)님이 집필하신 '손가락 하나 까딱하지 않는 주식 거래 시스템 구축' 교재를 참고하여 작성하였습니다.

 

그 외에 프로그램 동산님은 깃허브, 카페, 유튜브를 운영 중이십니다. 굉장히 도움이 되는 내용이 많으니 참고하셔도 좋을 것 같습니다.

 

(깃허브) github.com/programgarden

(유튜브) www.youtube.com/channel/UCq7fsrxP6oi6vnYgPkw92jg

(네이버 카페) cafe.naver.com/programgarden

댓글

추천 글