반응형

creon plus -- 당일 체결 data 받기 TR -- StockBid 사용



개발환경 : windows 10 64bit, python 3.6 32bit, pyqt5



참고 : https://money2.creontrade.com/e5/mboard/ptype_basic/HTS_Plus_Helper/DW_Basic_Read_Page.aspx?boardseq=284&seq=22&page=1&searchString=stockbid&p=8841&v=8643&m=9505




** creon plus api 에서 TR 사용시에는, 개인적으로 BlockRequest() 보다는 Request() 사용한다. 


** TR data 수신중에, 동일한 TR 을 추가 요청하면 error 발생한다.

   --> 즉, Request() 중에 다른 종목 Request() 요청하면 error!

   --> 이전에 수신중인 TR data 는 완료가 안된 상태로 끝난다.




<< 실행화면 >>





<< api 도움말 >>





*** 소스코드 ***


https://gist.github.com/jayu108/6e8ee600a7ec1e23225cc913154b13d9


import time
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtWidgets import *
import win32com.client
class Creon_StockBid(QObject):
"""
체결창 TR data 받기 class -- dscbo1.StockBid
**** TR data 수신중에, 다른 종목 수신요청하면 error 발생함 --> 받던 data 중간에 날라감..****
"""
receive_tr_stockbid_signal = pyqtSignal(tuple) # pyqtSignal(object) 로 해도됨..
continue_tr_stockbid_signal = pyqtSignal(str) # 다음 연속 data 있는 경우 signal
end_tr_stockbid_signal = pyqtSignal(str) # TR 종료 신호 -- 종목코드 전송함.
def __init__(self):
super().__init__()
# self.name = "StockBid"
# self.cnt = 0
pass
def set_input(self, stockcode="005930"):
code = 'A' + stockcode # 대신은 주식 종목코드가 'A'로 시작해야함.
self.SetInputValue(0, code) # 0 - (string) 종목코드
self.SetInputValue(2, 80) # 2 - (short)요청개수 (최대 80)
self.SetInputValue(3, ord('H')) # 3 - (char)체결비교방식 ; 'H' --> 호가비교방식
# self.SetInputValue(4, "0930") # 4 - (string) 시간검색 (ex "0910")
# print("stockbid 추가.. ---->", stockcode)
self.__request()
def __request(self, stockcode: str=""):
try:
self.Request()
except Exception as e:
# print("---error---", stockcode)
QMessageBox.warning(None, "치명적인 error", str(e))
# def block_request(self):
# self.BlockRequest()
def OnReceived(self):
code = self.GetHeaderValue(0) # 0 - (string) 종목코드
stockcode = code[1:] # 'A' 제외시킴.
sell_che = self.GetHeaderValue(3) # 3 - (long) 누적매도체결량
buy_che = self.GetHeaderValue(4) # 4 - (long) 누적매수체결량
data_count = self.GetHeaderValue(2) # 2 - (long) 수신개수
# self.cnt += 1
# print("------ creon tr che ---", self.cnt, stockcode, sell_che, buy_che, data_count)
for i in range(data_count):
ttime = self.GetDataValue(9, i) # 9 - (long) 시각(초)
sell_hoga = self.GetDataValue(2, i) # 2 - (long) 매도호가
buy_hoga = self.GetDataValue(3, i) # 3 - (long) 매수호가
price = self.GetDataValue(4, i) # 4 - (long) 현재가
vol = self.GetDataValue(5, i) # 5 - (long) 거래량 ; 누적 거래량
che_vol = self.GetDataValue(6, i) # 6 - (long) 순간체결량
pos = chr(self.GetDataValue(7, i)) # 7 - (char)체결상태 ; '1' -> 매수, '2' -> 매도
che_strength = self.GetDataValue(8, i) # 8 - (float) 체결강도
jang = chr(self.GetDataValue(10, i)) # 10 - (char)장구분플래그 ; '1'-동시호가시간(예상체결), '2'-장중(체결)
tick = (stockcode, ttime, price, che_vol, vol, sell_hoga, buy_hoga, pos, che_strength, jang)
self.receive_tr_stockbid_signal.emit(tick)
if self.Continue == 1:
self.continue_tr_stockbid_signal.emit(stockcode)
# time.sleep(0.3) #“계좌등급으로 시세제한 메세지 나올때 사용"
self.__request(stockcode)
else:
self.end_tr_stockbid_signal.emit(stockcode) # TR 종료 신호
@classmethod
def get_instance(cls):
cp_bid = win32com.client.DispatchWithEvents("dscbo1.StockBid", cls)
return cp_bid
if __name__ == "__main__":
import sys
class MyMain(QWidget):
def __init__(self):
super().__init__()
self.qtxt = QTextEdit(self)
hbox = QHBoxLayout()
label = QLabel("종목코드")
self.lineed = QLineEdit("900100", self)
self.btn = QPushButton("조회하기")
hbox.addWidget(label)
hbox.addWidget(self.lineed)
hbox.addWidget(self.btn)
vbox = QVBoxLayout()
vbox.addWidget(self.qtxt)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.setGeometry(100, 50, 600, 600)
self.btn.clicked.connect(self.__btn_clicked)
self.stockbid = Creon_StockBid.get_instance()
self.stockbid.receive_tr_stockbid_signal.connect(self.__receive_tr_stockbid)
self.stockbid.continue_tr_stockbid_signal.connect(self.__continue_tr_stockbid)
self.stockbid.end_tr_stockbid_signal.connect(self.__end_tr_sotkcbid)
self.setWindowTitle("creon plus 체결창 TR data 가져오기 -- StockBid 사용")
self.show()
@pyqtSlot()
def __btn_clicked(self):
# print("조회하기")
code = self.lineed.text()
self.stockbid.set_input(code)
@pyqtSlot(tuple)
def __receive_tr_stockbid(self, tuple_data):
# print(tuple_data)
self.qtxt.append(str(tuple_data))
@pyqtSlot(str)
def __continue_tr_stockbid(self, stockcode: str):
# print(tuple_data)
msg = "----- {0}---- TR 연속 data 수신중..... ----".format(stockcode)
self.qtxt.append(msg)
@pyqtSlot(str)
def __end_tr_sotkcbid(self, stockcode: str):
# print(tuple_data)
msg = "----- {0}---- TR data 수신 종료 ----".format(stockcode)
self.qtxt.append(msg)
app = QApplication(sys.argv)
mywin = MyMain()
app.exec_()



반응형
Posted by 자유프로그램
,