Mehrfach konvergierende Swing Hunter-Strategie: Trenderfassung in kurzen Zeiträumen basierend auf einem fortschrittlichen Bewertungssystem

MACD RSI 多重会聚 趋势捕捉 摆动交易 计分系统 交易策略 低时间框架 价格行为 技术分析 动量指标 趋势识别 风险管理
Erstellungsdatum: 2025-06-30 13:46:39 zuletzt geändert: 2025-06-30 13:46:39
Kopie: 0 Klicks: 239
2
konzentrieren Sie sich auf
319
Anhänger

Mehrfach konvergierende Swing Hunter-Strategie: Trenderfassung in kurzen Zeiträumen basierend auf einem fortschrittlichen Bewertungssystem Mehrfach konvergierende Swing Hunter-Strategie: Trenderfassung in kurzen Zeiträumen basierend auf einem fortschrittlichen Bewertungssystem

Überblick

Die Multiple-Meeting-Swing-Hunter-Strategie ist eine hochwertige Quantifizierungsstrategie, die speziell für den Handel mit niedrigen Zeitrahmen entwickelt wurde. Sie verwendet ein umfassendes, auf Punkten basierendes Bewertungssystem, das optimierte technische Indikatoren, die Analyse des Preisverhaltens und die Identifizierung von Reversal-Mustern kombiniert, um präzise Handelssignale zu erzeugen. Die Kerninnovation der Strategie besteht in der Einführung eines einzigartigen Dual-Score-Mechanismus, der zum einen die Schwingung der Unterseite durch ein Einstiegsscore-System identifiziert und zum anderen die beste Ausstiegszeit durch ein Ausstiegsscore-System bestimmt.

