diff --git a/config.py b/config.py index 7877087..8b695d3 100644 --- a/config.py +++ b/config.py @@ -24,60 +24,60 @@ RESISTANCE_LOOKBACK = 120 # 저항선 판단을 위한 과거 캔들 수 (예: RESISTANCE_BREAK_THRESHOLD = 0.01 # 저항선 대비 1% 이상 돌파 시 신호 KR_COINS = { - "ADA": "ADA", - "APE": "ApeCoin", - "ARB": "Arbitrum", - "BONK": "BONK", - "ENA": "ETHENA", - "HBAR": "HBAR", - "KAIA": "KAIA", - "LINK": "Chainlink", - "ONDO": "ONDO", - "PENGU": "Pudgy Penguins", - "PEPE": "PEPE", - "POL": "POL", - "SAND": "Sandbox", - "SEI": "SEI", - "SHIB": "Shiba Inu", - "STORJ": "Storj", - "SUI": "Sui Network", - "TON": "Toncoin", - "TRX": "TRON", - "UXLINK": "UXLINK", - "VIRTUAL": "Virtuals Protocol", - "WLD": "Worldcoin", - "XLM": "XLM", - "XRP": "XRP" + "ADA": "에이다", + "APE": "에이프코인", + "APT": "앱토스", + "ARB": "아비트럼", + "BONK": "봉크", + "ENA": "에테나", + "HBAR": "헤데라", + "KAIA": "카이아", + "LINK": "체인링크", + "ONDO": "온도파이낸스", + "PENGU": "펏지 펭귄", + "PEPE": "페페", + "POL": "폴리곤 에코시스템 토큰", + "SEI": "세이", + "SHIB": "시바이누", + "STORJ": "스토리지", + "SUI": "수이", + "TON": "톤코인", + "TRX": "트론", + "UXLINK": "유엑스링크", + "VIRTUAL": "버추얼 프로토콜", + "WLD": "월드코인", + "XLM": "스텔라루멘", + "XRP": "엑스알피" } KR_COINS_1 = { - "ADA": "ADA", - "APE": "ApeCoin", - "ARB": "Arbitrum", - "BONK": "BONK", - "ENA": "ETHENA", - "HBAR": "HBAR", - "KAIA": "KAIA", - "LINK": "Chainlink", - "ONDO": "ONDO", - "PENGU": "Pudgy Penguins", - "PEPE": "PEPE", - "POL": "POL", + "ADA": "에이다", + "APE": "에이프코인", + "APT": "앱토스", + "ARB": "아비트럼", + "BONK": "봉크", + "ENA": "에테나", + "HBAR": "헤데라", + "KAIA": "카이아", + "LINK": "체인링크", + "ONDO": "온도파이낸스", + "PENGU": "펏지 펭귄", + "PEPE": "페페", } KR_COINS_2 = { - "SAND": "Sandbox", - "SEI": "SEI", - "SHIB": "Shiba Inu", - "STORJ": "Storj", - "SUI": "Sui Network", - "TON": "Toncoin", - "TRX": "TRON", - "UXLINK": "UXLINK", - "VIRTUAL": "Virtuals Protocol", - "WLD": "Worldcoin", - "XLM": "XLM", - "XRP": "XRP" + "POL": "폴리곤 에코시스템 토큰", + "SEI": "세이", + "SHIB": "시바이누", + "STORJ": "스토리지", + "SUI": "수이", + "TON": "톤코인", + "TRX": "트론", + "UXLINK": "유엑스링크", + "VIRTUAL": "버추얼 프로토콜", + "WLD": "월드코인", + "XLM": "스텔라루멘", + "XRP": "엑스알피" } # 주식 설정 diff --git a/downloader.py b/downloader.py index e386905..a2698d4 100644 --- a/downloader.py +++ b/downloader.py @@ -12,9 +12,10 @@ def inserData(symbol, interval, data): conn = sqlite3.connect('coins.db') cursor = conn.cursor() + tableName = "{}_{}".format(symbol, str(interval)) # 테이블/키 생성 - cursor.execute("CREATE TABLE IF NOT EXISTS " + symbol + " (interval text, CODE text, NAME text, ymdhms datetime, ymd text, hms text, Close REAL, Open REAL, High REAL, Low REAL, Volume REAL)") - cursor.execute("CREATE INDEX IF NOT EXISTS " + symbol + "_idx on " + symbol + "(interval, CODE, ymdhms)") + cursor.execute("CREATE TABLE IF NOT EXISTS {} (CODE text, NAME text, ymdhms datetime, ymd text, hms text, Close REAL, Open REAL, High REAL, Low REAL, Volume REAL)".format(tableName)) + cursor.execute("CREATE INDEX IF NOT EXISTS {}_idx on {}(CODE, ymdhms)".format(tableName, tableName)) for i in range(len(data)): ymd = data.index[i].strftime('%Y%m%d') @@ -26,12 +27,12 @@ def inserData(symbol, interval, data): Close = data.Close.iloc[i] Volume = data.Volume.iloc[i] - cursor.execute("SELECT * from " + symbol + " where CODE = ? and ymdhms = ? and interval = ?", (symbol, ymdhms, interval)) + cursor.execute("SELECT * from {} where CODE = ? and ymdhms = ?".format(tableName), (symbol, ymdhms, )) arr = cursor.fetchone() if arr: - cursor.execute("UPDATE " + symbol + " SET Close=?, Open=?, High=?, Low=?, Volume=? where CODE=? and ymdhms=? and interval=?", (Close, Open, High, Low, Volume, symbol, ymdhms, interval)) + cursor.execute("UPDATE {} SET Close=?, Open=?, High=?, Low=?, Volume=? where CODE=? and ymdhms=?".format(tableName), (Close, Open, High, Low, Volume, symbol, ymdhms)) else: - cursor.execute("INSERT INTO " + symbol + " (interval, CODE, NAME, ymdhms, ymd, hms, Close, Open, High, Low, Volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (interval, symbol, KR_COINS[symbol], ymdhms, ymd, hms, Close, Open, High, Low, Volume)) + cursor.execute("INSERT INTO {} (CODE, NAME, ymdhms, ymd, hms, Close, Open, High, Low, Volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)".format(tableName), (symbol, KR_COINS[symbol], ymdhms, ymd, hms, Close, Open, High, Low, Volume)) conn.commit() cursor.close() @@ -44,9 +45,16 @@ def download(): # 1시간 interval = 60 - data = monitorCoin.get_coin_more_data(symbol, interval, bong_count=10000) + if data is not None and not data.empty: + try: + inserData(symbol, interval, data) + except Exception as e: + print(f"Error processing data for {symbol}: {str(e)}") + # 5분 + interval = 5 + data = monitorCoin.get_coin_more_data(symbol, interval, bong_count=10000) if data is not None and not data.empty: try: inserData(symbol, interval, data) diff --git a/monitor_1h.py b/monitor.py similarity index 94% rename from monitor_1h.py rename to monitor.py index 4aedede..f6dc91a 100644 --- a/monitor_1h.py +++ b/monitor.py @@ -311,14 +311,14 @@ class Monitor: pass current_time = datetime.now() - if data['sell_signal'].iloc[-1] == 'fall_6p': + if data['signal'].iloc[-1] == 'fall_6p': if data['Close'].iloc[-1] > 100: buy_amount = 500000 else: buy_amount = 300000 - if symbol in self.buy_cooldown and symbol in self.last_sell_signal: - if self.last_sell_signal[symbol] == 'fall_6p': + if symbol in self.buy_cooldown and symbol in self.last_signal: + if self.last_signal[symbol] == 'fall_6p': time_diff = current_time - self.buy_cooldown[symbol] if time_diff.total_seconds() < 4000: print(f"{symbol}: 매수 금지 중 (남은 시간: {600 - time_diff.total_seconds():.0f}초)") @@ -331,20 +331,20 @@ class Monitor: return False buy_amount = 5100 - if data['sell_signal'].iloc[-1] == 'movingaverage': + if data['signal'].iloc[-1] == 'movingaverage': buy_amount = 30000 - elif data['sell_signal'].iloc[-1] == 'deviation40': + elif data['signal'].iloc[-1] == 'deviation40': buy_amount = 50000 - elif data['sell_signal'].iloc[-1] == 'deviation240': + elif data['signal'].iloc[-1] == 'deviation240': buy_amount = 6000 - elif data['sell_signal'].iloc[-1] == 'deviation1440': + elif data['signal'].iloc[-1] == 'deviation1440': if symbol in ['BONK', 'PEPE', 'TON']: buy_amount = 20000 else: buy_amount = 30000 # heikin_ashi 조건 제거 완료 - if data['sell_signal'].iloc[-1] in ['movingaverage', 'deviation40', 'deviation240', 'deviation1440']: + if data['signal'].iloc[-1] in ['movingaverage', 'deviation40', 'deviation240', 'deviation1440']: if check_5_week_lowest: buy_amount *= 4 @@ -353,14 +353,14 @@ class Monitor: if self.cooldown_file is not None: # 최근 매수 신호를 함께 기록하여 [신규] 포맷으로 저장 try: - self.last_sell_signal[symbol] = str(data['sell_signal'].iloc[-1]) + self.last_signal[symbol] = str(data['signal'].iloc[-1]) except Exception: - self.last_sell_signal[symbol] = '' + self.last_signal[symbol] = '' self.buy_cooldown[symbol] = current_time self._save_buy_cooldown() - print(f"{KR_COINS[symbol]} ({symbol}) [{data['sell_signal'].iloc[-1]}], 현재가: {data['Close'].iloc[-1]:.4f}, 20분간 매수 금지 시작") - self.sendMsg("[KRW-COIN]" + "\n" + self.format_message('COIN', symbol, KR_COINS[symbol], data['Close'].iloc[-1], data['sell_signal'].iloc[-1])) + print(f"{KR_COINS[symbol]} ({symbol}) [{data['signal'].iloc[-1]}], 현재가: {data['Close'].iloc[-1]:.4f}, 20분간 매수 금지 시작") + self.sendMsg("[KRW-COIN]" + "\n" + self.format_message('COIN', symbol, KR_COINS[symbol], data['Close'].iloc[-1], data['signal'].iloc[-1])) except Exception as e: print(f"Error buying {symbol}: {str(e)}") return False @@ -521,16 +521,12 @@ class Monitor: conn = sqlite3.connect('coins.db') cursor = conn.cursor() for i in range(1, len(data)): - cursor.execute( - "SELECT * from " + symbol + " where CODE = ? and ymdhms = ? and interval = ?", - (symbol, data['datetime'].iloc[-i].strftime('%Y-%m-%d %H:%M:%S'), interval), - ) + cursor.execute("SELECT * from {}_{} where CODE = ? and ymdhms = ?".format(symbol, str(interval)), (symbol, data['datetime'].iloc[-i].strftime('%Y-%m-%d %H:%M:%S')),) arr = cursor.fetchone() if not arr: cursor.execute( - "INSERT INTO " + symbol + " (interval, CODE, NAME, ymdhms, ymd, hms, close, open, high, low, volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "INSERT INTO {}_{} (CODE, NAME, ymdhms, ymd, hms, close, open, high, low, volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)".format(symbol, interval), ( - interval, symbol, KR_COINS[symbol], data['datetime'].iloc[-i].strftime('%Y-%m-%d %H:%M:%S'), @@ -545,11 +541,7 @@ class Monitor: ) else: break - cursor.execute( - "select * from (SELECT Open,Close,High,Low,Volume,ymdhms as datetime from " - + symbol - + " order by ymdhms desc limit 7000) subquery order by datetime" - ) + cursor.execute("select * from (SELECT Open,Close,High,Low,Volume,ymdhms as datetime from {}_{} order by ymdhms desc limit 7000) subquery order by datetime".format(symbol, str(interval))) result = cursor.fetchall() conn.commit() cursor.close() diff --git a/monitor_coin.py b/monitor_coin.py index f1a476e..a90b531 100644 --- a/monitor_coin.py +++ b/monitor_coin.py @@ -2,7 +2,7 @@ from datetime import datetime import time from config import * -from monitor_1h import Monitor +from monitor import Monitor class MonitorCoin (Monitor): """자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스""" diff --git a/monitor_coin_1h_1.py b/monitor_coin_1h_1.py index db44dd5..5a9c80a 100644 --- a/monitor_coin_1h_1.py +++ b/monitor_coin_1h_1.py @@ -2,7 +2,7 @@ from datetime import datetime import time from config import * -from monitor_1h import Monitor +from monitor import Monitor class MonitorCoin (Monitor): """자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스""" diff --git a/monitor_coin_1h_2.py b/monitor_coin_1h_2.py index 9eb62fe..82fc69d 100644 --- a/monitor_coin_1h_2.py +++ b/monitor_coin_1h_2.py @@ -2,7 +2,7 @@ from datetime import datetime import time from config import * -from monitor_1h import Monitor +from monitor import Monitor class MonitorCoin (Monitor): """자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스""" diff --git a/monitor_stock.py b/monitor_stock.py index 07bd20e..d7486da 100644 --- a/monitor_stock.py +++ b/monitor_stock.py @@ -5,7 +5,7 @@ import schedule from config import * import FinanceDataReader as fdr -from monitor_1h import Monitor +from monitor import Monitor class MonitorStock (Monitor): """자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스""" diff --git a/simulation_1h.py b/simulation_1h.py index 6314c8d..3b99d5d 100644 --- a/simulation_1h.py +++ b/simulation_1h.py @@ -9,7 +9,7 @@ plt.rcParams['font.family'] ='AppleGothic' plt.rcParams['axes.unicode_minus'] =False from config import * -from monitor_1h import Monitor +from monitor import Monitor class Simulation: