From 6f7ccbb7e3fc62efab52016da91d3dbcd4fb6390 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sun, 27 Aug 2023 21:54:58 +0900 Subject: [PATCH] init --- HTS_Alert.py | 191 +++++++-------------------------------------------- 1 file changed, 26 insertions(+), 165 deletions(-) diff --git a/HTS_Alert.py b/HTS_Alert.py index 5654a68..3584634 100644 --- a/HTS_Alert.py +++ b/HTS_Alert.py @@ -1,185 +1,46 @@ -import re -import os import time -import math -import sqlite3 +import requests +from bs4 import BeautifulSoup from datetime import datetime - -from hts.HTS import HTS -from hts.OrderType import OrderType - -from hts.BuySellChecker import BuySellChecker -from hts.OrderChecker import OrderChecker from stock.util.SlackBot import SlackBot -from stock.analysis.StockStatus import StockStatus -class HTS_Stocks (HTS): - - RESOURCE_PATH = None - orderChecker = None - buySellChecker = None - labelChecker = None +class HTS_Alert : slackBot = None - stockStatus = None - analyzed_day = None - MAX_BUY_PRICE = None - conn_stock = None - cursor_stock = None - - def __init__(self, RESOURCE_PATH): - super().__init__(RESOURCE_PATH) + def __init__(self): self.slackBot = SlackBot() - - self.RESOURCE_PATH = RESOURCE_PATH - self.stockStatus = StockStatus(RESOURCE_PATH) - - self.buySellChecker = BuySellChecker() - self.orderChecker = OrderChecker(self.RESOURCE_PATH, "STOCK") - - self.analyzed_day = 120 - self.MAX_BUY_PRICE = 300000 - return - def connect2StockDB(self): + def checkPrice(self, code): + code_index = 0 + PERCENT = ["40%", "30%", "30%"] + CHECK_PRICE = [2670, 2620, 2580] - self.conn_stock = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "resources/stock.db")) - self.cursor_stock = self.conn_stock.cursor() - - return - - def disconnectStockDB(self): - - self.cursor_stock.close() - self.conn_stock.close() - return - - def getCompanyInfo(self, today_stock): - - self.cursor_stock.execute('SELECT distinct code, name FROM stock order by code') - all_stocks = self.cursor_stock.fetchall() - - valid_company = dict() - self.cursor_stock.execute('select CODE, NAME, max(ymd) as ymd from fnguide where type != "E" and sales > 0 group by 1 order by sales desc') - items = self.cursor_stock.fetchall() - for i, item in enumerate(items): - if item[0] in today_stock: - valid_company[item[0]] = i - - return all_stocks, valid_company - - def buyRealTime(self, today, n = 200): - print ("START...") THIS_TIME = datetime.now() + today = datetime.today().strftime('%Y%m%d') + while datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): + url = 'https://finance.naver.com/item/main.naver?code={code}'.format(code=code.strip()) + res = requests.get(url) - today_stock = self.get_today_stock() - all_stocks, valid_company = self.getCompanyInfo(today_stock) + html = res.text + soup = BeautifulSoup(html, 'html.parser') + post = soup.select_one('#chart_area > .rate_info > .today > .no_today > em') + arr = post.text.split("\n") + c_price = int(arr[1].replace(',', '')) - while datetime.strptime(today + " 070000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100", '%Y%m%d %H%M%S'): + if c_price < CHECK_PRICE[code_index]: + self.slackBot.sendMsg(code + " " + str(CHECK_PRICE[code_index]) + " " + PERCENT[code_index] + "를 파세요...") + code_index += 1 - # 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 - - time.sleep(0.1) - - stock_code = item[0] - stock_name = item[1] - if (stock_code not in valid_company): - continue - - print("%5d: %8s, %-50s" % (idx, stock_code, stock_name)) - - stock = self.stockStatus.fetchLastData(self.cursor_stock, stock_code, n) - try: - self.getRealTime_DailyCheck(today, stock_code, stock) - data = self.stockStatus.analyze(stock, self.analyzed_day) - except: - print("#ERROR:", stock_code, stock_name) - continue - - # 분석일 데이터만 활용한다 (이전 데이터는 제거) - data.drop(data.index[:len(data) - self.analyzed_day], inplace=True) - - bs_buy_price = data["close"][len(data["close"]) - 1] - - # 미체결 기록을 가져와서 10분 이상 된 매수 주문을 취소 한다. - ORDER_LIST = self.requestOrderList() - orderListToCancel = self.orderChecker.cancel(today, "A" + stock_code, ORDER_LIST, mins=10) - if len(orderListToCancel) > 0: - self.cancelOrderList(orderListToCancel) - - # 다음 조건이면 매수한다. - if bs_buy_price > 1000: - - if not self.orderChecker.exist(today, "A" + stock_code, hours=5): - buy_count = int(self.MAX_BUY_PRICE / bs_buy_price) - - if buy_count > 0: - - # 매수를 주문한다. - orderNum = self.requestOrder(OrderType.buy, stock_code, buy_count, bs_buy_price) - self.orderChecker.buy(today, "A" + stock_code, buy_count, bs_buy_price, orderNum) - - # slackbot에 메시지를 보냄 - self.slackBot.post_to_slack(stock_code, stock_name, "BUY", bs_buy_price, buy_count) - - # 로그 출력 - print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count) - - time.sleep(3600) - THIS_TIME = datetime.now() + if code_index > 2: + break + time.sleep(5) return - def updteTodayStock(self, db_filename, stock_code, today_str): - bsLine, data = self.labelChecker.makeCandidate(stock_code, today_str) - self.labelChecker.updateLabel(db_filename, stock_code, bsLine, data, today_str) - return - - def get_today_stock(self): - today_stock = set() - today_stock.add("311320") - today_stock.add("311390") - today_stock.add("290380") - today_stock.add("333430") - today_stock.add("200350") - today_stock.add("009410") - today_stock.add("053950") - today_stock.add("027710") - today_stock.add("246690") - today_stock.add("096530") - today_stock.add("201490") - today_stock.add("008420") - today_stock.add("302550") - today_stock.add("039240") - today_stock.add("377330") - today_stock.add("025550") - today_stock.add("006340") - today_stock.add("001440") - return today_stock - if __name__ == "__main__": - today = datetime.today() + hTS_Alert = HTS_Alert() - PROJECT_HOME = os.getcwd() - RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources") + post = hTS_Alert.checkPrice('252670') - hts = HTS_Stocks(RESOURCE_PATH) - hts.connect2DB("hts.db") - hts.connect2StockDB() - - today_str = today.strftime('%Y%m%d') - hts.buyRealTime(today_str) - - hts.disconnectStockDB() - hts.disconnect() - - print ("done...") + print ("done...") \ No newline at end of file