MA 정렬 요구 완화 + 최소 캔들 body 0.2% 필터

## 변경 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<MA25 라 차단
이후: close 가 MA7,MA25 위라 통과 -> 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<open 통과 -> short 신호
이후: body -0.11% > -0.2% -> 차단

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
ILSEON-RYU
2026-05-05 00:03:45 +09:00
parent 260f68adca
commit d49ac84fa2
+10 -6
View File
@@ -310,11 +310,13 @@ def compute_indicators(df, interval="5m"):
return df return df
def compute_signals(df, interval="5m"): def compute_signals(df, interval="5m"):
# close 가 MA7, MA25 양쪽 위/아래에 있는 것 만 요구. MA끼리 정렬 (MA7>MA25)은
# 추세 반전 직후엔 늦게 형성되어 양봉/음봉 신호를 차단하는 부작용 있어 제거.
df["bull_ma_2"] = ( 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["bear_ma_2"] = (
(df["close"] < df["MA7"]) & (df["MA7"] < df["MA25"]) (df["close"] < df["MA7"]) & (df["close"] < df["MA25"])
) )
df["bull_ma"] = ( df["bull_ma"] = (
(df["close"] > df["MA7"]) & (df["MA7"] > df["MA25"]) (df["close"] > df["MA7"]) & (df["MA7"] > df["MA25"])
@@ -328,10 +330,12 @@ def compute_signals(df, interval="5m"):
# 현재 캔들 자체의 방향이 신호 방향과 일치해야 발사. # 현재 캔들 자체의 방향이 신호 방향과 일치해야 발사.
# 늦은 진입 (반등 중인 녹색 캔들에 short 등) 차단 + 현재 진행 중인 breakdown # 늦은 진입 (반등 중인 녹색 캔들에 short 등) 차단 + 현재 진행 중인 breakdown
# (빨간 거대 캔들에 short) 은 통과 시킴. # (빨간 거대 캔들에 short) 은 통과 시킴.
# BB 상/하단 차단 제거 + RSI 임계 완화 (60→75 / 35→25). 큰 양봉/음봉이라도 # BB 상/하단 차단 제거 + RSI 임계 완화 (60→75 / 35→25). 캔들 body 최소 0.2%
# 마커 발화하도록. 늦은 진입 차단보다 신호 캡처 우선. # 요구해 작은 노이즈 캔들 차단 (close vs open 만으로는 -0.1% 같은 미미한 음봉도
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"]) 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["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) df["short_signal"] = df["short_signal"] & (df["short_signal"].rolling(5, min_periods=1).sum().shift(1).fillna(0) == 0)