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

키움 증권 API를 이용하여 주식 자동 매매 프로그램 개발하기 - 로그인 상태 확인, 개인정보 조회, 로그아웃 [Python]

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

 

 

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

 

저번 시간에는 단순히 계좌 번호만 가져오고 출력하는 방법을 알아보았습니다. 오늘은 현재 계정이 로그인이 되었는지 확인하고, 계좌 번호 외에 기타 개인 정보를 조회하는 기능을 만들어보겠습니다.

 

 

사용할 함수 목록

오늘은 2가지의 함수를 사용할 것입니다. 전자는 GetConnectState() 함수이고, 후자는 저번 시간에도 활용하였던 GetLoginInfo() 함수입니다.

 

 

 

 

먼저, GetConnectState() 함수는 아주 심플합니다. 인자는 없고, 단순히 리턴값으로 1 또는 0만 반환합니다. 1이면, 로그인이 되어있는 것이고, 0이면 로그아웃 상태인 것입니다.

 

 

 

 

GetLoginInf() 함수는 저번 시간에 다루었던 것이고, 인자에 따라 리턴값이 상이합니다. 여기서 주의할 점은 제가 직접 프로그램을 돌려보니까 접속서버 구분은 작동을 하지 않았습니다. 개발가이드에서는 GetServerGubun 인자가 없던데, 이 부분은 수정이 되었으면 좋겠습니다.

 

저는 이 중에서 보유계좌 수, 보유계좌 목록, 사용자 ID, 사용자 이름, 총 4개의 인자만 사용하였습니다.

 

 

메뉴 구현

위의 2가지 내용은 모두 로그인 이후에 사용이 가능하기때문에 로그인이 정상적으로 완료되었다면, 메뉴를 통해서 사용자가 선택하도록 설계하였습니다.

 

먼저, 전체 소스코드는 아래와 같습니다.

 

 

 

 

소스코드를 보시면, __init__()이나 여러 출력문 사이에 input()이 껴 있는데, 이것은 별거 없고 엔터를 치면 다음 동작을 하도록 설정한 것입니다. 가령, 로그인이 성공되었다면, 성공 메시지를 사용자에게 보여주고 바로 다음 과정을 넘어가지 않도록 막는 것이죠. (사실, 이 프로그램이 GUI로 개발되었다면, 메시지 창을 띄우는 형태일텐데 CLI라서 부득이하게 이렇게 구현하였습니다.)

 

그 외에 login_slot()에서 if문이 추가된 것이 있는데, 이것은 마지막에 설명하겠습니다. 이제, 메뉴를 구성하고 기능을 구현한 코드를 따로 살펴보겠습니다.

 

 

 

 

메뉴문을 출력하고, 사용자에게 종료할 때까지 입력받는 무한루프로 구현하였습니다. 여기서, 'os.system('cls')는 화면을 깨끗하게 지워주는 명령어이고, sys.exit(0)는 프로그램을 종료하는 코드입니다. 그리고 1이나 2를 입력받으면 각각 현재 로그인 상태를 확인하거나 개인 정보를 조회하는 코드로 넘어갑니다. 마지막으로, 1, 2, "Q", '"q"가 아닌 값이 들어오면, 그냥 무한루프를 수행하도록 하였습니다.

 

이제, 2가지 기능을 구현한 코드를 봅시다.

 

 

 

 

현재 로그인 상태를 확인하기 위해서는 GetConnectState() 함수를 사용하면 됩니다. 반환값만 있으므로 dynamicCall()만 호출하면 1 또는 0 값을 얻어낼 수 있습니다. 이를 통하여, 현재 로그인 상태를 사용자에게 알려줄 수 있습니다.

 

 

 

 

개인정보를 조회하기 위해서는 GetLoginInfo(QString) 함수를 사용해야 합니다. 이 함수를 사용하려면, 인자 하나가 필요한데, USER_NAME, USER_ID, ACCOUNT_CNT를 넘기면 됩니다. 그리고 이미 계좌 번호는 전에 구해놨으므로 바로 출력만 하면 끝입니다.

 

 

로그아웃 구현

로그인이 있다면, 로그아웃도 있는 것이 이치에 맞습니다. 하지만, KOA Studio나 키움증권 개발가이드에 따르면, 로그아웃을 수행하는 함수는 더이상 지원하지 않는다고 합니다.

 

 

 

 

