This commit is contained in:
dsyoon
2023-08-27 21:54:58 +09:00
parent e7012c8fa3
commit 6f7ccbb7e3

View File

@@ -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...")