This commit is contained in:
dsyoon
2021-10-12 12:40:59 +09:00
parent 6448ff580f
commit 9e7c48f6e6

View File

@@ -301,51 +301,57 @@ 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)
# 미체결
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
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) # 주문호가구분코드
orderList.append(item)
# 연속 처리 체크 - 다음 데이터가 없으면 중지
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)