diff --git a/HTS_etf.py b/HTS_etf.py index 8011b73..e40f35d 100644 --- a/HTS_etf.py +++ b/HTS_etf.py @@ -35,17 +35,27 @@ class HTS_etf (HTS): return - def sellStocks(self): + def sellStocks(self, stock_code=None, bs_sell_price=None): jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: for code in jangoDic: - if jangoDic[code]['매도가능'] > 0: - if 2 < jangoDic[code]['평가손익']: - currentStock = self.currentStock(code[1:]) - self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close']) - self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능']) + if stock_code is not None: + if code == "A"+stock_code and bs_sell_price is not None: + if jangoDic[code]['매도가능'] > 0: + if 2 < jangoDic[code]['평가손익']: + self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price) + self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", bs_sell_price, jangoDic[code]['매도가능']) + else: + continue + else: + if jangoDic[code]['매도가능'] > 0: + if 2 < jangoDic[code]['평가손익']: + currentStock = self.currentStock(code[1:]) + self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close']) + self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능']) return + def getSellingPrice(self, log_time, stock_code, final_price, without_loss=False): # final_price와 diff를 받으면, 해당 가격으로 그냥 매도한다는 의미 # final_price와 diff가 None이면 장부가와 final 중 max로 팔겠다는 의미 @@ -69,6 +79,7 @@ class HTS_etf (HTS): return orderNum, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price return orderNum, None, None, None + def makeTickData(self, data, mins=30): result = {"check": set(), "time": [], @@ -117,7 +128,7 @@ 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() + ###self.sellStocks() for stock in stocks: @@ -154,7 +165,7 @@ class HTS_etf (HTS): if len(orderListToCancel) > 0: self.cancelOrderList(orderListToCancel) - if bs_buy_price > 0: + if bs_buy_price > 1000: if not self.orderChecker.exist(today, "A" + stock['stock_code'], hours=9): buy_count = self.getCount(stock['stock_code'], bs_buy_price, data) @@ -171,11 +182,22 @@ 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 > 1000: + self.sellStocks(stock['stock_code'], bs_sell_price) + + # slackbot에 메시지를 보냄 + self.slackBot.post_to_slack(stock['stock_code'], stock['stock_name'], "SELL", bs_sell_price, 'ALL') + + # 로그 출력 + print("SELL", THIS_TIME.strftime('%Y%m%d %H%M%S'), stock['stock_code'], stock['stock_name'], bs_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], data["open"][0], data["high"][0], data["low"][0], data["slow_k"][0], data_5["slow_k"][0], data_30["slow_k"][0])) + """ 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분 사이는 잔량을 매도한다. @@ -199,7 +221,8 @@ class HTS_etf (HTS): print("SELL", sell_time, stock['stock_code'], stock['stock_name'], final_price, str(orderNum), jango, sell_price) final_sell_check = True - + """ + time.sleep(10) THIS_TIME = datetime.now() diff --git a/HTS_stocks.py b/HTS_stocks.py index dada155..47ef281 100644 --- a/HTS_stocks.py +++ b/HTS_stocks.py @@ -54,15 +54,24 @@ class HTS_Stocks (HTS): self.conn_stock.close() return - def sellStocks(self): + def sellStocks(self, stock_code=None, bs_sell_price=None): jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: for code in jangoDic: - if jangoDic[code]['매도가능'] > 0: - if 2 < jangoDic[code]['평가손익']: - currentStock = self.currentStock(code[1:]) - self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close']) - self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능']) + if stock_code is not None: + if code == "A"+stock_code and bs_sell_price is not None: + if jangoDic[code]['매도가능'] > 0: + if 2 < jangoDic[code]['평가손익']: + self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], bs_sell_price) + self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", bs_sell_price, jangoDic[code]['매도가능']) + else: + continue + else: + if jangoDic[code]['매도가능'] > 0: + if 2 < jangoDic[code]['평가손익']: + currentStock = self.currentStock(code[1:]) + self.requestOrder(OrderType.sell, code[1:], jangoDic[code]['매도가능'], currentStock['close']) + self.slackBot.post_to_slack(code, jangoDic[code]['종목명'], "SELL", currentStock['close'], jangoDic[code]['매도가능']) return def getSellingPrice(self, log_time, stock_code, final_price, without_loss=False): @@ -119,7 +128,7 @@ class HTS_Stocks (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() + ###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: @@ -179,6 +188,17 @@ 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) > 10 and max(bsLine['sell'][len(bsLine['sell']) - 1:]) > 1000: + bs_sell_price = bsLine['sell'][len(bsLine['sell']) - 1] + self.sellStocks(stock_code, bs_sell_price) + + # slackbot에 메시지를 보냄 + self.slackBot.post_to_slack(stock_code, stock_name, "SELL", bsLine['sell'][len(bsLine['sell']) - 1], 'ALL') + + # 로그 출력 + print("SELL", THIS_TIME.strftime('%Y%m%d %H%M%S'), stock_code, stock_name, bs_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분 사이는 잔량을 매도한다. @@ -199,7 +219,7 @@ class HTS_Stocks (HTS): orderNum, sell_time, jango, sell_price = self.getSellingPrice(THIS_TIME, stock_code, final_price=-1, without_loss=True) # 로그 출력 print("SELL", sell_time, stock_code, stock_name, -1, str(orderNum), jango, sell_price) - + """ time.sleep(10) THIS_TIME = datetime.now() diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 320d53d..be1bd48 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -1110,7 +1110,7 @@ class BuySellChecker: data['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 5.0 - + """ check = True for l in range(i - 3, i): if ( @@ -1129,6 +1129,7 @@ class BuySellChecker: data['buy'][i] = buy bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 5.0 + """ if (data['disparity'][i] < 5 and 99.0 < data['disparity_avg60'][i] < 99.1 and -0.009 < data['gradients_avg60'][i] < -0.008 and 0.015 < data['gradients_avg20'][i] < 0.016 and @@ -1195,6 +1196,23 @@ class BuySellChecker: bsLine['buy'][i] = buy bsLine['buy_weight'][i] = 10.0 + + if data['slow_k'][i] > 90: + if (data['slow_d'][i-1] < data['slow_k'][i-1] and data['slow_k'][i] < data['slow_d'][i]): + sell = data['low'][i] + weight = 100 + data['sell'][i] = sell + bsLine['sell'][i] = sell + bsLine['sell_weight'][i] = weight + + if data['slow_k'][i] > 95: + if data['slow_k'][i] < data['slow_d'][i]: + sell = data['low'][i] + weight = 100 + data['sell'][i] = sell + bsLine['sell'][i] = sell + bsLine['sell_weight'][i] = weight + return bsLine, data def checkTransactionWithEnvelope(self, data, stock_code, analyzed_day, isRealTime=False): diff --git a/stock/analysis/StockStatus.py b/stock/analysis/StockStatus.py index 15741fc..01d1789 100644 --- a/stock/analysis/StockStatus.py +++ b/stock/analysis/StockStatus.py @@ -575,7 +575,7 @@ class StockStatus (HTS): dir_name = os.path.join(outPath, "99_daily_auto_trading") if os.path.isdir(dir_name): - os.rmdir(dir_name) + shutil.rmtree(dir_name) os.mkdir(dir_name) today = datetime.today().strftime('%Y%m%d') diff --git a/stock/util/SlackBot.py b/stock/util/SlackBot.py index b0c54e3..93c331f 100644 --- a/stock/util/SlackBot.py +++ b/stock/util/SlackBot.py @@ -18,9 +18,7 @@ class SlackBot: def post_to_slack(self, stock_code, stock_name, type, price, count): try: this_time = datetime.now() - text = "DATE TIME:" + this_time.strftime( - '%Y-%m-%d %H:%M:%S') + ", " + "stock_code:" + stock_code + ", " + "stock_name:" + stock_name + ", " + "type:" + type + ", " + "price:" + str( - price) + ", " + "count:" + str(count) + text = "DATE TIME:" + this_time.strftime('%Y-%m-%d %H:%M:%S') + ", " + "stock_code:" + stock_code + ", " + "stock_name:" + stock_name + ", " + "type:" + type + ", " + "price:" + str(price) + ", " + "count:" + str(count) result = self.client.chat_postMessage( channel=self.CHANNEL_ID, text=text