diff --git a/HTS_etf.py b/HTS_etf.py index 92c5b4e..c9a7669 100644 --- a/HTS_etf.py +++ b/HTS_etf.py @@ -41,18 +41,18 @@ class HTS_etf(HTS): return - def getTodayRSI(self, dbfile_name="stock.db"): + def getTodayStateValue(self, stock_code, dbfile_name="stock.db"): try: conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, dbfile_name)) cursor = conn.cursor() - cursor.execute('SELECT rsi FROM stock_analysis WHERE CODE=? order by ymd desc', (self.stock_code,)) - db_result = cursor.fetchall() + cursor.execute('SELECT stochastic_slow_k FROM stock_analysis WHERE CODE=? order by ymd desc limit 1', (stock_code,)) + db_result = cursor.fetchone() cursor.close() conn.close() if db_result is not None: - return db_result[0][0] + return db_result[0] except: return 100 return 100 @@ -129,11 +129,55 @@ class HTS_etf(HTS): return result - def buyRealTime(self, today, analyzed_day=1000, MAX_PRICE=10000, logFp=None): - rsi = self.getTodayRSI() - if rsi > 79: - self.bot.sendMsg("exit... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi)) - return + def get_MAX_PRICE(self, stock_code, stochastic_slow_k): + MAX_PRICE = 30000 + + if stock_code == "252670": + # "KODEX 200선물인버스2X" + if stochastic_slow_k < 20: + MAX_PRICE = 200000 + elif 20 <= stochastic_slow_k < 40: + MAX_PRICE = 150000 + elif 40 <= stochastic_slow_k < 60: + MAX_PRICE = 100000 + else: + MAX_PRICE = 50000 + elif stock_code == "122630": + # "KODEX 레버리지" + if stochastic_slow_k < 20: + MAX_PRICE = 100000 + elif 20 <= stochastic_slow_k < 40: + MAX_PRICE = 70000 + elif 40 <= stochastic_slow_k < 60: + MAX_PRICE = 50000 + else: + MAX_PRICE = 30000 + elif stock_code == "251340": + # "KODEX 코스닥150선물인버스" + if stochastic_slow_k < 20: + MAX_PRICE = 100000 + elif 20 <= stochastic_slow_k < 40: + MAX_PRICE = 70000 + elif 40 <= stochastic_slow_k < 60: + MAX_PRICE = 50000 + else: + MAX_PRICE = 30000 + elif stock_code == "233740": + # "KODEX 코스닥150레버리지" + if stochastic_slow_k < 20: + MAX_PRICE = 70000 + elif 20 <= stochastic_slow_k < 40: + MAX_PRICE = 50000 + elif 40 <= stochastic_slow_k < 60: + MAX_PRICE = 30000 + else: + MAX_PRICE = 10000 + + return MAX_PRICE + + def buyRealTime(self, today, analyzed_day=1000, logFp=None): + stochastic_slow_k = self.getTodayStateValue(self.stock_code) + MAX_PRICE = self.get_MAX_PRICE(self.stock_code, stochastic_slow_k) print("START...") THIS_TIME = datetime.now() @@ -141,11 +185,9 @@ class HTS_etf(HTS): LAST_DATA = self.getLastData(self.stock_code, today) while datetime.strptime(today + " 063000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100",'%Y%m%d %H%M%S'): - if THIS_TIME < datetime.strptime(today + " 085500", '%Y%m%d %H%M%S'): - self.bot.sendMsg("WAIT... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi)) if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 090100", '%Y%m%d %H%M%S'): - self.bot.sendMsg("START... {} ({}) RSI: {}".format(self.stock_code, self.stock_name, rsi)) - logFp.write("START {} ({}) RSI: {}\n".format(self.stock_code, self.stock_name, rsi)) + self.bot.sendMsg("START... {} ({}) SLOW_K: {}".format(self.stock_code, self.stock_name, MAX_PRICE)) + logFp.write("START {} ({}) SLOW_K: {}\n".format(self.stock_code, self.stock_name, MAX_PRICE)) if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): diff --git a/HTS_etf_122630.py b/HTS_etf_122630.py index cbdfc5f..c44c5bd 100644 --- a/HTS_etf_122630.py +++ b/HTS_etf_122630.py @@ -20,7 +20,7 @@ if __name__ == "__main__": if not os.path.exists(os.path.join(RESOURCE_PATH, "log")): os.mkdir(os.path.join(RESOURCE_PATH, "log")) logFp = open(os.path.join(RESOURCE_PATH, "log", today_str + "_" + stock_code + ".log"), "w", encoding='utf-8') - hts.buyRealTime(today_str, analyzed_day=1000, MAX_PRICE=40000, logFp=logFp) + hts.buyRealTime(today_str, analyzed_day=1000, logFp=logFp) logFp.close() db_filename = os.path.join(RESOURCE_PATH, "hts.db") diff --git a/HTS_etf_233740.py b/HTS_etf_233740.py index 17087a5..e9897f2 100644 --- a/HTS_etf_233740.py +++ b/HTS_etf_233740.py @@ -20,7 +20,7 @@ if __name__ == "__main__": if not os.path.exists(os.path.join(RESOURCE_PATH, "log")): os.mkdir(os.path.join(RESOURCE_PATH, "log")) logFp = open(os.path.join(RESOURCE_PATH, "log", today_str + "_" + stock_code + ".log"), "w", encoding='utf-8') - hts.buyRealTime(today_str, analyzed_day=1000, MAX_PRICE=30000, logFp=logFp) + hts.buyRealTime(today_str, analyzed_day=1000, logFp=logFp) logFp.close() db_filename = os.path.join(RESOURCE_PATH, "hts.db") diff --git a/HTS_etf_251340.py b/HTS_etf_251340.py index 94ee463..58db2ae 100644 --- a/HTS_etf_251340.py +++ b/HTS_etf_251340.py @@ -20,7 +20,7 @@ if __name__ == "__main__": if not os.path.exists(os.path.join(RESOURCE_PATH, "log")): os.mkdir(os.path.join(RESOURCE_PATH, "log")) logFp = open(os.path.join(RESOURCE_PATH, "log", today_str + "_" + stock_code + ".log"), "w", encoding='utf-8') - hts.buyRealTime(today_str, analyzed_day=1000, MAX_PRICE=50000, logFp=logFp) + hts.buyRealTime(today_str, analyzed_day=1000, logFp=logFp) logFp.close() db_filename = os.path.join(RESOURCE_PATH, "hts.db") diff --git a/HTS_etf_252670.py b/HTS_etf_252670.py index 0af6348..01f7881 100644 --- a/HTS_etf_252670.py +++ b/HTS_etf_252670.py @@ -20,7 +20,7 @@ if __name__ == "__main__": if not os.path.exists(os.path.join(RESOURCE_PATH, "log")): os.mkdir(os.path.join(RESOURCE_PATH, "log")) logFp = open(os.path.join(RESOURCE_PATH, "log", today_str + "_" + stock_code + ".log"), "w", encoding='utf-8') - hts.buyRealTime(today_str, analyzed_day=1000, MAX_PRICE=100000, logFp=logFp) + hts.buyRealTime(today_str, analyzed_day=1000, logFp=logFp) logFp.close() db_filename = os.path.join(RESOURCE_PATH, "hts.db") diff --git a/Simulation.py b/Simulation.py index d817177..010709b 100644 --- a/Simulation.py +++ b/Simulation.py @@ -271,18 +271,13 @@ if __name__ == "__main__": simulation = Simulation(RESOURCE_PATH) + day_list = ['20231025'] # to check bying stock_codes = { - #"252670": ['20210930'], - #"252670": ['20210903','20210910','20210913'], - #"252670": ['20210901', '20210902', '20210903', '20210906', '20210907', '20210908', '20210909', '20210910', '20210913', '20210914', '20210915', '20210916', '20210917', '20210923', '20210924', '20210927', '20210928', '20210929', '20210930', '20211001', '20211005','20231012','20231013'], - #"122630": ['20230930'], - #"122630": ['20210901','20210902','20210903','20210906','20231012','20231013'] - #"122630": ['20210901', '20210902', '20210903', '20210906', '20210907', '20210908', '20210909', '20210910', '20210913', '20210914', '20210915', '20210916', '20210917', '20210923', '20210924', '20210927', '20210928', '20210929', '20210930', '20211001', '20211005','20231012','20231013'], - "233740": ['20231023'], - "252670": ['20231023'], - "251340": ['20231023'], - "122630": ['20231023'] + "233740": day_list, + "252670": day_list, + "251340": day_list, + "122630": day_list } #simulation.simulate(stock_codes) simulation.simulate(stock_codes) diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 1c4dcca..365e00e 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -215,61 +215,40 @@ class BuySellChecker: return buy, weight - - - def getBuyPriceAndWeight(self, stock_code, i, data): buy, weight = -1, -1 - if i > 40: - """ - up, up_volume, down, down_volume = 0, 0, 0, 0 - for c in range(i-26, i): - if data['open'][c] < data['close'][c]: - up += 1 - up_volume += data['volume'][c] - if data['close'][c] < data['open'][c]: - down += 1 - down_volume += data['volume'][c] - if down_volume < up_volume * 0.75: - buy, weight = data['close'][i], 1 - """ + if i > 50: - if data['macd'][i] < 0 and data['macd'][i - 1] < data['macd'][i] and data['macds'][i] < data['macd'][i]: - check = True - for c in range(2, 5): - if data['macds'][i - c] < data['macd'][i - c]: - check = False - break - if check: - up, middle, down = 0, 0, 0 - for c in range(i - 26, i): - if data['open'][c] < data['close'][c]: - min_value = min(data['open'][c], data['close'][c]) - if data['laggingSpan'][c] < min_value: - down += 1 - elif min_value < data['laggingSpan'][c]: - up += 1 - else: - middle += 1 - if middle < 10: - check = True - for c in range(i - 56, i - 26): - if min(data['open'][c], data['close'][c]) < data['laggingSpan'][c]: - check = False - break - if check: - if max(data['low'][i - 5:i].tolist() + data['high'][i - 5:i].tolist()) < data['close'][i]: - buy, weight = data['close'][i], 1 + if stock_code == '233740': + if data['macd'][i-2] < 0 and 0 < data['macd'][i-1] and 0 < data['macd'][i]: + if data['volume'][i - 2] < data['volume'][i - 1] < data['volume'][i]: + if min(data['macd'][i-30:i].tolist()) < -50: + buy, weight = data['close'][i], 1 - check = True - for c in range(i - 40 - 26, i - 26): - if min(data['open'][c], data['close'][c]) < data['laggingSpan'][c]: - check = False - break - if check: - if max(data['low'][i - 5:i].tolist() + data['high'][i - 5:i].tolist()) < data['close'][i]: - buy, weight = data['close'][i], 1 + if min(data['macd'][i-5:i].tolist()) < min(data['macd'][i-15:i-10].tolist()) < -50: + if -50 < max(data['macd'][i-15:i-7].tolist()): + buy, weight = data['close'][i], 1 + + elif stock_code == '122630': + if data['macd'][i - 2] < 0 and 0 < data['macd'][i - 1] and 0 < data['macd'][i]: + if data['volume'][i - 2] < data['volume'][i - 1] < data['volume'][i]: + if min(data['macd'][i - 30:i].tolist()) < -25: + buy, weight = data['close'][i], 1 + + if min(data['macd'][i-5:i].tolist()) < min(data['macd'][i - 15:i - 10].tolist()) < -30: + if -20 < max(data['macd'][i - 15:i - 7].tolist()): + buy, weight = data['close'][i], 1 + + + elif stock_code == '252670': + if min(data['macd'][i - 40:i - 20].tolist()) < -5 < data['macd'][i]: + if data['close'][i] < min(data['close'][i - 40:i - 20].tolist()): + buy, weight = data['close'][i], 1 + elif stock_code == '251340': + if min(data['macd'][i-40:i-20].tolist()) < -20 < data['macd'][i]: + if data['close'][i] < min(data['close'][i-40:i-20].tolist()): + buy, weight = data['close'][i], 1 return buy, weight