목 차
1. 들어가며
2. 사전 설명
1) 아이디/비밀번호, 계좌/비밀번호
2) 계좌 관련 정보
3) 사용할 라이브러리 4가지
3. 로그인 코드 설명
4. 전체코드
5. 마치며
1. 들어가며
지난 글에서는 라이브러리(모듈) 개념 및 활용에 대해 알아보았다. 설명이 약간 추상적일 수 있다. 코드를 짜보면서 향후 조금씩 라이브러리에 익숙해지는게 좋을 것이다.
이번 글에서는 파이썬을 통해 키움증권 자동매매에 로그인하는 방법에 대해 알아본다. 아래 경로는 과거에 필자가 자세히 적어놓은 로그인 관련 내용이다. 중복될만한 내용은 최소화하며 글을 쓸 것이다.
※ 로그인 설명 경로 : https://springcoming.tistory.com/129
2. 사전 설명
1) 아이디/비밀번호, 계좌/비밀번호
키움증권 서버 접속을 위해서는 기본적으로 아이디 및 아이디 비밀번호, 계좌 및 계좌비밀번호의 4가지가 필요하다.
- ①아이디/비밀번호는 키움증권 홈페이지에 가입했을 때의 아이디/비밀번호를 말한다.
- ②계좌/비밀번호는 키움증권에서 개설한 계좌 및 계좌비밀번호를 말한다.
위의 링크에서도 설명하였지만, 키움 해외선물은 국내주식 OpenAPI와 다르게 자동로그인이 되지 않는다. 즉, 위 4가지는 자동매매를 할 때 사용자가 직접 입력해 주어야 자동매매가 실행된다는 점을 반드시 기억하자.
2) 계좌 관련 정보
① 계좌 내 숫자는 붙여서 로그인한다.
사용자에게 보이는 키움증권 계좌번호는 1234-5678로 중간에 하이픈이 있는데, 로그인할 때는 하이픈을 없애주어야 한다.
ex) 1234-5678(x) → 12345678(o)
② 계좌 자리수
키움증권에서 개설한 계좌는 8자리이다. 예를 들어 1234-5678로 사용자에게 보일 것이다. 계좌번호를 활용하여 로그인을 할 때, 계좌 끝에 "72"를 붙여주어 10자리로 만들어주어야 한다. (이유는 잘 모르겠다.)
- (원래 보이는 계좌) 1234-5678 → 12345678
- (자동매매시 기입할 계좌) 1234-5678-72 → 1234567872
③ 실제계좌와 모의계좌의 계좌시작 숫자
실제계좌는 계좌의 시작이 5로 시작하고, 모의계좌는 7로 시작하는 8자리이다. 이 글을 쓰는 동안 필자는 모의계좌로 설명할 예정이다. ex) 7000000072
④ 실제계좌와 모의계좌의 로그인시 필요정보
- 모의계좌 로그인시 홈페이지 아이디/비밀번호, 계좌/계좌비밀번호의 4가지가 필요하다.
- 실제계화 로그인시 홈페이지 아이디/비밀번호, 계좌/계좌비밀번호, 인증서 비밀번호의 5가지가 필요하다.
3) 사용할 라이브러리 4가지
- sys : 파이썬의 변수나 함수를 관리하는 기능 (한마디로 변수/함수 실행 관련 모듈)
- PyQt5.QAxContainer : QAxContainer 내 QAxWidget를 활용하기 위해 import 하며, QAxWidget는 사용자pc에 저장(설치)된 키움증권 API의 레지스트리를 통해 키움서버에 접속하여 데이터 요청/수신받기 위해 사용된다.
- PyQt5.QtWidgets : QApplication 내에 있는 exec_() 함수를 실행히 프로그램이 종료되지 않고, 계속 실행될 수 있도록 한다.
- PyQt5.QtCore : QEventLoop의 실행되는 동안 다음 코드가 실행되는 것을 막아준다. 여기서는 로그인이 완료될 때까지 다른 함수가 실행되지 않게 해준다는 의미이다. (QEventLoop가 없으면, 로그인이 되지도 않았는데, 1분봉을 받으려다 에러가 나는 경우 등이 발생할 수 있다)
3. 로그인 코드 설명
로그인을 위한 코드는 29줄로 이루어진다.
1줄~4줄 : <사전 설명>의 3번(사용할 라이브러리 4가지)에서 기 설명하였으므로, 여기서는 설명을 생략한다.
6줄 : 임의의 클래스 btl_system을 선언하였다. 참고로 btl은 bloodless tearless로 필자가 지은것이며 피도 눈물도 없이 수익내고 싶어서... 깊은 고민없이 지었다. 원래는 bts(bloodless tearless system)으로 지으려고 했으나, 유명 아이돌 그룹이 있고 괜히 오해받을것 같아 btl로 명명하였다. 사용자 편의에 따라 마음대로 클래스 이름을 정하자. @.@
※ 클래스 관련 내용
①클래스 내에 정의된 함수를 메소드(method)라고 하는데, 딱히 필요성을 느끼지 못해서, 향후에는 메소드보다는 함수라고 설명할 것이다.
②클래스 내 함수에는 self가 들어가야 한다. 향후 클래스 내 변수가 들어가야 하는 자리에는 self를 써주고 변수를 써주도록 습관들이자. 이유는 잘 모르겠다. 그리고 딱히... 궁금하지도 않다. 중요한건 시스템이 돌아가는 것이다. -_-+
7줄 : def __init__(self)가 무엇일까? 굳이 알 필요없다. < 그림1 >의 코드를 실행할 때 ①클래스 내에서 제일 먼저 실행된다는 것과 ②변수들의 초기값을 선언한다는 2가지만 알고 있으면 된다.
※ 당부말씀 : 코딩공부를 대충 하자는 건 아니다. 다만, 지금 단계에서 어려운 내용을 굳이 이해할 필요는 없다는 것이다. 초기단계라면 어려운 내용은 일단 넘어가는 것도 좋아보인다. 나중에 시간이 되고, 실력이 어느 정도 올라오면 자연스럽게 알게될 것이다. (다만, 필자는 굳이 알고 싶지 않다. 프로그램만 돌아가면 된다)
8줄 : 이 글의 첫번째 핵심이다.
PyQt5.QAxContainer의 QAxWidget를 통해 OpenAPI 레지스터리에 접근할 수 있도록 self.kiwoom에 변수화(인스턴스)시킨다. 이 내용이 정말 중요한건, 나중에 1분봉의 시가, 고가, 저가, 종가 등을 받을 때 레지스터리를 통해 키움증권 서버에 접근/데이터 수신을 받을 때 self.kiwoom이 쓰이기 때문이다.
close_price = self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", i, "현재가")
위의 예시에서 보듯이 종가를 받기위해 self.kiwoom을 써주었다. 참고로 위 예시는 "키움api 레지스터리를 통해 1분봉의 현재가(종가)를 키움서버에 요청한다"는 내용이다.
11줄 : 이 글의 두번째 핵심이다.
① dynamicCall은 PyQt5.QAxContainer에서 제공하는 함수이며 데이터를 요청/수신해 주는 기능을 한다.
② CommConnect()은 키움api에서 제공하는 함수이며, 로그인을 요청한다. 괄호 안에 1을 넣어주면 자동로그인을 해준다.
self.kiwoom.dynamicCall("CommConnect(1)")
위 코드는 키움api 레지스터리를 통해 로그인(commconnect(1))을 키움서버에 요청(dynamiccall)한다는 의미이다.
11줄을 실행하면 아래 < 그림2-1 >가 화면에 뜬다. 모의계좌의 경우 고객id, 비밀번호(키움증권 홈페이지 비번)을 입력해주면 되고, 실제계좌이면 인증서 비빌번호까지 입력하여 "로그인"클릭한다.
12줄 : 키움증권에서 제공하는 OnEventConnect 함수(요청-수신을 연결)이다. 11줄(commconnect, 로그인 요청)이 실행되면 키움서버에 로그인 요청 이벤트가 발생한 후 18줄에서 정의한 self.login_Connect 함수가 12줄에서 실행된다. 즉 키움서버에 로그인 요청하고 이벤트를 OnEventConnect와 연결(connect)하여 데이터를 수신받는다.
13줄 : QEventLoop() 함수를 self.login_event_loop에 넣어준다.
14줄 : self.login_event_loop를 실행해준다. 로그인이 완료될 때까지 대기(loop)한다. 참고로 이벤트 28줄(exit)에서 완료된다.
16줄 : 이 글의 세번째 핵심이다.
자동매매를 위해서는 OpenAPI-W 로그인(11줄) 및 계좌의 로그인(16줄) 2가지가 필요하다. 즉 16줄은 본인의 계좌를 통해 키움서버에 접속한다는 의미이다.
self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")
위의 코드는 키움증권에서 제공하는 GetComminFunc를 통해 계좌로그인을 한다. 아래 < 그림3 >은 모의계좌이며, 하단에 계좌비밀번호 4자리를 입력-저장-닫기를 하면 로그인이 완료된다.
18줄~22줄 : 로그인을 위한 함수를 정의하였다. 수신받은 데이터가 0이면 로그인 성공이고, 1이면 로그인 실패이다.
23줄 : 로그인 데이터를 수신받으면 14줄에서 실행(exec_)한 QEventLoop를 종료(exit)한다.
25줄 : if __name__ == "__main__": 을 인터넷에 검색해보면, 굉장히 어렵게 설명되어 있다. 필자도 사실 무슨 말인지 모르겠다. 쉽게 설명하겠다. 엉터리 설명이 될 수도 있겠지만, if __name__ == "__main__": 은 그 아래의 내용을 "실행하라"는 뜻으로 볼 수 있다.
26줄 : 3줄에서 임포트(import)한 QApplication 내에 있는 exec_()를 활용하기 위해 QApplication(sys.argv)를 app에 변수화시킨다.
27줄 : 6줄에서 정의한 btl_system()를 btl 변수에 담는다. 클래스를 변수에 넣을 수 있는게 인상깊다. 변수화시키는 이유는 향후 클래스 내에 있는 개별변수를 활용하기 위해서이다. (향후 설명 예정)
28줄 : 코드가 종료되지 않도록 (계속) 실행된 상태를 유지(exec_)한다.
4. 전체코드
전체코드는 아래와 같다.
import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class btl_system():
def __init__(self):
self.kiwoom = QAxWidget("KFOPENAPI.KFOpenAPICtrl.1")
print("로그인 시작!")
self.kiwoom.dynamicCall("CommConnect(1)") # CommConnect() : 괄호 안에 자동(1)을 넣는다.
self.kiwoom.OnEventConnect.connect(self.login_Connect)
self.login_event_loop = QEventLoop()
self.login_event_loop.exec_()
self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "") # 계좌번호 입력창을 띄우는 내부함수
def login_Connect(self, err_code):
if err_code == 0:
print('로그인 성공했습니다!')
else:
print('로그인 실패했습니다!')
self.login_event_loop.exit()
if __name__ == "__main__":
app = QApplication(sys.argv)
btl = btl_system()
app.exec_()
5. 마치며
키움증권에서는 "자동로그인" 요청에 대해 보안 상의 이유로 "곤란"하다는 입장이다. 아이디/비번, 계좌/비번을 일일히 입력해주어야 하는 불편함이 있지만, 자동로그인이 불가하다는 현실은 받아들여야 할 거 같다.
라이브러리 활용, 로그인 함수 등을 통해 키움증권 해외선물의 OpenAPI-W의 로그인 하는 방법을 알아보았다. 내용이 상당히 난해하고 설명이 부족한 부분이 있는 것 같아 약간의 아쉬움은 남는다. 다만, 자동매매를 위해서는 로그인이 반드시 필요하다. 인내심을 가지고 한줄한줄 이해하면서 코드를 작성해보면 익숙해지는 날이 올 것이다.
다음 글에서는 self에 대해 알아보도록 하자.
'2. 해외선물 > 2-1. 해외선물 자동매매 연구' 카테고리의 다른 글
(키움증권 해외선물 자동매매 파이썬) 9. 1분봉 데이터 받기(opc10002) (2) | 2023.09.28 |
---|---|
(키움증권 해외선물 자동매매 파이썬) 8. tr 동작원리 (2) | 2023.09.27 |
(키움증권 해외선물 자동매매 파이썬) 7. 클래스의 변수화(인스턴스) (0) | 2023.09.15 |
(키움증권 해외선물 자동매매 파이썬) 6. self의 활용 (self.kiwoom) (0) | 2023.09.08 |
(키움증권 해외선물 자동매매 파이썬) 4. 라이브러리 개념 및 활용 (0) | 2023.09.06 |
(키움증권 해외선물 자동매매 파이썬) 3. 알고리즘 개념 및 50:50 손익 딜레마 (0) | 2023.09.05 |
(키움증권 해외선물 자동매매 파이썬) 2. pc사양 및 API 간 비교 (0) | 2023.09.04 |
(키움증권 해외선물 자동매매 파이썬) 1. 자동매매 개념 및 글의 방향 (0) | 2023.09.03 |