From 40c479b000e8d7c62b7e882c9cc8740e99ab3ce5 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Wed, 8 Feb 2023 20:02:34 +0900 Subject: [PATCH] init --- HTS_etf.py | 26 +++++++++++++------------- HTS_stocks.py | 39 ++++++++++++++++----------------------- hts/HTS.py | 4 ++-- 3 files changed, 31 insertions(+), 38 deletions(-) diff --git a/HTS_etf.py b/HTS_etf.py index 99f7721..19410f8 100644 --- a/HTS_etf.py +++ b/HTS_etf.py @@ -35,6 +35,16 @@ class HTS_etf (HTS): return + def sellStocks(self): + jangoDic = self.requstJango() + if jangoDic and len(jangoDic.keys()) > 0: + for code in jangoDic: + if jangoDic[code]['매도가능'] > 0: + if jangoDic[code]['평가금액'] - jangoDic[code]['장부가'] > jangoDic[code]['장부가'] * 0.02: + self.requestOrder(OrderType.sell, code, jangoDic[code]['매도가능'], jangoDic[code]['평가금액']) + self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", jangoDic[code]['평가금액'], jangoDic[code]['매도가능']) + return + def getSellingPrice(self, log_time, stock_code, final_price, without_loss=False): # final_price와 diff를 받으면, 해당 가격으로 그냥 매도한다는 의미 # final_price와 diff가 None이면 장부가와 final 중 max로 팔겠다는 의미 @@ -105,6 +115,9 @@ class HTS_etf (HTS): if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): + # 매도를 체크한다. + self.sellStocks() + for stock in stocks: time.sleep(0.1) @@ -157,19 +170,6 @@ class HTS_etf (HTS): # 로그 출력 print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock['stock_code'], stock['stock_name'], bs_buy_price, buy_count) - - if bs_sell_price > 0: - # 매도한다. - orderNum, sell_time, jango, sell_price = self.getSellingPrice(THIS_TIME, stock['stock_code'], bs_sell_price, without_loss=True) - if orderNum is not None: - self.orderChecker.sell(today, "A" + stock['stock_code']) - - # slackbot에 메시지를 보냄 - self.slackBot.post_to_slack(stock['stock_code'], stock['stock_name'], "SELL", bsLine['sell'][len(bsLine['sell']) - 1], -1) - - # 로그 출력 - print("SELL", sell_time, stock['stock_code'], stock['stock_name'], bs_sell_price, str(orderNum), jango, sell_price) - # 로그 출력 print("TIMECHECK: %s, code: %s, name: %s, buy: %d, sell: %d, avg5: %.2f, avg30: %.2f, open: %d, high: %d, low: %d, slow_k: %.2f, slow_k_5: %.2f, slow_k_30: %.2f" % (str(THIS_TIME), stock['stock_code'], stock['stock_name'], bs_buy_price, bs_sell_price, data["avg5"][0], data["avg30"][0], diff --git a/HTS_stocks.py b/HTS_stocks.py index 103b196..3f64ec9 100644 --- a/HTS_stocks.py +++ b/HTS_stocks.py @@ -54,12 +54,21 @@ class HTS_Stocks (HTS): self.conn_stock.close() return + def sellStocks(self): + jangoDic = self.requstJango() + if jangoDic and len(jangoDic.keys()) > 0: + for code in jangoDic: + if jangoDic[code]['매도가능'] > 0: + if jangoDic[code]['평가금액'] - jangoDic[code]['장부가'] > jangoDic[code]['장부가'] * 0.02: + self.requestOrder(OrderType.sell, code, jangoDic[code]['매도가능'], jangoDic[code]['평가금액']) + self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", jangoDic[code]['평가금액'], jangoDic[code]['매도가능']) + return + def getSellingPrice(self, log_time, stock_code, final_price, without_loss=False): # final_price와 diff를 받으면, 해당 가격으로 그냥 매도한다는 의미 # final_price와 diff가 None이면 장부가와 final 중 max로 팔겠다는 의미 # final_price가 0이고 diff가 None이면 장부가로 팔겠다는 의미임 - sell_price = -1 orderNum = None jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: @@ -67,11 +76,9 @@ class HTS_Stocks (HTS): if code == "A" + stock_code: if jangoDic[code]['매도가능'] > 0: if without_loss: - if jangoDic[code]['장부가']*0.02 < jangoDic[code]['장부가'] - final_price: - sell_price = jangoDic[code]['장부가'] - - orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price) - return orderNum, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price + if final_price - jangoDic[code]['장부가'] > jangoDic[code]['장부가']*0.02: + orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], final_price) + return orderNum, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], final_price else: #max_price = max(jangoDic[code]['장부가'], final_price) # 10% 이상 수익이어야 매도한다. @@ -110,6 +117,9 @@ class HTS_Stocks (HTS): # 1515 까지만 매수를 시도한다. if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): + # 매도를 체크한다. + self.sellStocks() + for idx, item in enumerate(all_stocks): if THIS_TIME < datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') or datetime.strptime(today + " 151500", '%Y%m%d %H%M%S') < THIS_TIME: break @@ -168,23 +178,6 @@ class HTS_Stocks (HTS): # 로그 출력 print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count) - # 다음 조건이면 매도한다. - if len(data.index) > 10 and max(bsLine['sell'][len(bsLine['sell']) - 1:]) > 0: - - last_index = len(bsLine['sell']) - 1 - if bsLine['sell'][last_index] > 0: - - bs_sell_price = bsLine['sell'][last_index] - orderNum, sell_time, jango, sell_price = self.getSellingPrice(THIS_TIME, stock_code, bs_sell_price, without_loss=True) - if orderNum is not None: - self.orderChecker.sell(today, "A" + stock_code) - - # slackbot에 메시지를 보냄 - self.slackBot.post_to_slack(stock_code, stock_name, "SELL", bsLine['sell'][len(bsLine['sell']) - 1], -1) - - # 로그 출력 - print("SELL", sell_time, stock_code, stock_name, bs_sell_price, str(orderNum), jango, sell_price) - elif datetime.strptime(today + " 151530", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151600", '%Y%m%d %H%M%S'): # 3시 15분 30초부터 3시 16분 사이는 잔량을 매도한다. diff --git a/hts/HTS.py b/hts/HTS.py index fd745c5..db6d599 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -256,8 +256,8 @@ class HTS: item['잔고수량'] = objRq.GetDataValue(7, i) # 체결잔고수량 item['매도가능'] = objRq.GetDataValue(15, i) item['장부가'] = objRq.GetDataValue(17, i) # 체결장부단가 - # item['평가금액'] = self.objRq.GetDataValue(9, i) # 평가금액(천원미만은 절사 됨) - # item['평가손익'] = self.objRq.GetDataValue(11, i) # 평가손익(천원미만은 절사 됨) + item['평가금액'] = objRq.GetDataValue(9, i) # 평가금액(천원미만은 절사 됨) + item['평가손익'] = objRq.GetDataValue(11, i) # 평가손익(천원미만은 절사 됨) # 매입금액 = 장부가 * 잔고수량 item['매입금액'] = item['장부가'] * item['잔고수량'] item['현재가'] = 0