Die Strategie nutzt weitgehend getestete und optimierte Kennzahlen, darunter die speziell konfigurierten MACD ((3, 10, 3) und RSI ((21), die besser auf schnelle Marktveränderungen reagieren als die Standardkonfiguration. Die Strategie erfordert einen hohen Punkt-Schwellenwert von mindestens 13 Punkten für Ein- und Ausgänge, um sicherzustellen, dass nur Signale mit hoher Vertrauenswürdigkeit einen Handel auslösen.

Strategieprinzip

Im Zentrum der Multiple-Meeting-Swing-Hunter-Strategie steht ein integriertes Bewertungssystem, das den Zeitpunkt des Handels durch quantitative Beurteilung mehrerer technischer Bedingungen bestimmt. Das Einstiegsrating-System besteht aus den folgenden vier Hauptkomponenten:

  1. RSI-Signal(maximal 5 Punkte):

    • RSI < 30: + 2 Punkte
    • RSI < 25: + 2 Punkte
    • RSI geht nach oben: +1
  2. MACD-Signale(maximal 8 Punkte):

    • MACD unter der Nulllinie: + 1 Punkt
    • Der MACD-Wert hat sich um +2 Punkte erhöht.
    • MACD-Säulen verbessert sich um +2 Punkte
    • Der MACD ist um +3 Punkte von der Marke abweichen.
  3. Preisverhalten(maximal 4 Punkte):

    • Schattenlinie unterhalb der Länge ((> 50%): + 2 Punkte
    • Kleine Einheiten ((<30%): + 1 Punkt
    • Die Sonnenstrahlung ist + 1 Punkt.
  4. Patternerkennung(maximal 8 Punkte):

    • Der RSI ist um +4 Punkte von der Marke abweichen.
    • Schnelle Wiederherstellung: +2 Punkte
    • Rückkehr bestätigt: +4 Punkte

Die Ausgangsscoresystem verwendet ein ähnliches Gewichtssystem, jedoch mit umgekehrten Kriterien zur Identifizierung von Schwingenden Spitzen. Die Strategie erfordert, dass Ein- und Ausgangsscores von mindestens 13 Punkten erreicht werden, was sicherstellt, dass nur Signale mit hoher Sicherheit ausgeführt werden, was die Wahrscheinlichkeit von Falschsignalen verringert.

Ein weiterer wichtiger Bestandteil der Strategie sind die optimierten Kennzahlen:

  • MACD KonfigurationSchneller als die Standardkonfiguration (§ 12, 26, 9), um das Signal früher zu erkennen und gleichzeitig zuverlässig zu sein
  • RSI-Konfiguration (Zyklus 21)Der 14-Zyklus-RSI hat weniger Falschsignale als der Standard-RSI und kann dennoch Überverkaufsbedingungen effektiv erfassen.

Diese Parameter wurden speziell optimiert, um schnelle Preisänderungen und Hochfrequenzschwankungen zu erfassen.

Strategische Vorteile

  1. Entscheidungsprozesse mit objektiver QuantifizierungDie Strategie eliminiert subjektive Urteile und bietet klare Handelskriterien durch ein auf Punkten basierendes Bewertungssystem. Diese Methode basiert die Handelsentscheidungen auf Daten und nicht auf Emotionen und erhöht die Handelsdisziplin erheblich.

  2. MehrfachbestätigungDie Strategie erfordert die gleichzeitige Bestätigung mehrerer technischer Indikatoren und Preismodelle, was die Zuverlässigkeit des Signals erheblich erhöht. Der Handel wird nur durchgeführt, wenn die Kriterien von mindestens 13 Punkten erfüllt sind, was die Gefahr falscher Signale verringert.

  3. Optimierte ZeitempfindlichkeitDurch die Verwendung von optimierten MACD- (3, 10, 3) und RSI- (21), Parametern, kann die Strategie die Veränderungen in der Preisdynamik früher erfassen und gleichzeitig Marktlärm filtern, um eine bessere Zeitempfindlichkeit zu bieten.

  4. Flexible RisikomanagementDie Strategie beinhaltet eine risikobasierte Berechnung der Stop-Loss- und Profit-Zielwerte und ein Risiko-Rendite-Verhältnis von 5:1 als Standard, was einen klaren Risikomanagementrahmen für den Handel bietet. Dynamische Stop-Loss-Berichterstattung basiert auf den jüngsten Schwankungen und verfügt über konfigurierbare Bufferzonen, die die Flexibilität der Risikokontrolle erhöhen.

  5. Hochvisualisierte TransaktionssystemeDie Strategie bietet ein Score-Anzeige-System, das ein grünes Label ((Eintrittsscore ≥ 10 Punkte) und ein rotes Label ((Exittscores ≥ 10 Punkte) enthält, sowie ein sichtbares Ein-/Austritt-Markierungssymbol, das es dem Händler ermöglicht, die Funktionsweise des Systems klar zu sehen.

  6. Äußerst anpassungsfähigObwohl die Strategieparameter optimiert sind, können sie an unterschiedliche Marktbedingungen und Handelsarten angepasst werden, was die Strategie für eine breite Anwendung macht.

Strategisches Risiko

  1. HochpositionsrisikoStrategie: Die Standardstrategie ist eine 100%ige Vermögensverteilung, die die Risikobereitschaft für einzelne Geschäfte erhöht. Dies kann zu erheblichen Kontofluktuationen bei starken Marktschwankungen oder unerwarteten Ereignissen führen.

  2. Abhängigkeit von MarktbedingungenDie Strategie wirkt am besten in deutlich trendigen und schwankenden Märkten, kann jedoch in stark schwankenden und schrägen Märkten weniger wirksam sein. Sie sollte in verschiedenen Marktumgebungen mit Vorsicht angewendet werden und Parameter anpassen oder den Handel aussetzen.

  3. Optimierung des Risikos einer ÜberpassungStrategieparameter sind optimiert und es besteht die Gefahr, dass historische Daten zu stark angepasst werden. Veränderte zukünftige Marktbedingungen können dazu führen, dass die Strategie weniger gut funktioniert als die Rückmeldung. Die Parameter sollten regelmäßig überprüft und angepasst werden, um die Effektivität der Strategie zu erhalten.

  4. Nicht diversifizierter SchutzAls Single-Position-Strategie fehlt es an Diversifizierungsschutz und erhöht das spezifische Marktrisiko. In praktischen Anwendungen kann die Strategie als Teil eines breiteren Portfolios in Betracht gezogen werden, oder Multi-Variante-Handels eingeführt werden, um die Diversifizierung zu erhöhen.

  5. Risiko für technische StörungenKomplexe Bewertungssysteme und mehrere Bedingungen können in bestimmten Marktumgebungen, insbesondere bei extremen Marktbedingungen, nicht funktionieren. Es wird empfohlen, zusätzliche Risikomanagementmaßnahmen zu ergreifen, z. B. die Festlegung von Maximalverlustlimits oder die Verwendung von Volatilitätsfiltern.

Optimierungsrichtung

  1. Einführung von AnpassungsparameternDie aktuelle Strategie verwendet die festgelegten MACD- und RSI-Parameter. Es kann in Betracht gezogen werden, Anpassungsparameter einzuführen, die auf Marktvolatilität oder Trendstärke basieren. Zum Beispiel kann die MACD-Parameter automatisch in einem hochvolatilen Umfeld angepasst werden, oder die RSI-Überverkauf/Überkauf-Ebene entsprechend der aktuellen Marktlage angepasst werden, um die Anpassungsfähigkeit der Strategie in verschiedenen Marktumgebungen zu verbessern.

  2. Integrierte Preis-Leistungs-AnalyseDie derzeitige Strategie basiert hauptsächlich auf Preisbewegungen und dynamischen Kennzahlen, die die Signalqualität durch die Integration von Volumenanalyse verbessern können. Besonders bei der Bestätigung von Umkehrmustern kann die Bestätigung von Volumen zusätzliche Zuverlässigkeit bieten. Berücksichtigen Sie die Hinzufügung von volumenrelevanten Bewertungskriterien, wie z. B. erhöhtes Volumen, Abweichung von Volumen usw.

  3. Marktumfeldfilter hinzufügenDie Implementierung von Mechanismen zur Identifizierung von Marktumständen, die automatisch die Handelsfrequenz reduzieren oder Parameter anpassen, wenn die Marktbedingungen nicht für die Strategie geeignet sind. Zum Beispiel, die Punktgrenze in hochgradig horizontalen Märkten zu erhöhen oder die Stop-Loss-Range in einem äußerst volatilen Umfeld zu verringern.

  4. Optimierung des FondsmanagementsDie derzeitige Strategie nutzt eine 100%-Positionsverteilung, um ein komplexeres System der Geldverwaltung zu ermöglichen, das die Positionsgröße anhand von Signalstärke, Marktvolatilität oder historischer Leistungsdynamik anpasst. Zum Beispiel, je höher der Score, desto mehr Geld wird verteilt, oder die Positionsgröße wird nach einer Reihe von Verlusten reduziert.

  5. Integration von mehreren ZeitrahmenDie Qualität des Eintrittssignals wird durch die Aufnahme von Trendbestätigungen für höhere Zeiträume verbessert. Zum Beispiel werden Geschäfte nur ausgeführt, wenn die Richtung des Trends in den höheren Zeiträumen übereinstimmt, oder werden mehr Punkte für Geschäfte vergeben, die dem Haupttrend folgen.

  6. Maschinelle LernoptimierungÜberlegungen zur Optimierung von Rating-Gewichten und -Durchschnitten mit Hilfe von Machine-Learning-Methoden. Durch die Analyse historischer Daten kann ermittelt werden, welche Signalkombinationen in einem bestimmten Marktumfeld am effektivsten sind, und das Rating-System entsprechend angepasst werden.

Zusammenfassen

Die Multiple-Meeting-Swing-Hunter-Strategie stellt eine umfassende, systematische Low-Time-Frame-Trading-Methode dar, die ein datengetriebenes Handelsentscheidungssystem durch die Integration mehrerer technischer Analyse-Indikatoren und Merkmale der Preisbewegung schafft. Die Kernstärke der Strategie liegt in ihrer objektiven, mehrstufigen Bewertungsmethode, die emotionale Entscheidungen wirksam eliminiert, während genügend Flexibilität beibehalten wird, um sich an verschiedene Handelsarten und Marktbedingungen anzupassen.

Die Strategie ist in der Lage, die Marktschwankungen durch optimierte MACD (3, 10, 3) und RSI (21), in Kombination mit strengen Ein- und Ausstiegsbedingungen effektiv zu erfassen, insbesondere in sehr volatilen Märkten. Die integrierten Risikomanagementfunktionen und Visualisierungsinstrumente erhöhen die Praktikabilität und Benutzerfreundlichkeit der Strategie weiter.

Die Strategie hat jedoch auch einige Einschränkungen und Risiken, darunter eine hohe Positionsverteilung, die Abhängigkeit von Marktbedingungen und die Möglichkeit, übermäßige Anpassung zu optimieren. Durch die Umsetzung der empfohlenen Optimierungsrichtung, wie die Einführung von Anpassungsparametern, die Integration der Preis-Leistungs-Analyse, die Erhöhung der Marktumgebungsfilter, kann die Stabilität und Anpassungsfähigkeit der Strategie weiter verbessert werden.

Für erfahrene Händler bietet die Multiple-Meeting-Swing-Hunter-Strategie einen leistungsstarken Rahmen, der verwendet werden kann, um Trends in niedrigen Zeiträumen zu erfassen und zu handeln. Durch das Verständnis ihrer Kernprinzipien und die Anpassung an spezifische Bedürfnisse können Händler diese Strategie nutzen, um in einem sich schnell verändernden Markt nach hochprobablen Handelsmöglichkeiten zu suchen. Es ist erwähnenswert, dass jede Handelsstrategie ein strenges Risikomanagement und eine kontinuierliche Überwachung erfordert, um den langfristigen Handel zu gewährleisten.

Strategiequellcode
/*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)