この戦略は,トレンドフォローとスウィングトレードを組み合わせたハイブリッドシステムで,複数の技術指標のスクリーニングと厳格な資本管理を通じて安定した取引を達成する.この戦略は,収益をロックするために段階的な利益の取扱アプローチを採用し,最大引き下げ制御を設定し,リスクを管理しながら収益を確保する.このシステムは,取引効果を確保するためにボリューム,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)