From c6254cbe12253453bd75f0d492301dbf282e143e Mon Sep 17 00:00:00 2001 From: dosangyoon Date: Thu, 7 Oct 2021 21:00:44 +0900 Subject: [PATCH] init --- hts/HTS.py | 174 ++++++++++++++++++++++++++-------------------- hts/HTS_5min.py | 35 +++++++--- hts/timecheck.csv | 2 + 3 files changed, 129 insertions(+), 82 deletions(-) diff --git a/hts/HTS.py b/hts/HTS.py index bd4e2d0..9913193 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -1,10 +1,10 @@ -import win32com.client +#import win32com.client import time import os from datetime import datetime, timedelta import pandas as pd from enum import Enum -#import plotly.graph_objects as go +import plotly.graph_objects as go from stockpredictor.analysis.Common import Common # enum 주문 상태 세팅용 @@ -517,16 +517,24 @@ class HTS: vol = result["vol"] close_df = pd.DataFrame(close) - avg5_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist() + avg1_list = close_df.rolling(window=1).mean().fillna(close[0]).values.tolist() + avg1 = [item[0] for item in avg1_list] + avg2_list = close_df.rolling(window=2).mean().fillna(close[0]).values.tolist() + avg2 = [item[0] for item in avg2_list] + avg5_list = close_df.rolling(window=5).mean().fillna(close[0]).values.tolist() avg5 = [item[0] for item in avg5_list] - avg20_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() + avg10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() + avg10 = [item[0] for item in avg10_list] + avg20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() avg20 = [item[0] for item in avg20_list] - avg60_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() + avg30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist() + avg30 = [item[0] for item in avg30_list] + avg40_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist() + avg40 = [item[0] for item in avg40_list] + avg50_list = close_df.rolling(window=50).mean().fillna(close[0]).values.tolist() + avg50 = [item[0] for item in avg50_list] + avg60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist() avg60 = [item[0] for item in avg60_list] - avg120_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist() - avg120 = [item[0] for item in avg120_list] - avg240_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist() - avg240 = [item[0] for item in avg240_list] upper, lower = [], [] for i in range(len(upper_df)): @@ -539,7 +547,7 @@ class HTS: point_temp = result["time"] - temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "avg5": avg5, "avg20": avg20, "avg60": avg60, "avg120": avg120, "avg240": avg240} + temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "avg1": avg1, "avg2": avg2, "avg5": avg5, "avg10": avg10, "avg20": avg20, "avg30": avg30, "avg40": avg40, "avg50": avg50, "avg60": avg60} data = pd.DataFrame(temp) df_final_time = pd.DatetimeIndex(point_temp) data.index = df_final_time @@ -556,11 +564,15 @@ class HTS: data['Low'] = pd.to_numeric(data['Low']) data['Close'] = pd.to_numeric(data['Close']) data['Volume'] = pd.to_numeric(data['Volume']) + data['avg1'] = pd.to_numeric(data['avg1']) + data['avg2'] = pd.to_numeric(data['avg2']) data['avg5'] = pd.to_numeric(data['avg5']) + data['avg10'] = pd.to_numeric(data['avg10']) data['avg20'] = pd.to_numeric(data['avg20']) + data['avg30'] = pd.to_numeric(data['avg30']) + data['avg40'] = pd.to_numeric(data['avg40']) + data['avg50'] = pd.to_numeric(data['avg50']) data['avg60'] = pd.to_numeric(data['avg60']) - data['avg120'] = pd.to_numeric(data['avg120']) - data['avg240'] = pd.to_numeric(data['avg240']) buy_colors = [] for i in range(len(buy_line)): @@ -582,17 +594,21 @@ class HTS: sell_check = go.Scatter(x=data['Date'], y=sell_line, mode='markers', name="sell", marker=dict(size=14, color=sell_colors, line_width=0)) bolinger_upper = go.Scatter(x=data['Date'], y=upper, name="upper", line_color='#8B4513') bolinger_lower = go.Scatter(x=data['Date'], y=lower, name="lower", line_color='#8B4513') - avg5 = go.Scatter(x=data['Date'], y=data['avg5'], name="avg5", line_color='#FF0000') - avg20 = go.Scatter(x=data['Date'], y=data['avg20'], name="avg20", line_color='#F43B86') - avg60 = go.Scatter(x=data['Date'], y=data['avg60'], name="avg60", line_color='#F0A500') - avg120 = go.Scatter(x=data['Date'], y=data['avg120'], name="avg120", line_color='#14279B') - avg240 = go.Scatter(x=data['Date'], y=data['avg240'], name="avg240", line_color='#000000') + avg1 = go.Scatter(x=data['Date'], y=data['avg1'], name="avg1", line_color='#FF0000') + avg2 = go.Scatter(x=data['Date'], y=data['avg2'], name="avg2", line_color='#A200FF') + avg5 = go.Scatter(x=data['Date'], y=data['avg5'], name="avg5", line_color='#0800FF') + avg10 = go.Scatter(x=data['Date'], y=data['avg10'], name="avg10", line_color='#FF7C00') + avg20 = go.Scatter(x=data['Date'], y=data['avg20'], name="avg20", line_color='#00AAFF') + avg30 = go.Scatter(x=data['Date'], y=data['avg30'], name="avg30", line_color='#FFD100') + avg40 = go.Scatter(x=data['Date'], y=data['avg40'], name="avg40", line_color='#A600FF') + avg50 = go.Scatter(x=data['Date'], y=data['avg50'], name="avg50", line_color='#FF00E0') + avg60 = go.Scatter(x=data['Date'], y=data['avg60'], name="avg60", line_color='#000000') candle_stick = go.Candlestick(x=data['Date'], open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], increasing_line_color='red', decreasing_line_color='blue') # 그래프를 그린다. - fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, avg5, avg20, avg60, avg120, avg240]) + fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, avg1, avg2, avg5, avg10, avg20, avg30, avg40, avg50, avg60]) fig.update_layout(title=stock_code + "_" + given_day) fig.show() return @@ -772,6 +788,7 @@ class HTS: bsLine['sell'] = [-1 for i in range(size)] i = size - 1 + """ status = self.checkStatus(STOCK, i) count_1 = 0 # if "GOLDEN#2_" in status: count_1 += 1 @@ -816,7 +833,12 @@ class HTS: if count_0 > 0: bsLine['buy'][i] = 0 bsLine['sell'][i] = STOCK[i]['close'] + 5 + """ + if STOCK[i]['low'] < lower[i]: + bsLine['buy'][i] = STOCK[i]['close'] - 5 + if STOCK[i]['close'] > upper[i]: + bsLine['sell'][i] = STOCK[i]['close'] + 5 return bsLine['buy'][i], bsLine['sell'][i] @@ -824,13 +846,14 @@ class HTS: size = len(data["Close"]) STOCK = [] for i in range(size): - STOCK.append({'volume': data['Volume'][i], 'close': data["Close"][i], 'open': data["Open"][i], 'high': data["High"][i], 'low': data["Low"][i], 'avg5': data["avg5"][i], 'avg20': data["avg20"][i], 'avg60': data["avg60"][i], 'avg120': data["avg120"][i], 'avg240': data["avg240"][i]}) + STOCK.append({'volume': data['Volume'][i], 'close': data["Close"][i], 'open': data["Open"][i], 'high': data["High"][i], 'low': data["Low"][i], 'avg5': data["avg2"][i], 'avg20': data["avg5"][i], 'avg60': data["avg10"][i], 'avg120': data["avg20"][i], 'avg240': data["avg30"][i]}) bsLine = {} bsLine['buy'] = [-1 for i in range(len(lower))] bsLine['sell'] = [-1 for i in range(len(lower))] for i in range(5, size-5): + """ status = self.checkStatus(STOCK, i) count_1 = 0 #if "GOLDEN#2_" in status: count_1 += 1 @@ -876,7 +899,12 @@ class HTS: # bsLine['sell'][i + 2] = STOCK[i]['close'] + 5 if data["avg60"][i - 1] > data["avg60"][i]: bsLine['sell'][i] = STOCK[i]['close'] + """ + if STOCK[i]['low'] < lower[i]: + bsLine['buy'][i] = STOCK[i]['close'] - 5 + if STOCK[i]['close'] > upper[i]: + bsLine['sell'][i] = STOCK[i]['close'] + 5 return bsLine @@ -911,7 +939,7 @@ class HTS: def buyRealTime(self, stock_code, given_day): PREVIOUS_PRICE = 0 - BUY_COUNT = 200 + BUY_COUNT = 100 TOTAL_BUY_AMT = 0 logFp = open(given_day+".log", "w") @@ -927,72 +955,67 @@ class HTS: "low": [], "vol": []} - avg60_1 = 0 - avg60_2 = 0 final_price = 0 print ("START...") - while datetime.strptime(given_day + " 083000", '%Y%m%d %H%M%S') < datetime.now() < datetime.strptime(given_day + " 151600", '%Y%m%d %H%M%S'): + while datetime.strptime(given_day + " 083000", '%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 second in timecheck and not timecheck[second]: - print("TIMECHECK", second) - logFp.write("%s,%s,\n" %("TIMECHECK", second)) - logFp.flush() + if datetime.now() < datetime.strptime(given_day + " 144000", '%Y%m%d %H%M%S'): + if second in timecheck and not timecheck[second]: + print("TIMECHECK", second) + logFp.write("%s,%s,\n" %("TIMECHECK", second)) + logFp.flush() - # 데이터를 가지고 온다. - self.getRealTime(stock_code, given_day, result) + # 데이터를 가지고 온다. + self.getRealTime(stock_code, given_day, result) - # 분석을 통해서 볼린저밴드 상/하단을 계산한다. - data, upper, lower = self.analyze(result) - avg60_2 = data['avg60'][len(data['avg60']) - 2] - avg60_1 = data['avg60'][len(data['avg60']) - 1] - final_price = data["Close"][len(data["Close"])- 1] - # 사야 할 시점/가격과 팔아야 할 시점/가격을 체크한다. - bs_buy_price, bs_sell_price = self.checkTransaction_Realtime(data, upper, lower) + # 분석을 통해서 볼린저밴드 상/하단을 계산한다. + data, upper, lower = self.analyze(result) + final_price = data["Close"][len(data["Close"])- 1] + # 사야 할 시점/가격과 팔아야 할 시점/가격을 체크한다. + bs_buy_price, bs_sell_price = self.checkTransaction_Realtime(data, upper, lower) - if bs_buy_price > 0: - if PREVIOUS_PRICE > 0: - if PREVIOUS_PRICE > bs_buy_price: - if BUY_COUNT > 240: - BUY_COUNT = 240 - if BUY_COUNT <= 140: - BUY_COUNT = 140 - BUY_COUNT += 10 - elif PREVIOUS_PRICE < bs_buy_price: - if BUY_COUNT > 250: - BUY_COUNT = 260 - if BUY_COUNT <= 150: - BUY_COUNT = 160 - BUY_COUNT -= 10 + if bs_buy_price > 0: + if PREVIOUS_PRICE > 0: + if PREVIOUS_PRICE > bs_buy_price: + if BUY_COUNT > 140: + BUY_COUNT = 140 + if BUY_COUNT <= 40: + BUY_COUNT = 40 + BUY_COUNT += 10 + elif PREVIOUS_PRICE < bs_buy_price: + if BUY_COUNT > 150: + BUY_COUNT = 160 + if BUY_COUNT <= 50: + BUY_COUNT = 60 + BUY_COUNT -= 10 - PREVIOUS_PRICE = bs_buy_price + PREVIOUS_PRICE = bs_buy_price - # 매수 주문 - # 현재까지 매입금액이 7백만원 이하일 때만 매수를 한다. - if TOTAL_BUY_AMT < 7000000: - self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price) + # 매수 주문 + # 현재까지 매입금액이 7백만원 이하일 때만 매수를 한다. + if TOTAL_BUY_AMT < 7000000: + self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price) - ## 매도 주문 (아래 잔고를 체크해서 매도를 호출하는 것으로 시도한다.) - #time.sleep(60) - #self.requestOrder("1", stock_code, BUY_COUNT , price + 5) - print("BUY", second, bs_buy_price) - logFp.write("%s,%s, %d\n" % ("BUY", second, bs_buy_price)) - logFp.flush() + print("BUY", second, bs_buy_price) + logFp.write("%s,%s, %d\n" % ("BUY", second, bs_buy_price)) + logFp.flush() - # 가져온 만큼 데이터를 누적해서 파일로 작성한다. - self.write(given_day, result) + if bs_sell_price > 0: + jangoDic = self.requstJango() + if jangoDic and len(jangoDic.keys()) > 0: + for code in jangoDic: + TOTAL_BUY_AMT = jangoDic[code]['매입금액'] + if jangoDic[code]['매도가능'] > 0: + self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], bs_sell_price) + + timecheck[second] = True + else: + #print("NONE", second) + logFp.write("%s,%s,\n" % ("NONE", second)) + logFp.flush() - timecheck[second] = True else: - #print("NONE", second) - logFp.write("%s,%s,\n" % ("NONE", second)) - logFp.flush() - - - # 60일 선이 꺾여서 하락 중일 경우만 바로 매도를 한다. - if (((avg60_1 != 0 and avg60_2 != 0) and avg60_2 > avg60_1) or - (datetime.now() >= datetime.strptime(given_day + " 151500", '%Y%m%d %H%M%S')) or - (datetime.now() < datetime.strptime(given_day + " 090503", '%Y%m%d %H%M%S'))): # 만약 잔고가 있으면 장부가보다 5원 높게 매도한다. jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: @@ -1015,6 +1038,7 @@ class HTS: else: # 장부가의 마지막 자리수가 7,8,9 라면 (2097, 2098, 2099 -> 2105 에 매도) self.requestOrder("1", stock_code, jangoDic[code]['매도가능'], sell_price + 15) + break time.sleep(0.9) @@ -1038,11 +1062,13 @@ if __name__ == "__main__": #hts.getChartData(stock_codes) #hts.currentStock(stock_codes) #for given_day in given_days: + #hts.writeStockData(stock_codes, given_day) #for stock_code in stock_codes: #hts.simulate(stock_code, given_day) given_day = datetime.today().strftime('%Y%m%d') - hts.writeStockData(stock_codes, given_day) + #hts.writeStockData(stock_codes, given_day) + hts.simulate(stock_codes[0], given_day) #hts.buyRealTime(stock_codes[0], given_day) print ("done...") diff --git a/hts/HTS_5min.py b/hts/HTS_5min.py index c434de6..18defb4 100644 --- a/hts/HTS_5min.py +++ b/hts/HTS_5min.py @@ -520,10 +520,16 @@ class HTS: ma5 = [item[0] for item in ma5_list] ma10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() ma10 = [item[0] for item in ma10_list] - ma15_list = close_df.rolling(window=15).mean().fillna(close[0]).values.tolist() - ma15 = [item[0] for item in ma15_list] ma20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() ma20 = [item[0] for item in ma20_list] + ma30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist() + ma30 = [item[0] for item in ma30_list] + ma40_list = close_df.rolling(window=40).mean().fillna(close[0]).values.tolist() + ma40 = [item[0] for item in ma40_list] + ma50_list = close_df.rolling(window=50).mean().fillna(close[0]).values.tolist() + ma50 = [item[0] for item in ma50_list] + ma60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist() + ma60 = [item[0] for item in ma60_list] upper, lower = [], [] for i in range(len(upper_df)): @@ -538,7 +544,7 @@ class HTS: upper_temp = [upper[i] for i in range(size) if i % window == 0] lower_temp = [lower[i] for i in range(size) if i % window == 0] - temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "ma2": ma2, "ma5": ma5, "ma10": ma10, "ma15": ma15, "ma20": ma20} + temp = {"Date": point_temp, "Open": open, "High": high, "Low": low, "Close": close, "Volume": vol, "ma2": ma2, "ma5": ma5, "ma10": ma10, "ma20": ma20, "ma30": ma30, "ma40": ma40, "ma50": ma50, "ma60": ma60} data = pd.DataFrame(temp) df_final_time = pd.DatetimeIndex(point_temp) data.index = df_final_time @@ -558,8 +564,11 @@ class HTS: data['ma2'] = pd.to_numeric(data['ma2']) data['ma5'] = pd.to_numeric(data['ma5']) data['ma10'] = pd.to_numeric(data['ma10']) - data['ma15'] = pd.to_numeric(data['ma15']) data['ma20'] = pd.to_numeric(data['ma20']) + data['ma30'] = pd.to_numeric(data['ma30']) + data['ma40'] = pd.to_numeric(data['ma40']) + data['ma50'] = pd.to_numeric(data['ma50']) + data['ma60'] = pd.to_numeric(data['ma60']) buy_colors = [] for i in range(len(buy_line)): @@ -584,14 +593,17 @@ class HTS: ma2 = go.Scatter(x=data['Date'], y=data['ma2'], name="ma2", line_color='#FF0000') ma5 = go.Scatter(x=data['Date'], y=data['ma5'], name="ma5", line_color='#F43B86') ma10 = go.Scatter(x=data['Date'], y=data['ma10'], name="ma10", line_color='#F0A500') - ma15 = go.Scatter(x=data['Date'], y=data['ma15'], name="ma15", line_color='#14279B') ma20 = go.Scatter(x=data['Date'], y=data['ma20'], name="ma20", line_color='#000000') + ma30 = go.Scatter(x=data['Date'], y=data['ma30'], name="ma30", line_color='#14279B') + ma40 = go.Scatter(x=data['Date'], y=data['ma40'], name="ma40", line_color='#14279B') + ma50 = go.Scatter(x=data['Date'], y=data['ma50'], name="ma50", line_color='#14279B') + ma60 = go.Scatter(x=data['Date'], y=data['ma60'], name="ma60", line_color='#14279B') candle_stick = go.Candlestick(x=data['Date'], open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], increasing_line_color='red', decreasing_line_color='blue') # 그래프를 그린다. - fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, ma2, ma10, ma15, ma20]) + fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, ma2, ma10, ma20, ma30, ma40, ma50, ma60]) fig.update_layout(title=given_day + "_2x") fig.show() return @@ -602,9 +614,13 @@ class HTS: close = data["Close"] open = data["Open"] ma2 = data["ma2"] + ma5 = data["ma5"] ma10 = data["ma10"] - ma15 = data["ma15"] ma20 = data["ma20"] + ma30 = data["ma30"] + ma40 = data["ma40"] + ma50 = data["ma50"] + ma60 = data["ma60"] bsLine = {} bsLine['buy'] = [-1 for i in range(len(lower))] @@ -823,8 +839,11 @@ class HTS: ma2 = data["ma2"] ma5 = data["ma5"] ma10 = data["ma10"] - ma15 = data["ma15"] ma20 = data["ma20"] + ma30 = data["ma30"] + ma40 = data["ma40"] + ma50 = data["ma50"] + ma60 = data["ma60"] # 살 시점인지 체크 # 볼린저밴드 하단에 연속으로 같은 가격이 왔을 때, diff --git a/hts/timecheck.csv b/hts/timecheck.csv index 1543e6f..81261cf 100644 --- a/hts/timecheck.csv +++ b/hts/timecheck.csv @@ -1,4 +1,6 @@ time, check +090303,False +090403,False 090503,False 090603,False 090703,False