init
This commit is contained in:
15
hts/HTS.py
15
hts/HTS.py
@@ -204,8 +204,9 @@ class HTS:
|
||||
|
||||
|
||||
# 주식 현재가 조회
|
||||
def checkRealTime(self, stock_code):
|
||||
# 연결 여부 체크
|
||||
def getRealTime(self, stock_code, day):
|
||||
day = '20210917'
|
||||
|
||||
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
|
||||
bConnect = objCpCybos.IsConnect
|
||||
if (bConnect == 0):
|
||||
@@ -217,7 +218,7 @@ class HTS:
|
||||
|
||||
objStockChart.SetInputValue(0, 'A'+stock_code) # 종목 코드
|
||||
objStockChart.SetInputValue(1, ord('2')) # 1: 기간으로 조회, 2: 개수로 조회
|
||||
objStockChart.SetInputValue(2, '20210917')
|
||||
objStockChart.SetInputValue(2, day)
|
||||
#objStockChart.SetInputValue(3, '20210915')
|
||||
objStockChart.SetInputValue(4, 100000) # 최근 n개 치
|
||||
objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량
|
||||
@@ -231,6 +232,7 @@ class HTS:
|
||||
print("날짜", "시간", "시가", "고가", "저가", "종가", "거래량")
|
||||
print("==============================================-")
|
||||
|
||||
result = []
|
||||
for i in range(len):
|
||||
day = objStockChart.GetDataValue(0, i)
|
||||
time = objStockChart.GetDataValue(1, i)
|
||||
@@ -240,8 +242,9 @@ class HTS:
|
||||
close = objStockChart.GetDataValue(5, i)
|
||||
vol = objStockChart.GetDataValue(6, i)
|
||||
print(day, time, open, high, low, close, vol)
|
||||
result.append([time, close])
|
||||
|
||||
return
|
||||
return result
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -258,5 +261,7 @@ if __name__ == "__main__":
|
||||
|
||||
#hts.currentStock(stock_code)
|
||||
|
||||
hts.checkRealTime(stock_code)
|
||||
day = datetime.today().strftime("%Y%m%d")
|
||||
result = hts.getRealTime(stock_code, day)
|
||||
print (result)
|
||||
print ("done...")
|
||||
|
||||
736
hts/RealTime.py
736
hts/RealTime.py
@@ -1,736 +0,0 @@
|
||||
import sys
|
||||
|
||||
import pandas
|
||||
from PyQt5 import QtWidgets
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5 import uic
|
||||
from PyQt5.QtCore import *
|
||||
import win32com.client
|
||||
from pandas import Series, DataFrame
|
||||
import locale
|
||||
|
||||
# cp object
|
||||
g_objCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
|
||||
g_objCpStatus = win32com.client.Dispatch("CpUtil.CpCybos")
|
||||
g_objCpTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
|
||||
locale.setlocale(locale.LC_ALL, '')
|
||||
|
||||
|
||||
# 현재가 정보 저장 구조체
|
||||
class stockPricedData:
|
||||
def __init__(self):
|
||||
self.dicEx = {ord('0'): "동시호가/장중 아님", ord('1'): "동시호가", ord('2'): "장중"}
|
||||
self.code = ""
|
||||
self.name = ""
|
||||
self.cur = 0 # 현재가
|
||||
self.diff = 0 # 대비
|
||||
self.diffp = 0 # 대비율
|
||||
self.offer = [0 for _ in range(10)] # 매도호가
|
||||
self.bid = [0 for _ in range(10)] # 매수호가
|
||||
self.offervol = [0 for _ in range(10)] # 매도호가 잔량
|
||||
self.bidvol = [0 for _ in range(10)] # 매수호가 잔량
|
||||
self.totOffer = 0 # 총매도잔량
|
||||
self.totBid = 0 # 총매수 잔량
|
||||
self.vol = 0 # 거래량
|
||||
self.tvol = 0 # 순간 체결량
|
||||
self.baseprice = 0 # 기준가
|
||||
self.high = 0
|
||||
self.low = 0
|
||||
self.open = 0
|
||||
self.volFlag = ord('0') # 체결매도/체결 매수 여부
|
||||
self.time = 0
|
||||
self.sum_buyvol = 0
|
||||
self.sum_sellvol = 0
|
||||
self.vol_str = 0
|
||||
|
||||
# 예상체결가 정보
|
||||
self.exFlag = ord('2')
|
||||
self.expcur = 0 # 예상체결가
|
||||
self.expdiff = 0 # 예상 대비
|
||||
self.expdiffp = 0 # 예상 대비율
|
||||
self.expvol = 0 # 예상 거래량
|
||||
self.objCur = CpPBStockCur()
|
||||
self.objOfferbid = CpPBStockBid()
|
||||
|
||||
def __del__(self):
|
||||
self.objCur.Unsubscribe()
|
||||
self.objOfferbid.Unsubscribe()
|
||||
|
||||
# 전일 대비 계산
|
||||
def makediffp(self):
|
||||
lastday = 0
|
||||
if (self.exFlag == ord('1')): # 동시호가 시간 (예상체결)
|
||||
if self.baseprice > 0:
|
||||
lastday = self.baseprice
|
||||
else:
|
||||
lastday = self.expcur - self.expdiff
|
||||
if lastday:
|
||||
self.expdiffp = (self.expdiff / lastday) * 100
|
||||
else:
|
||||
self.expdiffp = 0
|
||||
else:
|
||||
if self.baseprice > 0:
|
||||
lastday = self.baseprice
|
||||
else:
|
||||
lastday = self.cur - self.diff
|
||||
if lastday:
|
||||
self.diffp = (self.diff / lastday) * 100
|
||||
else:
|
||||
self.diffp = 0
|
||||
|
||||
def getCurColor(self):
|
||||
diff = self.diff
|
||||
if (self.exFlag == ord('1')): # 동시호가 시간 (예상체결)
|
||||
diff = self.expdiff
|
||||
if (diff > 0):
|
||||
return 'color: red'
|
||||
elif (diff == 0):
|
||||
return 'color: black'
|
||||
elif (diff < 0):
|
||||
return 'color: blue'
|
||||
|
||||
|
||||
# CpEvent: 실시간 이벤트 수신 클래스
|
||||
class CpEvent:
|
||||
def set_params(self, client, name, rpMst, parent):
|
||||
self.client = client # CP 실시간 통신 object
|
||||
self.name = name # 서비스가 다른 이벤트를 구분하기 위한 이름
|
||||
self.parent = parent # callback 을 위해 보관
|
||||
self.rpMst = rpMst
|
||||
|
||||
# PLUS 로 부터 실제로 시세를 수신 받는 이벤트 핸들러
|
||||
def OnReceived(self):
|
||||
if self.name == "stockcur":
|
||||
# 현재가 체결 데이터 실시간 업데이트
|
||||
self.rpMst.exFlag = self.client.GetHeaderValue(19) # 예상체결 플래그
|
||||
code = self.client.GetHeaderValue(0)
|
||||
diff = self.client.GetHeaderValue(2)
|
||||
cur = self.client.GetHeaderValue(13) # 현재가
|
||||
vol = self.client.GetHeaderValue(9) # 거래량
|
||||
|
||||
# 예제는 장중만 처리 함.
|
||||
if (self.rpMst.exFlag == ord('1')): # 동시호가 시간 (예상체결)
|
||||
# 예상체결가 정보
|
||||
self.rpMst.expcur = cur
|
||||
self.rpMst.expdiff = diff
|
||||
self.rpMst.expvol = vol
|
||||
else:
|
||||
self.rpMst.cur = cur
|
||||
self.rpMst.diff = diff
|
||||
self.rpMst.makediffp()
|
||||
self.rpMst.vol = vol
|
||||
self.rpMst.open = self.client.GetHeaderValue(4)
|
||||
self.rpMst.high = self.client.GetHeaderValue(5)
|
||||
self.rpMst.low = self.client.GetHeaderValue(6)
|
||||
self.rpMst.tvol = self.client.GetHeaderValue(17)
|
||||
self.rpMst.volFlag = self.client.GetHeaderValue(14) # '1' 매수 '2' 매도
|
||||
self.rpMst.time = self.client.GetHeaderValue(18)
|
||||
self.rpMst.sum_buyvol = self.client.GetHeaderValue(16) # 누적매수체결수량 (체결가방식)
|
||||
self.rpMst.sum_sellvol = self.client.GetHeaderValue(15) # 누적매도체결수량 (체결가방식)
|
||||
if (self.rpMst.sum_sellvol):
|
||||
self.rpMst.volstr = self.rpMst.sum_buyvol / self.rpMst.sum_sellvol * 100
|
||||
else:
|
||||
self.rpMst.volstr = 0
|
||||
|
||||
self.rpMst.makediffp()
|
||||
# 현재가 업데이트
|
||||
self.parent.monitorPriceChange()
|
||||
|
||||
return
|
||||
|
||||
elif self.name == "stockbid":
|
||||
# 현재가 10차 호가 데이터 실시간 업데이c
|
||||
code = self.client.GetHeaderValue(0)
|
||||
dataindex = [3, 7, 11, 15, 19, 27, 31, 35, 39, 43]
|
||||
obi = 0
|
||||
for i in range(10):
|
||||
self.rpMst.offer[i] = self.client.GetHeaderValue(dataindex[i])
|
||||
self.rpMst.bid[i] = self.client.GetHeaderValue(dataindex[i] + 1)
|
||||
self.rpMst.offervol[i] = self.client.GetHeaderValue(dataindex[i] + 2)
|
||||
self.rpMst.bidvol[i] = self.client.GetHeaderValue(dataindex[i] + 3)
|
||||
|
||||
self.rpMst.totOffer = self.client.GetHeaderValue(23)
|
||||
self.rpMst.totBid = self.client.GetHeaderValue(24)
|
||||
# 10차 호가 변경 call back 함수 호출
|
||||
self.parent.monitorOfferbidChange()
|
||||
return
|
||||
|
||||
|
||||
# SB/PB 요청 ROOT 클래스
|
||||
class CpPublish:
|
||||
def __init__(self, name, serviceID):
|
||||
self.name = name
|
||||
self.obj = win32com.client.Dispatch(serviceID)
|
||||
self.bIsSB = False
|
||||
|
||||
def Subscribe(self, var, rpMst, parent):
|
||||
if self.bIsSB:
|
||||
self.Unsubscribe()
|
||||
|
||||
if (len(var) > 0):
|
||||
self.obj.SetInputValue(0, var)
|
||||
|
||||
handler = win32com.client.WithEvents(self.obj, CpEvent)
|
||||
handler.set_params(self.obj, self.name, rpMst, parent)
|
||||
self.obj.Subscribe()
|
||||
self.bIsSB = True
|
||||
|
||||
def Unsubscribe(self):
|
||||
if self.bIsSB:
|
||||
self.obj.Unsubscribe()
|
||||
self.bIsSB = False
|
||||
|
||||
|
||||
# CpPBStockCur: 실시간 현재가 요청 클래스
|
||||
class CpPBStockCur(CpPublish):
|
||||
def __init__(self):
|
||||
super().__init__("stockcur", "DsCbo1.StockCur")
|
||||
|
||||
|
||||
# CpPBStockBid: 실시간 10차 호가 요청 클래스
|
||||
class CpPBStockBid(CpPublish):
|
||||
def __init__(self):
|
||||
super().__init__("stockbid", "Dscbo1.StockJpBid")
|
||||
|
||||
|
||||
# SB/PB 요청 ROOT 클래스
|
||||
class CpPBConnection:
|
||||
def __init__(self):
|
||||
self.obj = win32com.client.Dispatch("CpUtil.CpCybos")
|
||||
handler = win32com.client.WithEvents(self.obj, CpEvent)
|
||||
handler.set_params(self.obj, "connection", None)
|
||||
|
||||
|
||||
# CpRPCurrentPrice: 현재가 기본 정보 조회 클래스
|
||||
class CpRPCurrentPrice:
|
||||
def __init__(self):
|
||||
if (g_objCpStatus.IsConnect == 0):
|
||||
print("PLUS가 정상적으로 연결되지 않음. ")
|
||||
return
|
||||
self.objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
|
||||
return
|
||||
|
||||
def Request(self, code, rtMst, callbackobj):
|
||||
# 현재가 통신
|
||||
rtMst.objCur.Unsubscribe()
|
||||
rtMst.objOfferbid.Unsubscribe()
|
||||
|
||||
self.objStockMst.SetInputValue(0, code)
|
||||
ret = self.objStockMst.BlockRequest()
|
||||
if self.objStockMst.GetDibStatus() != 0:
|
||||
print("통신상태", self.objStockMst.GetDibStatus(), self.objStockMst.GetDibMsg1())
|
||||
return False
|
||||
|
||||
# 수신 받은 현재가 정보를 rtMst 에 저장
|
||||
rtMst.code = code
|
||||
rtMst.name = g_objCodeMgr.CodeToName(code)
|
||||
rtMst.cur = self.objStockMst.GetHeaderValue(11) # 종가
|
||||
rtMst.diff = self.objStockMst.GetHeaderValue(12) # 전일대비
|
||||
rtMst.baseprice = self.objStockMst.GetHeaderValue(27) # 기준가
|
||||
rtMst.vol = self.objStockMst.GetHeaderValue(18) # 거래량
|
||||
rtMst.exFlag = self.objStockMst.GetHeaderValue(58) # 예상플래그
|
||||
rtMst.expcur = self.objStockMst.GetHeaderValue(55) # 예상체결가
|
||||
rtMst.expdiff = self.objStockMst.GetHeaderValue(56) # 예상체결대비
|
||||
rtMst.makediffp()
|
||||
|
||||
rtMst.totOffer = self.objStockMst.GetHeaderValue(71) # 총매도잔량
|
||||
rtMst.totBid = self.objStockMst.GetHeaderValue(73) # 총매수잔량
|
||||
|
||||
# 10차호가
|
||||
for i in range(10):
|
||||
rtMst.offer[i] = (self.objStockMst.GetDataValue(0, i)) # 매도호가
|
||||
rtMst.bid[i] = (self.objStockMst.GetDataValue(1, i)) # 매수호가
|
||||
rtMst.offervol[i] = (self.objStockMst.GetDataValue(2, i)) # 매도호가 잔량
|
||||
rtMst.bidvol[i] = (self.objStockMst.GetDataValue(3, i)) # 매수호가 잔량
|
||||
|
||||
rtMst.objCur.Subscribe(code, rtMst, callbackobj)
|
||||
rtMst.objOfferbid.Subscribe(code, rtMst, callbackobj)
|
||||
|
||||
|
||||
# CpWeekList: 일자별 리스트 구하기
|
||||
class CpWeekList:
|
||||
def __init__(self):
|
||||
self.objWeek = win32com.client.Dispatch("Dscbo1.StockWeek")
|
||||
return
|
||||
|
||||
def Request(self, code, caller):
|
||||
# 현재가 통신
|
||||
self.objWeek.SetInputValue(0, code)
|
||||
# 데이터들
|
||||
dates = []
|
||||
opens = []
|
||||
highs = []
|
||||
lows = []
|
||||
closes = []
|
||||
diffs = []
|
||||
vols = []
|
||||
diffps = []
|
||||
foreign_vols = []
|
||||
foreign_diff = []
|
||||
foreign_p = []
|
||||
|
||||
# 누적 개수 - 100 개까지만 하자
|
||||
sumCnt = 0
|
||||
while True:
|
||||
ret = self.objWeek.BlockRequest()
|
||||
if self.objWeek.GetDibStatus() != 0:
|
||||
print("통신상태", self.objWeek.GetDibStatus(), self.objWeek.GetDibMsg1())
|
||||
return False
|
||||
|
||||
cnt = self.objWeek.GetHeaderValue(1)
|
||||
sumCnt += cnt
|
||||
if cnt == 0:
|
||||
break
|
||||
|
||||
for i in range(cnt):
|
||||
dates.append(self.objWeek.GetDataValue(0, i))
|
||||
opens.append(self.objWeek.GetDataValue(1, i))
|
||||
highs.append(self.objWeek.GetDataValue(2, i))
|
||||
lows.append(self.objWeek.GetDataValue(3, i))
|
||||
closes.append(self.objWeek.GetDataValue(4, i))
|
||||
|
||||
temp = self.objWeek.GetDataValue(5, i)
|
||||
diffs.append(temp)
|
||||
vols.append(self.objWeek.GetDataValue(6, i))
|
||||
|
||||
temp2 = self.objWeek.GetDataValue(10, i)
|
||||
if (temp < 0):
|
||||
temp2 *= -1
|
||||
diffps.append(temp2)
|
||||
|
||||
foreign_vols.append(self.objWeek.GetDataValue(7, i)) # 외인보유
|
||||
foreign_diff.append(self.objWeek.GetDataValue(8, i)) # 외인보유 전일대비
|
||||
foreign_p.append(self.objWeek.GetDataValue(9, i)) # 외인비중
|
||||
|
||||
if (sumCnt > 100):
|
||||
break
|
||||
|
||||
if self.objWeek.Continue == False:
|
||||
break
|
||||
|
||||
if len(dates) == 0:
|
||||
return False
|
||||
|
||||
caller.rpWeek = None
|
||||
weekCol = {'close': closes,
|
||||
'diff': diffs,
|
||||
'diffp': diffps,
|
||||
'vol': vols,
|
||||
'open': opens,
|
||||
'high': highs,
|
||||
'low': lows,
|
||||
'for_v': foreign_vols,
|
||||
'for_d': foreign_diff,
|
||||
'for_p': foreign_p,
|
||||
}
|
||||
caller.rpWeek = DataFrame(weekCol, index=dates)
|
||||
return True
|
||||
|
||||
|
||||
# CpStockBid: 시간대별 조회
|
||||
class CpStockBid:
|
||||
def __init__(self):
|
||||
self.objSBid = win32com.client.Dispatch("Dscbo1.StockBid")
|
||||
return
|
||||
|
||||
def Request(self, code, caller):
|
||||
# 현재가 통신
|
||||
self.objSBid.SetInputValue(0, code)
|
||||
self.objSBid.SetInputValue(2, 80) # 요청개수 (최대 80)
|
||||
self.objSBid.SetInputValue(3, ord('C')) # C 체결가 비교 방식 H 호가 비교방식
|
||||
|
||||
times = []
|
||||
curs = []
|
||||
diffs = []
|
||||
tvols = []
|
||||
offers = []
|
||||
bids = []
|
||||
vols = []
|
||||
offerbidFlags = [] # 체결 상태 '1' 매수 '2' 매도
|
||||
volstrs = [] # 체결강도
|
||||
marketFlags = [] # 장구분 '1' 동시호가 예상체결' '2' 장중
|
||||
|
||||
# 누적 개수 - 100 개까지만 하자
|
||||
sumCnt = 0
|
||||
while True:
|
||||
ret = self.objSBid.BlockRequest()
|
||||
if self.objSBid.GetDibStatus() != 0:
|
||||
print("통신상태", self.objSBid.GetDibStatus(), self.objSBid.GetDibMsg1())
|
||||
return False
|
||||
|
||||
cnt = self.objSBid.GetHeaderValue(2)
|
||||
sumCnt += cnt
|
||||
if cnt == 0:
|
||||
break
|
||||
|
||||
strcur = ""
|
||||
strflag = ""
|
||||
strflag2 = ""
|
||||
for i in range(cnt):
|
||||
cur = self.objSBid.GetDataValue(4, i)
|
||||
times.append(self.objSBid.GetDataValue(9, i))
|
||||
diffs.append(self.objSBid.GetDataValue(1, i))
|
||||
vols.append(self.objSBid.GetDataValue(5, i))
|
||||
tvols.append(self.objSBid.GetDataValue(6, i))
|
||||
offers.append(self.objSBid.GetDataValue(2, i))
|
||||
bids.append(self.objSBid.GetDataValue(3, i))
|
||||
flag = self.objSBid.GetDataValue(7, i)
|
||||
if (flag == ord('1')):
|
||||
strflag = "체결매수"
|
||||
else:
|
||||
strflag = "체결매도"
|
||||
offerbidFlags.append(strflag)
|
||||
volstrs.append(self.objSBid.GetDataValue(8, i))
|
||||
flag = self.objSBid.GetDataValue(10, i)
|
||||
if (flag == ord('1')):
|
||||
strflag2 = "예상체결"
|
||||
# strcur = '*' + str(cur)
|
||||
else:
|
||||
strflag2 = "장중"
|
||||
# strcur = str(cur)
|
||||
marketFlags.append(strflag2)
|
||||
curs.append(cur)
|
||||
|
||||
if (sumCnt > 100):
|
||||
break
|
||||
|
||||
if self.objSBid.Continue == False:
|
||||
break
|
||||
|
||||
if len(times) == 0:
|
||||
return False
|
||||
|
||||
caller.rpStockBid = None
|
||||
sBidCol = {'time': times,
|
||||
'cur': curs,
|
||||
'diff': diffs,
|
||||
'vol': vols,
|
||||
'tvol': tvols,
|
||||
'offer': offers,
|
||||
'bid': bids,
|
||||
'flag': offerbidFlags,
|
||||
'market': marketFlags,
|
||||
'volstr': volstrs}
|
||||
caller.rpStockBid = DataFrame(sBidCol)
|
||||
print(caller.rpStockBid)
|
||||
return True
|
||||
|
||||
|
||||
class Form(QtWidgets.QDialog):
|
||||
def __init__(self, parent=None):
|
||||
QtWidgets.QDialog.__init__(self, parent)
|
||||
self.ui = uic.loadUi("hoga.ui", self)
|
||||
self.ui.show()
|
||||
self.objMst = CpRPCurrentPrice()
|
||||
self.item = stockPricedData()
|
||||
|
||||
# 일자별
|
||||
self.objWeek = CpWeekList()
|
||||
self.rpWeek = DataFrame() # 일자별 데이터프레임
|
||||
|
||||
# 시간대별
|
||||
self.rpStockBid = DataFrame()
|
||||
self.objStockBid = CpStockBid()
|
||||
self.todayIndex = 0
|
||||
|
||||
self.setCode("000660")
|
||||
|
||||
@pyqtSlot()
|
||||
def slot_codeupdate(self):
|
||||
code = self.ui.editCode.toPlainText()
|
||||
self.setCode(code)
|
||||
|
||||
def slot_codechanged(self):
|
||||
code = self.ui.editCode.toPlainText()
|
||||
self.setCode(code)
|
||||
|
||||
def monitorPriceChange(self):
|
||||
self.displyHoga()
|
||||
self.updateWeek()
|
||||
self.updateStockBid()
|
||||
|
||||
def monitorOfferbidChange(self):
|
||||
self.displyHoga()
|
||||
|
||||
def setCode(self, code):
|
||||
if len(code) < 6:
|
||||
return
|
||||
|
||||
print(code)
|
||||
if not (code[0] == "A"):
|
||||
code = "A" + code
|
||||
|
||||
name = g_objCodeMgr.CodeToName(code)
|
||||
if len(name) == 0:
|
||||
print("종목코드 확인")
|
||||
return
|
||||
|
||||
self.ui.label_name.setText(name)
|
||||
|
||||
if (self.objMst.Request(code, self.item, self) == False):
|
||||
return
|
||||
self.displyHoga()
|
||||
|
||||
# 일자별
|
||||
self.ui.tableWeek.clearContents()
|
||||
if (self.objWeek.Request(code, self) == True):
|
||||
print(self.rpWeek)
|
||||
self.displyWeek()
|
||||
|
||||
# 시간대별
|
||||
self.ui.tableStockBid.clearContents()
|
||||
if (self.objStockBid.Request(code, self) == True):
|
||||
self.displyStockBid()
|
||||
|
||||
# 10차 호가 UI 채우기
|
||||
def displyHoga(self):
|
||||
self.ui.label_offer10.setText(format(self.item.offer[9], ','))
|
||||
self.ui.label_offer9.setText(format(self.item.offer[8], ','))
|
||||
self.ui.label_offer8.setText(format(self.item.offer[7], ','))
|
||||
self.ui.label_offer7.setText(format(self.item.offer[6], ','))
|
||||
self.ui.label_offer6.setText(format(self.item.offer[5], ','))
|
||||
self.ui.label_offer5.setText(format(self.item.offer[4], ','))
|
||||
self.ui.label_offer4.setText(format(self.item.offer[3], ','))
|
||||
self.ui.label_offer3.setText(format(self.item.offer[2], ','))
|
||||
self.ui.label_offer2.setText(format(self.item.offer[1], ','))
|
||||
self.ui.label_offer1.setText(format(self.item.offer[0], ','))
|
||||
|
||||
self.ui.label_offer_v10.setText(format(self.item.offervol[9], ','))
|
||||
self.ui.label_offer_v9.setText(format(self.item.offervol[8], ','))
|
||||
self.ui.label_offer_v8.setText(format(self.item.offervol[7], ','))
|
||||
self.ui.label_offer_v7.setText(format(self.item.offervol[6], ','))
|
||||
self.ui.label_offer_v6.setText(format(self.item.offervol[5], ','))
|
||||
self.ui.label_offer_v5.setText(format(self.item.offervol[4], ','))
|
||||
self.ui.label_offer_v4.setText(format(self.item.offervol[3], ','))
|
||||
self.ui.label_offer_v3.setText(format(self.item.offervol[2], ','))
|
||||
self.ui.label_offer_v2.setText(format(self.item.offervol[1], ','))
|
||||
self.ui.label_offer_v1.setText(format(self.item.offervol[0], ','))
|
||||
|
||||
self.ui.label_bid10.setText(format(self.item.bid[9], ','))
|
||||
self.ui.label_bid9.setText(format(self.item.bid[8], ','))
|
||||
self.ui.label_bid8.setText(format(self.item.bid[7], ','))
|
||||
self.ui.label_bid7.setText(format(self.item.bid[6], ','))
|
||||
self.ui.label_bid6.setText(format(self.item.bid[5], ','))
|
||||
self.ui.label_bid5.setText(format(self.item.bid[4], ','))
|
||||
self.ui.label_bid4.setText(format(self.item.bid[3], ','))
|
||||
self.ui.label_bid3.setText(format(self.item.bid[2], ','))
|
||||
self.ui.label_bid2.setText(format(self.item.bid[1], ','))
|
||||
self.ui.label_bid1.setText(format(self.item.bid[0], ','))
|
||||
|
||||
self.ui.label_bid_v10.setText(format(self.item.bidvol[9], ','))
|
||||
self.ui.label_bid_v9.setText(format(self.item.bidvol[8], ','))
|
||||
self.ui.label_bid_v8.setText(format(self.item.bidvol[7], ','))
|
||||
self.ui.label_bid_v7.setText(format(self.item.bidvol[6], ','))
|
||||
self.ui.label_bid_v6.setText(format(self.item.bidvol[5], ','))
|
||||
self.ui.label_bid_v5.setText(format(self.item.bidvol[4], ','))
|
||||
self.ui.label_bid_v4.setText(format(self.item.bidvol[3], ','))
|
||||
self.ui.label_bid_v3.setText(format(self.item.bidvol[2], ','))
|
||||
self.ui.label_bid_v2.setText(format(self.item.bidvol[1], ','))
|
||||
self.ui.label_bid_v1.setText(format(self.item.bidvol[0], ','))
|
||||
|
||||
cur = self.item.cur
|
||||
diff = self.item.diff
|
||||
diffp = self.item.diffp
|
||||
if (self.item.exFlag == ord('1')): # 동시호가 시간 (예상체결)
|
||||
cur = self.item.expcur
|
||||
diff = self.item.expdiff
|
||||
diffp = self.item.expdiffp
|
||||
|
||||
strcur = format(cur, ',')
|
||||
if (self.item.exFlag == ord('1')): # 동시호가 시간 (예상체결)
|
||||
strcur = "*" + strcur
|
||||
|
||||
curcolor = self.item.getCurColor()
|
||||
self.ui.label_cur.setStyleSheet(curcolor)
|
||||
self.ui.label_cur.setText(strcur)
|
||||
strdiff = str(diff) + " " + format(diffp, '.2f')
|
||||
strdiff += "%"
|
||||
self.ui.label_diff.setText(strdiff)
|
||||
self.ui.label_diff.setStyleSheet(curcolor)
|
||||
|
||||
self.ui.label_totoffer.setText(format(self.item.totOffer, ','))
|
||||
self.ui.label_totbid.setText(format(self.item.totBid, ','))
|
||||
|
||||
# 일자별 리스트 UI 채우기
|
||||
def displyWeek(self):
|
||||
rowcnt = len(self.rpWeek.index)
|
||||
if rowcnt == 0:
|
||||
return
|
||||
self.ui.tableWeek.setRowCount(rowcnt)
|
||||
|
||||
nRow = 0
|
||||
|
||||
for index, row in self.rpWeek.iterrows():
|
||||
datas = [index, row['close'], row['diff'], row['diffp'], row['vol'], row['open'], row['high'], row['low'],
|
||||
row['for_v'], row['for_d'], row['for_p']]
|
||||
for col in range(len(datas)):
|
||||
val = ''
|
||||
if (col == 0): # 일자
|
||||
# 20170929 ==> 2017/09/29
|
||||
yyyy = int(datas[col] / 10000)
|
||||
mm = int(datas[col] - (yyyy * 10000))
|
||||
dd = mm % 100
|
||||
mm = mm / 100
|
||||
val = '%04d/%02d/%02d' % (yyyy, mm, dd)
|
||||
elif (col == 3 or col == 10): # 대비율
|
||||
val = locale.format('%.2f', datas[col], 1)
|
||||
val += "%"
|
||||
|
||||
else:
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
|
||||
item = QTableWidgetItem(val)
|
||||
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
|
||||
self.ui.tableWeek.setItem(nRow, col, item)
|
||||
|
||||
if (nRow == 0):
|
||||
self.todayIndex = index
|
||||
nRow += 1
|
||||
|
||||
self.tableWeek.resizeColumnsToContents()
|
||||
return
|
||||
|
||||
# 일자별 리스트 UI 채우기 - 오늘 날짜 업데이트
|
||||
def updateWeek(self):
|
||||
rowcnt = len(self.rpWeek.index)
|
||||
if rowcnt == 0:
|
||||
return
|
||||
|
||||
# 오늘 날짜 데이터 업데이트
|
||||
self.rpWeek.set_value(self.todayIndex, 'close', self.item.cur)
|
||||
self.rpWeek.set_value(self.todayIndex, 'open', self.item.open)
|
||||
self.rpWeek.set_value(self.todayIndex, 'high', self.item.high)
|
||||
self.rpWeek.set_value(self.todayIndex, 'low', self.item.low)
|
||||
self.rpWeek.set_value(self.todayIndex, 'vol', self.item.vol)
|
||||
self.rpWeek.set_value(self.todayIndex, 'diff', self.item.diff)
|
||||
self.rpWeek.set_value(self.todayIndex, 'diffp', self.item.diffp)
|
||||
|
||||
datas = [self.todayIndex, self.item.cur, self.item.diff, self.item.diffp, self.item.vol,
|
||||
self.item.open, self.item.high, self.item.low]
|
||||
for col in range(len(datas)):
|
||||
val = ''
|
||||
if (col == 0): # 일자
|
||||
# 20170929 ==> 2017/09/29
|
||||
yyyy = int(datas[col] / 10000)
|
||||
mm = int(datas[col] - (yyyy * 10000))
|
||||
dd = mm % 100
|
||||
mm = mm / 100
|
||||
val = '%04d/%02d/%02d' % (yyyy, mm, dd)
|
||||
elif (col == 3): # 대비율
|
||||
val = locale.format('%.2f', datas[col], 1)
|
||||
val += "%"
|
||||
|
||||
else:
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
|
||||
item = QTableWidgetItem(val)
|
||||
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
|
||||
self.ui.tableWeek.setItem(0, col, item)
|
||||
|
||||
return
|
||||
|
||||
# 시간대별 리스트 UI 채우기
|
||||
def displyStockBid(self):
|
||||
rowcnt = len(self.rpStockBid.index)
|
||||
if rowcnt == 0:
|
||||
return
|
||||
self.ui.tableStockBid.setRowCount(rowcnt)
|
||||
|
||||
nRow = 0
|
||||
|
||||
for index, row in self.rpStockBid.iterrows():
|
||||
# 행 내에 표시할 데이터 - 컬럼 순
|
||||
datas = [row['time'], row['cur'], row['diff'], row['offer'], row['bid'], row['vol'], row['tvol'],
|
||||
row['tvol'], row['volstr']]
|
||||
market = row['market']
|
||||
for col in range(len(datas)):
|
||||
val = ''
|
||||
if col == 0: # 시각
|
||||
# 155925 ==> 15:59:25
|
||||
hh = int(datas[col] / 10000)
|
||||
mm = int(datas[col] - (hh * 10000))
|
||||
ss = mm % 100
|
||||
mm = mm / 100
|
||||
val = '%02d:%02d:%02d' % (hh, mm, ss)
|
||||
elif col == 6: # 체결매도
|
||||
market = row['flag']
|
||||
if (market == "체결매도"):
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
elif col == 7: # 체결매수
|
||||
market = row['flag']
|
||||
if (market == "체결매수"):
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
elif col == 8: # 체결강도
|
||||
val = locale.format('%.2f', datas[col], 1)
|
||||
elif col == 1: # 현재가
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
if (market == "예상체결"):
|
||||
val = '*' + val
|
||||
else: # 기타
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
item = QTableWidgetItem(val)
|
||||
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
|
||||
self.ui.tableStockBid.setItem(nRow, col, item)
|
||||
nRow += 1
|
||||
|
||||
self.tableStockBid.resizeColumnsToContents()
|
||||
return
|
||||
|
||||
def updateStockBid(self):
|
||||
rowcnt = len(self.rpStockBid.index)
|
||||
if rowcnt == 0:
|
||||
return
|
||||
if (self.item.exFlag == ord('1')): # 동시호가 시간 (예상체결)
|
||||
return
|
||||
|
||||
buyvol = sellvol = 0
|
||||
if self.item.volFlag == ord('1'):
|
||||
buyvol = self.item.tvol
|
||||
if self.item.volFlag == ord('2'):
|
||||
sellvol = self.item.tvol
|
||||
line = DataFrame({"time": self.item.time,
|
||||
"cur": self.item.cur,
|
||||
"diff": self.item.diff,
|
||||
"offer": self.item.offer[0],
|
||||
"bid": self.item.bid[0],
|
||||
"vol": self.item.vol,
|
||||
"tvol": buyvol,
|
||||
"tvol": sellvol,
|
||||
"volstr": self.item.volstr},
|
||||
index=[0])
|
||||
|
||||
self.rpStockBid = pandas.concat([line, self.rpStockBid.ix[:]]).reset_index(drop=True)
|
||||
|
||||
# 행 내에 표시할 데이터 - 컬럼 순
|
||||
datas = [self.item.time, self.item.cur, self.item.diff, self.item.offer[0], self.item.bid[0],
|
||||
self.item.vol, sellvol, buyvol, self.item.volstr]
|
||||
self.ui.tableStockBid.insertRow(0)
|
||||
for col in range(len(datas)):
|
||||
val = ''
|
||||
if col == 0: # 시각
|
||||
# 155925 ==> 15:59:25
|
||||
hh = int(datas[col] / 10000)
|
||||
mm = int(datas[col] - (hh * 10000))
|
||||
ss = mm % 100
|
||||
mm = mm / 100
|
||||
val = '%02d:%02d:%02d' % (hh, mm, ss)
|
||||
elif col == 6: # 체결매도
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
elif col == 7: # 체결매수
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
elif col == 8: # 체결강도
|
||||
val = locale.format('%.2f', datas[col], 1)
|
||||
else: # 기타
|
||||
val = locale.format('%d', datas[col], 1)
|
||||
|
||||
item = QTableWidgetItem(val)
|
||||
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
|
||||
self.ui.tableStockBid.setItem(0, col, item)
|
||||
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
w = Form()
|
||||
sys.exit(app.exec())
|
||||
23
hts/Util.py
Normal file
23
hts/Util.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
class Util:
|
||||
|
||||
def analyze(self):
|
||||
data = pd.read_csv("data_s.csv")
|
||||
y_value = data.종가
|
||||
|
||||
max20 = y_value.rolling(window=20).mean()
|
||||
stddev = y_value.rolling(window=20).std()
|
||||
upper = max20 + (stddev * 2) # 상단 볼리저 밴드
|
||||
lower = max20 - (stddev * 2) # 하단 볼리저 밴드
|
||||
middle = (upper + lower) / 2 # 중심
|
||||
|
||||
x_value = [i for i in range(len(y_value))]
|
||||
plt.plot(x_value, y_value.tolist(), x_value, upper.tolist(), x_value, lower.tolist(), x_value, middle.tolist())
|
||||
plt.show()
|
||||
return
|
||||
|
||||
if __name__ == "__main__":
|
||||
util = Util()
|
||||
util.analyze()
|
||||
2857
hts/data_s.csv
Normal file
2857
hts/data_s.csv
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user