1 minute read

Qthread_8.py 구현

Qthread_8.py 코드에서는 조건식에 해당하는 종목들을 받아오는 부분을 구현한다.

조건식을 선택하고 종목 수동 검색을 누르면 종목들이 나온다.

Qthread_8 - init() 생성


from PyQt5.QtCore import *

from kiwoom import Kiwoom

from PyQt5.QtWidgets import *



class Thread8(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.request_stock()

        self.searchItem2()

        ###


조건식으로 종목 받아오기


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()

codelist는 거래할 종목이 들어있는데 “;” 를 기준으로 종목 코드로 나뉘어져 있다.

따라서 “;” 기준으로 분할하여 하나씩 새로운 리스트에 넣어준다.


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


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_()

조건식 이름을 박스(kiwoom_list)에서 가져와 조건식 리스트인 condition_list의 값들과 비교한다.

해당하는 조건식의 코드값(키움 서버는 이름이 아닌 코드로 작동)을 서버에 전송하여 종목을 요청한다.


종목 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)

종목을 서버에서 받아왔으므로 UI에 전시한다.

서버에서 수신한 데이터는 종목 코드이므로, 종목 코드에 해당하는 종목명을 찾아야 한다.


조건식에 해당하는 종목 받아오는데 성공했다면 다음과 같이 UI에 전시된다.

image.png