Overview
The strategy is an advanced trading system based on support and resistance levels, combined with dynamic trend channels and risk management functions. The strategy identifies key support and resistance levels by analyzing the highest and lowest points of price fluctuations within a specific lookback period, and uses the channel width parameter to construct dynamic trading ranges, providing traders with a clear market structure perspective and precise trading signals.
Strategy Principle
The core logic of the strategy includes the following key elements:
- Support and resistance levels are calculated based on the lowest and highest prices over a user-defined lookback period
- Set the dynamic channel width through percentage parameters to build upper and lower channels based on support and resistance levels
- A buy signal is triggered when the price approaches a support level (within 1% of the support level)
- The system automatically calculates the stop loss and take profit levels based on the percentages set by the user
- Trades are only executed within the specified backtesting timeframe
- Calculate and display the risk-return ratio in real time to help traders evaluate the potential benefits and risks of each transaction
Strategy Advantages
- Strong adaptability: support and resistance levels will be adjusted dynamically with market changes to adapt to different market environments
- Improved risk management: integrated calculation and visualization of stop loss, take profit and risk-return ratio
- Clear trading signals: Provide clear entry signals to reduce the impact of subjective judgment
- Excellent visualization: Different price levels are displayed intuitively through lines and labels of different colors
- Flexible and adjustable parameters: Allow users to adjust various parameters according to personal trading style and market characteristics
Strategy Risks
- Market volatility risk: Too many trading signals may be triggered in a highly volatile market
- False breakout risk: When the price is close to the support level, a false breakout may occur, resulting in a false signal
- Parameter sensitivity: The settings of the lookback period and channel width have a greater impact on the performance of the strategy
- One-way trading restrictions: The current strategy only supports long trading, which may miss shorting opportunities
- Time dependency: Strategy performance is limited to the specified backtest time range
Strategy Optimization Direction
- Add trend filter: introduce moving average or momentum indicators to filter out counter-trend signals
- Improve trading direction: add short-selling trading logic to improve the comprehensiveness of the strategy
- Optimizing signal generation: Verifying the validity of price breakouts with volume indicators
- Dynamic stop loss setting: dynamically adjust the stop loss distance based on ATR or volatility
- Increased position management: Dynamically adjust position size based on risk-return ratio and market volatility
Summary
This strategy combines the key concepts of technical analysis - support and resistance levels and trend channels - to build a logically rigorous and risk-controlled trading system. The advantage of the strategy lies in its adaptability and perfect risk management, but traders still need to carefully adjust parameters according to market conditions and personal risk tolerance. Through the recommended optimization direction, the strategy still has room for further improvement and can be developed into a more comprehensive and robust trading system.
Strategy source code
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Support and Resistance with Trend Lines and Channels", overlay=true)
// Inputs
lookback = input.int(20, title="Lookback Period for Support/Resistance", minval=1)
channelWidth = input.float(0.01, title="Channel Width (%)", minval=0.001) / 100
startDate = input(timestamp("2023-01-01 00:00"), title="Backtesting Start Date")
endDate = input(timestamp("2023-12-31 23:59"), title="Backtesting End Date")
// Check if the current bar is within the testing range
inTestingRange = true
// Support and Resistance Levels
supportLevel = ta.lowest(low, lookback) // Swing low (support)
resistanceLevel = ta.highest(high, lookback) // Swing high (resistance)
// Trend Lines and Channels
var line supportLine = na
var line resistanceLine = na
var line upperChannelLine = na
var line lowerChannelLine = na
// Calculate channel levels
upperChannel = resistanceLevel * (1 + channelWidth) // Upper edge of channel
lowerChannel = supportLevel * (1 - channelWidth) // Lower edge of channel
// Create or update the support trend line
// if na(supportLine)
// supportLine := line.new(bar_index, supportLevel, bar_index + 1, supportLevel, color=color.green, width=2, extend=extend.right)
// else
// line.set_y1(supportLine, supportLevel)
// line.set_y2(supportLine, supportLevel)
// // Create or update the resistance trend line
// if na(resistanceLine)
// resistanceLine := line.new(bar_index, resistanceLevel, bar_index + 1, resistanceLevel, color=color.red, width=2, extend=extend.right)
// else
// line.set_y1(resistanceLine, resistanceLevel)
// line.set_y2(resistanceLine, resistanceLevel)
// // Create or update the upper channel line
// if na(upperChannelLine)
// upperChannelLine := line.new(bar_index, upperChannel, bar_index + 1, upperChannel, color=color.blue, width=1, style=line.style_dashed, extend=extend.right)
// else
// line.set_y1(upperChannelLine, upperChannel)
// line.set_y2(upperChannelLine, upperChannel)
// // Create or update the lower channel line
// if na(lowerChannelLine)
// lowerChannelLine := line.new(bar_index, lowerChannel, bar_index + 1, lowerChannel, color=color.purple, width=1, style=line.style_dashed, extend=extend.right)
// else
// line.set_y1(lowerChannelLine, lowerChannel)
// line.set_y2(lowerChannelLine, lowerChannel)
// Buy Condition: When price is near support level
buyCondition = close <= supportLevel * 1.01 and inTestingRange
if buyCondition
strategy.entry("Buy", strategy.long)
// Stop Loss and Take Profit
stopLossPercentage = input.float(1.5, title="Stop Loss Percentage", minval=0.0) / 100
takeProfitPercentage = input.float(3.0, title="Take Profit Percentage", minval=0.0) / 100
var float longStopLoss = na
var float longTakeProfit = na
if strategy.position_size > 0
longStopLoss := strategy.position_avg_price * (1 - stopLossPercentage)
longTakeProfit := strategy.position_avg_price * (1 + takeProfitPercentage)
strategy.exit("Exit Buy", "Buy", stop=longStopLoss, limit=longTakeProfit)
// Visualize Entry, Stop Loss, and Take Profit Levels
var float entryPrice = na
if buyCondition
entryPrice := close
if not na(entryPrice)
label.new(bar_index, entryPrice, text="Entry: " + str.tostring(entryPrice, "#.##"), style=label.style_label_up, color=color.green, textcolor=color.white)
if strategy.position_size > 0
line.new(bar_index, longStopLoss, bar_index + 1, longStopLoss, color=color.red, width=1, extend=extend.right)
line.new(bar_index, longTakeProfit, bar_index + 1, longTakeProfit, color=color.blue, width=1, extend=extend.right)
// Risk-to-Reward Ratio (Optional)
if not na(entryPrice) and not na(longStopLoss) and not na(longTakeProfit)
riskToReward = (longTakeProfit - entryPrice) / (entryPrice - longStopLoss)
label.new(bar_index, entryPrice, text="R:R " + str.tostring(riskToReward, "#.##"), style=label.style_label_up, color=color.yellow, textcolor=color.black, size=size.small)
Strategy Parameters
The original address: Adaptive Channel Breakout Strategy with Dynamic Support and Resistance Trading System