diff --git a/hts/HTS.py b/hts/HTS.py index 174db50..ec1e9b8 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -1,7 +1,12 @@ import os import re -import win32com.client +#import win32com.client from datetime import datetime +import matplotlib.pyplot as plt +import pandas as pd + +import mplfinance as mpf +import matplotlib.ticker as ticker class HTS: @@ -11,7 +16,7 @@ class HTS: stock = [] def __init__(self): - self.connect() + #self.connect() return def connect(self): @@ -205,10 +210,9 @@ class HTS: return - # 주식 현재가 조회 - def getRealTime(self, stock_code, day): - day = '20210917' + # 주식 현재가 조회 + def getRealTime(self, stock_code, day, result): objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") bConnect = objCpCybos.IsConnect if (bConnect == 0): @@ -218,33 +222,92 @@ class HTS: # 차트 객체 구하기 objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") - objStockChart.SetInputValue(0, 'A'+stock_code) # 종목 코드 - objStockChart.SetInputValue(1, ord('2')) # 1: 기간으로 조회, 2: 개수로 조회 - objStockChart.SetInputValue(2, day) - #objStockChart.SetInputValue(3, '20210915') - objStockChart.SetInputValue(4, 100) # 최근 n개 치 - objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량 - objStockChart.SetInputValue(6, ord('S')) # '차트 주가 - 월(M), 주(W), 일(D), 시(H), 분(m), 초(S) 차트 요청 + objStockChart.SetInputValue(0, 'A'+stock_code) # 종목 코드 + objStockChart.SetInputValue(1, ord('2')) # 1: 기간으로 조회, 2: 개수로 조회 + objStockChart.SetInputValue(2, day) # 기간 조회 시, 시작일 + #objStockChart.SetInputValue(3, '20210915') # 기간 조회 시, 종료일 + objStockChart.SetInputValue(4, 100) # 조회 시 가져오는 Line 개수 + objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량 + objStockChart.SetInputValue(6, ord('S')) # '차트 주가 - 월(M), 주(W), 일(D), 시(H), 분(m), 초(S) 차트 요청 objStockChart.SetInputValue(7, 1) - objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 + objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 objStockChart.BlockRequest() - len = objStockChart.GetHeaderValue(3) + size = objStockChart.GetHeaderValue(3) #print("날짜", "시간", "시가", "고가", "저가", "종가", "거래량") - #print("==============================================-") - - result = ["time":[], "close":[]] - for i in range(len): + for i in range(size-1, -1, -1): #day = objStockChart.GetDataValue(0, i) time = objStockChart.GetDataValue(1, i) #open = objStockChart.GetDataValue(2, i) #high = objStockChart.GetDataValue(3, i) #low = objStockChart.GetDataValue(4, i) close = objStockChart.GetDataValue(5, i) - #vol = objStockChart.GetDataValue(6, i) + vol = objStockChart.GetDataValue(6, i) #print(day, time, open, high, low, close, vol) - result.append([time, close]) + + if time[i] not in result["check"]: + result["check"].add(time) + result["time"].append(time) + result["close"].append(close) + result["vol"].append(vol) + return + + def getCSV(self, fileName, result): + data = pd.read_csv(fileName) + + time = data.시간 + close = data.종가 + for i in range(len(data)-1, -1, -1): + if time[i] not in result["check"]: + result["check"].add(time[i]) + result["time"].append(time[i]) + result["close"].append(close[i]) + result["vol"].append(0) + return + + def analyze(self, result): + df = pd.DataFrame(result["close"]) + y_value = result["close"] + vol = result["vol"] + + max20 = df.rolling(window=20).mean() + stddev20 = df.rolling(window=20).std() + upper = max20 + (stddev20 * 2) # 상단 볼린저 밴드 + lower = max20 - (stddev20 * 2) # 하단 볼린저 밴드 + middle = (upper + lower) / 2 # 중심 블린저 밴드 + + x_value = [i for i in range(len(y_value))] + + window = 3 + open = y_value[:len(y_value)-window] + [y_value[len(y_value)-window] for i in range(window)] # 시가 + close = [y_value[window-1] for i in range(window-1)] + y_value[window-1:] # 종가 + high = df.rolling(window=window).max() # 고가 + low = df.rolling(window=window).min() # 저가 + mean5 = df.rolling(window=window).mean() # 이동평균선 + mean20 = df.rolling(window=window*4).mean() # 이동평균선 + mean60 = df.rolling(window=window*12).mean() # 이동평균선 + + temp = {'Open': open, 'High': high.values.tolist(), 'Low': low.values.tolist(), 'Close': close, 'Volume': vol} + data = pd.DataFrame(temp, index=x_value) + return data + + def buyRealTime(self, stock_code, day): + result = {"check": set(), + "time": [], + "close": [], + "vol": []} + + + #self.getRealTime(stock_code, day, result) + self.getCSV("data_s_1.csv", result) + self.getCSV("data_s_2.csv", result) + data = self.analyze(result) + + mpf.plot(data, type='candle', mav=(3, 6, 9)) + plt.show() + + print(result) return result @@ -260,10 +323,9 @@ if __name__ == "__main__": hts = HTS() #hts.all_stocks() #hts.getChartData(stock_code) - #hts.currentStock(stock_code) day = datetime.today().strftime("%Y%m%d") - result = hts.getRealTime(stock_code, day) - print (result) + day = '20210917' + hts.buyRealTime(stock_code, day) print ("done...") diff --git a/hts/Util.py b/hts/Util.py deleted file mode 100644 index 51f19f4..0000000 --- a/hts/Util.py +++ /dev/null @@ -1,23 +0,0 @@ -import pandas as pd -import matplotlib.pyplot as plt - -class Util: - - def analyze(self): - data = pd.read_csv("data_s.csv") - y_value = data.종가 - - max20 = y_value.rolling(window=20).mean() - stddev = y_value.rolling(window=20).std() - upper = max20 + (stddev * 2) # 상단 볼리저 밴드 - lower = max20 - (stddev * 2) # 하단 볼리저 밴드 - middle = (upper + lower) / 2 # 중심 - - x_value = [i for i in range(len(y_value))] - plt.plot(x_value, y_value.tolist(), x_value, upper.tolist(), x_value, lower.tolist(), x_value, middle.tolist()) - plt.show() - return - -if __name__ == "__main__": - util = Util() - util.analyze() \ No newline at end of file