From d49ac84fa2e5fcfc8a9dc7f55207b197ba068eeb Mon Sep 17 00:00:00 2001 From: ILSEON-RYU Date: Tue, 5 May 2026 00:03:45 +0900 Subject: [PATCH] =?UTF-8?q?MA=20=EC=A0=95=EB=A0=AC=20=EC=9A=94=EA=B5=AC=20?= =?UTF-8?q?=EC=99=84=ED=99=94=20+=20=EC=B5=9C=EC=86=8C=20=EC=BA=94?= =?UTF-8?q?=EB=93=A4=20body=200.2%=20=ED=95=84=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 변경 1 — bull_ma_2 / bear_ma_2 정의 완화 이전: close > MA7 > MA25 (MA끼리 정렬 요구) -> 추세 반전 직후 MA가 정렬되기 전 양봉/음봉을 차단해 신호 누락. 이후: close > MA7 AND close > MA25 (가격이 두 MA 모두 위/아래에만 있으면 OK). MA끼리 정렬 미완성도 통과. 예: 23:15 15m 양봉 +0.36% (close 79,201, MA7 78,903, MA25 79,092) 이전: MA7 long_signal 발화 ## 변경 2 — 최소 캔들 body 0.2% 필터 이전: close > open / close < open 만 요구 -> -0.11% 같은 미미한 음봉도 short 신호로 발화 (노이즈). 이후: body_pct >= +0.2% (long) / <= -0.2% (short) 추가 요구. 예: 22:45 15m -0.11% 작은 음봉 이전: close short 신호 이후: body -0.11% > -0.2% -> 차단 Co-Authored-By: Claude Opus 4.7 (1M context) --- app_streamlit.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app_streamlit.py b/app_streamlit.py index 73596a4..2156274 100644 --- a/app_streamlit.py +++ b/app_streamlit.py @@ -310,11 +310,13 @@ def compute_indicators(df, interval="5m"): return df def compute_signals(df, interval="5m"): + # close 가 MA7, MA25 양쪽 위/아래에 있는 것 만 요구. MA끼리 정렬 (MA7>MA25)은 + # 추세 반전 직후엔 늦게 형성되어 양봉/음봉 신호를 차단하는 부작용 있어 제거. df["bull_ma_2"] = ( - (df["close"] > df["MA7"]) & (df["MA7"] > df["MA25"]) + (df["close"] > df["MA7"]) & (df["close"] > df["MA25"]) ) df["bear_ma_2"] = ( - (df["close"] < df["MA7"]) & (df["MA7"] < df["MA25"]) + (df["close"] < df["MA7"]) & (df["close"] < df["MA25"]) ) df["bull_ma"] = ( (df["close"] > df["MA7"]) & (df["MA7"] > df["MA25"]) @@ -328,10 +330,12 @@ def compute_signals(df, interval="5m"): # 현재 캔들 자체의 방향이 신호 방향과 일치해야 발사. # 늦은 진입 (반등 중인 녹색 캔들에 short 등) 차단 + 현재 진행 중인 breakdown # (빨간 거대 캔들에 short) 은 통과 시킴. - # BB 상/하단 차단 제거 + RSI 임계 완화 (60→75 / 35→25). 큰 양봉/음봉이라도 - # 마커 발화하도록. 늦은 진입 차단보다 신호 캡처 우선. - df["long_signal"] = df["bull_ma_2"] & (df["RSI"] < 75) & (df["MACD_hist"] > df["MACD_hist"].shift(1)) & (df["close"] > df["BB_mid"]) & (df["close"] > df["open"]) - df["short_signal"] = df["bear_ma_2"] & (df["RSI"] > 25) & (df["MACD_hist"] < df["MACD_hist"].shift(1)) & (df["close"] < df["BB_mid"]) & (df["close"] < df["open"]) + # BB 상/하단 차단 제거 + RSI 임계 완화 (60→75 / 35→25). 캔들 body 최소 0.2% + # 요구해 작은 노이즈 캔들 차단 (close vs open 만으로는 -0.1% 같은 미미한 음봉도 + # 신호로 잡히던 문제 해결). + body_pct = (df["close"] - df["open"]) / df["open"].replace(0, float("nan")) + df["long_signal"] = df["bull_ma_2"] & (df["RSI"] < 75) & (df["MACD_hist"] > df["MACD_hist"].shift(1)) & (df["close"] > df["BB_mid"]) & (body_pct >= 0.002) + df["short_signal"] = df["bear_ma_2"] & (df["RSI"] > 25) & (df["MACD_hist"] < df["MACD_hist"].shift(1)) & (df["close"] < df["BB_mid"]) & (body_pct <= -0.002) df["long_signal"] = df["long_signal"] & (df["long_signal"].rolling(5, min_periods=1).sum().shift(1).fillna(0) == 0) df["short_signal"] = df["short_signal"] & (df["short_signal"].rolling(5, min_periods=1).sum().shift(1).fillna(0) == 0)