diff --git a/hts/HTS.py b/hts/HTS.py new file mode 100644 index 0000000..1e714bb --- /dev/null +++ b/hts/HTS.py @@ -0,0 +1,211 @@ +import win32com.client + +class HTS: + + objCpCybos = None + objCpCodeMgr = None + + def __init__(self): + self.connect() + return + + def connect(self): + # 연결 여부 체크 + self.objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") + bConnect = self.objCpCybos.IsConnect + if (bConnect == 0): + print("PLUS가 정상적으로 연결되지 않음. ") + exit() + return + + def all_stocks(self): + # 종목코드 리스트 구하기 + self.objCpCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr") + codeList = self.objCpCodeMgr.GetStockListByMarket(1) # 거래소 + codeList2 = self.objCpCodeMgr.GetStockListByMarket(2) # 코스닥 + + print("거래소 종목코드", len(codeList)) + for i, code in enumerate(codeList): + secondCode = self.objCpCodeMgr.GetStockSectionKind(code) + name = self.objCpCodeMgr.CodeToName(code) + stdPrice = self.objCpCodeMgr.GetStockStdPrice(code) + print(i, code, secondCode, stdPrice, name) + + print("코스닥 종목코드", len(codeList2)) + for i, code in enumerate(codeList2): + secondCode = self.objCpCodeMgr.GetStockSectionKind(code) + name = self.objCpCodeMgr.CodeToName(code) + stdPrice = self.objCpCodeMgr.GetStockStdPrice(code) + print(i, code, secondCode, stdPrice, name) + + print("거래소 + 코스닥 종목코드 ", len(codeList) + len(codeList2)) + return + + # 차트 데이터 구하기 + def getChartData(self, stock_code): + # 차트 객체 구하기 + objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") + + objStockChart.SetInputValue(0, 'A'+stock_code) # 종목 코드 - 삼성전자 + objStockChart.SetInputValue(1, ord('2')) # 개수로 조회 + objStockChart.SetInputValue(4, 100) # 최근 100일 치 + objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8]) # 날짜,시가,고가,저가,종가,거래량 + objStockChart.SetInputValue(6, ord('D')) # '차트 주가 - 일간 차트 요청 + objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 + objStockChart.BlockRequest() + + len = objStockChart.GetHeaderValue(3) + + print("날짜", "시가", "고가", "저가", "종가", "거래량") + print("빼기빼기==============================================-") + + for i in range(len): + day = objStockChart.GetDataValue(0, i) + open = objStockChart.GetDataValue(1, i) + high = objStockChart.GetDataValue(2, i) + low = objStockChart.GetDataValue(3, i) + close = objStockChart.GetDataValue(4, i) + vol = objStockChart.GetDataValue(5, i) + print(day, open, high, low, close, vol) + + return + + # 주식 현재가 조회 + def currentStock(self, stock_code): + # 현재가 객체 구하기 + self.objStockMst = win32com.client.Dispatch("DsCbo1.StockMst") + self.objStockMst.SetInputValue(0, 'A'+stock_code) # 종목 코드 - 삼성전자 + self.objStockMst.BlockRequest() + + # 현재가 통신 및 통신 에러 처리 + rqStatus = self.objStockMst.GetDibStatus() + rqRet = self.objStockMst.GetDibMsg1() + print("통신상태", rqStatus, rqRet) + if rqStatus != 0: + exit() + + # 현재가 정보 조회 + code = self.objStockMst.GetHeaderValue(0) # 종목코드 + name = self.objStockMst.GetHeaderValue(1) # 종목명 + time = self.objStockMst.GetHeaderValue(4) # 시간 + cprice = self.objStockMst.GetHeaderValue(11) # 종가 + diff = self.objStockMst.GetHeaderValue(12) # 대비 + open = self.objStockMst.GetHeaderValue(13) # 시가 + high = self.objStockMst.GetHeaderValue(14) # 고가 + low = self.objStockMst.GetHeaderValue(15) # 저가 + offer = self.objStockMst.GetHeaderValue(16) # 매도호가 + bid = self.objStockMst.GetHeaderValue(17) # 매수호가 + vol = self.objStockMst.GetHeaderValue(18) # 거래량 + vol_value = self.objStockMst.GetHeaderValue(19) # 거래대금 + + # 예상 체결관련 정보 + exFlag = self.objStockMst.GetHeaderValue(58) # 예상체결가 구분 플래그 + exPrice = self.objStockMst.GetHeaderValue(55) # 예상체결가 + exDiff = self.objStockMst.GetHeaderValue(56) # 예상체결가 전일대비 + exVol = self.objStockMst.GetHeaderValue(57) # 예상체결수량 + + print("코드", code) + print("이름", name) + print("시간", time) + print("종가", cprice) + print("대비", diff) + print("시가", open) + print("고가", high) + print("저가", low) + print("매도호가", offer) + print("매수호가", bid) + print("거래량", vol) + print("거래대금", vol_value) + + if (exFlag == ord('0')): + print("장 구분값: 동시호가와 장중 이외의 시간") + elif (exFlag == ord('1')): + print("장 구분값: 동시호가 시간") + elif (exFlag == ord('2')): + print("장 구분값: 장중 또는 장종료") + + print("예상체결가 대비 수량") + print("예상체결가", exPrice) + print("예상체결가 대비", exDiff) + print("예상체결수량", exVol) + + return + + # 주식 현금 매수주문 + def orderToBuy(self, stock_code): + # 주문 초기화 + objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") + initCheck = objTrade.TradeInit(0) + if (initCheck != 0): + print("주문 초기화 실패") + exit() + + # 주식 매수 주문 + acc = objTrade.AccountNumber[0] # 계좌번호 + accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 + print(acc, accFlag[0]) + objStockOrder = win32com.client.Dispatch("CpTrade.CpTd0311") + objStockOrder.SetInputValue(0, "2") # 2: 매수 + objStockOrder.SetInputValue(1, acc) # 계좌번호 + objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 + objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드 + objStockOrder.SetInputValue(4, 10) # 매수수량 10주 + objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100원 + objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK + objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통 + + # 매수 주문 요청 + objStockOrder.BlockRequest() + + rqStatus = objStockOrder.GetDibStatus() + rqRet = objStockOrder.GetDibMsg1() + print("통신상태", rqStatus, rqRet) + if rqStatus != 0: + exit() + + return + + # 주식 현금 매수주문 + def orderToSell(self, stock_code): + # 주문 초기화 + objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil") + initCheck = objTrade.TradeInit(0) + if (initCheck != 0): + print("주문 초기화 실패") + exit() + + # 주식 매도 주문 + acc = objTrade.AccountNumber[0] # 계좌번호 + accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 + print(acc, accFlag[0]) + objStockOrder = win32com.client.Dispatch("CpTrade.CpTd0311") + objStockOrder.SetInputValue(0, "1") # 1: 매도 + objStockOrder.SetInputValue(1, acc) # 계좌번호 + objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 + objStockOrder.SetInputValue(3, "A"+stock_code) # 종목코드 - A003540 - 대신증권 종목 + objStockOrder.SetInputValue(4, 10) # 매도수량 10주 + objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100원 + objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK + objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통 + + # 매도 주문 요청 + objStockOrder.BlockRequest() + + rqStatus = objStockOrder.GetDibStatus() + rqRet = objStockOrder.GetDibMsg1() + print("통신상태", rqStatus, rqRet) + if rqStatus != 0: + exit() + + return + + +if __name__ == "__main__": + hts = HTS() + #hts.all_stocks() + + fileName = "%s/%d__p(%.2f)__b(%.2f)__s(%.2f)__%s__%d__%s_%s.html" % (fileName, isbuy, positionalEnergy, bolingerband_score, stochastic_score, state, buy_price,item_name.replace(" ", ""), item_code) + + stock_code = "094860" + hts.currentStock(stock_code) + print ("done...") \ No newline at end of file