From c27eed6be015c54c5beb39ab6edbdfd500ddfbef Mon Sep 17 00:00:00 2001 From: dosangyoon Date: Fri, 29 Jul 2022 15:40:31 +0900 Subject: [PATCH] init --- HTS_122630.py | 3 ++ HTS_252670.py | 3 ++ hts/HTS.py | 86 ++++++++++++++++++++++++++++++++++++++ hts/util/DataDownloader.py | 81 ----------------------------------- 4 files changed, 92 insertions(+), 81 deletions(-) delete mode 100644 hts/util/DataDownloader.py diff --git a/HTS_122630.py b/HTS_122630.py index 8b2250d..5ade39a 100644 --- a/HTS_122630.py +++ b/HTS_122630.py @@ -202,4 +202,7 @@ if __name__ == "__main__": hts.buyRealTime(lastday_str, today_str) hts.writeStockData(stock_code, today_str) + db_filename = os.path.join(RESOURCE_PATH, "hts.db") + hts.insertStockData(db_filename, stock_code, "KODEX 200선물인버스2X", today_str) + print ("done...") diff --git a/HTS_252670.py b/HTS_252670.py index a73f8a5..ee7d25f 100644 --- a/HTS_252670.py +++ b/HTS_252670.py @@ -206,4 +206,7 @@ if __name__ == "__main__": hts.buyRealTime(lastday_str, today_str) hts.writeStockData(stock_code, today_str) + db_filename = os.path.join(RESOURCE_PATH, "hts.db") + hts.insertStockData(db_filename, stock_code, "KODEX 200선물인버스2X", today_str) + print ("done...") diff --git a/hts/HTS.py b/hts/HTS.py index efe7260..d7cb901 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -3,6 +3,7 @@ import os.path import win32com.client import csv import time +import sqlite3 from datetime import datetime from hts.OrderItem import OrderItem @@ -416,6 +417,91 @@ class HTS: return + def getStockInfo(self, stock_code, today): + objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") + bConnect = objCpCybos.IsConnect + if (bConnect == 0): + print("PLUS가 정상적으로 연결되지 않음. ") + exit() + + # 차트 객체 구하기 + objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") + + objStockChart.SetInputValue(0, 'A' + stock_code) # 종목 코드 + objStockChart.SetInputValue(1, ord('1')) # 1: 기간으로 조회, 2: 개수로 조회 + objStockChart.SetInputValue(2, today) # 기간 조회 시, 시작일 + objStockChart.SetInputValue(3, today) # 기간 조회 시, 종료일 + objStockChart.SetInputValue(4, 400) # 조회 시 가져오는 Line 개수 + objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량 + objStockChart.SetInputValue(6, ord('m')) # '차트 주가 - 월(M), 주(W), 일(D), 시(H), 분(m), 초(S) 차트 요청 + objStockChart.SetInputValue(7, 1) + objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 + objStockChart.BlockRequest() + + size = objStockChart.GetHeaderValue(3) + + data = [] + for i in range(size - 1, -1, -1): + day = objStockChart.GetDataValue(0, i) + time = objStockChart.GetDataValue(1, i) + start = objStockChart.GetDataValue(2, i) + high = objStockChart.GetDataValue(3, i) + low = objStockChart.GetDataValue(4, i) + close = objStockChart.GetDataValue(5, i) + vol = objStockChart.GetDataValue(6, i) + + data.append([day, str(time).zfill(4), start, high, low, close, vol]) + + return data + + def insertStockData(self, inFileName, stock_code, stock_name, today): + tableName = 'hts' + conn = sqlite3.connect(inFileName) + cursor = conn.cursor() + + # 테이블 생성 + cursor.execute( + "CREATE TABLE IF NOT EXISTS " + tableName + " (CODE text, NAME text, ymd text, hms text, close REAL, open REAL, high REAL, low REAL, volume REAL)") + + # 키 생성 + create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms) " + cursor.execute(create_key) + + conn.commit() + cursor.close() + conn.close() + + items = self.getStockInfo(stock_code, today) + + idx = 0 + for item in items: + ymd = item[0] + hms = item[1] + open = item[2] + high = item[3] + low = item[4] + close = item[5] + volume = item[6] + + idx += 1 + + conn = sqlite3.connect(inFileName) + cursor = conn.cursor() + + cursor.execute('SELECT * FROM ' + tableName + ' WHERE CODE=? and ymd=? and hms=?', (stock_code, ymd, hms,)) + result = cursor.fetchone() + if result == None: + cursor.execute( + "INSERT INTO " + tableName + "(CODE, NAME, ymd, hms, close, open, high, low, volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)", + (stock_code, stock_name, ymd, hms, close, open, high, low, volume)) + + conn.commit() + cursor.close() + conn.close() + print(idx, stock_code, stock_name, ymd) + + return + def write(self, day, result): #날짜,시간,시가,고가,저가,종가,거래량 diff --git a/hts/util/DataDownloader.py b/hts/util/DataDownloader.py deleted file mode 100644 index 18e5e13..0000000 --- a/hts/util/DataDownloader.py +++ /dev/null @@ -1,81 +0,0 @@ -import win32com.client -import os -from datetime import datetime, timedelta - -from hts.HTS import HTS - -class DataDownloader (HTS): - - buySellChecker = None - stock_code = None - - def __init__(self): - super().__init__() - - return - - # 주식 현재가 조회 - def writeStockData(self, stock_code, today): - objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") - bConnect = objCpCybos.IsConnect - if (bConnect == 0): - print("PLUS가 정상적으로 연결되지 않음. ") - exit() - - # 차트 객체 구하기 - objStockChart = win32com.client.Dispatch("CpSysDib.StockChart") - - objStockChart.SetInputValue(0, 'A' + stock_code) # 종목 코드 - objStockChart.SetInputValue(1, ord('1')) # 1: 기간으로 조회, 2: 개수로 조회 - objStockChart.SetInputValue(2, today) # 기간 조회 시, 시작일 - objStockChart.SetInputValue(3, today) # 기간 조회 시, 종료일 - objStockChart.SetInputValue(4, 400) # 조회 시 가져오는 Line 개수 - objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8]) # 날짜,시간,시가,고가,저가,종가,거래량 - objStockChart.SetInputValue(6, ord('m')) # '차트 주가 - 월(M), 주(W), 일(D), 시(H), 분(m), 초(S) 차트 요청 - objStockChart.SetInputValue(7, 1) - objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용 - objStockChart.BlockRequest() - - size = objStockChart.GetHeaderValue(3) - - if size > 0: - outfp = open("./hts/backup/" + stock_code + "_" + today + ".csv", mode="w", encoding="utf-8") - outfp.write("%s,%s,%s,%s,%s,%s,%s\n" % ("날짜", "시간", "시가", "고가", "저가", "종가", "거래량")) - for i in range(size - 1, -1, -1): - day = objStockChart.GetDataValue(0, i) - time = objStockChart.GetDataValue(1, i) - start = objStockChart.GetDataValue(2, i) - high = objStockChart.GetDataValue(3, i) - low = objStockChart.GetDataValue(4, i) - close = objStockChart.GetDataValue(5, i) - vol = objStockChart.GetDataValue(6, i) - outfp.write("%d,%s,%d,%d,%d,%d,%d\n" % (day, str(time).zfill(4), start, high, low, close, vol)) - outfp.close() - - return size - -if __name__ == "__main__": - - today = datetime.today() - - PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__)))))) - RESOURCE_DIR = PROJECT_HOME + "/hits/hts" - - stock_codes = ["252670", "122630"] - dataDownloader = DataDownloader() - - zero_count = 0 - for stock_code in stock_codes: - for i in range(1, 100000): - given_day = today - timedelta(i) - - count = dataDownloader.writeStockData(stock_code, given_day.strftime('%Y%m%d')) - if count == 0: - zero_count += 1 - else: - zero_count = 0 - print(given_day, count) - - if zero_count > 10: - break - print ("done...")