1 minute read

Qthread_10.py 구현

Qthread_10.py 코드에서는 사용자가 지정한 시간마다 조건식에 해당되는 종목을 받아오는 부분을 구현한다.

Qthread_8.py에서 구현했던 종목 수동 검색은 사용자가 직접 버튼을 눌러야 종목들이 검색되고 등록되는데 이를 자동으로 특정 시간마다 수행하게 만든다.

코드는 Qthread_8.py와 유사하며 설정한 시간마다 자동으로 검색되도록 코드를 만들어주면 된다.

Qthread_10 - init() 생성


from PyQt5.QtCore import *

from PyQt5.QtWidgets import *

from kiwoom import Kiwoom



import threading



class Thread10(QThread) :

    def __init__(self, parent) :

        super().__init__(parent)

        self.parent = parent

        

        self.k = Kiwoom()

        

        self.detail_account_info_event_loop = QEventLoop()

        

        ### 부가기능 1 : 키움서버에 저장된 종목 받아오는 함수

        self.k.kiwoom.OnReceiveTrCondition.connect(self.OnReceiveTrCondition)

        ###

        

        ### 부가기능 2 : 키움조건식 일련번호를 요청하는 부분

        self.delay = int(self.parent.search_minute.value())

        ###

        

        for code in self.k.acc_portfolio.keys() :

            self.k.portfolio_stock_dict.update({code : {}})

            

        self.stock()

전체적인 흐름은 유사하고 stock 메서드로 자동 검색 기능을 구현한다.


조건식으로 종목 받아오기


def OnReceiveTrCondition(self, scrno, codelist, code_name, code_number, sPrevNext) :

    self.k.code_list = []

    

    code = codelist.split(';')

    

    for data in code :

        try :

            self.k.code_list.append(data)

        except IndexError :

            pass

    

    if sPrevNext == "2" :

        self.request_stock(sPrevNext="2")       # 다음 페이지 존재 시 전부 검색

    else :

        self.detail_account_info_event_loop.exit()

조건식에 해당하는 종목 요청


def request_stock(self) :

    code_name = self.parent.kiwoom_list.currentText()

    

    k = 0

    

    for name in self.k.condition_list['Name'] :

        if code_name == name :

            break

        k += 1

        

    code_number = self.k.condition_list['index'][k]

    result = self.k.kiwoom.dynamicCall("SendCondition(QString, QString, int, int)", "0150", str(code_name), str(code_number), 0)        # 조건식 요청하기



    if result == 1:

        print("조건검색 종목 받기 성공")

    else :

        print("조건검색 종목 받기 실패")

        

    self.detail_account_info_event_loop.exec_()


종목 UI에 전시


def searchItem2(self) :

    self.new_code = self.k.code_list

    self.itemName = []

    

    for code1 in self.new_code :

        for code2 in self.k.All_Stock_Code.keys() :

            if code1 == code2 :

                self.itemName.append(self.k.All_Stock_Code[code2]['종목명'])

                

    column_head = ["종목코드", "종목명"]

    colCount = len(column_head)

    rowCount = len(self.itemName)

    

    self.parent.check_list.setColumnCount(colCount)

    self.parent.check_list.setRowCount(rowCount)

    self.parent.check_list.setHorizontalHeaderLabels(column_head)

    

    for index in range(rowCount) :

        self.index = index

        self.parent.check_list.setItem(index, 0, QTableWidgetItem(str(self.new_code[index])))

        self.parent.check_list.setItem(index, 1, QTableWidgetItem(str(self.itemName[index])))

        

        self.parent.check_list.item(index, 0).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)

        self.parent.check_list.item(index, 1).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)


종목 자동 검색


def stock(self) :

    print("종목 자동으로 불러오기")

    

    t = threading.Timer(self.delay * 60, self.stock)

    t.start()

    

    self.request_stock()

    self.searchItem2()



    if self.k.code_list != "" :

        for code in self.k.code_list :

            if code not in self.k.portfolio_stock_dict.keys() :

                self.k.portfolio_stock_dict.update({code : {}})

self.delay는 사용자가 설정한 자동검색간격을 분 단위로 저장해놓은 변수로 초 단위로 바꿔준다.

재귀호출로 설정한 시간간격마다 stock 메서드를 실행하여 조건식 종목을 받아오고 UI에 전시한다.

또한 지정 시간마다 업데이트 되는 종목은 code_list에 저장되는데 만약 포트폴리오에 해당 종목이 없으면 이를 업데이트하여 저장한다.