This is a trend following strategy that combines multi-timeframe analysis and volatility management. The strategy core uses dual EMA crossover for trend direction, RSI indicator for overbought/oversold filtering, incorporates higher timeframe EMA for overall trend confirmation, and utilizes ATR indicator for dynamic stop-loss and profit target management. Through the coordinated use of multiple technical indicators, the strategy ensures both signal reliability and effective risk control.
The core trading logic consists of the following key components:
This is a well-designed trend following strategy that achieves favorable risk-reward characteristics through multi-timeframe analysis and volatility management. The core advantage lies in the organic combination of multiple technical indicators, ensuring both trading reliability and effective risk control. While some potential risks exist, the strategy’s overall performance still has room for improvement through continuous optimization and refinement. It’s crucial to focus on parameter optimization and backtesting validation while strictly implementing risk control measures in live trading.
/*backtest start: 2019-12-23 08:00:00 end: 2024-11-26 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trend Following with ATR and MTF Confirmation", overlay=true) // Parameters emaShortPeriod = input.int(9, title="Short EMA Period", minval=1) emaLongPeriod = input.int(21, title="Long EMA Period", minval=1) rsiPeriod = input.int(14, title="RSI Period", minval=1) rsiOverbought = input.int(70, title="RSI Overbought", minval=50) rsiOversold = input.int(30, title="RSI Oversold", minval=1) atrPeriod = input.int(14, title="ATR Period", minval=1) atrMultiplier = input.float(1.5, title="ATR Multiplier", minval=0.1) takeProfitATRMultiplier = input.float(2.0, title="Take Profit ATR Multiplier", minval=0.1) // Multi-timeframe settings htfEMAEnabled = input.bool(true, title="Use Higher Timeframe EMA Confirmation?", inline="htf") htfEMATimeframe = input.timeframe("D", title="Higher Timeframe", inline="htf") // Select trade direction tradeDirection = input.string("Both", title="Trade Direction", options=["Both", "Long", "Short"]) // Calculating indicators emaShort = ta.ema(close, emaShortPeriod) emaLong = ta.ema(close, emaLongPeriod) rsiValue = ta.rsi(close, rsiPeriod) atrValue = ta.atr(atrPeriod) // Higher timeframe EMA confirmation htfEMALong = request.security(syminfo.tickerid, htfEMATimeframe, ta.ema(close, emaLongPeriod)) // Trading conditions longCondition = ta.crossover(emaShort, emaLong) and rsiValue < rsiOverbought and (not htfEMAEnabled or close > htfEMALong) shortCondition = ta.crossunder(emaShort, emaLong) and rsiValue > rsiOversold and (not htfEMAEnabled or close < htfEMALong) // Plotting EMAs plot(emaShort, title="EMA Short", color=color.green) plot(emaLong, title="EMA Long", color=color.red) // Trailing Stop-Loss and Take-Profit levels var float trailStopLoss = na var float trailTakeProfit = na // Exit conditions var bool exitLongCondition = na var bool exitShortCondition = na if (strategy.position_size != 0) if (strategy.position_size > 0) // Long Position trailStopLoss := na(trailStopLoss) ? close - atrValue * atrMultiplier : math.max(trailStopLoss, close - atrValue * atrMultiplier) trailTakeProfit := close + atrValue * takeProfitATRMultiplier exitLongCondition := close <= trailStopLoss or close >= trailTakeProfit strategy.exit("Exit Long", "Long", stop=trailStopLoss, limit=trailTakeProfit, when=exitLongCondition) else // Short Position trailStopLoss := na(trailStopLoss) ? close + atrValue * atrMultiplier : math.min(trailStopLoss, close + atrValue * atrMultiplier) trailTakeProfit := close - atrValue * takeProfitATRMultiplier exitShortCondition := close >= trailStopLoss or close <= trailTakeProfit strategy.exit("Exit Short", "Short", stop=trailStopLoss, limit=trailTakeProfit, when=exitShortCondition) // Strategy Entry if (longCondition and (tradeDirection == "Both" or tradeDirection == "Long")) strategy.entry("Long", strategy.long) if (shortCondition and (tradeDirection == "Both" or tradeDirection == "Short")) strategy.entry("Short", strategy.short) // Plotting Buy/Sell signals plotshape(series=longCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY") plotshape(series=shortCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL") // Plotting Trailing Stop-Loss and Take-Profit levels plot(strategy.position_size > 0 ? trailStopLoss : na, title="Long Trailing Stop Loss", color=color.red, linewidth=2, style=plot.style_line) plot(strategy.position_size < 0 ? trailStopLoss : na, title="Short Trailing Stop Loss", color=color.green, linewidth=2, style=plot.style_line) plot(strategy.position_size > 0 ? trailTakeProfit : na, title="Long Take Profit", color=color.blue, linewidth=2, style=plot.style_line) plot(strategy.position_size < 0 ? trailTakeProfit : na, title="Short Take Profit", color=color.orange, linewidth=2, style=plot.style_line) // Alerts alertcondition(longCondition, title="Buy Alert", message="Buy Signal Triggered") alertcondition(shortCondition, title="Sell Alert", message="Sell Signal Triggered") alertcondition(exitLongCondition, title="Long Exit Alert", message="Long Position Closed") alertcondition(exitShortCondition, title="Short Exit Alert", message="Short Position Closed")