반응형
creon plus -- 당일 체결 data 받기 TR -- StockBid 사용
개발환경 : windows 10 64bit, python 3.6 32bit, pyqt5
** creon plus api 에서 TR 사용시에는, 개인적으로 BlockRequest() 보다는 Request() 사용한다.
** TR data 수신중에, 동일한 TR 을 추가 요청하면 error 발생한다.
--> 즉, Request() 중에 다른 종목 Request() 요청하면 error!
--> 이전에 수신중인 TR data 는 완료가 안된 상태로 끝난다.
<< 실행화면 >>
<< api 도움말 >>
*** 소스코드 ***
https://gist.github.com/jayu108/6e8ee600a7ec1e23225cc913154b13d9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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_() | |
반응형
'증권사 api' 카테고리의 다른 글
creon plus -- 실시간 체결데이터 받기 -- StockCur 사용 (0) | 2018.10.25 |
---|---|
creon plus -- 기본 정보 구하기 -- CpCodeMgr 사용 (4) | 2018.10.24 |
xing api -- 실시간 데이터 조회 (6) | 2017.06.02 |
xing api -- 체결창 ; 반복 데이터(Occurs), 연속 데이터 조회 (2) | 2017.06.01 |
xing api -- 현재가 ; 단일 데이터 조회 (0) | 2017.06.01 |