10강에 설명드린 2개의 함수를 이용하여 키움 로그인을 진행해 보겠습니다. 그리고 로그인 결과는 GUI예 전시하며, 관련 코드는 글 마지막에 공개해 드리니 참조하시기 바랍니다.(9강에 이전 코드들이 있습니다.)
[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.
1. 키움 로그인
10강에서 기본 개념은 말씀드렸으며, CommConnect()를 이용해 로그인 명령을 전송하고 OnEventConnect()를 통해 명령 정보처리 결과를 받아오겠습니다.
(1) QEventLoop를사용하기 위해 form PyQt5.QtCore import *를 사용하여 PyQt5.QtCore의 모든 함수를 가져옵니다.
(2) QEventLoop 클래스를 self.login_event_loop에 인스턴스화 하기
- QEventLoop는 키움 서버에서 특정 명령이 완전히 완료될 때까지 다음 코드들이 실행되는 것을 막아 다양한 오류를 막아주는 함수입니다. 이를 self.login_event_loop라는 객체에 인스턴스화 하면서 앞으로 self.login_event_loop만 사용하면 QEventLoop를 사용할 수 있게 하였습니다.
(3) 키움 서버에서 보내온 정보처리 결과를 받을 장소를 미리 만들어 놓습니다.
- self.set_signal_slot() 이라고 정의된 함수를 실행합니다.
- 위의 함수를 실행하면 self.k.kiwoom.OnEventConnect.connect(self.login_slot) 이라는 명령어가 실행되는데 이때 가장 중요시 보셔야 될게 self.k의 존재입니다. 10강에서 말씀드린 바와 같이 self.k는 kiwoom 스크립트의 기능을 사용하기 위한 객체입니다. 다음으로 kiwoom.OnEventConnect.connect()는 kiwoom.OnEventConnect을 이용해 키움 서버로부터 전달된 정보를 () 안에 넣겠다는 뜻입니다. 우리는 () 안에 self.login_slot을 정의하였습니다.
- 키움 서버로 부터 전달 될 되는 정보는 0, 100, 101, 102가 있으며, login_slot에서 각 코드가 전달되었을 때 특정 명령어가 작동하도록 if 구문을 사용하여 정리하였습니다. 만약 0이라는 정보가 전달되면 로그인 성공 메시지를 GUI 하단에 전시되도록 아래와 같이 코딩했습니다.
if errCode == 0: (만약 errCode가 0이라면)
print("로그인 성공") (로그인 성공이라는 메세지를 commend 창에 전시해라)
self.statusbar.showMessage("로그인 성공") (그리고 GUI 하딴예 로그인 성공이라는 메시지를 전시해라)
- 위의 과정이 완료 되면 self.login_event_loop.exit() 함수를 사용하여 다음 코드가 실행될 수 있도록 합니다.
위의 과정을 거치면 우리는 명령어를 받을 준비가 완료된 것입니다.
(4) 키움 서버에 명령을 로그인 관련 명령어를 전송합니다.
- self.signal_login_commConnect()라고 정의된 함수를 실행합니다.
- self.k.kiwoom.dynamicCall이라는 함수를 사용하여 키움 네트워크에 CommConnect()하라고 즉, 로그인하라고 메시지를 전달합니다.
- 그리고 전달된 명령이 완료될 때까지 다음 코드가 실행되는 것을 막기 위해 self.login_event_loop.exec() 함수를 실행합니다.
2. 키움 로그인 최종 GUI 전시 화면 확인
위의 코드를 그대로 실행시키면, 아래와 같은 GUI 결과가 출력됩니다.
위의 화면이 뜨지 않으시는 분들은 언제든 질문해 주십시요. 감사합니다.
3. 최종 코드 : 9강에서 적어드린 kiwoom.py는 동일합니다.
import sys # system specific parameters and functions : 파이썬 스크립트 관리
from PyQt5.QtWidgets import * # GUI의 그래픽적 요소를 제어 하단의 terminal 선택, activate py37_32, pip install pyqt5, 전부다 y
from PyQt5 import uic # ui 파일을 가져오기위한 함수
from PyQt5.QtCore import * # eventloop/스레드를 사용 할 수 있는 함수 가져옴.
################# 부가 기능 수행(일꾼) #####################################
from kiwoom import Kiwoom # 키움증권 함수/공용 방 (싱글턴)
#=================== 프로그램 실행 프로그램 =========================#
form_class = uic.loadUiType("ALBA.ui")[0] # 만들어 놓은 ui 불러오기
class Login_Machnine(QMainWindow, QWidget, form_class): # QMainWindow : PyQt5에서 윈도우 생성시 필요한 함수
def __init__(self, *args, **kwargs): # Main class의 self를 초기화 한다.
print("Login Machine 실행합니다.")
super(Login_Machnine, self).__init__(*args, **kwargs)
form_class.__init__(self) # 상속 받은 from_class를 실행하기 위한 초기값(초기화)
self.setUI() # UI 초기값 셋업 반드시 필요
#### 기타 함수
self.login_event_loop = QEventLoop() # 이때 QEventLoop()는 block 기능을 가지고 있다.
####키움증권 로그인 하기
self.k = Kiwoom() # Kiwoom()을 실행하며 상속 받는다. Kiwoom()은 전지적인 아이다.
self.set_signal_slot() # 키움로그인을 위한 명령어 전송 시 받는 공간을 미리 생성한다.
self.signal_login_commConnect()
def setUI(self):
self.setupUi(self) # UI 초기값 셋업
def set_signal_slot(self):
self.k.kiwoom.OnEventConnect.connect(self.login_slot) # 내가 알고 있는 login_slot에다가 특정 값을 던져 준다.
def signal_login_commConnect(self):
self.k.kiwoom.dynamicCall("CommConnect()") # 네트워크적 서버 응용프로그램에 데이터를 전송할 수 있게 만든 함수
self.login_event_loop.exec_() # 로그인이 완료될 때까지 계속 반복됨. 꺼지지 않음.
def login_slot(self, errCode):
if errCode == 0:
print("로그인 성공")
self.statusbar.showMessage("로그인 성공")
elif errCode == 100:
print("사용자 정보교환 실패")
elif errCode == 101:
print("서버접속 실패")
elif errCode == 102:
print("버전처리 실패")
self.login_event_loop.exit() # 로그인이 완료되면 로그인 창을 닫는다.
if __name__=='__main__': # import된 것들을 실행시키지 않고 __main__에서 실행하는 것만 실행 시킨다.
# 즉 import된 다른 함수의 코드를 이 화면에서 실행시키지 않겠다는 의미이다.
app = QApplication(sys.argv) # PyQt5로 실행할 파일명을 자동으로 설정, PyQt5에서 자동으로 프로그램 실행
CH = Login_Machnine() # Main 클래스 myApp으로 인스턴스화
CH.show() # myApp에 있는 ui를 실행한다.
app.exec_() # 이벤트 루프
'주식 자동매매 강의 > 기초반(모든 코딩의 뿌리)' 카테고리의 다른 글
주식자동매매 13강. 계좌평가잔고내역요청(1), KOA Studio 사용 (1) | 2022.05.01 |
---|---|
주식자동매매 12강. 로그인시 계좌번호 GUI에 전시하기 (11) | 2022.04.29 |
주식자동매매 10강. 키움 증권 로그인 전 기본기 쌓기 (0) | 2022.04.27 |
주식자동매매 9강. 1~8강 복습 및 정리(초심자 용, 최종 코드) (4) | 2022.04.26 |
주식자동매매 8강. 키움 로그인 문제 해결하기(싱글턴, singleton) (35) | 2022.04.26 |