From 9e7c48f6e6183d21c5d4daf904108c908410b373 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Tue, 12 Oct 2021 12:40:59 +0900 Subject: [PATCH] init --- hts/HTS.py | 131 ++++++++++++++++++++++++++++------------------------- 1 file changed, 70 insertions(+), 61 deletions(-) diff --git a/hts/HTS.py b/hts/HTS.py index a3d73f5..0344096 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -301,52 +301,58 @@ class HTS: acc = objTrade.AccountNumber[0] # 계좌번호 accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 - objResult = win32com.client.Dispatch("CpTrade.CpTd9065") + objResult = win32com.client.Dispatch("CpTrade.CpTd5339") objResult.SetInputValue(0, acc) # 계좌번호 objResult.SetInputValue(1, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 - objResult.SetInputValue(2, 20) + objResult.SetInputValue(4, "0") # 전체 + objResult.SetInputValue(5, "1") # 정렬 기준 - 역순 + objResult.SetInputValue(6, "0") # 전체 + objResult.SetInputValue(7, 20) # 요청개수 - 최대 20개 while True: - objResult.BlockRequest() + ret = objResult.BlockRequest() if objResult.GetDibStatus() != 0: print("통신상태", objResult.GetDibStatus(), objResult.GetDibMsg1()) return False - cnt = objResult.GetHeaderValue(4) + if (ret == 2 or ret == 3): + print("통신 오류", ret) + return False; + + # 통신 초과 요청 방지에 의한 요류 인 경우 + while (ret == 4): # 연속 주문 오류 임. 이 경우는 남은 시간동안 반드시 대기해야 함. + time.sleep(1) + ret = objResult.BlockRequest() + + # 수신 개수 + cnt = objResult.GetHeaderValue(5) + print("[Cp5339] 수신 개수 ", cnt) if cnt == 0: break for i in range(cnt): - i1 = objResult.GetDataValue(1, i) # 주문구분(매수 또는 매도) - i2 = objResult.GetDataValue(2, i) # 코드 - i3 = objResult.GetDataValue(3, i) # 주문 수량 - i4 = objResult.GetDataValue(4, i) # 주문호가구분 - i5 = objResult.GetDataValue(6, i) # 예약번호 - i6 = objResult.GetDataValue(12, i) # 처리구분내용 - 주문취소 또는 주문예정 - i7 = objResult.GetDataValue(9, i) # 주문단가 - i8 = objResult.GetDataValue(11, i) # 주문번호 - i9 = objResult.GetDataValue(12, i) # 처리구분코드 - i10 = objResult.GetDataValue(13, i) # 거부코드 - i11 = objResult.GetDataValue(14, i) # 거부내용 - print(i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11) + item = orderData() + item.orderNum = objResult.GetDataValue(1, i) + item.orderPrev = objResult.GetDataValue(2, i) + item.code = objResult.GetDataValue(3, i) # 종목코드 + item.name = objResult.GetDataValue(4, i) # 종목명 + item.orderDesc = objResult.GetDataValue(5, i) # 주문구분내용 + item.amount = objResult.GetDataValue(6, i) # 주문수량 + item.price = objResult.GetDataValue(7, i) # 주문단가 + item.ContAmount = objResult.GetDataValue(8, i) # 체결수량 + item.credit = objResult.GetDataValue(9, i) # 신용구분 + item.modAvali = objResult.GetDataValue(11, i) # 정정취소 가능수량 + item.buysell = objResult.GetDataValue(13, i) # 매매구분코드 + item.creditdate = objResult.GetDataValue(17, i) # 대출일 + item.orderFlagDesc = objResult.GetDataValue(19, i) # 주문호가구분코드내용 + item.orderFlag = objResult.GetDataValue(21, i) # 주문호가구분코드 - # 미체결 - if (i6 == "주문예정"): - item = orderData() - item.orderNum = i5 - if (i1 == "매수"): - item.bs = EorderBS.buy - else: - item.bs = EorderBS.sell - item.code = i2 - item.amount = i3 - item.price = i7 - - orderList.append(item) + orderList.append(item) # 연속 처리 체크 - 다음 데이터가 없으면 중지 - if objResult.Continue == False: - break + if objResult.Continue == False: + print("[Cp5339] 연속 조회 여부: 다음 데이터가 없음") + break return orderList @@ -366,22 +372,31 @@ class HTS: acc = objTrade.AccountNumber[0] # 계좌번호 accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분 - objCancel = win32com.client.Dispatch("CpTrade.CpTdNew9064") + objCancelOrder = win32com.client.Dispatch("CpTrade.CpTd0314") # 취소 + onums = [] + codes = [] + amounts = [] for item in orderList: - objCancel.SetInputValue(0, item.orderNum) - objCancel.SetInputValue(1, acc) - objCancel.SetInputValue(2, accFlag[0]) - objCancel.SetInputValue(3, item.code) + onums.append(item.orderNum) + codes.append(item.code) + amounts.append(item.amount) - # 예약 취소 주문 요청 - objCancel.BlockRequest() + for i in range(len(onums)): + ordernum = onums[i] + code = codes[i] + amount = amounts[i] + objCancelOrder.SetInputValue(1, ordernum) # 원주문 번호 - 정정을 하려는 주문 번호 + objCancelOrder.SetInputValue(2, acc) # 상품구분 - 주식 상품 중 첫번째 + objCancelOrder.SetInputValue(3, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째 + objCancelOrder.SetInputValue(4, code) # 종목코드 + objCancelOrder.SetInputValue(5, amount) # 정정 수량, 0 이면 잔량 취소임 - if objCancel.GetDibStatus() != 0: - print("예약 취소 실패") - return False - - print("예약주문 취소 ", item.orderNum, objCancel.GetDibMsg1()) + # 취소주문 요청 + ret = objCancelOrder.BlockRequest() + print("[CpRPOrder/BlockRequestCancel] 주문결과", objCancelOrder.GetDibStatus(), objCancelOrder.GetDibMsg1()) + if objCancelOrder.GetDibStatus() != 0: + break return @@ -993,6 +1008,7 @@ class HTS: final_price = 0 print ("START...") while datetime.strptime(given_day + " 070000", '%Y%m%d %H%M%S') < datetime.now() < datetime.strptime(given_day + " 15200", '%Y%m%d %H%M%S'): + second = datetime.now().strftime('%Y%m%d %H%M%S') if datetime.strptime(given_day + " 085900", '%Y%m%d %H%M%S') < datetime.now() < datetime.strptime(given_day + " 151500", '%Y%m%d %H%M%S'): @@ -1037,6 +1053,9 @@ class HTS: logFp.flush() if bs_sell_price > 0: + # 매도 전에 모든 미체결을 취소한다. + self.cancelOrderList() + # 잔고 모든 항목을 매도한다. jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: for code in jangoDic: @@ -1050,24 +1069,16 @@ class HTS: logFp.write("%s,%s,\n" % ("NONE", second)) logFp.flush() - if datetime.strptime(given_day + " 151501", '%Y%m%d %H%M%S') < datetime.now(): - break + if datetime.strptime(given_day + " 151500", '%Y%m%d %H%M%S') < datetime.now(): # 15:15:00 이후라면 모든 매수/매도 주문 취소하고 현재가-5원으로 매도한다. - #####self.cancelOrderList() + self.cancelOrderList() # 만약 잔고가 있으면 장부가보다 5원 높게 매도한다. - #####jangoDic = self.requstJango() - #####if jangoDic and len(jangoDic.keys()) > 0: - #####for code in jangoDic: - #####if jangoDic[code]['매도가능'] > 0: - # 데이터를 가지고 온다. - #####self.getRealTime(stock_code, given_day, result) - # 분석을 통해서 볼린저밴드 상/하단을 계산한다. - #####data, _, _ = self.analyze(result) - #####final_price = data["Close"][len(data["Close"]) - 1] - 5 - #####orderNum = self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], final_price) - #####time.sleep(5) - """ + jangoDic = self.requstJango() + if jangoDic and len(jangoDic.keys()) > 0: + for code in jangoDic: + if jangoDic[code]['매도가능'] > 0: + if final_price > jangoDic[code]['장부가'] + 5: orderNum = self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], final_price) else: @@ -1084,9 +1095,7 @@ class HTS: else: # 장부가의 마지막 자리수가 7,8,9 라면 (2097, 2098, 2099 -> 2105 에 매도) orderNum = self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], sell_price + 15) - """ - #####else: - #####break + time.sleep(0.9)