[키움 자동매매 프로그램] - 조건식에 해당하는 종목 불러오기(Qthread_8.py)
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에 전시된다.