diff --git a/stockpredictor/analysis/AnalyzerSqlite.py b/stockpredictor/analysis/AnalyzerSqlite.py index 1b1ece1..8feabf1 100644 --- a/stockpredictor/analysis/AnalyzerSqlite.py +++ b/stockpredictor/analysis/AnalyzerSqlite.py @@ -118,9 +118,15 @@ class AnalyzerSqlite: high = list(reversed(stock['high'])) low = list(reversed(stock['low'])) volume = list(reversed(stock['volume'])) + avg4 = list(reversed(stock['avg4'])) avg5 = list(reversed(stock['avg5'])) + avg6 = list(reversed(stock['avg6'])) + avg10 = list(reversed(stock['avg10'])) + avg12 = list(reversed(stock['avg12'])) avg20 = list(reversed(stock['avg20'])) + avg36 = list(reversed(stock['avg36'])) avg40 = list(reversed(stock['avg40'])) + avg48 = list(reversed(stock['avg48'])) avg60 = list(reversed(stock['avg60'])) avg120 = list(reversed(stock['avg120'])) avg240 = list(reversed(stock['avg240'])) @@ -136,9 +142,15 @@ class AnalyzerSqlite: # general candle_stick = go.Candlestick(x=ymd, open=open, high=high, low=low, close=close, increasing_line_color='red', decreasing_line_color='blue') + avg4 = go.Scatter(x=ymd, y=avg4, name="avg4", line_color='#085F1B') avg5 = go.Scatter(x=ymd, y=avg5, name="avg5", line_color='#000000') + avg6 = go.Scatter(x=ymd, y=avg6, name="avg6", line_color='#698D09') + avg10 = go.Scatter(x=ymd, y=avg10, name="avg10", line_color='#041366') + avg12 = go.Scatter(x=ymd, y=avg12, name="avg12", line_color='#6C2507') avg20 = go.Scatter(x=ymd, y=avg20, name="avg20", line_color='#f84c43') + avg36 = go.Scatter(x=ymd, y=avg36, name="avg36", line_color='#370557') avg40 = go.Scatter(x=ymd, y=avg40, name="avg40", line_color='#8013ED') + avg48 = go.Scatter(x=ymd, y=avg48, name="avg48", line_color='#7A1E66') avg60 = go.Scatter(x=ymd, y=avg60, name="avg60", line_color='#f89543') avg120 = go.Scatter(x=ymd, y=avg120, name="avg120", line_color='#0ed604') avg240 = go.Scatter(x=ymd, y=avg240, name="avg240", line_color='#FF00F7') @@ -148,7 +160,7 @@ class AnalyzerSqlite: changeLine = go.Scatter(x=ymd, y=ichimokucloud_changeLine, name="changeLine", line_color='#000000') baseLine = go.Scatter(x=ymd, y=ichimokucloud_baseLine, name="baseLine", line_color='#FF0000') - candle_data = [candle_stick, avg5, avg20, avg40, avg60, avg120, avg240, avg300, bolinger_upper, bolinger_lower, changeLine, baseLine] + candle_data = [candle_stick, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg240, avg300, bolinger_upper, bolinger_lower, changeLine, baseLine] #candle_data = [candle_stick, bolinger_upper, bolinger_lower, changeLine, baseLine] volume = go.Bar(x=ymd, y=volume, name="volume") @@ -215,19 +227,28 @@ class AnalyzerSqlite: if os.path.isdir(outPath): shutil.rmtree(outPath) os.mkdir(outPath) + self.makeDir("final") - self.makeDir("weekly_20주선_40주선_상향돌파") - self.makeDir("weekly_종가_20주선_상향돌파") - self.makeDir("weekly_rsi_32이하") + self.makeDir("weekly_4주선_48주선_상향돌파") + self.makeDir("weekly_종가_12주선_상향돌파") + self.makeDir("weekly_rsi_20이하") self.makeDir("weekly_rsi_rsis_위로_올라옴") - self.makeDir("monthly_20월선_40월선_상향돌파") - self.makeDir("monthly_종가_20주선_상향돌파") - self.makeDir("monthly_rsi_32이하") + self.makeDir("weekly_BB하단_내려옴") + + self.makeDir("monthly_6월선_36월선_상향돌파") + self.makeDir("monthly_종가_12월선_상향돌파") + self.makeDir("monthly_rsi_30이하") self.makeDir("monthly_rsi_rsis_위로_올라옴") + self.makeDir("monthly_BB하단_내려옴") + + self.makeDir("daily_rsi_10이하") + self.makeDir("daily_거래량_7배_이상_상승") + self.makeDir("daily_BB하단_내려옴") + self.makeDir("daily_종가_60일선_상향돌파") return - def writeFile(self, type, CODE, NAME, top, stock, state): + def writeFile(self, type, CODE, NAME, top, stock, state, final_status_count=-1): # 3년 이내 한번이라도 영업이익이 났는지 체크를 함 fnguide = None if CODE in self.fnguide: @@ -241,11 +262,14 @@ class AnalyzerSqlite: if check: fig = self.draw(stock) - title = "%s (%s), %d %s 차트 (URL1, URL2)" % (NAME, CODE, stock['close'][0], state, CODE, CODE) + title = "%s (%s), %d, %s, %s 차트 (URL1, URL2)" % (NAME, CODE, stock['close'][0], state, type, CODE, CODE) fig['layout'].update(title=title) fileName = self.outPath + "/" + str(type) - fileName = "%s/%s_%s_%s_%s.html" % (fileName, top, NAME.replace(" ", ""), CODE, state) + if final_status_count == -1: + fileName = "%s/%s_%s_%s_%s.html" % (fileName, top, NAME.replace(" ", ""), CODE, state) + else: + fileName = "%s/%s_%s_%s_%s_%s.html" % (fileName, str(final_status_count), top, NAME.replace(" ", ""), CODE, state) po.write_html(fig, file=fileName, auto_open=False) return @@ -273,7 +297,7 @@ class AnalyzerSqlite: cursor = conn.cursor() sql = 'SELECT ymd, close, open, high, low, volume, ' - sql += ' avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300, ' + sql += ' avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, ' sql += ' bolingerband_upper, bolingerband_lower, bolingerband_middle, ' sql += ' ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, ' sql += ' stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, ' @@ -287,7 +311,7 @@ class AnalyzerSqlite: ymd = [] close, open, high, low, volume = [], [], [], [], [] - avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300 = [], [], [], [], [], [], [], [], [] + avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300 = [], [], [], [], [], [], [], [], [], [], [], [], [], [] bolingerband_upper, bolingerband_lower, bolingerband_middle = [], [], [] ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2 = [], [], [], [] stochastic_fast_k, stochastic_slow_k, stochastic_slow_d = [], [], [] @@ -300,32 +324,37 @@ class AnalyzerSqlite: high.append(price[3]) low.append(price[4]) volume.append(price[5]) - avg5.append(price[6]) - avg10.append(price[7]) - avg20.append(price[8]) - avg40.append(price[9]) - avg60.append(price[10]) - avg120.append(price[11]) - avg200.append(price[12]) - avg240.append(price[13]) - avg300.append(price[14]) - bolingerband_upper.append(price[15]) - bolingerband_lower.append(price[16]) - bolingerband_middle.append(price[17]) - ichimokucloud_changeLine.append(price[18]) - ichimokucloud_baseLine.append(price[19]) - ichimokucloud_leadingSpan1.append(price[20]) - ichimokucloud_leadingSpan2.append(price[21]) - stochastic_fast_k.append(price[22]) - stochastic_slow_k.append(price[23]) - stochastic_slow_d.append(price[24]) - rsi.append(price[25]) - rsis.append(price[26]) + avg4.append(price[6]) + avg5.append(price[7]) + avg6.append(price[8]) + avg10.append(price[9]) + avg12.append(price[10]) + avg20.append(price[11]) + avg36.append(price[12]) + avg40.append(price[13]) + avg48.append(price[14]) + avg60.append(price[15]) + avg120.append(price[16]) + avg200.append(price[17]) + avg240.append(price[18]) + avg300.append(price[19]) + bolingerband_upper.append(price[20]) + bolingerband_lower.append(price[21]) + bolingerband_middle.append(price[22]) + ichimokucloud_changeLine.append(price[23]) + ichimokucloud_baseLine.append(price[24]) + ichimokucloud_leadingSpan1.append(price[25]) + ichimokucloud_leadingSpan2.append(price[26]) + stochastic_fast_k.append(price[27]) + stochastic_slow_k.append(price[28]) + stochastic_slow_d.append(price[29]) + rsi.append(price[30]) + rsis.append(price[31]) stock = { "ymd": ymd, "close": close, "open": open, "high": high, "low": low, "volume": volume, - "avg5": avg5, "avg10": avg10, "avg20": avg20, "avg40": avg40, "avg60": avg60, "avg120": avg120, "avg200": avg200, "avg300": avg300, + "avg4": avg4, "avg5": avg5, "avg6": avg6, "avg10": avg10, "avg12": avg12, "avg20": avg20, "avg36": avg36, "avg40": avg40, "avg48": avg48, "avg60": avg60, "avg120": avg120, "avg200": avg200, "avg300": avg300, "avg240": avg240, "bolingerband_upper": bolingerband_upper, "bolingerband_lower": bolingerband_lower, "bolingerband_middle": bolingerband_middle, @@ -366,14 +395,18 @@ class AnalyzerSqlite: if CODE in self.topCompany: top = str(self.topCompany[CODE][0]) - #stock_daily = self.getStockData(stockAnalysisTableName, CODE) + stock_daily = self.getStockData(stockAnalysisTableName, CODE) stock_weekly = self.getStockData(stockAnalysisWeeklyTableName, CODE) stock_monthly = self.getStockData(stockAnalysisMonthlyTableName, CODE) + status = "" + final_status = "" + final_status_count = 0 + # 거래량이 100만 이상이고, 종가가 1천원 이상인지 체크 (https://happpy-rich.tistory.com/94) if stock_weekly['volume'][0] > 100000 and stock_weekly['close'][0] > 1000: + # 종목 상태 체크 분석 - status = "" # [Weekly] # 정배열 체크 @@ -381,26 +414,32 @@ class AnalyzerSqlite: if temp_status != "": status += temp_status - # 20주선이 40주 선을 상향 돌파함 + # 4주선이 48주 선을 상향 돌파함 if len(stock_weekly['close']) > 40: - if (stock_weekly['avg20'][1] is not None and stock_weekly['avg40'][1] is not None and - stock_weekly['avg20'][0] is not None and stock_weekly['avg40'][0] is not None): - if stock_weekly['avg20'][1] <= stock_weekly['avg40'][1] and stock_weekly['avg20'][0] > stock_weekly['avg40'][0]: - type = "weekly_20주선_40주선_상향돌파" + if (stock_weekly['avg4'][1] is not None and stock_weekly['avg48'][1] is not None and + stock_weekly['avg4'][0] is not None and stock_weekly['avg48'][0] is not None): + if stock_weekly['avg4'][1] <= stock_weekly['avg48'][1] and stock_weekly['avg4'][0] > stock_weekly['avg48'][0]: + type = "weekly_4주선_48주선_상향돌파" + final_status += " " + type + final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) # 종가가 20주선을 상향 돌파함 if len(stock_weekly['close']) > 2: - if stock_weekly['close'][1] is not None and stock_weekly['avg20'][1] is not None and stock_weekly['close'][0] is not None and stock_weekly['avg20'][0] is not None: - if stock_weekly['close'][1] <= stock_weekly['avg20'][1] and stock_weekly['close'][0] > stock_weekly['avg20'][0]: - type = "weekly_종가_20주선_상향돌파" + if stock_weekly['close'][1] is not None and stock_weekly['avg12'][1] is not None and stock_weekly['close'][0] is not None and stock_weekly['avg12'][0] is not None: + if stock_weekly['close'][1] <= stock_weekly['avg12'][1] and stock_weekly['close'][0] > stock_weekly['avg12'][0]: + type = "weekly_종가_12주선_상향돌파" + final_status += " " + type + final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) # RSI가 32 이하인 경우 (30이 이하로 떨어지는 것 미리 확인) if len(stock_monthly['close']) > 1: if stock_weekly['rsi'][0] is not None: - if stock_weekly['rsi'][0] <= 32: - type = "weekly_rsi_32이하" + if stock_weekly['rsi'][0] <= 20: + type = "weekly_rsi_20이하" + final_status += " " + type + final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) # rsi가 40 이하이고, rsis 아래에서 위로 올라올 때 @@ -409,29 +448,50 @@ class AnalyzerSqlite: if stock_weekly['rsi'][0] < 40: if stock_weekly['rsi'][0] > stock_weekly['rsis'][0] and stock_weekly['rsi'][1] <= stock_weekly['rsis'][1]: type = "weekly_rsi_rsis_위로_올라옴" + #final_status += " " + type + #final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) + if len(stock_weekly['volume']) > 6: + # BB 하단에 부딪힘 + for c_index in range(1, 5): + if stock_weekly['close'][c_index] <= (stock_weekly['bolingerband_lower'][c_index+1]): + type = "weekly_BB하단_내려옴" + final_status += " " + type + final_status_count += 1 + self.writeFile(type, CODE, NAME, top, stock_weekly, status) + break + + + + # [Monthly] # 20주선이 40주 선을 상향 돌파함 if len(stock_monthly['close']) > 40: - if (stock_monthly['avg20'][1] is not None and stock_monthly['avg40'][1] is not None and - stock_monthly['avg20'][0] is not None and stock_monthly['avg40'][0] is not None): - if stock_monthly['avg20'][1] <= stock_monthly['avg40'][1] and stock_monthly['avg20'][0] > stock_monthly['avg40'][0]: - type = "monthly_20월선_40월선_상향돌파" + if (stock_monthly['avg6'][1] is not None and stock_monthly['avg36'][1] is not None and + stock_monthly['avg6'][0] is not None and stock_monthly['avg36'][0] is not None): + if stock_monthly['avg6'][1] <= stock_monthly['avg36'][1] and stock_monthly['avg6'][0] > stock_monthly['avg36'][0]: + type = "monthly_6월선_36월선_상향돌파" + final_status += " " + type + final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) # 종가가 20주선을 상향 돌파함 if len(stock_monthly['close']) > 2: - if stock_monthly['close'][1] is not None and stock_monthly['avg20'][1] is not None and stock_monthly['close'][0] is not None and stock_monthly['avg20'][0] is not None: - if stock_monthly['close'][1] <= stock_monthly['avg20'][1] and stock_monthly['close'][0] > stock_monthly['avg20'][0]: - type = "monthly_종가_20주선_상향돌파" + if stock_monthly['close'][1] is not None and stock_monthly['avg12'][1] is not None and stock_monthly['close'][0] is not None and stock_monthly['avg12'][0] is not None: + if stock_monthly['close'][1] <= stock_monthly['avg12'][1] and stock_monthly['close'][0] > stock_monthly['avg12'][0]: + type = "monthly_종가_12월선_상향돌파" + final_status += " " + type + final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) # RSI가 32 이하인 경우 (30이 이하로 떨어지는 것 미리 확인) if len(stock_monthly['close']) > 1: if stock_monthly['rsi'][0] is not None: - if stock_monthly['rsi'][0] <= 32: - type = "monthly_rsi_32이하" + if stock_monthly['rsi'][0] <= 30: + type = "monthly_rsi_30이하" + final_status += " " + type + final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_weekly, status) # rsi가 rsis 아래에서 위로 올라올 때 @@ -440,14 +500,79 @@ class AnalyzerSqlite: if stock_monthly['rsi'][0] < 40: if stock_monthly['rsi'][0] > stock_monthly['rsis'][0] and stock_monthly['rsi'][1] <= stock_monthly['rsis'][1]: type = "monthly_rsi_rsis_위로_올라옴" + #final_status += " " + type + #final_status_count += 1 self.writeFile(type, CODE, NAME, top, stock_monthly, status) + + if len(stock_monthly['volume']) > 5: + # BB 하단에 부딪힘 + for c_index in range(1, 5): + if stock_monthly['bolingerband_lower'][c_index+1] is None: + break + if stock_monthly['close'][c_index] <= (stock_monthly['bolingerband_lower'][c_index+1]): + type = "monthly_BB하단_내려옴" + final_status += " " + type + final_status_count += 1 + self.writeFile(type, CODE, NAME, top, stock_monthly, status) + break + + + + # 3) daily + if len(stock_daily['volume']) > 5: + # RSI가 10 이하인 경우 (10이 이하로 떨어지는 것 미리 확인) + if stock_daily['rsi'][0] is not None: + if stock_daily['rsi'][0] <= 10: + type = "daily_rsi_10이하" + final_status += " " + type + final_status_count += 1 + self.writeFile(type, CODE, NAME, top, stock_weekly, status) + + # 거래량이 7배 이상 상승한 경우 + for c_index in range(1, 5): + if stock_daily['volume'][c_index] > (stock_daily['volume'][c_index+1]) * 5: + type = "daily_거래량_7배_이상_상승" + final_status += " " + type + final_status_count += 1 + self.writeFile(type, CODE, NAME, top, stock_daily, status) + break + + # BB 하단에 내려옴 + for c_index in range(1, 5): + if stock_daily['bolingerband_lower'][c_index+1] is None: + break + + if stock_daily['close'][c_index] <= (stock_daily['bolingerband_lower'][c_index + 1]): + type = "daily_BB하단_내려옴" + final_status += " " + type + final_status_count += 1 + self.writeFile(type, CODE, NAME, top, stock_daily, status) + break + + # 종가가 60일선을 상향 돌파함 + if len(stock_daily['close']) > 60: + if stock_daily['close'][1] is not None and stock_daily['avg60'][1] is not None and stock_daily['close'][0] is not None and stock_daily['avg60'][0] is not None: + if stock_daily['close'][1] <= stock_daily['avg60'][1] and stock_daily['close'][0] > stock_daily['avg60'][0]: + type = "daily_종가_60일선_상향돌파" + final_status += " " + type + final_status_count += 1 + self.writeFile(type, CODE, NAME, top, stock_daily, status) + + if final_status_count > 0: + type = "final" + self.writeFile(type, CODE, NAME, top, stock_daily, final_status, final_status_count) return def get_moving_average(self, stock): + q_4 = MovingAverage(4) q_5 = MovingAverage(5) + q_6 = MovingAverage(6) q_10 = MovingAverage(10) + q_12 = MovingAverage(12) q_20 = MovingAverage(20) + q_36 = MovingAverage(36) q_40 = MovingAverage(40) + q_48 = MovingAverage(48) q_60 = MovingAverage(60) q_120 = MovingAverage(120) q_200 = MovingAverage(200) @@ -455,20 +580,30 @@ class AnalyzerSqlite: q_300 = MovingAverage(300) for i in range(len(stock)): + q_4.enqueue(stock[i]['close']) q_5.enqueue(stock[i]['close']) + q_6.enqueue(stock[i]['close']) q_10.enqueue(stock[i]['close']) + q_12.enqueue(stock[i]['close']) q_20.enqueue(stock[i]['close']) + q_36.enqueue(stock[i]['close']) q_40.enqueue(stock[i]['close']) + q_48.enqueue(stock[i]['close']) q_60.enqueue(stock[i]['close']) q_120.enqueue(stock[i]['close']) q_200.enqueue(stock[i]['close']) q_240.enqueue(stock[i]['close']) q_300.enqueue(stock[i]['close']) + stock[i]['avg4'] = q_4.avg() stock[i]['avg5'] = q_5.avg() + stock[i]['avg6'] = q_6.avg() stock[i]['avg10'] = q_10.avg() + stock[i]['avg12'] = q_12.avg() stock[i]['avg20'] = q_20.avg() + stock[i]['avg36'] = q_36.avg() stock[i]['avg40'] = q_40.avg() + stock[i]['avg48'] = q_48.avg() stock[i]['avg60'] = q_60.avg() stock[i]['avg120'] = q_120.avg() stock[i]['avg200'] = q_200.avg() @@ -490,10 +625,15 @@ class AnalyzerSqlite: "high": weekDict['high'][ts], "low": weekDict['low'][ts], "volume": weekDict['volume'][ts], + "avg4": -1, "avg5": -1, + "avg6": -1, "avg10": -1, + "avg12": -1, "avg20": -1, + "avg36": -1, "avg40": -1, + "avg48": -1, "avg60": -1, "avg120": -1, "avg200": -1, @@ -524,7 +664,7 @@ class AnalyzerSqlite: stockAnalysisTableName = 'stock_analysis_' + type # 테이블 생성 - cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg5 REAL, avg10 REAL, avg20 REAL, avg40 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL)") + cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL)") # 키 생성 create_key = "CREATE INDEX IF NOT EXISTS " + stockAnalysisTableName + "_idx on " + stockAnalysisTableName + " (CODE, ymd) " @@ -545,16 +685,16 @@ class AnalyzerSqlite: result = cursor.fetchone() if result == None: sql = "INSERT INTO " + stockAnalysisTableName + "(CODE, NAME, ymd, close, diff, open, high, low, volume, " - sql += " avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300, " + sql += " avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, " sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, " sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, " sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, " sql += " rsi, rsis) " - sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" cursor.execute(sql, ( stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'], - price['avg5'], price['avg10'], price['avg20'], price['avg40'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], + price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'], @@ -563,7 +703,7 @@ class AnalyzerSqlite: else: sql = "UPDATE " + stockAnalysisTableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=?, " - sql += " avg5=?, avg10=?, avg20=?, avg40=?, avg60=?, avg120=?, avg200=?, avg240=?, avg300=?, " + sql += " avg4=?, avg5=?, avg6=?, avg10=?, avg12=?, avg20=?, avg36=?, avg40=?, avg48=?, avg60=?, avg120=?, avg200=?, avg240=?, avg300=?, " sql += " bolingerband_upper=?, bolingerband_lower=?, bolingerband_middle=?, " sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, " sql += " stochastic_fast_k=?, stochastic_slow_k=?, stochastic_slow_d=?, " @@ -572,7 +712,7 @@ class AnalyzerSqlite: cursor.execute(sql, (price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'], - price['avg5'], price['avg10'], price['avg20'], price['avg40'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], + price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'], price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'], @@ -612,10 +752,15 @@ class AnalyzerSqlite: "high": item[4], "low": item[5], "volume": item[6], + "avg4": -1, "avg5": -1, + "avg6": -1, "avg10": -1, + "avg12": -1, "avg20": -1, + "avg36": -1, "avg40": -1, + "avg48": -1, "avg60": -1, "avg120": -1, "avg200": -1, @@ -670,10 +815,15 @@ class AnalyzerSqlite: "high": item[4], "low": item[5], "volume": item[6], + "avg4": -1, "avg5": -1, + "avg6": -1, "avg10": -1, + "avg12": -1, "avg20": -1, + "avg36": -1, "avg40": -1, + "avg48": -1, "avg60": -1, "avg120": -1, "avg200": -1, @@ -728,9 +878,9 @@ if __name__ == "__main__": stockFileName = PROJECT_HOME + '/resources/stock.db' analyzer = AnalyzerSqlite(PROJECT_HOME, stockFileName) - analyzer.analyzeDaily() - analyzer.analyzeGrouping("weekly") - analyzer.analyzeGrouping("monthly") + #analyzer.analyzeDaily() + #analyzer.analyzeGrouping("weekly") + #analyzer.analyzeGrouping("monthly") day = datetime.today().strftime("%Y%m%d")