139 lines
4.5 KiB
Python
139 lines
4.5 KiB
Python
import os.path
|
|
import pandas as pd
|
|
import platform
|
|
if platform.system().lower().find("window") >= 0 and platform.architecture()[0] != "64bit" :
|
|
import win32com.client
|
|
|
|
import sqlite3
|
|
from datetime import datetime, timedelta
|
|
|
|
class DailyStatus:
|
|
tableName = None
|
|
dbFileName = None
|
|
RESOURCE_PATH = None
|
|
|
|
def __init__(self, RESOURCE_PATH):
|
|
self.RESOURCE_PATH = RESOURCE_PATH
|
|
self.tableName = 'stock_analysis'
|
|
self.dbFileName = "stock.db"
|
|
return
|
|
|
|
def getDBData(self, stock_code, day, result):
|
|
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, self.dbFileName))
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute('SELECT ymd, close, open, high, low, envelope_upper, envelope_lower, envelope_middle, rsi, rsis, macd, macds, stochastic_slow_k, stochastic_slow_d FROM ' + self.tableName + ' WHERE CODE=? and ymd=? order by ymd', (stock_code, day,))
|
|
db_result = cursor.fetchall()
|
|
for rows in db_result:
|
|
ymd = rows[0]
|
|
close = rows[1]
|
|
open = rows[2]
|
|
high = rows[3]
|
|
low = rows[4]
|
|
envelope_upper = rows[5]
|
|
envelope_lower = rows[6]
|
|
envelope_middle = rows[7]
|
|
rsi = 0 if rows[8] is None else rows[8]
|
|
rsis = 0 if rows[9] is None else rows[9]
|
|
macd = rows[10]
|
|
macds = rows[11]
|
|
stochastic_slow_k = 0 if rows[12] is None else rows[12]
|
|
stochastic_slow_d = 0 if rows[13] is None else rows[13]
|
|
|
|
result["ymd"].append(ymd)
|
|
result["open"].append(int(open))
|
|
result["close"].append(int(close))
|
|
result["high"].append(int(high))
|
|
result["low"].append(int(low))
|
|
result["envelope_upper"].append(int(envelope_upper))
|
|
result["envelope_lower"].append(int(envelope_lower))
|
|
result["envelope_middle"].append(int(envelope_middle))
|
|
result["rsi"].append(int(rsi))
|
|
result["rsis"].append(int(rsis))
|
|
result["macd"].append(int(macd))
|
|
result["macds"].append(int(macds))
|
|
result["slow_k"].append(int(stochastic_slow_k))
|
|
result["slow_d"].append(int(stochastic_slow_d))
|
|
|
|
return
|
|
|
|
def isValidYMD(self, stock_code, day):
|
|
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, self.dbFileName))
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute('SELECT ymd, count(*) as cnt FROM ' + self.tableName + ' WHERE CODE=? and ymd=?', (stock_code, day,))
|
|
db_result = cursor.fetchone()
|
|
if db_result[1] > 0:
|
|
return True
|
|
return False
|
|
|
|
def getLastData(self, stock_code, today, n=100):
|
|
result = {
|
|
"ymd": [],
|
|
"open": [],
|
|
"close": [],
|
|
"high": [],
|
|
"low": [],
|
|
"envelope_upper": [],
|
|
"envelope_lower": [],
|
|
"envelope_middle": [],
|
|
"rsi": [],
|
|
"rsis": [],
|
|
"macd": [],
|
|
"macds": [],
|
|
"slow_k": [],
|
|
"slow_d": []
|
|
}
|
|
|
|
days = []
|
|
for i in range(1, n):
|
|
last_day = (datetime.strptime(today, '%Y%m%d') - timedelta(i)).strftime('%Y.%m.%d')
|
|
isValid = self.isValidYMD(stock_code, last_day)
|
|
if isValid:
|
|
days.append(last_day)
|
|
|
|
days = sorted(days)
|
|
for day in days:
|
|
self.getDBData(stock_code, day, result)
|
|
|
|
data = pd.DataFrame(result)
|
|
df_final_time = pd.DatetimeIndex(result['ymd'])
|
|
data.index = df_final_time
|
|
|
|
return data
|
|
|
|
|
|
def getLastData_realtime(self, stock_code, today, n=100):
|
|
result = {
|
|
"ymd": [],
|
|
"open": [],
|
|
"close": [],
|
|
"high": [],
|
|
"low": [],
|
|
"envelope_upper": [],
|
|
"envelope_lower": [],
|
|
"envelope_middle": [],
|
|
"rsi": [],
|
|
"rsis": [],
|
|
"macd": [],
|
|
"macds": [],
|
|
"slow_k": [],
|
|
"slow_d": []
|
|
}
|
|
|
|
days = []
|
|
for i in range(1, n):
|
|
last_day = (datetime.strptime(today, '%Y%m%d') - timedelta(i)).strftime('%Y.%m.%d')
|
|
isValid = self.isValidYMD(stock_code, last_day)
|
|
if isValid:
|
|
days.append(last_day)
|
|
|
|
days = sorted(days)
|
|
for day in days:
|
|
self.getDBData(stock_code, day, result)
|
|
|
|
data = pd.DataFrame(result)
|
|
df_final_time = pd.DatetimeIndex(result['ymd'])
|
|
data.index = df_final_time
|
|
|
|
return data |