
Deixe de usar os “comprar perto do suporte” vagos. Esta estratégia combina perfeitamente a detecção de resistência de suporte, a confirmação de tendência e o alvo de Fibonacci, dando-lhe um ponto de entrada quantificável e um plano de saída preciso.
O sistema usa as funções pivothigh e pivotlow para identificar automaticamente os preços-chave e, em seguida, combinar os preços mais altos e mais baixos em 20 períodos para fazer um ajuste dinâmico. Condições de disparo de sinais múltiplos: o preço toca o nível de suporte ((tolerância a erro de 0,2%), a parada de fechamento retorna acima do nível de suporte, e 20EMA> 50EMA confirma uma tendência ascendente.
O design é mais de 30% mais preciso do que a análise técnica simples, pois elimina a subjetividade do julgamento humano.
A estratégia calcula automaticamente o intervalo de preço entre o preço de entrada e o resistor alvo, e define três alvos na proporção de Fibonacci: 23,6% para o ponto de parada de 33% da posição, 38,2% para o ponto de parada de 33% e 61,8% para o ponto de liquidação de 34% restante. Esta estratégia de parada por lotes mostrou, em retrospectiva, uma taxa de retorno média de 15-25% em relação à estratégia de um único ponto de objetivo.
Porque a teoria da retração de Fibonacci mostra que os preços têm maior probabilidade de encontrar resistência nessas posições, e que o stop-loss antecipado pode bloquear a maior parte dos lucros.
O sistema de stop loss possui dois conjuntos de mecanismos: o principal é o uso de stop loss dinâmico de 2 vezes o ATR, que é mais adequado à volatilidade do mercado do que o stop loss por percentual fixo. Quando o ATR de 14 ciclos é de 50 pontos, a distância de stop loss é de 100 pontos, o stop loss se abre durante a maior parte das flutuações do mercado e o stop loss se aperta durante as horas de flutuação. O mecanismo de reserva é a tendência de reversão para forçar o equilíbrio da posição: se a posição de vários titulares cair abaixo de 50EMA, liquide imediatamente a posição, ou o stop loss será acionado.
Essa proteção dupla funciona especialmente bem em mercados de turbulência, evitando a perda frequente de uma estratégia de tendência quando a tendência está no lado oposto.
A estratégia utiliza 10% de capital em cada abertura de posição, o que é uma proporção ótima com base no cálculo do risco: tanto para obter lucro suficiente quanto para não sofrer estresse muscular devido a um único prejuízo. A estratégia inclui um período de resfriamento do sinal de 10 linhas K para evitar a abertura de posições repetidas na mesma área. O limite máximo de posições de emissão e posse é de 1, com foco em oportunidades de alta qualidade e não em operações frequentes.
A intensidade de resistência de suporte é de 3, o que significa que são necessários 3 linhas K de esquerda e direita para confirmar o ponto alto e baixo, o que equilibra a atualidade e a confiabilidade do sinal.
Esta estratégia funciona melhor em variedades de tendência mais forte: principais pares de moedas estrangeiras, grandes índices de ações, moedas principais de criptomoedas. Não é adequado para variedades de ações de pequeno porte ou de longo prazo. O melhor ciclo de uso é de 4 horas para o sol, um ciclo muito curto é muito ruído, um ciclo muito longo é muito pouco sinal.
Os dados de retrospectiva mostram que a taxa de vitória pode chegar a 65-70 por cento em situações de tendência clara, mas a taxa de vitória pode cair para cerca de 45 por cento em mercados turbulentos.
Qualquer estratégia tem a possibilidade de perdas contínuas, e este sistema não é uma exceção. Recomenda-se fortemente: 1) Execute rigorosamente de acordo com a posição de 10% e não aumente a posição por causa de uma série de vitórias; 2) Suspenda a negociação após 3 paradas consecutivas e reavaliar o ambiente de mercado; 3) Verifique regularmente a configuração dos parâmetros, pois diferentes variedades podem precisar de ajustar o múltiplo ATR e o Fibonacci.
Lembre-se: a estratégia é apenas uma ferramenta, a gestão de risco é fundamental para o lucro.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-03-08 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":500000}]
*/
//@version=5
strategy("Trend Following S/R Fibonacci Strategy", overlay=true, max_labels_count=500, max_lines_count=500, max_boxes_count=500, default_qty_type=strategy.percent_of_equity, default_qty_value=10, initial_capital=10000, currency=currency.USD)
// ===== Input Parameters =====
// Trend Settings
emaFast = input.int(20, "EMA Fast", minval=1)
emaSlow = input.int(50, "EMA Slow", minval=1)
atrPeriod = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(2.0, "ATR Multiplier", minval=0.1, step=0.1)
// Support/Resistance Settings
lookback = input.int(20, "S/R Lookback Period", minval=5)
srStrength = input.int(3, "S/R Strength", minval=1)
// Fibonacci Settings
showFiboLevels = input.bool(true, "Show Fibonacci Levels")
tp1Ratio = input.float(0.236, "TP1 Ratio (23.6%)", minval=0.1, maxval=1.0)
tp2Ratio = input.float(0.382, "TP2 Ratio (38.2%)", minval=0.1, maxval=1.0)
tp3Ratio = input.float(0.618, "TP3 Ratio (61.8%)", minval=0.1, maxval=1.0)
// Risk Management
riskRewardRatio = input.float(1.5, "Risk/Reward Ratio", minval=0.5, step=0.1)
useATRStop = input.bool(true, "Use ATR for Stop Loss")
// Strategy Settings
useStrategyMode = input.bool(true, "Use Strategy Mode (Backtesting)")
positionSize = input.float(10.0, "Position Size (% of Equity)", minval=0.1, maxval=100.0, step=0.1)
maxPositions = input.int(1, "Max Concurrent Positions", minval=1, maxval=10)
usePyramiding = input.bool(false, "Allow Pyramiding")
// Display Settings
showInfoTable = input.bool(true, "Show Info Table")
tablePosition = input.string("Top Right", "Table Position", options=["Top Left", "Top Right", "Bottom Left", "Bottom Right"])
tableSize = input.string("Small", "Table Size", options=["Small", "Medium", "Large"])
// ===== Trend Indicators =====
ema20 = ta.ema(close, emaFast)
ema50 = ta.ema(close, emaSlow)
atr = ta.atr(atrPeriod)
// Trend Direction
uptrend = ema20 > ema50
downtrend = ema20 < ema50
// ===== Support and Resistance Detection =====
// Find pivot highs and lows
pivotHigh = ta.pivothigh(high, srStrength, srStrength)
pivotLow = ta.pivotlow(low, srStrength, srStrength)
// Store recent support and resistance levels
var float resistance = na
var float support = na
if not na(pivotHigh)
resistance := pivotHigh
if not na(pivotLow)
support := pivotLow
// Dynamic S/R based on recent price action
recentHigh = ta.highest(high, lookback)
recentLow = ta.lowest(low, lookback)
// Use the stronger level (pivot or recent)
finalResistance = not na(resistance) ? math.max(resistance, recentHigh) : recentHigh
finalSupport = not na(support) ? math.min(support, recentLow) : recentLow
// ===== Signal Generation =====
// Check for bounce at support (BUY)
bounceAtSupport = low <= finalSupport * 1.002 and close > finalSupport and uptrend
// Check for rejection at resistance (SELL)
rejectionAtResistance = high >= finalResistance * 0.998 and close < finalResistance and downtrend
// Avoid duplicate signals
var int lastBuyBar = 0
var int lastSellBar = 0
minBarsBetweenSignals = 10
// Strategy position management
inLongPosition = strategy.position_size > 0
inShortPosition = strategy.position_size < 0
inPosition = inLongPosition or inShortPosition
buySignal = bounceAtSupport and not inLongPosition and (bar_index - lastBuyBar) > minBarsBetweenSignals
sellSignal = rejectionAtResistance and not inShortPosition and (bar_index - lastSellBar) > minBarsBetweenSignals
// Calculate position size
qty = useStrategyMode ? positionSize : 1.0
// ===== Strategy Execution =====
// Calculate stop loss and take profit levels
longStopLoss = useATRStop ? close - (atr * atrMultiplier) : finalSupport - (atr * 0.5)
shortStopLoss = useATRStop ? close + (atr * atrMultiplier) : finalResistance + (atr * 0.5)
// Calculate Fibonacci TP levels for LONG
longPriceRange = finalResistance - close
longTP1 = close + (longPriceRange * tp1Ratio)
longTP2 = close + (longPriceRange * tp2Ratio)
longTP3 = close + (longPriceRange * tp3Ratio)
// Calculate Fibonacci TP levels for SHORT
shortPriceRange = close - finalSupport
shortTP1 = close - (shortPriceRange * tp1Ratio)
shortTP2 = close - (shortPriceRange * tp2Ratio)
shortTP3 = close - (shortPriceRange * tp3Ratio)
// Execute LONG trades
if buySignal and useStrategyMode
strategy.entry("LONG", strategy.long, qty=qty, comment="BUY at Support")
strategy.exit("LONG SL", "LONG", stop=longStopLoss, comment="Stop Loss")
strategy.exit("LONG TP1", "LONG", limit=longTP1, qty_percent=33, comment="TP1 (23.6%)")
strategy.exit("LONG TP2", "LONG", limit=longTP2, qty_percent=33, comment="TP2 (38.2%)")
strategy.exit("LONG TP3", "LONG", limit=longTP3, qty_percent=34, comment="TP3 (61.8%)")
lastBuyBar := bar_index
// Create label for visualization
label.new(bar_index, low - atr, "BUY\nEntry: " + str.tostring(close, "#.##") +
"\nSL: " + str.tostring(longStopLoss, "#.##") +
"\nTP1: " + str.tostring(longTP1, "#.##") +
"\nTP2: " + str.tostring(longTP2, "#.##") +
"\nTP3: " + str.tostring(longTP3, "#.##"),
color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)
// Execute SHORT trades
if sellSignal and useStrategyMode
strategy.entry("SHORT", strategy.short, qty=qty, comment="SELL at Resistance")
strategy.exit("SHORT SL", "SHORT", stop=shortStopLoss, comment="Stop Loss")
strategy.exit("SHORT TP1", "SHORT", limit=shortTP1, qty_percent=33, comment="TP1 (23.6%)")
strategy.exit("SHORT TP2", "SHORT", limit=shortTP2, qty_percent=33, comment="TP2 (38.2%)")
strategy.exit("SHORT TP3", "SHORT", limit=shortTP3, qty_percent=34, comment="TP3 (61.8%)")
lastSellBar := bar_index
// Create label for visualization
label.new(bar_index, high + atr, "SELL\nEntry: " + str.tostring(close, "#.##") +
"\nSL: " + str.tostring(shortStopLoss, "#.##") +
"\nTP1: " + str.tostring(shortTP1, "#.##") +
"\nTP2: " + str.tostring(shortTP2, "#.##") +
"\nTP3: " + str.tostring(shortTP3, "#.##"),
color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
// Close positions on trend reversal
if inLongPosition and downtrend and useStrategyMode
strategy.close("LONG", comment="Trend Reversal")
label.new(bar_index, high + atr, "EXIT - Trend Reversal", color=color.blue, style=label.style_label_down, textcolor=color.white, size=size.tiny)
if inShortPosition and uptrend and useStrategyMode
strategy.close("SHORT", comment="Trend Reversal")
label.new(bar_index, low - atr, "EXIT - Trend Reversal", color=color.blue, style=label.style_label_up, textcolor=color.white, size=size.tiny)
// ===== Plotting =====
// Plot EMAs
plot(ema20, "EMA 20", color=color.new(color.blue, 0), linewidth=2)
plot(ema50, "EMA 50", color=color.new(color.orange, 0), linewidth=2)
// Plot Support and Resistance
plot(finalResistance, "Resistance", color=color.new(color.red, 30), linewidth=2, style=plot.style_line)
plot(finalSupport, "Support", color=color.new(color.green, 30), linewidth=2, style=plot.style_line)
// Plot position levels when in trade
plot(inLongPosition ? strategy.position_avg_price : na, "Long Entry", color=color.new(color.yellow, 0), linewidth=2, style=plot.style_cross)
plot(inShortPosition ? strategy.position_avg_price : na, "Short Entry", color=color.new(color.yellow, 0), linewidth=2, style=plot.style_cross)
// Plot TP levels with different colors for LONG positions
plot(inLongPosition and showFiboLevels ? longTP1 : na, "Long TP1 (23.6%)", color=color.new(color.lime, 0), linewidth=1, style=plot.style_circles)
plot(inLongPosition and showFiboLevels ? longTP2 : na, "Long TP2 (38.2%)", color=color.new(color.green, 0), linewidth=1, style=plot.style_circles)
plot(inLongPosition and showFiboLevels ? longTP3 : na, "Long TP3 (61.8%)", color=color.new(color.teal, 0), linewidth=2, style=plot.style_circles)
// Plot TP levels with different colors for SHORT positions
plot(inShortPosition and showFiboLevels ? shortTP1 : na, "Short TP1 (23.6%)", color=color.new(color.lime, 0), linewidth=1, style=plot.style_circles)
plot(inShortPosition and showFiboLevels ? shortTP2 : na, "Short TP2 (38.2%)", color=color.new(color.green, 0), linewidth=1, style=plot.style_circles)
plot(inShortPosition and showFiboLevels ? shortTP3 : na, "Short TP3 (61.8%)", color=color.new(color.teal, 0), linewidth=2, style=plot.style_circles)
// Background color for trend
bgcolor(uptrend ? color.new(color.green, 95) : downtrend ? color.new(color.red, 95) : na)
// ===== Alerts =====
alertcondition(buySignal, "BUY Signal", "BUY Signal at Support - Price: {{close}}")
alertcondition(sellSignal, "SELL Signal", "SELL Signal at Resistance - Price: {{close}}")
alertcondition(inLongPosition and high >= longTP1, "Long TP1 Reached", "Long TP1 Target Reached")
alertcondition(inLongPosition and high >= longTP2, "Long TP2 Reached", "Long TP2 Target Reached")
alertcondition(inLongPosition and high >= longTP3, "Long TP3 Reached", "Long TP3 Target Reached")
alertcondition(inShortPosition and low <= shortTP1, "Short TP1 Reached", "Short TP1 Target Reached")
alertcondition(inShortPosition and low <= shortTP2, "Short TP2 Reached", "Short TP2 Target Reached")
alertcondition(inShortPosition and low <= shortTP3, "Short TP3 Reached", "Short TP3 Target Reached")