[키움 자동매매 프로그램] - 특정 시간마다 조건식 자동 검색(Qthread_10.py)
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에 저장되는데 만약 포트폴리오에 해당 종목이 없으면 이를 업데이트하여 저장한다.