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