이것을 사용하면, 키움api 프로그램과 통신이 종료되면서 로그아웃이 가능한데, 키움증권 측에서 어떠한 이유인지 사용을 못 하게 막아놨습니다.

 

하지만, 사용자가 키움api 프로그램을 강제 종료한다면 로그아웃이 가능합니다. 그리고 이를 예외처리해 주지 않으면 런타임 에러가 발생합니다. 기존의 있던 login_slot()의 코드를 잠시 아래와 같이 바꿔봅시다.

 

 

 

 

그리고 프로그램을 실행해서 로그인 한 다음, 키움증권 api 프로그램을 강제 종료합니다.

 

 

 

 

위의 사진에서 통신종료를 클릭하시면 됩니다.

 

 

 

 

그렇다면, 로그인에 실패하였다는 메시지와 함게 KeyError가 발생한 모습을 보실 수 있습니다. 키움증권 개발가이드에 들어가서 '-106' 에러코드가 무엇인지 봅시다.

 

 

 

 

바로, 통신연결종료를 나타내는 키값이었습니다. 이를 errCode.py에 에러코드 목록을 추가해 주셔야합니다.

 

 

 

 

그리고 login_slot()도 코드를 바꿔 줍니다.

 

 

 

 

제가 보여드린 전체 소스코드와 조금 다른데, 로그아웃되는 모습을 직접 보여드리려고 잠깐 코드를 변경하였습니다. 이대로 프로그램을 실행해 봅시다. 

 

 

 

 

적당히 로그인하시고 아까와 같은 방법으로 키움api 프로그램을 강제로 종료합니다. 그렇다면, 위와 같이 메시지가 뜨고, 아래 콘솔에도 통신연결종료라는 안내문이 출력될 것입니다. 메시지창도 확인눌러서 꺼 주시고, 콘솔도 엔터를 치면 우리가 구성한 메뉴 화면으로 넘어옵니다. 거기서 1번을 선택해서 현재 로그인 상태를 확인해 봅시다.

 

 

 

 

위와 같이 계정이 로그아웃되어있다는 사실을 알 수 있습니다. 그런데 재미있는 점은 여기서 2번을 선택해서 개인정보를 조회하면 정상적으로 데이터가 수집됩니다.

 

 

 

 

이것은 어떠한 원리로 로그아웃상태인데도 계정의 정보를 가져오는지는 잘 모르겠습니다.

 

 

이렇게, 사용자가 강제로 로그아웃을 할 수는 있지만, 사실 로그아웃을 하고 나면 할 수 있는 일이 없습니다. 그리고 다시 로그인을 하는 과정도 번거롭기때문에 저는 그냥 프로그램을 강제로 종료하도록 설계하였습니다. 또한, 로그인을 실패했으면 다시 로그인을 해야하므로 이것도 프로그램을 종료하게 만들었습니다. 더 좋은 로직이 있다면 각자 자유롭게 구현하셔도 되겠습니다.

 

 

정리

지금까지 로그인 버전 처리의 관련 함수 중 OnReceiveMsg() 함수를 제외한 모두 함수를 다뤄보았습니다. OnReceiveMsg() 함수는 화면 번호와 트랜젝션의 개념이 필요해서 나중에 사용할 것입니다. 다음 시간에는 예수금 정보를 가져오는 방법과 함께 화면 번호, 트랜젝션을 알아보겠습니다.

 

 

수정 사항 (2021-01-21)

위에서는 사용자가 강제로 로그아웃을 할 때와, 로그인 실패할 때로 2가지로 나누었지만, 프로그램 상에서 오류가 나서 터질 때 login_slot()에서 모두 작동을 하므로 굳이 이렇게 나눌 필요는 없다고 판단하였습니다. 그래서 로그인 성공을 하지 못 하였을 경우 else 부분에서 모두 에러 코드를 내뱉고 종료하도록 수정하였습니다.

 

 

 

 

물론, 에러코드를 출력하는 방식은 자유지만, 저는 이렇게 작성하기로 하였습니다.

 

 

출처

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

 

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

 

(깃허브) github.com/programgarden

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

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

댓글

추천 글