이 전략은 트렌드 추적 및 스윙 트레이딩을 결합한 하이브리드 시스템으로, 여러 기술적 지표 검진 및 엄격한 자본 관리를 통해 안정적인 거래를 달성합니다. 이 전략은 수익을 잠금하기 위해 단계적 인 수익 접근 방식을 채택하고 수익을 보장하면서 위험을 관리하기 위해 최대 마감 통제를 설정합니다. 시스템은 거래 효과를 보장하기 위해 볼륨, ATR 및 EMA 여러 필터와 결합하여 주요 거래 신호 트리거로 RSI 모멘텀 지표와 ADX 트렌드 강도 지표를 사용합니다.
전략의 핵심 논리는 다음의 핵심 요소들을 포함합니다.
이 전략은 여러 기술적 지표와 엄격한 자본 관리를 통해 안정적인 거래를 달성하는 포괄적 인 거래 시스템입니다. 전략의 핵심 장점은 완전한 리스크 제어 시스템과 단계적 인 이익 취득 메커니즘에 있습니다. 그러나 실질적인 적용에서 시장 조건에 따라 적절한 파라미터 조정에주의를 기울여야합니다. 전략의 추가 최적화 공간은 주로 파라미터 동적 적응 및 신호 필터링 메커니즘 개선에 있습니다.
/*backtest start: 2023-12-20 00:00:00 end: 2024-12-18 08:00:00 period: 2d basePeriod: 2d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Swing Strategy (<30% DD)", shorttitle="SwingStratDD", overlay=true) //----------------------------------------------------- // Example Indicators and Logic //----------------------------------------------------- emaLen = input.int(200, "EMA Length", minval=1) emaValue = ta.ema(close, emaLen) plot(emaValue, color=color.yellow, linewidth=2, title="EMA 200") //----------------------------------------------------- // User Inputs //----------------------------------------------------- adxLen = input.int(14, "ADX Length", minval=1) rsiLen = input.int(14, "RSI Length", minval=1) atrLen = input.int(14, "ATR Length", minval=1) rsiBuyThresh = input.float(60, "RSI Buy Threshold", minval=1, maxval=100) adxThresh = input.float(25, "ADX Threshold (Trend)", minval=1, maxval=100) minVolume = input.float(1e6,"Minimum Volume", minval=1) minATR = input.float(2, "Minimum ATR(14)", minval=0.1, step=0.1) stopLossPerc = input.float(15, "Stop-Loss %", minval=0.1, step=0.1) // We’ll do two partial take-profit levels to aim for consistent cashflow: takeProfit1Perc = input.float(15, "Take-Profit1 %", minval=0.1, step=0.1) takeProfit2Perc = input.float(30, "Take-Profit2 %", minval=0.1, step=0.1) ddLimit = input.float(30, "Max Drawdown %", minval=0.1, step=0.1) //----------------------------------------------------- // Indicators //----------------------------------------------------- rsiValue = ta.rsi(close, rsiLen) atrValue = ta.atr(atrLen) //--- Fully Manual ADX Calculation --- upMove = high - high[1] downMove = low[1] - low plusDM = (upMove > downMove and upMove > 0) ? upMove : 0.0 minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0 smPlusDM = ta.rma(plusDM, adxLen) smMinusDM = ta.rma(minusDM, adxLen) smTR = ta.rma(ta.tr, adxLen) plusDI = (smPlusDM / smTR) * 100 minusDI = (smMinusDM / smTR) * 100 dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adxValue = ta.rma(dx, adxLen) //----------------------------------------------------- // Screener-Like Conditions (Technical Only) //----------------------------------------------------- volumeCondition = volume > minVolume adxCondition = adxValue > adxThresh rsiCondition = rsiValue > rsiBuyThresh atrCondition = atrValue > minATR aboveEmaCondition = close > emaValue longCondition = volumeCondition and adxCondition and rsiCondition and atrCondition and aboveEmaCondition //----------------------------------------------------- // Strategy Entry / Exit Logic //----------------------------------------------------- var bool inTrade = false // Entry if longCondition and not inTrade strategy.entry("Long", strategy.long) // Basic Exit Condition: RSI < 50 or Price < EMA exitCondition = (rsiValue < 50) or (close < emaValue) if inTrade and exitCondition strategy.close("Long") // Update inTrade status inTrade := strategy.position_size > 0 //----------------------------------------------------- // Multi-Level Stop-Loss & Partial Profits //----------------------------------------------------- if inTrade float entryPrice = strategy.position_avg_price // Stop-Loss float stopPrice = entryPrice * (1 - stopLossPerc / 100) // Two partial take-profit levels float tp1Price = entryPrice * (1 + takeProfit1Perc / 100) float tp2Price = entryPrice * (1 + takeProfit2Perc / 100) // Example approach: exit half at TP1, half at TP2 strategy.exit("TP1/SL", from_entry="Long", stop=stopPrice, limit=tp1Price, qty_percent=50) strategy.exit("TP2", from_entry="Long", limit=tp2Price, qty_percent=50) //----------------------------------------------------- // Dynamic Drawdown Handling //----------------------------------------------------- var float peakEquity = strategy.equity peakEquity := math.max(peakEquity, strategy.equity) currentDrawdownPerc = (peakEquity - strategy.equity) / peakEquity * 100 if currentDrawdownPerc > ddLimit strategy.close_all("Max Drawdown Exceeded") //----------------------------------------------------- // Plotting //----------------------------------------------------- plot(emaValue, title="EMA 200", color=color.yellow, linewidth=2) plotchar(rsiValue, title="RSI", char='●', location=location.bottom, color=color.new(color.teal, 50)) plot(adxValue, title="Manual ADX", color=color.orange)