
A estratégia de caçador de balanço de reuniões múltiplas é uma estratégia de quantificação avançada projetada especificamente para negociação em baixos prazos de tempo, que utiliza um sistema de pontuação baseado em pontos abrangente, que combina indicadores técnicos otimizados, análise de comportamento de preços e identificação de padrões de reversão para gerar sinais de negociação precisos. A inovação central da estratégia consiste na introdução de um mecanismo de pontuação dupla exclusivo, que identifica o fundo do balanço por meio de um sistema de pontuação de entrada e determina o melhor momento de saída por meio de um sistema de pontuação de saída.
A estratégia utiliza parâmetros de indicadores que foram amplamente testados e otimizados, incluindo MACD ((3, 10, 3) e RSI ((21) especialmente configurados, que são mais adaptáveis às mudanças rápidas do mercado do que a configuração padrão. A estratégia requer um limite de pontuação alto de pelo menos 13 pontos para entrar e sair, garantindo que apenas sinais de alta credibilidade desencadeiam negociações.
O núcleo da estratégia do caçador de salto de múltiplos encontros é seu sistema de pontuação integrado, que determina o momento de negociação por meio de avaliações quantitativas de várias condições técnicas. O sistema de pontuação de entrada é composto pelos seguintes quatro componentes principais:
Sinais de RSI(Mais de 5 pontos):
Sinais MACD(até 8 pontos):
Comportamento dos preços(até 4 pontos):
Identificação de padrões(até 8 pontos):
O sistema de pontuação de saída usa um sistema de pesos semelhante, mas usa padrões opostos para identificar os topos de balanço. A estratégia exige que a entrada e a saída tenham uma pontuação média de pelo menos 13 pontos, o que garante que apenas os sinais de alta confiança sejam executados, reduzindo a possibilidade de falsos sinais.
Outro componente-chave da estratégia é o seu parâmetro de indicadores de otimização:
Esses parâmetros foram especialmente otimizados para capturar mudanças rápidas de preços e alta frequência de volatilidade.
Processos de decisão objetivamente quantificadosA estratégia elimina julgamentos subjetivos e fornece padrões de negociação claros através de um sistema de pontuação baseado em pontos. Esta abordagem baseia as decisões de negociação em dados e não em emoções, aumentando significativamente a disciplina de negociação.
Mecanismo de confirmação múltiplaA estratégia exige a confirmação simultânea de vários indicadores técnicos e modelos de preços, o que aumenta significativamente a confiabilidade do sinal. A negociação só é realizada quando o padrão de pelo menos 13 pontos é atendido, o que reduz o risco de falsos sinais.
Sensibilidade ao tempo optimizadaA estratégia é capaz de capturar mudanças na dinâmica de preços mais cedo, enquanto filtra o ruído do mercado, oferecendo melhor sensibilidade ao tempo, através da utilização de parâmetros otimizados MACD ((3, 10, 3) e RSI ((21).
Gestão de Riscos FlexívelA estratégia incorpora um cálculo de stop loss e profit target baseado em risco, com uma relação de risco-retorno de 5:1 como padrão, o que fornece uma estrutura de gerenciamento de risco clara para a negociação. O stop loss dinâmico é baseado em baixos de flutuação recentes e possui uma zona de amortecimento configurável, aumentando a flexibilidade do controle de risco.
Sistemas de transação altamente visíveisA estratégia fornece um sistema de exibição de pontuação, incluindo etiquetas verdes ((pontuação de entrada ≥ 10 pontos) e etiquetas vermelhas ((pontuação de saída ≥ 10 pontos), bem como marcadores visíveis de entrada/saída de transações, permitindo que os comerciantes vejam claramente o funcionamento do sistema.
Altamente adaptávelEmbora os parâmetros da estratégia sejam otimizados, eles podem ser ajustados para diferentes cenários de mercado e variedades de negociação, permitindo uma ampla aplicabilidade da estratégia.
Risco de distribuição de posições elevadasA estratégia por defeito adota uma distribuição de fundos de 100%, o que aumenta a margem de risco de uma única transação. Isso pode levar a uma significativa flutuação da conta em caso de forte flutuação do mercado ou eventos inesperados.
Dependência de condições de mercadoA estratégia funciona melhor em mercados com tendências evidentes e flutuações, mas pode ser menos eficaz em mercados altamente turbulentos e horizontais. Deve ser usada com cautela em diferentes ambientes de mercado e considerar ajustes de parâmetros ou suspensão de negociação.
Risco de superalimento optimizado: Os parâmetros da estratégia são otimizados, podendo haver riscos de superalimento dos dados históricos. Alterações nas condições de mercado futuras podem levar a uma estratégia de menor desempenho do que os resultados da retrospectiva. Os parâmetros devem ser reavaliados e ajustados periodicamente para manter a eficácia da estratégia.
Proteção sem diversidadeComo uma estratégia de posição única, a falta de proteção de diversificação aumenta o risco de mercado específico. Em aplicações práticas, pode-se considerar a estratégia como parte de um portfólio mais amplo ou a introdução de negociações multivariadas para aumentar a diversificação.
Risco de falha técnicaOs sistemas de classificação complexos e a multiplicidade de condições podem falhar em certos cenários de mercado, especialmente em condições de mercado extremas. Recomenda-se a implementação de medidas adicionais de gestão de risco, como o estabelecimento de limites de perda máxima ou o uso de filtros de volatilidade.
Introdução de parâmetros de adaptaçãoA estratégia atual usa parâmetros fixos de MACD e RSI. Pode-se considerar a introdução de parâmetros de adaptação baseados na volatilidade do mercado ou na força da tendência. Por exemplo, ajustar automaticamente os parâmetros do MACD em ambientes de alta volatilidade ou ajustar os níveis de sobrevenda / sobrevenda do RSI de acordo com a situação atual do mercado para melhorar a adaptabilidade da estratégia em diferentes ambientes de mercado.
Análise integrada da relação preço-qualidadeA estratégia atual baseia-se principalmente no comportamento dos preços e na dinâmica dos indicadores, podendo melhorar a qualidade do sinal através da integração da análise do volume de transação. A confirmação do volume de transação pode fornecer confiabilidade adicional, especialmente na confirmação do padrão de reversão. Considere adicionar critérios de classificação relacionados ao volume de transação, como aumento do volume de transação, desvio do volume de transação, etc.
Adicionar filtro de ambiente de mercadoImplementação de mecanismos de identificação de cenários de mercado para reduzir automaticamente a frequência de negociação ou ajustar parâmetros em condições de mercado que não são adequadas à estratégia. Por exemplo, aumentar o limite de pontuação em mercados altamente horizontais ou reduzir o limite de perda em ambientes de baixa volatilidade.
Otimização do sistema de gestão de fundosA estratégia atual usa uma distribuição de posições de 100%, o que permite um sistema de gerenciamento de fundos mais complexo, ajustando o tamanho da posição com base na intensidade do sinal, na volatilidade do mercado ou na dinâmica do desempenho histórico. Por exemplo, quanto mais alto o escore, mais dinheiro é distribuído ou o tamanho da posição é reduzido após perdas consecutivas.
Integração de análise de multi-quadros temporaisA qualidade do sinal de entrada é aumentada pela adição de confirmação de tendências em prazos mais elevados. Por exemplo, execute uma transação somente quando a tendência de prazos mais elevados está alinhada, ou alocar mais pontos para transações que seguem a tendência principal.
Otimização de aprendizagem de máquinaConsidere o uso de métodos de aprendizagem de máquina para otimizar os pesos de pontuação e as barreiras. Analisando dados históricos, é possível determinar quais combinações de sinais são mais eficazes em um determinado cenário de mercado e ajustar o sistema de pontuação de acordo.
A estratégia do caçador de balanços de reuniões múltiplas representa uma abordagem de negociação de baixo prazo abrangente e sistematizada, que cria um sistema de decisão de negociação orientado a dados por meio da integração de vários indicadores de análise técnica e características de comportamento de preços. A vantagem central da estratégia reside no seu método de pontuação objetivo e múltiplos padrões, que efetivamente elimina a decisão emocional, mantendo a flexibilidade suficiente para se adaptar a diferentes tipos de negociação e condições de mercado.
A estratégia é capaz de efetivamente capturar oscilações de mercado, especialmente em mercados de alta volatilidade, por meio de parâmetros otimizados de MACD ((3, 10, 3) e RSI ((21), combinados com condições rigorosas de entrada e saída. A funcionalidade de gerenciamento de risco e a ferramenta de visualização incorporadas aumentam ainda mais a praticidade e a facilidade de uso da estratégia.
No entanto, as estratégias também apresentam algumas limitações e riscos, incluindo a atribuição de posições elevadas, a dependência de condições de mercado e a possibilidade de otimização de sobre-ajustes. A solidez e adaptabilidade das estratégias podem ser melhoradas pela implementação de orientações de otimização recomendadas, como a introdução de parâmetros de auto-adaptação, a integração da análise de relações de preço e quantidade, o aumento de filtros de ambiente de mercado.
Para os comerciantes experientes, a estratégia de caçadores de vaivém de concentração múltipla oferece uma estrutura robusta para a captura de tendências e negociações de vaivém em quadros de tempo baixos. Compreendendo seus princípios centrais e ajustando-os para necessidades específicas, os comerciantes podem usar esta estratégia para encontrar oportunidades de negociação de alta probabilidade em mercados em rápida mudança.
/*backtest
start: 2024-06-30 00:00:00
end: 2025-06-28 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":50000000}]
*/
// ____ _ _______ _ _ _____
// / __ \ | | |__ __| | (_) | __ \
// | | | |_ _ __ _ _ __ | |_ | |_ __ __ _ __| |_ _ __ __ _ | |__) |
// | | | | | | |/ _` | '_ \| __| | | '__/ _` |/ _` | | '_ \ / _` | | ___/ '__/ _ \
// | |__| | |_| | (_| | | | | |_ | | | | (_| | (_| | | | | | (_| | | | | | | (_) |
// \___\_\\__,_|\__,_|_| |_|\__| |_|_| \__,_|\__,_|_|_| |_|\__, | |_| |_| \___/
// __/ |
// |___/
// Quant Trading Pro
//@version=6
strategy("Multi-Confluence Swing Hunter V1", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=100,
commission_type=strategy.commission.percent, commission_value=0.1,
slippage=3, initial_capital=1000, margin_long=0, margin_short=0)
// === DESCRIPTION ===
// High-conviction swing bottom entry strategy using optimized MACD(3,10,3) and RSI(21)
// Entry: Point-based scoring system for swing bottoms (divergences, momentum, price action)
// Exit: Inverse scoring system for swing tops (no stop-loss, exit only on swing top signals)
// Position: Single position with 100% allocation, scores displayed only when ≥10 points
// Based on analysis showing 23.7% improvement over standard parameters
// === INPUT PARAMETERS ===
// Optimized Indicator Settings
macdFast = input.int(3, "MACD Fast Length", minval=1, maxval=50, group="Optimized Indicators")
macdSlow = input.int(10, "MACD Slow Length", minval=1, maxval=100, group="Optimized Indicators")
macdSignal = input.int(3, "MACD Signal Length", minval=1, maxval=50, group="Optimized Indicators")
rsiLength = input.int(21, "RSI Length", minval=2, maxval=100, group="Optimized Indicators")
// Entry Settings - Swing Bottom Scoring
minEntryScore = input.int(13, "Minimum Entry Score", minval=5, maxval=20, group="Entry Settings")
showEntryScores = input.bool(true, "Show Entry Scores (Above 10)", group="Entry Settings")
// Exit Settings - Swing Top Scoring (Inverse of Entry Criteria)
minExitScore = input.int(13, "Minimum Exit Score", minval=5, maxval=20, group="Exit Settings")
showExitScores = input.bool(true, "Show Exit Scores (Above 10)", group="Exit Settings")
// Price Action Settings
minLowerWickPercent = input.float(50.0, "Min Lower Wick %", minval=10.0, maxval=90.0, step=5.0, group="Price Action")
quickRecoveryPercent = input.float(0.3, "Quick Recovery %", minval=0.1, maxval=2.0, step=0.1, group="Price Action")
quickRecoveryBars = input.int(3, "Quick Recovery Bars", minval=1, maxval=10, group="Price Action")
// RSI Levels
rsiOversold = input.float(30.0, "RSI Oversold Level", minval=10.0, maxval=50.0, step=1.0, group="RSI Settings")
rsiExtremeOversold = input.float(25.0, "RSI Extreme Oversold", minval=10.0, maxval=40.0, step=1.0, group="RSI Settings")
rsiOverbought = input.float(70.0, "RSI Overbought Level", minval=50.0, maxval=90.0, step=1.0, group="RSI Settings")
rsiExtremeOverbought = input.float(75.0, "RSI Extreme Overbought", minval=60.0, maxval=90.0, step=1.0, group="RSI Settings")
// Reversal Signals Settings
reversalLookback = input.int(12, "Reversal Candle Lookback", minval=5, maxval=50, group="Reversal Signals")
reversalConfirm = input.int(3, "Reversal Confirm Within", minval=1, maxval=10, group="Reversal Signals")
useVolumeConfirmation = input.bool(false, "Use Volume Confirmation", group="Reversal Signals")
// Trade Management
allowShortTrades = input.bool(false, "Allow Short Trades?", group="Short Trades")
// Risk/Reward TP/SL Settings
useRiskReward = input.bool(true, "Use Risk/Reward TP/SL", group="Risk Management")
riskRewardRatio = input.float(5, "Risk/Reward Ratio", minval=1.0, maxval=5.0, step=0.1, group="Risk Management")
stopLossLookback = input.int(10, "Stop Loss Lookback Bars", minval=3, maxval=50, group="Risk Management")
stopLossBuffer = input.float(0.15, "Stop Loss Buffer %", minval=0.05, maxval=1.0, step=0.05, group="Risk Management")
// Advanced Settings
maxLookbackBars = input.int(8, "Divergence Lookback Bars", minval=3, maxval=20, group="Advanced")
// === 1️⃣ CALCULATIONS ===
// Optimized MACD Calculation
[macdLine, signalLine, macdHist] = ta.macd(close, macdFast, macdSlow, macdSignal)
// Optimized RSI Calculation
rsi = ta.rsi(close, rsiLength)
// Price Action Calculations
bodySize = math.abs(close - open)
lowerWick = math.min(open, close) - low
upperWick = high - math.max(open, close)
totalRange = high - low
lowerWickPercent = totalRange > 0 ? (lowerWick / totalRange) * 100 : 0
upperWickPercent = totalRange > 0 ? (upperWick / totalRange) * 100 : 0
bodyPercent = totalRange > 0 ? (bodySize / totalRange) * 100 : 0
// Reversal Signals Calculation
var int bullCandleScore = 0
var int bearCandleScore = 0
var bool bullReversalCandidate = false
var bool bearReversalCandidate = false
var float bullReversalLow = 0.0
var float bullReversalHigh = 0.0
var float bearReversalLow = 0.0
var float bearReversalHigh = 0.0
var bool bullSignalConfirmed = false
var bool bearSignalConfirmed = false
var int bullCandleCounter = 0
var int bearCandleCounter = 0
volumeIsHigh = volume > ta.sma(volume, 20)
// Reset scores
bullCandleScore := 0
bearCandleScore := 0
// Calculate reversal scores
if bar_index >= reversalLookback
for i = 0 to (reversalLookback - 1)
if close < low[i]
bullCandleScore += 1
if close > high[i]
bearCandleScore += 1
// Bear signal setup
if bearCandleScore == (reversalLookback - 1)
bearReversalCandidate := true
bearReversalLow := low
bearReversalHigh := high
bearSignalConfirmed := false
bearCandleCounter := 0
if bearReversalCandidate
bearCandleCounter += 1
if close > bearReversalHigh
bearReversalCandidate := false
bearCondition = bearReversalCandidate and close < bearReversalLow and not bearSignalConfirmed and bearCandleCounter <= (reversalConfirm + 1)
bearSignal = false
if bearCondition
bearSignalConfirmed := true
if not useVolumeConfirmation or volumeIsHigh
bearSignal := true
// Bull signal setup
if bullCandleScore == (reversalLookback - 1)
bullReversalCandidate := true
bullReversalLow := low
bullReversalHigh := high
bullSignalConfirmed := false
bullCandleCounter := 0
if bullReversalCandidate
bullCandleCounter += 1
if close < bullReversalLow
bullReversalCandidate := false
bullCondition = bullReversalCandidate and close > bullReversalHigh and not bullSignalConfirmed and bullCandleCounter <= (reversalConfirm + 1)
bullSignal = false
if bullCondition
bullSignalConfirmed := true
if not useVolumeConfirmation or volumeIsHigh
bullSignal := true
// === 2️⃣ ENTRY & EXIT LOGIC ===
// Helper Functions for Divergence Detection
findLowerLow(lookback) =>
var float lowestPrice = na
var int lowestIndex = na
if bar_index >= lookback
lowestPrice := low
lowestIndex := bar_index
for i = 1 to lookback
if low[i] < lowestPrice
lowestPrice := low[i]
lowestIndex := bar_index - i
[lowestPrice, lowestIndex]
findHigherHigh(lookback) =>
var float highestPrice = na
var int highestIndex = na
if bar_index >= lookback
highestPrice := high
highestIndex := bar_index
for i = 1 to lookback
if high[i] > highestPrice
highestPrice := high[i]
highestIndex := bar_index - i
[highestPrice, highestIndex]
// SWING BOTTOM SCORING SYSTEM
// 1. RSI Signals
rsiOversoldSignal = rsi < rsiOversold
rsiExtremeOversoldSignal = rsi < rsiExtremeOversold
rsiTurningUp = rsi > rsi[1]
// RSI Bullish Divergence
[prevLowPrice, prevLowIndex] = findLowerLow(maxLookbackBars)
rsiBullishDivergence = false
if not na(prevLowPrice) and not na(prevLowIndex) and bar_index > prevLowIndex
prevRSI = rsi[bar_index - prevLowIndex]
if low < prevLowPrice and rsi > prevRSI and not na(prevRSI)
rsiBullishDivergence := true
// 2. MACD Signals
macdNegative = macdLine < 0
macdTurningUp = macdLine > macdLine[1]
macdHistImproving = macdHist > macdHist[1]
// MACD Bullish Divergence
macdBullishDivergence = false
if not na(prevLowPrice) and not na(prevLowIndex) and bar_index > prevLowIndex
prevMACD = macdLine[bar_index - prevLowIndex]
if low < prevLowPrice and macdLine > prevMACD and not na(prevMACD)
macdBullishDivergence := true
// 3. Price Action Signals
longLowerWick = lowerWickPercent > minLowerWickPercent
smallBody = bodyPercent < 30.0
bullishClose = close > open
// 4. Quick Recovery Check
quickRecovery = false
if bar_index >= quickRecoveryBars
recoveryTarget = close * (1 + quickRecoveryPercent / 100)
for i = 1 to quickRecoveryBars
if high[i] > recoveryTarget
quickRecovery := true
break
// ENTRY SCORE CALCULATION
entryScore = 0
entryScore := entryScore + (rsiOversoldSignal ? 2 : 0)
entryScore := entryScore + (rsiExtremeOversoldSignal ? 2 : 0)
entryScore := entryScore + (rsiBullishDivergence ? 4 : 0)
entryScore := entryScore + (rsiTurningUp ? 1 : 0)
entryScore := entryScore + (macdNegative ? 1 : 0)
entryScore := entryScore + (macdTurningUp ? 2 : 0)
entryScore := entryScore + (macdHistImproving ? 2 : 0)
entryScore := entryScore + (macdBullishDivergence ? 3 : 0)
entryScore := entryScore + (longLowerWick ? 2 : 0)
entryScore := entryScore + (smallBody ? 1 : 0)
entryScore := entryScore + (bullishClose ? 1 : 0)
entryScore := entryScore + (quickRecovery ? 2 : 0)
entryScore := entryScore + (bullSignal ? 4 : 0) // Green reversal signal +4
// SWING TOP SCORING SYSTEM (for exits)
// 1. RSI Exit Signals
rsiOverboughtSignal = rsi > rsiOverbought
rsiExtremeOverboughtSignal = rsi > rsiExtremeOverbought
rsiTurningDown = rsi < rsi[1]
// RSI Bearish Divergence
[prevHighPrice, prevHighIndex] = findHigherHigh(maxLookbackBars)
rsiBearishDivergence = false
if not na(prevHighPrice) and not na(prevHighIndex) and bar_index > prevHighIndex
prevRSIHigh = rsi[bar_index - prevHighIndex]
if high > prevHighPrice and rsi < prevRSIHigh and not na(prevRSIHigh)
rsiBearishDivergence := true
// 2. MACD Exit Signals
macdPositive = macdLine > 0
macdTurningDown = macdLine < macdLine[1]
macdHistDeclining = macdHist < macdHist[1]
// MACD Bearish Divergence
macdBearishDivergence = false
if not na(prevHighPrice) and not na(prevHighIndex) and bar_index > prevHighIndex
prevMACDHigh = macdLine[bar_index - prevHighIndex]
if high > prevHighPrice and macdLine < prevMACDHigh and not na(prevMACDHigh)
macdBearishDivergence := true
// 3. Price Action Exit Signals
longUpperWick = upperWickPercent > minLowerWickPercent
bearishClose = close < open
// EXIT SCORE CALCULATION
exitScore = 0
exitScore := exitScore + (rsiOverboughtSignal ? 2 : 0)
exitScore := exitScore + (rsiExtremeOverboughtSignal ? 2 : 0)
exitScore := exitScore + (rsiBearishDivergence ? 4 : 0)
exitScore := exitScore + (rsiTurningDown ? 1 : 0)
exitScore := exitScore + (macdPositive ? 1 : 0)
exitScore := exitScore + (macdTurningDown ? 2 : 0)
exitScore := exitScore + (macdHistDeclining ? 2 : 0)
exitScore := exitScore + (macdBearishDivergence ? 3 : 0)
exitScore := exitScore + (longUpperWick ? 2 : 0)
exitScore := exitScore + (bearishClose ? 1 : 0)
exitScore := exitScore + (bearSignal ? 1 : 0) // Red reversal signal +1
// SIGNAL CONDITIONS
longCondition = entryScore >= minEntryScore and barstate.isconfirmed
exitCondition = exitScore >= minExitScore and barstate.isconfirmed
// === TP/SL LEVELS (Clean Logic) ===
var float stopLossLevel = na
var float takeProfitLevel = na
var bool tpslSet = false
// Clear levels when no position
if strategy.position_size == 0
stopLossLevel := na
takeProfitLevel := na
tpslSet := false
// Calculate TP/SL levels ONCE when position is opened
if strategy.position_size > 0 and strategy.position_size[1] == 0 and useRiskReward and not tpslSet
// Find recent low for stop loss
recentLow = low
for i = 1 to stopLossLookback
if low[i] < recentLow
recentLow := low[i]
// Set levels using actual entry price
entryPrice = strategy.opentrades.entry_price(0)
stopLossLevel := recentLow * (1 - stopLossBuffer / 100) // Configurable buffer below recent low
riskAmount = entryPrice - stopLossLevel
takeProfitLevel := entryPrice + (riskAmount * riskRewardRatio)
tpslSet := true
// === 3️⃣ TRADE EXECUTIONS ===
// Long Entry - Single Position Only
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, comment="Entry Score: " + str.tostring(entryScore))
// Set TP/SL ONLY ONCE per trade (when levels are calculated and not yet set)
if strategy.position_size > 0 and useRiskReward and tpslSet and not na(stopLossLevel) and not na(takeProfitLevel)
strategy.exit("TP/SL", "Long", stop=stopLossLevel, limit=takeProfitLevel)
// Long Exit - Close Position on Swing Top Signal (Only when NOT using TP/SL)
if exitCondition and strategy.position_size > 0 and not useRiskReward
strategy.close("Long", comment="Exit Score: " + str.tostring(exitScore))
// === 4️⃣ VISUALIZATIONS ===
// Entry Score Display (Only When Score ≥ 10) - Shows on ALL qualifying bars
if showEntryScores and entryScore >= 10 and barstate.isconfirmed
label.new(bar_index, low,
text=str.tostring(entryScore),
yloc=yloc.belowbar,
color=na,
style=label.style_label_up,
textcolor=color.green,
size=size.small)
// Exit Score Display (Only When Score ≥ 10) - Shows on ALL qualifying bars
if showExitScores and exitScore >= 10 and barstate.isconfirmed
label.new(bar_index, high,
text=str.tostring(exitScore),
yloc=yloc.abovebar,
color=na,
style=label.style_label_down,
textcolor=color.red,
size=size.small)
// Large Trade Entry Triangle (Only when actually entering a position) - Using plotshape to avoid label limits
plotshape(longCondition and strategy.position_size == 0, title="Trade Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.normal, text="BUY")
// Large Trade Exit Triangle (Only when actually exiting a position) - Using plotshape to avoid label limits
plotshape(exitCondition and strategy.position_size > 0, title="Trade Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.normal, text="SELL")
// Reversal Signal Triangles
plotshape(bullSignal, title="Bull Reversal", location=location.belowbar,
color=color.lime, style=shape.triangleup, size=size.tiny)
plotshape(bearSignal, title="Bear Reversal", location=location.abovebar,
color=color.red, style=shape.triangledown, size=size.tiny)
// === TP/SL LEVEL PLOTS ===
plot(strategy.position_size > 0 and useRiskReward ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(strategy.position_size > 0 and useRiskReward ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)
// MACD and RSI Plots (in separate panes)
macdPlot = plot(macdLine, title="MACD Line", color=color.blue, display=display.none)
signalPlot = plot(signalLine, title="Signal Line", color=color.red, display=display.none)
histPlot = plot(macdHist, title="MACD Histogram", color=color.gray, style=plot.style_histogram, display=display.none)
rsiPlot = plot(rsi, title="RSI", color=color.purple, display=display.none)
rsiOverboughtLine = hline(rsiOverbought, title="RSI Overbought", color=color.red, linestyle=hline.style_dashed, display=display.none)
rsiOversoldLine = hline(rsiOversold, title="RSI Oversold", color=color.green, linestyle=hline.style_dashed, display=display.none)