
This strategy is an adaptive trading system that combines trend following and range trading. The system dynamically identifies market conditions using the ADX indicator and applies different trading strategies in trending and ranging markets. In trending markets, the strategy uses moving average crossover signals combined with RSI and MACD confirmation; in ranging markets, it utilizes Bollinger Bands breakouts with RSI overbought/oversold signals. The system also incorporates a dynamic stop-loss and take-profit mechanism based on ATR for effective risk management.
The core of the strategy is the market condition identification mechanism. When ADX is above 25, itโs considered a trending market, activating the trend following strategy: 1. Long condition: 50-day MA crosses above 200-day MA, with RSI above 50 and MACD line above signal line 2. Short condition: 50-day MA crosses below 200-day MA, with RSI below 50 and MACD line below signal line
When ADX is 25 or below, itโs considered a ranging market, activating the range trading strategy: 1. Long condition: Price crosses above lower Bollinger Band with RSI below 40 2. Short condition: Price crosses below upper Bollinger Band with RSI above 60
Stop-loss and take-profit levels are set using ATR multiples: 1.5x ATR for stop-loss and 3x ATR for take-profit.
The strategy achieves adaptation to different market environments through dynamic market condition identification and corresponding strategy switching. Through the combination of multiple technical indicators and dynamic risk control mechanisms, the strategy demonstrates good practicality. However, attention should be paid to signal lag and false breakout risks, and thorough testing and parameter optimization in live trading is recommended.
/*backtest
start: 2024-09-01 00:00:00
end: 2025-02-19 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Trend vs Range Trading - Fully Fixed for v6", overlay=true)
// ๐น Moving Averages (SMA 50 & 200)
sma50 = ta.sma(close, 50)
sma200 = ta.sma(close, 200)
// ๐น Proper ADX Calculation (With Corrected ta.dmi() Parameters)
dmiLength = 14
adxSmoothing = 14
[dmiPlus, dmiMinus, adx] = ta.dmi(dmiLength, adxSmoothing)
// ๐น Bollinger Bands Calculation (Fixed for v6)
bb_length = 20
bb_mult = 2.0
bb_basis = ta.sma(close, bb_length)
bb_dev = ta.stdev(close, bb_length)
bb_upper = bb_basis + (bb_mult * bb_dev)
bb_lower = bb_basis - (bb_mult * bb_dev)
// ๐น Additional Indicators (RSI & MACD)
rsi = ta.rsi(close, 14)
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
// ๐น ATR for Stop Loss & Take Profit
atr = ta.atr(14)
stop_loss_mult = 1.5 // Stop Loss Multiplier
take_profit_mult = 3.0 // Take Profit Multiplier
// ๐น Trend vs Range Market Detection
is_trending = adx > 25
// ๐น Trend Following Strategy (SMA Cross & Confirmation)
long_condition_trend = is_trending and ta.crossover(sma50, sma200) and rsi > 50 and macdLine > signalLine
short_condition_trend = is_trending and ta.crossunder(sma50, sma200) and rsi < 50 and macdLine < signalLine
// ๐น Range Trading Strategy (Bollinger Bands & RSI Confirmation)
long_condition_range = not is_trending and ta.crossover(close, bb_lower) and rsi < 40
short_condition_range = not is_trending and ta.crossunder(close, bb_upper) and rsi > 60
// ๐น Stop Loss & Take Profit Calculations
long_stop_loss = close - (atr * stop_loss_mult)
long_take_profit = close + (atr * take_profit_mult)
short_stop_loss = close + (atr * stop_loss_mult)
short_take_profit = close - (atr * take_profit_mult)
// ๐น Execute Trades (With Stop Loss & Take Profit)
if long_condition_trend
strategy.entry("Long_Trend", strategy.long)
strategy.exit("Exit_Long_Trend", from_entry="Long_Trend", stop=long_stop_loss, limit=long_take_profit)
if short_condition_trend
strategy.entry("Short_Trend", strategy.short)
strategy.exit("Exit_Short_Trend", from_entry="Short_Trend", stop=short_stop_loss, limit=short_take_profit)
if long_condition_range
strategy.entry("Long_Range", strategy.long)
strategy.exit("Exit_Long_Range", from_entry="Long_Range", stop=long_stop_loss, limit=long_take_profit)
if short_condition_range
strategy.entry("Short_Range", strategy.short)
strategy.exit("Exit_Short_Range", from_entry="Short_Range", stop=short_stop_loss, limit=short_take_profit)
// ๐น Visual Indicators & Background Color (Trend vs Range)
bgcolor(is_trending ? color.green : color.blue)
// ๐น Plot Moving Averages & Bollinger Bands
plot(sma50, color=color.blue, title="SMA 50")
plot(sma200, color=color.red, title="SMA 200")
plot(bb_upper, color=color.green, title="BB Upper")
plot(bb_lower, color=color.orange, title="BB Lower")