
이 전략은 지지 및 저항 수준과 동적 추세 채널 및 위험 관리 기능을 결합한 고급 거래 시스템입니다. 이 전략은 특정 추적 기간 내의 가격 변동의 가장 높은 지점과 가장 낮은 지점을 분석하여 주요 지지선과 저항선을 파악하고, 채널 폭 매개변수를 사용하여 역동적인 거래 범위를 구성함으로써 거래자에게 시장 구조와 정확한 거래 신호를 명확하게 보여줍니다.
전략의 핵심 논리에는 다음과 같은 핵심 요소가 포함됩니다.
이 전략은 기술적 분석의 핵심 개념인 지지 및 저항 수준과 추세 채널을 결합하여 엄격한 논리와 통제 가능한 위험을 갖춘 거래 시스템을 구축합니다. 이 전략의 장점은 적응성과 건전한 위험 관리에 있지만, 여전히 트레이더는 시장 상황과 개인의 위험 감수 능력에 따라 매개변수를 신중하게 조정해야 합니다. 제안된 최적화 방향을 통해 전략을 더욱 개선하고 보다 포괄적이고 강력한 거래 시스템으로 개발할 수 있습니다.
/*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)