Strategie zur Volumenumkehr-Trenderfassung

SMA ATR VOLUME ETH RTH TP SL
Erstellungsdatum: 2025-05-13 10:39:29 zuletzt geändert: 2025-05-13 10:39:29
Kopie: 1 Klicks: 346
2
konzentrieren Sie sich auf
319
Anhänger

Strategie zur Volumenumkehr-Trenderfassung Strategie zur Volumenumkehr-Trenderfassung

Strategieübersicht

Die Strategie nutzt die psychologische Veränderung des Marktes nach einem großen Volumen von Geschäften, die sogenannte “mittlere Form”, in der sich die Märkte normalerweise kurzfristig nach starken Eingriffen umdrehen. Die Strategie verwendet den Einstieg in den Markt mit einem Begrenzungspreis und setzt Stop-Loss- und Stop-Levels auf Basis von Fixpunkten oder ATRs und enthält eine Timing-Funktion, um Perioden mit geringer Marktliquidität zu vermeiden.

Strategieprinzip

Die Kernprinzipien der Strategie basieren auf dem Trendwechsel, der sich nach einem außergewöhnlichen Handelsvolumen auf dem Markt einstellt. Die spezifische Operationslogik lautet wie folgt:

  1. Identifizierung von außergewöhnlichen TransaktionenDas System erkennt, ob die erste K-Linie einen deutlich höheren Handelsvolumen aufweist als der Durchschnitt. In der regulären Handelszeit (RTH) muss der Handelsvolumen das Dreifache des aktuellen Durchschnitts betragen (das kann angepasst werden); in der nach- oder Sonderzeit (ETH) muss der Handelsvolumen das Fünffache überschreiten. Die Berechnung des Durchschnittsvolumens schließt automatisch die RTH-Randzeit, die 4-6 Uhr nach der Schließung und die Vor-Sonntags-Schließzeit aus.

  2. Bestätigung des Rückgangs der TransaktionenDie aktuelle K-Linie muss weniger Transaktionsvolumen aufweisen als die vorherige K-Linie, um zu zeigen, dass der Großhandel beendet ist.

  3. Trends zu bestimmen: Die Richtung des Trends wird durch den Vergleich des Abschlusspreises vor der K-Linie des außergewöhnlichen Handels mit dem Verhältnis des SMA (einfacher gleitender Durchschnitt) bestimmt.

  4. Rückwärts-Eingangssignal

    • Mehr Signale: Wenn ein außergewöhnlicher Handelsvolumen vor der K-Linie als Abwärtstrend gilt (< der Schlusskurs unterhalb des SMA) und der aktuelle K-Linie-Handel niedriger ist.
    • Leerlaufsignale: Wenn ein außergewöhnlicher Handelsvolumen vor der K-Linie als bullisher Trend ((Schlusskurs höher als der SMA) bezeichnet wird und der aktuelle K-Linie-Handel sinkt.
  5. Eintrittsvorgang

    • Mehr machen: Setzen Sie den Mindestpreis für die außergewöhnliche Transaktionsmenge in der K-Linie.
    • Leerstellen: Setzen Sie den Limit-Bill-Preis auf den höchsten Preis für die außergewöhnliche Handelsmenge K line.
  6. RisikomanagementDas System bietet zwei Arten von Stop/Stop-Einstellungen, je nach Eigenschaften der Sorte:

    • Für bestimmte Sorten (z. B. NQ): Stop Loss und Stop Stop
    • Für andere Sorten: Optional dynamische Stop-Loss/Stop-Stopps basierend auf ATR oder Verwendung einer festen Punktzahl.
  7. Zeit-FilterDie Strategie filtert selektiv die Handelssignale für die ersten und letzten 15 Minuten des RTH und filtert stets die Signale für die Zeit nach dem Anschluss am Ostermarkt (4-6 Uhr) und die Zeit vor dem Sonntagsmarkt.

Strategische Vorteile

  1. Ein wichtiger WendepunktDie Strategie konzentriert sich darauf, Marktwendepunkte zu erfassen, die mit außergewöhnlichen Handelsvolumina einhergehen, die in der Regel signifikante Veränderungen der Marktstimmung darstellen und Handelsmöglichkeiten mit höherer Gewinnquote bieten.

  2. Genaue EintrittspunkteEinstiegsgenauigkeit durch Einstiegsgenauigkeit bei technisch wichtigen Preisniveaus durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit durch Einstiegsgenauigkeit.

  3. Anpassungsrate erkennbarStrategie: Die Kriterien für die Bestimmung des außergewöhnlichen Handelsvolumens werden dynamisch an die tatsächlichen Marktbedingungen angepasst, je nach Handelszeit (normaler Handelszeit vs. nach der Börse / Sonderzeit).

  4. Flexible RisikomanagementDie Optionen für Stop-Loss/Stop-Out basieren auf einer festen Punktzahl und ATR, wobei die Einstellungen individuell auf die Eigenschaften und die Volatilität der verschiedenen Sorten abgestimmt werden können.

  5. Intelligentes ZeitfilterDas System erlaubt die automatische Identifizierung und Filterung von schwachen und instabilen Handelszeiten, um falsche Signale zu vermeiden, die in der Nähe von Markteintritten und -abschnitten auftreten können.

  6. Klare visuelle RückmeldungDie Strategie bietet intuitive visuelle Anweisungen auf den Diagrammen, einschließlich außergewöhnlicher Handelsvolumen K-Linien, Trend SMA-Linien, Stop-Loss-Stop-Equilibrium, um die Überwachung und Analyse von Händlern zu erleichtern.

  7. Automatisierte AusführungDas System führt automatisch Limit- und Stop-Loss-Orders aus, reduziert menschliche Eingriffe und bewahrt die Handelsdisziplin.

Strategisches Risiko

  1. Falsche DurchbruchgefahrEs ist möglich, dass ein außergewöhnlicher Handelsvolumen dazu führt, dass der Preis kurzfristig wichtige Niveaus überschreitet, die dann schnell zurückgezogen werden können, was zu falschen Signalen führt. Um dieses Risiko zu mildern, kann es in Betracht gezogen werden, Bestätigungsindikatoren wie die Bestätigung von RSI-Überkaufen/Überverkaufen oder die Dauer der Überschreitung zu verwenden.

  2. Die Auswirkungen von News-Driven EventsEs wird empfohlen, die Strategie vor oder nach der Veröffentlichung wichtiger Wirtschaftsdaten auszusetzen oder die Filterbedingungen zu erhöhen.

  3. Risiken durch Veränderungen des MarktumfeldsIn einem stark trendigen Markt kann der Gegenhandel mit anhaltend ungünstigen Preisbewegungen konfrontiert werden. Es kann in Erwägung gezogen werden, einen langfristigen Trendfilter zu verwenden, um einen Gegenhandel in einem stark trendigen Umfeld zu vermeiden.

  4. Risiko, dass der Angebot nicht abgeschlossen wird: Wenn der Preis auf der nächsten K-Linie nicht das gesetzte Grenzwert erreicht, kann das Handelssignal ausfallen. Es kann in Betracht gezogen werden, eine maximale Gültigkeitsdauer festzulegen oder unter bestimmten Bedingungen auf den Marktpreis umzustellen.

  5. Risiken der geringen LiquiditätEs wird empfohlen, die Handelszeitbeschränkung an die Eigenschaften der Handelsarten anzupassen.

  6. Risiken der ParameteroptimierungÜberoptimierte Strategieparameter können dazu führen, dass die historischen Daten überarbeitet werden, was zu einer schlechten zukünftigen Leistung führt. Die Parameter sollten in einem vernünftigen Bereich gehalten werden und die Strategie sollte durch außerhalb der Stichprobe durchgeführte Tests bestätigt werden.

Richtung der Strategieoptimierung

  1. Bestätigung mehrerer Zeiträume: Ein Trendfilter für höhere Zeiträume hinzugefügt, um eine höhere Gewinnrate in der größeren Trendrichtung zu gewährleisten. Zum Beispiel kann die Richtung der Sonnenlinie überprüft werden, um nur dann zu spielen, wenn sie mit der Sonnenlinie übereinstimmt.

  2. Qualitätsbeurteilung der TransaktionenAbgesehen von der Größe der reinen Volumen-Energie kann eine qualitative Bewertung des Handelsvolumens, wie die Abweichung von der Volumen-Wert-Durchschnittspreis (VWAP), in Betracht gezogen werden, um das Marktverhalten hinter einem großen Handelsvolumen besser zu verstehen.

  3. Dynamische Stop-Loss-Strategie: Ermöglicht dynamische Stop-Losses basierend auf der Volatilität, die automatisch die Stop-Loss-Position anpassen, um einen Teil des Gewinns zu sperren, wenn der Handel in eine günstige Richtung entwickelt wird. Zum Beispiel können Tracking-Stops verwendet werden oder Stop-Losses nach einem Durchbruch der kritischen Ebene zum Kostenpreis bewegt werden.

  4. Mehrsprachige Relevanz-FilterBei relevanten Varianten (z. B. Aktienindex-Futures vs. Bargeld, Gold vs. Silber) kann das Hinzufügen von Bestätigungsindikatoren für die relevanten Varianten die Signalqualität verbessern. Das Signal kann zuverlässiger sein, wenn mehrere relevante Varianten gleichzeitig mit außergewöhnlichem Handelsvolumen und Preisverhalten konfrontiert sind.

  5. Maschinelle Lernoptimierung: Analyse der erfolgreichsten außergewöhnlichen Transaktionsvolumen-Muster-Eigenschaften in den historischen Daten durch Machine-Learning-Algorithmen, dynamische Anpassung der Einstiegsbedingungen und -Parameter. Beispielsweise können Entscheidungsträume oder Zufallswälder verwendet werden, um die besten Aktionen unter einer bestimmten außergewöhnlichen Transaktionsvolumen-Eigenschaft vorherzusagen.

  6. SchwankungsrateAnpassung der Standards für die Bestimmung der außergewöhnlichen Handelsmenge und der Stop-Loss-Ebene an die aktuelle Marktschwankungen. In einer Umgebung mit hoher Volatilität kann die Erhöhung der Ausnahmemenge die Schwelle bestimmen und die Stop-Loss-Distanz verringern. In einer Umgebung mit niedriger Volatilität ist das Gegenteil der Fall.

  7. Hinzufügen von grundlegenden FilternDie Handelsstrategie wird von der US-Finanzbehörde für den Zeitraum vom 1. Januar 2014 bis zum 31. Dezember 2015 geändert.

Zusammenfassen

Die Strategie definiert technisch eindeutige Eintritts- und Ausstiegsbedingungen und Risikomanagementregeln und enthält eine intelligente Zeitfilterung, um schlechte Zeiten zu vermeiden.

Die Kernstärke der Strategie liegt darin, dass sie die “in-the-middle-form” des Marktes präzise erfasst, was oft zu kurzfristigen Umkehrmöglichkeiten führt, wenn Marktteilnehmer massenhaft ein- und aussteigen. Durch die präzise Festlegung der Begrenzungspreise an den kritischen Preisniveaus und in Kombination mit einer vernünftigen Stop-Loss-Stop-Management bietet die Strategie eine disziplinierte Handelsmethode.

Der Benutzer sollte jedoch auf die potenziellen Risiken der Strategie in stark trendigen Märkten sowie auf die Sensibilität für Nachrichtenereignisse achten. Die Strategie kann ihre Leistungsstabilität und Anpassungsfähigkeit durch die Erhöhung der Bestätigung mit mehreren Zeiträumen, die dynamische Anpassung der Parameter und die Erweiterung der Risikomanagementmechanismen weiter optimieren.

Insgesamt bietet die Strategie der Trendwechsel-Erfassung der Handelsvolumen den Händlern ein Handelssystem, das auf den Prinzipien des Marktverhaltens und der Psychologie basiert und besonders für die volatilen Märkte und die Zwischen-Schwankungen geeignet ist. Mit vernünftiger Einrichtung und kontinuierlicher Optimierung ist die Strategie in der Lage, ein wirksames Instrument in der Handelsportfolio zu werden.

Strategiequellcode
/*backtest
start: 2024-05-13 00:00:00
end: 2025-05-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Strategy Title Reflects Latest Logic
strategy(title="Middle Finger Trading Strategy",
         shorttitle="Middle_Finger",
         overlay=true,
         pyramiding=0, // Only one entry at a time
         default_qty_type=strategy.percent_of_equity,
         default_qty_value=1, // Trade 1% of equity
         commission_value=0.04, // Example commission (adjust as needed)
         commission_type=strategy.commission.percent,
         initial_capital = 10000, // Example starting capital
         process_orders_on_close=false // Important for limit orders to potentially fill intra-bar
         )

// --- Inputs ---

// Volume Settings Group
grp_vol = "Volume Settings"
float rthHugeVolMultiplier = input.float(3.0, title="1. RTH Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for core RTH (9:45-15:44 ET)")
float ethHugeVolMultiplier = input.float(5.0, title="2. ETH/Excluded Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for ETH and first/last 15min RTH (default 5x)")
int   volLookback         = input.int(20, title="3. Volume SMA Lookback", minval=1, group=grp_vol, tooltip="Lookback for calculating the filtered average volume (Used ONLY for identifying the HUGE spike)")
// Removed normalVolMultiplier as it's no longer used for entry confirmation

// Trend Settings Group
grp_trend = "Trend Settings"
int   trendLookback       = input.int(20, title="1. Trend SMA Lookback", minval=2, group=grp_trend, tooltip="Lookback period for the Simple Moving Average used to determine the trend before the spike")

// Risk Management Group
grp_risk = "Risk Management (SL/TP)"
string nqTargetTickerId   = input.string("CME:NQ1!", title="1. Target Ticker ID for Fixed NQ Points", group=grp_risk, tooltip="Specify the exact Ticker ID (e.g., CME:NQ1!, TVC:NDX) for fixed SL/TP. Found in Symbol Info.")
float nqFixedStopPoints   = input.float(20.0, title="2. Fixed SL Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
float nqFixedTpPoints     = input.float(50.0, title="3. Fixed TP Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)

// General SL/TP Settings (used if NOT the target ticker)
bool  useAtrStops         = input.bool(true, title="4. Use ATR for SL/TP (Other Tickers)?", group=grp_risk)
int   atrLookback         = input.int(14, title="5. ATR Lookback", group=grp_risk, inline="atr_other")
float atrStopMultiplier   = input.float(2.0, title="6. ATR SL Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float atrTpMultiplier     = input.float(4.0, title="7. ATR TP Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float fixedStopPoints     = input.float(100.0, title="6. Fixed SL Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
float fixedTpPoints       = input.float(200.0, title="7. Fixed TP Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)

// Time Filter Settings Group
grp_time = "Time Filter (ET)"
bool  enableEntryFilterRthEdges = input.bool(true, title="1. Filter Entries First/Last 15 Min RTH (ET)?", group=grp_time, tooltip="If checked, ignores entries from 9:30-9:44 ET and 15:45-15:59 ET. Avg Vol calc *always* filters these times, 4-6PM ET, and Sun pre-6PM ET.")
string targetTimezone     = "America/New_York" // Specify Eastern Time zone

// --- Time Calculation Function ---
isTimeInSession(t, tz, sessionString) =>
    not na(time(timeframe.period, sessionString, tz))

// --- Time Context Functions ---
getTimeContext(t, tz) =>
    h = hour(t, tz)
    m = minute(t, tz)
    d = dayofweek(t, tz)

    // Core RTH: 9:45 AM to 15:44 PM ET (Mon-Fri)
    bool isCoreRTH = d >= dayofweek.monday and d <= dayofweek.friday and
       ((h == 9 and m >= 45) or (h >= 10 and h <= 14) or (h == 15 and m <= 44))

    // Excluded RTH Edges: 9:30-9:44 ET and 15:45-15:59 ET (Mon-Fri)
    bool isExcludedRTH = d >= dayofweek.monday and d <= dayofweek.friday and
       ((h == 9 and m >= 30 and m <= 44) or (h == 15 and m >= 45))

    // After Hours Closed: 4:00 PM to 5:59 PM ET (Mon-Fri)
    bool isAfterHoursClosed = d >= dayofweek.monday and d <= dayofweek.friday and
       (h >= 16 and h < 18)

    // Sunday Pre-Market: Sunday before 6:00 PM ET
    bool isSundayPreMarket = d == dayofweek.sunday and h < 18

    // Combine ALL periods where activity should be ignored or volume excluded from avg
    bool isExcludedPeriod = isExcludedRTH or isAfterHoursClosed or isSundayPreMarket

    [isCoreRTH, isExcludedRTH, isAfterHoursClosed, isSundayPreMarket, isExcludedPeriod]

// --- Get Time Context for Current and Previous Bar ---
[isCurrentBarCoreRTH, isCurrentBarExcludedRTH, isCurrentBarAfterHoursClosed, isCurrentBarSundayPreMarket, isCurrentBarExcludedPeriod] = getTimeContext(time, targetTimezone)
[isPreviousBarCoreRTH, isPreviousBarExcludedRTH, isPreviousBarAfterHoursClosed, isPreviousBarSundayPreMarket, isPreviousBarExcludedPeriod] = getTimeContext(time[1], targetTimezone)

// --- Calculations ---

// Volume Averaging: Exclude RTH edges, 4-6 PM ET, and Sunday Pre-6 PM ET ALWAYS
// This average is *only* used to define the huge volume spike threshold
bool excludeCurrentVolFromAvg = isCurrentBarExcludedPeriod
float volumeForAvgCalc = excludeCurrentVolFromAvg ? na : volume
float avgVolume = ta.sma(volumeForAvgCalc, volLookback)

// Dynamic Huge Volume Multiplier: Based on *previous* bar's time (Core RTH or not)
float activeHugeVolMultiplier = isPreviousBarCoreRTH ? rthHugeVolMultiplier : ethHugeVolMultiplier
// Use avgVolume[1] as current avgVolume excludes current bar, and we compare previous volume to avg *before* it
float hugeVolThreshold   = nz(avgVolume[1]) * activeHugeVolMultiplier

// --- MODIFIED Volume Conditions ---
// 1. Check if the *previous* bar had huge volume compared to its preceding average
bool isHugeVolumePrevBar = volume[1] > hugeVolThreshold and hugeVolThreshold > 0
// 2. Check if the *current* bar's volume is simply lower than the previous (huge) bar's volume
bool isVolumeLowerThanSpike = volume < volume[1]

// Trend Condition
float priceSma = ta.sma(close, trendLookback)
// Ensure trend condition uses close[2] vs sma[2] (trend state *before* the spike bar)
bool isBullishTrendBeforeSpike = close[2] > nz(priceSma[2])
bool isBearishTrendBeforeSpike = close[2] < nz(priceSma[2])

// --- Entry Time Filtering ---
// Always filter After Hours Closed and Sunday Pre-Market.
// Optionally filter RTH Edges based on input.
bool shouldFilterRthEdges = enableEntryFilterRthEdges and isCurrentBarExcludedRTH
bool isIgnoreEntryTime = shouldFilterRthEdges or isCurrentBarAfterHoursClosed or isCurrentBarSundayPreMarket

// --- MODIFIED Base Conditions ---
// Uses the simplified `isVolumeLowerThanSpike` check
bool baseLongCondition = isBearishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
bool baseShortCondition = isBullishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike

// Final Conditions (Apply Time Filter)
bool finalLongCondition = baseLongCondition and not isIgnoreEntryTime
bool finalShortCondition = baseShortCondition and not isIgnoreEntryTime

// --- Stop Loss & Take Profit Calculation (Conditional Logic) ---
// This part remains the same
float atrValue = ta.atr(atrLookback)
float tickValue = syminfo.mintick
int stopLossTicks = 100 // Default fallback SL ticks
int takeProfitTicks = 200 // Default fallback TP ticks

// Check if the current symbol matches the target ticker ID
bool isTargetTicker = str.upper(syminfo.tickerid) == str.upper(nqTargetTickerId) // Case-insensitive comparison

if (isTargetTicker and tickValue > 0)
    // --- Target Ticker Logic (e.g., NQ Fixed Points) ---
    float ticksPerPoint = 1.0 / tickValue
    stopLossTicks := math.max(1, math.round(nqFixedStopPoints * ticksPerPoint))
    takeProfitTicks := math.max(1, math.round(nqFixedTpPoints * ticksPerPoint))
else if tickValue > 0 // Use only if tickValue is valid
    // --- Standard Logic (Other Tickers: ATR or Fixed) ---
    float stopLossDistance = useAtrStops ? atrValue * atrStopMultiplier : fixedStopPoints * tickValue
    float takeProfitDistance = useAtrStops ? atrValue * atrTpMultiplier : fixedTpPoints * tickValue

    // Calculate ticks, ensuring it's at least 1 tick
    stopLossTicks := na(stopLossDistance) ? 100 : math.max(1, math.round(stopLossDistance / tickValue))
    takeProfitTicks := na(takeProfitDistance) ? 200 : math.max(1, math.round(takeProfitDistance / tickValue))

// Final check to ensure SL/TP are not na
stopLossTicks := nz(stopLossTicks, 100)
takeProfitTicks := nz(takeProfitTicks, 200)


// --- Strategy Execution ---
// Uses Limit Orders based on previous bar's low/high - Remains the same
float limitEntryPriceLong = low[1]  // Target entry at the low of the huge volume bar
float limitEntryPriceShort = high[1] // Target entry at the high of the huge volume bar

if (finalLongCondition and strategy.position_size == 0)
    strategy.cancel("S") // Cancel any pending short limit order first
    strategy.entry("L", strategy.long, limit = limitEntryPriceLong)
    strategy.exit("L SL/TP", from_entry="L", loss=stopLossTicks, profit=takeProfitTicks)

if (finalShortCondition and strategy.position_size == 0)
    strategy.cancel("L") // Cancel any pending long limit order first
    strategy.entry("S", strategy.short, limit = limitEntryPriceShort)
    strategy.exit("S SL/TP", from_entry="S", loss=stopLossTicks, profit=takeProfitTicks)


// --- Plotting & Visuals ---
plot(avgVolume, title="Filtered Avg Volume", color=color.new(color.blue, 60), style=plot.style_line)
// Removed the plot for the normal volume threshold as it's no longer used

// Highlight huge volume bar (previous bar that triggered the signal)
bgcolor(isHugeVolumePrevBar[1] ? color.new(color.yellow, 85) : na, title="Huge Volume Bar [-1]")

// Highlight bars excluded from volume average calculation
bgcolor(excludeCurrentVolFromAvg ? color.new(color.teal, 90) : na, title="Vol Excluded from Avg Calc")

// Highlight bars where entries are ignored due to time filters
bgcolor(isIgnoreEntryTime and (baseLongCondition or baseShortCondition) ? color.new(color.gray, 75) : na, title="Entry Time Filtered Bar")

// --- MODIFIED Highlight base conditions met ---
// Reflects the updated base conditions using isVolumeLowerThanSpike
bgcolor(baseLongCondition and not isIgnoreEntryTime ? color.new(color.green, 90) : na, title="Base Long Condition Met")
bgcolor(baseShortCondition and not isIgnoreEntryTime ? color.new(color.red, 90) : na, title="Base Short Condition Met")

plot(priceSma, title="Trend SMA", color=color.gray)

// Plot SL/TP levels for visualization - Remains the same
var float entryPrice = na
var float slLevel = na
var float tpLevel = na

if (strategy.opentrades > 0 and strategy.opentrades[1] == 0) // Just entered a trade
    entryPrice := strategy.opentrades.entry_price(0)
    if (strategy.position_size > 0) // Long
        slLevel := entryPrice - stopLossTicks * tickValue
        tpLevel := entryPrice + takeProfitTicks * tickValue
    else // Short
        slLevel := entryPrice + stopLossTicks * tickValue
        tpLevel := entryPrice - takeProfitTicks * tickValue
else if (strategy.opentrades == 0 and strategy.opentrades[1] > 0) // Position closed
    entryPrice := na
    slLevel := na
    tpLevel := na
else if (strategy.opentrades > 0) // Position still open
    entryPrice := strategy.opentrades.entry_price(0)
    if (strategy.position_size > 0) // Long
        slLevel := entryPrice - stopLossTicks * tickValue
        tpLevel := entryPrice + takeProfitTicks * tickValue
    else // Short
        slLevel := entryPrice + stopLossTicks * tickValue
        tpLevel := entryPrice - takeProfitTicks * tickValue

plot(strategy.opentrades > 0 ? slLevel : na, title="Stop Loss Level", color=color.red, style=plot.style_linebr)
plot(strategy.opentrades > 0 ? tpLevel : na, title="Take Profit Level", color=color.green, style=plot.style_linebr)

// Optional Debugging Plots
// plotchar(isHugeVolumePrevBar, "HugeVol[1]", "H", location.bottom, color.yellow, size=size.tiny)
// plotchar(isVolumeLowerThanSpike, "VolLow", "v", location.bottom, color.purple, size=size.tiny) // Changed char
// plotchar(finalLongCondition, "FinalLong", "L", location.top, color.green, size=size.tiny)
// plotchar(finalShortCondition, "FinalShort", "S", location.top, color.red, size=size.tiny)
// plot(finalLongCondition ? limitEntryPriceLong : na, "Long Limit Target", color.lime, style=plot.style_circles, linewidth=2)
// plot(finalShortCondition ? limitEntryPriceShort : na, "Short Limit Target", color.fuchsia, style=plot.style_circles, linewidth=2)