This commit is contained in:
dosangyoon
2022-07-29 15:40:31 +09:00
parent 17be8fd147
commit c27eed6be0
4 changed files with 92 additions and 81 deletions

View File

@@ -202,4 +202,7 @@ if __name__ == "__main__":
hts.buyRealTime(lastday_str, today_str) hts.buyRealTime(lastday_str, today_str)
hts.writeStockData(stock_code, 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...") print ("done...")

View File

@@ -206,4 +206,7 @@ if __name__ == "__main__":
hts.buyRealTime(lastday_str, today_str) hts.buyRealTime(lastday_str, today_str)
hts.writeStockData(stock_code, 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...") print ("done...")

View File

@@ -3,6 +3,7 @@ import os.path
import win32com.client import win32com.client
import csv import csv
import time import time
import sqlite3
from datetime import datetime from datetime import datetime
from hts.OrderItem import OrderItem from hts.OrderItem import OrderItem
@@ -416,6 +417,91 @@ class HTS:
return 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): def write(self, day, result):
#날짜,시간,시가,고가,저가,종가,거래량 #날짜,시간,시가,고가,저가,종가,거래량

View File

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