diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e59efd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.claude/settings.local.json +streamlit.log +streamlit.err.log diff --git a/app_streamlit.py b/app_streamlit.py index 82d320e..5b39c6a 100644 --- a/app_streamlit.py +++ b/app_streamlit.py @@ -66,7 +66,7 @@ def send_telegram(message: str): def check_and_alert(df, symbol, interval): now = time.time() - last = df.iloc[-1] + recent = df.tail(3) for sig, key, msg in [ ("strong_long_signal", "strong_long", f"🟢 강한 롱 진입 신호\n{symbol} {interval}"), ("strong_short_signal", "strong_short", f"🔴 강한 숏 진입 신호\n{symbol} {interval}"), @@ -76,7 +76,7 @@ def check_and_alert(df, symbol, interval): ("vol_short_signal", "vol_short", f"🔽 볼륨급등 숏 신호\n{symbol} {interval}"), ("short_caution_signal","short_caution",f"⚠️ 숏 진입 주의 신호\n{symbol} {interval}"), ]: - if last.get(sig, False) and now - _last_alert[key] > ALERT_COOLDOWN: + if sig in recent.columns and recent[sig].fillna(False).any() and now - _last_alert[key] > ALERT_COOLDOWN: send_telegram(msg) _last_alert[key] = now @@ -542,10 +542,10 @@ def _alert_loop(): with _alert_lock: symbol = _alert_symbol interval = _alert_interval - df = get_klines(symbol, interval, 50) + df = get_klines(symbol, interval, 200) oi_period = interval if interval in ["5m","15m","30m","1h","4h","12h","1d","3d","1M"] else "5m" try: - oi = get_open_interest_history(symbol, oi_period, 50) + oi = get_open_interest_history(symbol, oi_period, 200) if not oi.empty: oi_m = oi[["timestamp","sumOpenInterest"]].rename(columns={"timestamp":"open_time"}) df["open_time_r"] = df["open_time"].dt.floor(_to_floor_freq(oi_period)) @@ -554,6 +554,16 @@ def _alert_loop(): df = df.drop(columns=["open_time_r","open_time_oi"], errors="ignore") df["sumOpenInterest"] = df["sumOpenInterest"].ffill() except: pass + try: + fr = get_funding_rate(symbol, 200) + if not fr.empty: + fr_m = fr[["fundingTime","fundingRate"]].rename(columns={"fundingTime":"open_time"}) + fr_m["open_time"] = fr_m["open_time"].dt.floor(_to_floor_freq("1h")) + df["open_time_r2"] = df["open_time"].dt.floor(_to_floor_freq("1h")) + df = df.merge(fr_m, left_on="open_time_r2", right_on="open_time", how="left", suffixes=("","_fr")) + df = df.drop(columns=["open_time_r2","open_time_fr"], errors="ignore") + df["fundingRate"] = df["fundingRate"].ffill().fillna(0) + except: pass df = compute_indicators(df, interval) check_and_alert(df, symbol, interval) except Exception as e: