이 전략은 볼링거 밴드, RSI 지표 및 200주기 EMA 트렌드 필터를 결합한 고급 양적 거래 시스템이다. 여러 기술적 지표의 시너지 효과를 통해 트렌드 방향으로 높은 확률의 브레이크아웃 기회를 포착하고 오스실레이션 시장에서 잘못된 신호를 효과적으로 필터한다. 이 시스템은 강력한 거래 성과를 달성하기 위해 위험 보상 비율에 기반한 동적 스톱 로스 및 수익 목표를 사용합니다.
핵심 논리는 세 가지 수준에 기반합니다.
거래 확인은 다음을 요구합니다.
위험 관리 제안:
주요 최적화 접근 방식:
이 전략은 볼링거 밴드, RSI 및 EMA 기술 지표의 유기적 조합을 통해 완전한 거래 시스템을 구축합니다. 거래 품질을 보장하면서도 시스템은 엄격한 위험 통제 및 유연한 매개 변수 최적화 공간을 통해 강력한 실용적 가치를 보여줍니다. 거래자는 라이브 거래에서 매개 변수를 신중하게 검증하고, 엄격하게 거래 규율을 실행하고, 전략 성능을 지속적으로 최적화하는 것이 좋습니다.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-10 08:00:00 period: 2d basePeriod: 2d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Improved Bollinger Breakout with Trend Filtering", overlay=true) // === Inputs === length = input(20, title="Bollinger Bands Length", tooltip="The number of candles used to calculate the Bollinger Bands. Higher values smooth the bands, lower values make them more reactive.") mult = input(2.0, title="Bollinger Bands Multiplier", tooltip="Controls the width of the Bollinger Bands. Higher values widen the bands, capturing more price movement.") rsi_length = input(14, title="RSI Length", tooltip="The number of candles used to calculate the RSI. Shorter lengths make it more sensitive to recent price movements.") rsi_midline = input(50, title="RSI Midline", tooltip="Defines the midline for RSI to confirm momentum. Higher values make it stricter for bullish conditions.") risk_reward_ratio = input(1.5, title="Risk/Reward Ratio", tooltip="Determines the take-profit level relative to the stop-loss.") atr_multiplier = input(1.5, title="ATR Multiplier for Stop-Loss", tooltip="Defines the distance of the stop-loss based on ATR. Higher values set wider stop-losses.") volume_filter = input(true, title="Enable Volume Filter", tooltip="If enabled, trades will only execute when volume exceeds the 20-period average.") trend_filter_length = input(200, title="Trend Filter EMA Length", tooltip="The EMA length used to filter trades based on the market trend.") trade_direction = input.string("Both", title="Trade Direction", options=["Long", "Short", "Both"], tooltip="Choose whether to trade only Long, only Short, or Both directions.") confirm_candles = input(2, title="Number of Confirming Candles", tooltip="The number of consecutive candles that must meet the conditions before entering a trade.") // === Indicator Calculations === basis = ta.sma(close, length) dev = mult * ta.stdev(close, length) upper_band = basis + dev lower_band = basis - dev rsi_val = ta.rsi(close, rsi_length) atr_val = ta.atr(14) vol_filter = volume > ta.sma(volume, 20) ema_trend = ta.ema(close, trend_filter_length) // === Helper Function for Confirmation === confirm_condition(cond, lookback) => count = 0 for i = 0 to lookback - 1 count += cond[i] ? 1 : 0 count == lookback // === Trend Filter === trend_is_bullish = close > ema_trend trend_is_bearish = close < ema_trend // === Long and Short Conditions with Confirmation === long_raw_condition = close > upper_band * 1.01 and rsi_val > rsi_midline and (not volume_filter or vol_filter) and trend_is_bullish short_raw_condition = close < lower_band * 0.99 and rsi_val < rsi_midline and (not volume_filter or vol_filter) and trend_is_bearish long_condition = confirm_condition(long_raw_condition, confirm_candles) short_condition = confirm_condition(short_raw_condition, confirm_candles) // === Trade Entry and Exit Logic === if long_condition and (trade_direction == "Long" or trade_direction == "Both") strategy.entry("Long", strategy.long) strategy.exit("Exit Long", "Long", stop=close - (atr_multiplier * atr_val), limit=close + (atr_multiplier * risk_reward_ratio * atr_val)) if short_condition and (trade_direction == "Short" or trade_direction == "Both") strategy.entry("Short", strategy.short) strategy.exit("Exit Short", "Short", stop=close + (atr_multiplier * atr_val), limit=close - (atr_multiplier * risk_reward_ratio * atr_val)) // === Plotting === plot(upper_band, color=color.green, title="Upper Band") plot(lower_band, color=color.red, title="Lower Band") plot(basis, color=color.blue, title="Basis") plot(ema_trend, color=color.orange, title="Trend Filter EMA")