
A estratégia é um sistema de negociação avançado baseado em níveis de suporte e resistência combinados com canais de tendência dinâmicos e recursos de gerenciamento de risco. A estratégia identifica os principais níveis de suporte e resistência analisando os pontos mais altos e mais baixos das flutuações de preço dentro de um período de retrospectiva específico e usa parâmetros de largura de canal para construir faixas de negociação dinâmicas, fornecendo aos traders uma visão clara da estrutura do mercado e sinais de negociação precisos.
A lógica central da estratégia inclui os seguintes elementos-chave:
Esta estratégia combina os principais conceitos da análise técnica — níveis de suporte e resistência e canais de tendência — para construir um sistema de negociação com lógica rigorosa e riscos controláveis. A vantagem da estratégia está na sua adaptabilidade e na sólida gestão de riscos, mas os traders ainda precisam ajustar cuidadosamente os parâmetros de acordo com as condições de mercado e a tolerância pessoal ao risco. Por meio das direções de otimização sugeridas, a estratégia pode ser melhorada e desenvolvida em um sistema de negociação mais abrangente e robusto.
/*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)