주식자동매매 25강. 계좌 관리하기(2), GUI 및 스크립트 만들기
본문 바로가기

주식 자동매매 강의/기초반(모든 코딩의 뿌리)

주식자동매매 25강. 계좌 관리하기(2), GUI 및 스크립트 만들기

반응형

24강에서 설명드린 개념을 바탕으로 계좌 관리를 위한 GUI 생성과 일꾼(Thread)을 구성하겠습니다. GUI 구성 방법과 코드 제작방법이 포함되어 있으니 잘 따라오시기 바랍니다. 잘 모르겠으면 요약의 코드만 복사 붙여 넣기 하세요.

 

[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.

 

참고로 유투브 강의도 이제 진행하고 있습니다. 이해하기 어려우시면 유튜브 강의와 블로그를 같이 시청하시기 바랍니다.

 

1. GUI 생성

 (1) 명령을 내릴 수 있는 push button 생성

  - QT Designer를 띄우셔서 저번에 만들었던 계좌평가잔고내역요청 옆에서 작업을 시작하겠습니다.

  - Push Button을 생성하시고 이름은 계좌 관리, object Name은 acc_manage라고 저는 정의 하였습니다.

GUI Push 버튼 생성 화면
GUI Push 버튼 생성 화면

 (2) 명령의 결과 데이터를 받을 수 있는 Table Widget 생성

  - Table Widget을 생성하고 object Name은 stocklistTableWidget_3이라 정의하겠습니다.

GUI Table Widget 생성 화면
GUI Table Widget 생성 화면

2. 코드 생성

  (1) 계좌 관리 일꾼(스레드) 만들기

    - File -> New -> Python File -> Qthread_2 라 생성해주세요

 

스레드 스크립트 만들기 1스레드 스크립트 만들기2
스레드 스크립트 만들기

 

    - Qthread_2의 초기 구성은 아래와 같습니다. (7강 참조)

      ◈ from PyQt5.QtCore import * : PyQt5.QtCore로 부터의 모든 함수(*)를 다 사용하겠다는 의미이며, 이벤트루프와 스레드 함수를 사용하기 위해서는 반드시 필요한 문구입니다.

      ◈ from kiwoom import Kiwoom : 절대 언어 kiwoom에서 Kiwoom 클래스를 사용하기 위한 문구입니다.

      ◈ 기타 파이썬 사용 함수 설명을 생략하겠습니다.

      ◈ class Thread2(QThread) : Thread2라는 클래스를 생성하고 스레드 기능을 할 수 있게 QThread를 상속시킵니다.

      ◈ def __init__(self, parent)... : 부모 GUI를 사용하기 위한 설명입니다. (자세한 설명은 15강 참조)

      ◈ self.k = Kiwoom() : Kiwoom 클래스를 self.k에 상속시킵니다. Kiwoom 클래스는 절대 언어로 교환 역할을 하며, 키움 서버에 명령을 하기 위해서는 반드시 필요한 클래스입니다.

Qthread_2 구성
Qthread_2 구성

  (2) 계좌관리 스레드(Qthread_2) 기능받아오기 : Qthread_2 스크립트의 Thread2 클래스 기능을 가져옵니다.

계좌 관리 스레드 가져오기
계좌 관리 스레드 가져오기

  (3) acc_manage를 클릭하였을 때 가동하는 함수를 정의합니다.

   - self. acc_manage.clicked : self.acc_manage를 클릭하였을 때

   - connect(self.a_manage) : a_manage함수를 연결해라

계좌관리 스레드 작동 이벤트
계좌관리 스레드 작동 이벤트

  (3) a_manage 함수 정의

   - def a_manage(self) : a_manage 함수를 만듦

   - h2 = Thread2(self) : 앞서 정의한 Thread2 클래스를 h2에 상속시킵니다.

   - h2.start() : h2 객체를 실행합니다. 즉, Thread2가 작동됩니다.

 

a_manage 함수 정의
a_manage 함수 정의

3. 요약

반응형

  (1) GUI를 생성하였습니다.

  (2)계좌 관리하는 Thread2 클래스를 만들었습니다.

from PyQt5.QtCore import *           # eventloop/스레드를 사용 할 수 있는 함수 가져옴.
from kiwoom import Kiwoom            # 로그인을 위한 클래스
from PyQt5.QtWidgets import *        # PyQt import
from PyQt5.QtTest import *           # 시간관련 함수
from datetime import datetime, timedelta    # 특정 일자를 조회


class Thread2(QThread):
    def __init__(self, parent):     # 부모의 윈도우 창을 가져올 수 있다.
        super().__init__(parent)    # 부모의 윈도우 창을 초기화 한다.
        self.parent = parent        # 부모의 윈도우를 사용하기 위한 조건

        ################## 키움서버 함수를 사용하기 위해서 kiwoom의 능력을 상속 받는다.
        self.k = Kiwoom()

  (3) main 스크립트에서 Thread2 클래스를 사용하기 위한 기초 작업을 하였습니다.

  (4) GUI에서 만든 push button이 클릭되었을 때 Thread2가 작동하는 코드를 main 스크립트에 추가하였습니다.


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          # 키움증권 함수/공용 방 (싱글턴)
from Qthread_1 import Thread1      # 계좌평가잔고내역 가져오기
from Qthread_2 import Thread2      # 계좌 관리

#=================== 프로그램 실행 프로그램 =========================#

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.label_11.setText(str("총매입금액"))
        self.label_12.setText(str("총평가금액"))
        self.label_13.setText(str("추정예탁자산"))
        self.label_14.setText(str("총평가손익금액"))
        self.label_15.setText(str("총수익률(%)"))


        #### 기타 함수
        self.login_event_loop = QEventLoop()  # 이때 QEventLoop()는 block 기능을 가지고 있다.

        ####키움증권 로그인 하기
        self.k = Kiwoom()                     # Kiwoom()을 실행하며 상속 받는다. Kiwoom()은 전지적인 아이다.
        self.set_signal_slot()                # 키움로그인을 위한 명령어 전송 시 받는 공간을 미리 생성한다.
        self.signal_login_commConnect()

        #####이벤트 생성 및 진행
        self.call_account.clicked.connect(self.c_acc)         # 계좌정보가져오기
        self.acc_manage.clicked.connect(self.a_manage)         # 계좌정보가져오기


    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("로그인 성공")
            self.get_account_info()                    # 로그인시 계좌정보 가져오기

        elif errCode == 100:
            print("사용자 정보교환 실패")
        elif errCode == 101:
            print("서버접속 실패")
        elif errCode == 102:
            print("버전처리 실패")
        self.login_event_loop.exit()  # 로그인이 완료되면 로그인 창을 닫는다.

    def get_account_info(self):
        account_list = self.k.kiwoom.dynamicCall("GetLoginInfo(String)", "ACCNO")

        for n in account_list.split(';'):
            self.accComboBox.addItem(n)

    def c_acc(self):
        print("선택 계좌 정보 가져오기")
        ##### 1번 일꾼 실행
        h1 = Thread1(self)
        h1.start()

    def a_manage(self):
        print("계좌 관리")
        h2 = Thread2(self)
        h2.start()


if __name__=='__main__':             # import된 것들을 실행시키지 않고 __main__에서 실행하는 것만 실행 시킨다.
                                     # 즉 import된 다른 함수의 코드를 이 화면에서 실행시키지 않겠다는 의미이다.

    app = QApplication(sys.argv)     # PyQt5로 실행할 파일명을 자동으로 설정, PyQt5에서 자동으로 프로그램 실행
    CH = Login_Machnine()            # Main 클래스 myApp으로 인스턴스화
    CH.show()                        # myApp에 있는 ui를 실행한다.
    app.exec_()                      # 이벤트 루프

반응형

.link_tit