Esta estratégia é um sistema de negociação avançado baseado em níveis de suporte e resistência, combinando canais de tendência dinâmica com funcionalidade de gerenciamento de risco.
A lógica central inclui vários elementos-chave:
Esta estratégia combina os principais conceitos de análise técnica - níveis de suporte / resistência e canais de tendência - para construir um sistema de negociação logicamente rigoroso e controlado pelo risco. Os pontos fortes da estratégia estão em sua adaptabilidade e gerenciamento abrangente de riscos, mas os comerciantes ainda precisam ajustar cuidadosamente os parâmetros com base nas condições do mercado e na tolerância ao risco pessoal. Através das direções de otimização sugeridas, a estratégia tem espaço para melhoria adicional e pode se desenvolver 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)