Multi-Time Frame Stochastic RSI Crossover Strategie

RSI STOCH RSI MTF TRENDING MARKETS STOP LOSS MULTI-STAGE TP
Erstellungsdatum: 2025-06-05 13:13:32 zuletzt geändert: 2025-06-05 13:13:32
Kopie: 0 Klicks: 336
2
konzentrieren Sie sich auf
319
Anhänger

Multi-Time Frame Stochastic RSI Crossover Strategie Multi-Time Frame Stochastic RSI Crossover Strategie

Strategieübersicht

Die Multi-Time-Frame Random Relative Strength-Weakness-Cross-Strategie ist ein auf Stochastic RSI (Random Relative Strength-Indicator) basierendes Komplex-Trading-System, bei dem Daten aus zwei Zeitperioden von 5 Minuten und 15 Minuten generiert und bestätigt werden. Es ist ein vollständiges Handelssystem mit klar definierten Einstiegsbedingungen, Stop-Loss-Kontrollen und einem gestaffelten Gewinnschema. Die Strategie konzentriert sich besonders auf die Überkauf-/Überverkaufszustände des Marktes und erzielt Gewinne durch die Erfassung von Wechselzeiten in der Preisdynamik.

Die Strategie arbeitet auf einem 5-Minuten-Chart, bezieht sich jedoch auf Daten aus dem 15-Minuten-Chart, um die Handelssignale zu bestätigen, was die Tiefe der Multi-Time-Frame-Analyse widerspiegelt. Es verwendet verschiedene Parameter-Sets für Mehrkopf- und Leerkopf-Handel, was darauf hindeutet, dass es in der Konstruktion dazu neigt, sich an die allgemein pessimistischen Marktbedingungen anzupassen.

Strategieprinzip

Das Kernprinzip der Strategie basiert auf dem Kreuzsignal des Stochastic RSI-Indikators, kombiniert mit einer mehrfachen Zeitrahmenbestätigungsmechanik, um minderwertige Signale zu filtern. Die spezifischen Arbeitsabläufe lauten wie folgt:

  1. Erste Triggersignale (Zeitrahmen von 5 Minuten)

    • Mehrkopfsignal: Wenn die K-Linie des Stoch RSI auf dem 5-Minuten-Chart die D-Linie nach oben durchquert und der K-Wert bei der Durchquerung unter dem angegebenen Triggerniveau liegt ([stoch_5min_k_long_trigger])
    • Hoher Signal: Wenn die K-Linie des Stoch RSI auf dem 5-Minuten-Chart die D-Linie nach unten überschreitet und der K-Wert beim Durchschreiten über dem angegebenen Triggerniveau liegt ((stoch_5min_k_short_trigger)).
  2. Hochwertige Bestätigung ((15-Minuten-Zeitrahmen))

    • Nach dem ersten 5-Minuten-Signal sucht die Strategie innerhalb des eingestellten Wartefensters (wait_window_5min_bars) eine Bestätigung für den 15-Minuten-Zeitrahmen.
    • Mehrköpfige Bestätigung: Die K-Linie des 15-minütigen Stoch RSI muss streng größer als seine D-Linie sein, und der 15-minütige K-Wert muss niedriger sein als der gesetzte Wert von stoch_15min_long_entry_level.
    • Die K-Linie des 15-Minuten-Stoch-RSI muss streng kleiner als seine D-Linie sein, und der 15-Minuten-K-Wert muss höher sein als der gesetzte Wert von stoch_15min_short_entry_level.
  3. Wiederholte Signalfilter

    • Die Strategie implementiert einen Kühlzeitmechanismus ((min_bars_between_signals), bei dem eine bestimmte Anzahl von K-Leitern zwischen Signalen in derselben Richtung überschritten werden muss, um ein neues Signal zu berücksichtigen.
  4. Positionsverwaltung

    • Positionsschließung: Die Strategie erzeugt kein neues Einstiegssignal, wenn bereits eine nicht ausgeglichene Position gehalten wird.
    • Stop-Loss-Einstellung: basierend auf der Eintritts-K-Linie-Low- ((multiplex)) oder High- ((blank)) -Einstellung, wird ein Stop-Loss ausgelöst, wenn der Schlusskurs der nachfolgenden K-Linie dieses Niveau überschreitet.
    • Die Stop-Loss-Prüfung hat Vorrang vor der Gewinnprüfung.
  5. Zweistufige Profitmechanismen

    • Phase 1 (TP1): Ein Ausgleich von 50% der Positionen, ausgelöst durch eine der folgenden Methoden:
      • Vorrangige Methode A ((extreme K-Werte): Wenn der 5-minütige oder 15-minütige Stoch-K-Wert über extreme_long_tp_level ((Mehrkopf) oder unter extreme_short_tp_level ((Leerkopf)) liegt.
      • Vorrangige Methode B ((Konditionelle 5-Minuten-Kreuzung + 15-Minuten-K-Umkehrung): Wenn eine 5-Minuten-K/D-Kreuzung des Stöch RSI erfolgt ((K-Übergang nach unten durch D bei Polygon; K-Übergang nach oben durch D bei Holzkopf), und der 15-Minuten-Stoch-K-Wert “umgekehrt” ist ((aktuelle 15-Minuten-K < vorherige 15-Minuten-K für Polygon; aktuelle 15-Minuten-K > vorherige 15-Minuten-K für Holzkopf)).
    • Phase 2 ((TP2): Ausgleich der verbleibenden 50% der Positionen, aktiviert nur nach TP1-Triggerung, ausgeführt, wenn der Stoch K-Wert nach 5 Minuten oder 15 Minuten erneut den gleichen Extremwert erreicht.

Strategische Vorteile

  1. Mehrfache Zeitrahmenbestätigung

    • Die Strategie reduziert Falschsignale und erhöht die Qualität des Handels durch die Kombination von Signalen in 5- und 15-Minuten-Zeitrahmen. Die kürzeren Zeitrahmen bieten Einstiegsmöglichkeiten, während die längeren Zeiträume eine Trendbestätigung bieten. Diese Methode kann den kurzfristigen Marktrauschen wirksam filtern.
  2. Überkauf-/Überverkaufsbedingungen genau lokalisiert

    • Der Stochastic RSI ist empfindlicher als der herkömmliche RSI und kann Änderungen in der Preisdynamik früher erfassen. Die Strategie nutzt diese Eigenschaft, um zu handeln, wenn der Preis sich umdrehen wird, was die Genauigkeit der Einstiegszeit erhöht.
  3. Phasen-Stillstandsstrategie

    • Ein zweistufiger Stop-Loss-Mechanismus ermöglicht es einem Händler, einen Teil seiner Gewinne zu sichern, während er seine verbleibenden Positionen behält, um größere Trends zu erfassen. Diese Methode balanciert Risiko und Ertrag und ist besonders geeignet für Märkte mit hoher Volatilität.
  4. Anpassungsvorlieben

    • Die Strategieparameter können angepasst werden, um die Marktpräferenzen zu reflektieren (z. B. wenn die aktuelle Strategie für mehrere Parteien flexibler ist), so dass sie sich an unterschiedliche Marktumgebungen und Handelspräferenzen anpassen können.
  5. Komplettes Risikomanagement

    • Der eindeutige Stop-Loss-Mechanismus basiert auf den Maximalwerten der eingegangenen K-Linie und bietet für jeden Handel quantifizierte Risikokontrollen. Die Stop-Loss-Prüfung hat Vorrang vor der Gewinnprüfung und stellt sicher, dass die Risikokontrolle immer die erste Überlegung ist.
  6. Wiederholte Signalfilter

    • Durch die Implementierung von Signalkühlperioden wird vermieden, dass in kurzer Zeit zu viel in die gleiche Richtung gehandelt wird, wodurch die Transaktionskosten reduziert und die Signalqualität verbessert wird.

Strategisches Risiko

  1. Parameterempfindlichkeit

    • Diese Strategie ist auf mehrere Threshold-Parameter angewiesen, wie z. B. auf verschiedene Trigger-Ebenen und Bestätigungs-Throughs. Eine unangemessene Parameter-Einstellung kann zu zu vielen Falschsignalen oder zu verpassten wichtigen Handelsmöglichkeiten führen. Diese Parameter sollten durch Rücktestung unter verschiedenen Marktbedingungen optimiert werden.
  2. Die Stop-Loss-Punkte sind möglicherweise breiter.

    • Ein Stop-Loss, der auf den K-Line-Heximalwert basiert, kann in einigen Fällen relativ locker sein, insbesondere in einem sehr volatilen Markt. Dies kann dazu führen, dass die potenziellen Verluste eines einzelnen Handels über die erwarteten liegen.
  3. Abhängigkeit von Marktbedingungen

    • Der Stochastic RSI kann sich gut in zwischenstaatlichen Marktschwankungen auswirken, kann aber in stark trendigen Märkten ein vorzeitiges Umkehrsignal erzeugen. Die Strategie kann sich in schnellen einseitigen Bewegungen schlecht auswirken, da die Preise möglicherweise überkauft oder überverkauft sind und nicht umkehren.
  4. Vorliebe für mehrere Köpfe

    • Die aktuelle Strategie-Konfiguration zeigt eine Präferenz für mehrköpfige Transaktionen, was zu übermäßigen Transaktionen oder unangemessenen mehrköpfigen Signalen in einem Bärenmarktumfeld führen kann. Die Parameter sollten entsprechend der Marktumgebung angepasst werden, um das Gleichgewicht zu halten.
  5. 15 Minuten Verspätung bestätigt

    • Die Wartezeit von 15 Minuten kann zu Eintrittsverzögerungen führen, die in schnellen Märkten den idealen Eintrittspunkt verpassen können. In extrem volatilen Märkten kann diese Verzögerung die Strategieleistung erheblich beeinflussen.

Richtung der Strategieoptimierung

  1. Dynamische Bremsvorrichtungen

    • Der aktuelle feste Prozentsatzstop kann zu einem dynamischen Stop auf Basis des ATR (Average True Range) aufgerüstet werden, oder es kann ein Trailing Stop-Mechanismus implementiert werden, um mehr Gewinne bei Trends zu erfassen. Besonders für die Phase-2-Stopps sollten Sie die Verwendung von Stop-Levels, die an die Volatilität oder die Trendstärke angepasst sind, in Betracht ziehen.
  2. Marktlage passt sich an

    • Die Einführung von Marktsituationsmessmechanismen (z. B. ADX-Indikatoren zur Beurteilung der Trendstärke), die es der Strategie ermöglichen, die Parameter automatisch an unterschiedliche Marktumstände anzupassen. Zum Beispiel, umkehrende Bedingungen in starken Trendmärkten zu lockern und diese in schwankenden Märkten zu verschärfen.
  3. Synchronisierte Mehrindikator-Bestätigung

    • Die Integration von zusätzlichen technischen Indikatoren wie MACD, Brin-Band oder Moving Average als Hilfsmittel zur Bestätigung. Mehrindikator-Resonanz kann die Signalzuverlässigkeit erhöhen und falsche Durchbrüche reduzieren.
  4. Optimierung der Risikoabschnitte

    • Einführung eines dynamischen Positionsmaßstab-Managements, das die Risikothek für jeden Handel an die aktuelle Volatilität oder die jüngste Handelsleistung anpasst. Zusätzlich kann eine maximale Stop-Loss-Grenze hinzugefügt werden, um extreme Verluste zu verhindern.
  5. Multi-Zeit-Rahmen-Ebenen erweitert

    • Erwägen Sie, einen dritten Zeitrahmen (z. B. 1 Stunde oder 4 Stunden) hinzuzufügen, um eine höhere Ebene der Markthintergrundanalyse bereitzustellen, insbesondere für die Bestätigung von Trends und die Identifizierung wichtiger Unterstützungs-/Widerstandspunkte.
  6. Filterung der Transaktionszeiten

    • Hinzufügen von Trading-Zeit-Filter, um zu vermeiden, dass der Handel in der Zeit der Märkte, in denen es zu wenig Liquidität oder unregelmäßige Schwankungen. Zum Beispiel kann der Handel während der hohen Schwankungen vor und nach dem Markt zu begrenzen.

Zusammenfassen

Die Multi-Time-Frame-Random-relativ-schwache-Indicator-Cross-Strategie ist ein gut strukturiertes Handelssystem, das die Handelsqualität durch Multi-Time-Frame-Analyse und eine strenge Signal-Bestätigungsprozess verbessert. Die Kernvorteile der Strategie liegen in ihren umfassenden Einstiegsbedingungen und dem Risikomanagementsystem, insbesondere dem zweistufigen Stop-Stop-Mechanismus, der es erlaubt, Gewinne zu sperren, während einige Positionen den Trends folgen.

Die Wirksamkeit dieser Strategie hängt jedoch stark von den Parameter-Einstellungen und den Marktbedingungen ab. Sie kann in einem wackligen Markt gut abschneiden, kann aber unter starken Trends oder hohen Schwankungen angepasst werden. Es wird empfohlen, dass Händler die Parameter durch historische Rückverfolgung optimieren und überlegen, Funktionen wie Marktzustandserkennung und dynamische Stoppmechanismen hinzuzufügen.

Die Strategie ist am besten für mittel- bis hochqualifizierte Trader geeignet, die über Programmierkenntnisse verfügen und die Fähigkeit haben, diese komplexen Handelsregeln zu verstehen und zu personalisieren. Mit geeigneter Parameteranpassung und Risikomanagement kann das System ein wertvoller Bestandteil der Toolkit für Day- und Short-Trader sein, insbesondere für Trader, die sich darauf konzentrieren, Veränderungen in der Marktdynamik zu erfassen.

Strategiequellcode
/*backtest
start: 2024-06-05 00:00:00
end: 2025-06-04 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Archertoria

//@version=6
strategy("System 0530 - Stoch RSI Strategy v13 SL-Priority TP-Reversal", 
         overlay=true, 
         default_qty_type=strategy.percent_of_equity, 
         default_qty_value=100, 
         calc_on_order_fills=false, 
         process_orders_on_close=true,
         margin_short=50) 

// --- Original Indicator Input Parameters ---
g_stoch = "Stochastic RSI Parameters"
rsi_len = input.int(14, "RSI Period", minval=1, group=g_stoch)
stoch_rsi_len = input.int(14, "Stochastic of RSI Period (K Period for Stoch)", minval=1, group=g_stoch)
stoch_k_smooth = input.int(3, "Stochastic %K Smoothing (D Period for Stoch)", minval=1, group=g_stoch)
stoch_d_smooth = input.int(3, "Stochastic %D Smoothing (Smoothing for final D)", minval=1, group=g_stoch)

g_signal = "Signal Trigger and Confirmation Parameters"
stoch_5min_k_long_trigger = input.float(40.0, "5-min Stoch K Long Trigger Level (K must be ≤ this value)", minval=0, maxval=100, step=0.1, group=g_signal, tooltip="On the 5-minute chart, when the K line crosses above the D line, the K value at that time must be less than or equal to this setting to initiate a long signal wait.")
stoch_5min_k_short_trigger = input.float(70.0, "5-min Stoch K Short Trigger Level (K must be ≥ this value)", minval=0, maxval=100, step=0.1, group=g_signal, tooltip="On the 5-minute chart, when the K line crosses below the D line, the K value at that time must be greater than or equal to this setting to initiate a short signal wait.")
stoch_15min_long_entry_level = input.int(50, "15-min Stoch K Long Confirmation Threshold (K must be below this value)", minval=0, maxval=100, group=g_signal, tooltip="On the 15-minute chart, for final long confirmation, the 15-minute K line value must be below this setting.")
stoch_15min_short_entry_level = input.int(70, "15-min Stoch K Short Confirmation Threshold (K must be above this value)", minval=0, maxval=100, group=g_signal, tooltip="On the 15-minute chart, for final short confirmation, the 15-minute K line value must be above this setting.")
wait_window_5min_bars = input.int(7, "Number of 5-min bars to wait for 15-min signal", minval=1, group=g_signal, tooltip="After a 5-minute signal is issued, wait for 15-minute signal confirmation within the next N 5-minute bars.")

g_repeat_filter = "Duplicate Signal Filtering Settings"
use_signal_cooldown_filter = input.bool(true, title="Enable Duplicate Signal Filter", group=g_repeat_filter, tooltip="Filters out duplicate signals in the same direction within a short period.")
min_bars_between_signals = input.int(12, title="Minimum Bars Between Same-Direction Signals", minval=1, group=g_repeat_filter, tooltip="After a signal is issued, at least this many bars must pass before another signal in the same direction can be issued.")

// --- Take Profit Parameters ---
g_tp_params = "Take Profit Parameters"
extreme_long_tp_level = input.float(95.0, "Extreme Long TP Level (Stoch K >)", minval=50, maxval=100, step=0.1, group=g_tp_params, tooltip="Direct TP for longs if 5-min OR 15-min Stoch K exceeds this.")
extreme_short_tp_level = input.float(5.0, "Extreme Short TP Level (Stoch K <)", minval=0, maxval=50, step=0.1, group=g_tp_params, tooltip="Direct TP for shorts if 5-min OR 15-min Stoch K is below this.")

// --- Strategy Specific Input Parameters ---
g_strategy = "Strategy Parameters"
leverage_multiplier = input.float(1.0, "Leverage Multiplier (Affects theoretical position size only)", minval=1.0, step=0.1, group=g_strategy, tooltip="Note: TradingView strategies do not directly simulate margin account liquidation. This leverage is used to calculate theoretical position size. Actual leverage effects must be realized with a broker that supports leverage.")

// --- Function: Calculate Stochastic RSI ---
getStochasticRSI(src, rsiLen, stochLen, kSmooth, dSmooth) =>
    rsi_val = ta.rsi(src, rsiLen)
    stoch_rsi_k_raw = ta.stoch(rsi_val, rsi_val, rsi_val, stochLen) // Stoch of RSI
    stoch_rsi_k = ta.sma(stoch_rsi_k_raw, kSmooth)
    stoch_rsi_d = ta.sma(stoch_rsi_k, dSmooth)
    [stoch_rsi_k, stoch_rsi_d]

// --- Helper Function to get only K-series for Stochastic RSI (RE-ADDED for 15-min prev K) ---
getStochKSeriesOnly(src, rsiLen, stochLen, kSmooth, dSmooth) =>
    rsi_val = ta.rsi(src, rsiLen)
    stoch_rsi_k_raw = ta.stoch(rsi_val, rsi_val, rsi_val, stochLen)
    stoch_rsi_k = ta.sma(stoch_rsi_k_raw, kSmooth)
    stoch_rsi_k // Return only the K series

// --- Time Series Data Fetching and Stochastic RSI Calculation ---
[stoch_k_15min_val, stoch_d_15min_val] = request.security(syminfo.tickerid, "15", getStochasticRSI(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth), lookahead=barmerge.lookahead_off)
// RE-ADDED: K value of the PREVIOUS 15-minute bar's Stochastic RSI
stoch_k_15min_prev_tf_bar = request.security(syminfo.tickerid, "15", nz(getStochKSeriesOnly(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth)[1]), lookahead=barmerge.lookahead_off)
[stoch_k_5min_val, stoch_d_5min_val] = getStochasticRSI(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth)

// --- Signal Logic State Variables ---
var bool waiting_for_15m_long_confirm = false
var bool waiting_for_15m_short_confirm = false
var int bars_elapsed_in_wait_state = 0
var int last_long_signal_bar_idx = -min_bars_between_signals 
var int last_short_signal_bar_idx = -min_bars_between_signals

// --- Variables to store SL reference points from ENTRY bar ---
var float entry_bar_low_for_sl = na
var float entry_bar_high_for_sl = na

// --- Take Profit Logic State Variables ---
var bool first_tp_long_taken = false
var bool first_tp_short_taken = false
// RE-ADDED: State variables for pending TP confirmation on 15-min reversal
var bool pending_long_tp_on_15m_reversal = false
var bool pending_short_tp_on_15m_reversal = false

// --- Detect 5-minute Stochastic RSI crossover events for ENTRY ---
bool stoch_5min_crossed_up_prev_bar = ta.crossover(stoch_k_5min_val[1], stoch_d_5min_val[1])
bool stoch_5min_crossed_down_prev_bar = ta.crossunder(stoch_k_5min_val[1], stoch_d_5min_val[1])
bool condition_5min_k_level_for_long_trigger = stoch_k_5min_val[1] <= stoch_5min_k_long_trigger
bool condition_5min_k_level_for_short_trigger = stoch_k_5min_val[1] >= stoch_5min_k_short_trigger

// --- Specific 5-minute Stochastic RSI crossover for Take Profit (current bar) ---
bool stoch_5min_k_cross_under_d_tp = ta.crossunder(stoch_k_5min_val, stoch_d_5min_val) // For Long TP trigger
bool stoch_5min_k_cross_over_d_tp  = ta.crossover(stoch_k_5min_val, stoch_d_5min_val)  // For Short TP trigger

// --- RE-ADDED: 15-minute Reversal Confirmation for Take Profit ---
bool confirm_15m_reversal_for_long_tp = stoch_k_15min_val < stoch_k_15min_prev_tf_bar
bool confirm_15m_reversal_for_short_tp = stoch_k_15min_val > stoch_k_15min_prev_tf_bar

// --- Manage waiting state and tolerance period for ENTRY ---
if (strategy.position_size == 0)
    if (stoch_5min_crossed_up_prev_bar and condition_5min_k_level_for_long_trigger)
        can_trigger_new_long = not use_signal_cooldown_filter or (bar_index - last_long_signal_bar_idx >= min_bars_between_signals)
        if (can_trigger_new_long)
            waiting_for_15m_long_confirm := true
            waiting_for_15m_short_confirm := false 
            bars_elapsed_in_wait_state := 1
    else if (stoch_5min_crossed_down_prev_bar and condition_5min_k_level_for_short_trigger)
        can_trigger_new_short = not use_signal_cooldown_filter or (bar_index - last_short_signal_bar_idx >= min_bars_between_signals)
        if (can_trigger_new_short)
            waiting_for_15m_short_confirm := true
            waiting_for_15m_long_confirm := false 
            bars_elapsed_in_wait_state := 1
    else if (waiting_for_15m_long_confirm or waiting_for_15m_short_confirm)
        bars_elapsed_in_wait_state += 1
    
    if (bars_elapsed_in_wait_state > wait_window_5min_bars)
        waiting_for_15m_long_confirm := false
        waiting_for_15m_short_confirm := false
        bars_elapsed_in_wait_state := 0 
else 
    waiting_for_15m_long_confirm := false
    waiting_for_15m_short_confirm := false
    bars_elapsed_in_wait_state := 0

// --- 15-minute Stochastic RSI confirmation conditions for ENTRY (Strict Crossover) ---
bool confirm_15min_long_stoch_kd_cond = stoch_k_15min_val > stoch_d_15min_val // K must be strictly greater than D
bool confirm_15min_short_stoch_kd_cond = stoch_k_15min_val < stoch_d_15min_val // K must be strictly less than D
bool filter_15min_stoch_level_long = stoch_k_15min_val < stoch_15min_long_entry_level
bool filter_15min_stoch_level_short = stoch_k_15min_val > stoch_15min_short_entry_level

// --- Main Signal Determination (for strategy logic) ---
entry_long_signal = false
entry_short_signal = false

if (strategy.position_size == 0) 
    if (waiting_for_15m_long_confirm and bars_elapsed_in_wait_state <= wait_window_5min_bars)
        if (confirm_15min_long_stoch_kd_cond and filter_15min_stoch_level_long)
            can_confirm_new_long = not use_signal_cooldown_filter or (bar_index - last_long_signal_bar_idx >= min_bars_between_signals)
            if (can_confirm_new_long)
                entry_long_signal := true
    if (waiting_for_15m_short_confirm and bars_elapsed_in_wait_state <= wait_window_5min_bars)
        if (confirm_15min_short_stoch_kd_cond and filter_15min_stoch_level_short)
            can_confirm_new_short = not use_signal_cooldown_filter or (bar_index - last_short_signal_bar_idx >= min_bars_between_signals)
            if (can_confirm_new_short)
                entry_short_signal := true

// --- Strategy Execution Logic ---
// Reset SL ref and TP flags if position just closed
if (strategy.position_size == 0 and strategy.position_size[1] != 0) 
    first_tp_long_taken := false
    first_tp_short_taken := false
    entry_bar_low_for_sl := na 
    entry_bar_high_for_sl := na 
    pending_long_tp_on_15m_reversal := false // Reset pending TP flag
    pending_short_tp_on_15m_reversal := false // Reset pending TP flag

if (entry_long_signal) 
    strategy.entry("LE", strategy.long, comment="Long Entry")
    last_long_signal_bar_idx := bar_index 
    waiting_for_15m_long_confirm := false 
    bars_elapsed_in_wait_state := 0
    first_tp_long_taken := false 
    entry_bar_low_for_sl := low 
    entry_bar_high_for_sl := na 
    pending_long_tp_on_15m_reversal := false // Reset for new trade
    pending_short_tp_on_15m_reversal := false     

if (entry_short_signal) 
    strategy.entry("SE", strategy.short, comment="Short Entry")
    last_short_signal_bar_idx := bar_index 
    waiting_for_15m_short_confirm := false 
    bars_elapsed_in_wait_state := 0
    first_tp_short_taken := false  
    entry_bar_high_for_sl := high 
    entry_bar_low_for_sl := na    
    pending_short_tp_on_15m_reversal := false // Reset for new trade
    pending_long_tp_on_15m_reversal := false

// --- Stop Loss Logic (PRIORITY 1) ---
// Check and execute SL first. If SL triggers, position size becomes 0, preventing TP logic below from executing on the same bar.
bool sl_triggered_this_bar = false
if (strategy.position_size > 0) // If in a long trade
    if (not na(entry_bar_low_for_sl) and close < entry_bar_low_for_sl)
        strategy.close(id="LE", comment="SL Long")
        sl_triggered_this_bar := true
        pending_long_tp_on_15m_reversal := false // Ensure pending TP is cancelled if SL hits

if (strategy.position_size < 0) // If in a short trade
    if (not na(entry_bar_high_for_sl) and close > entry_bar_high_for_sl)
        strategy.close(id="SE", comment="SL Short")
        sl_triggered_this_bar := true
        pending_short_tp_on_15m_reversal := false // Ensure pending TP is cancelled if SL hits

// --- Take Profit Logic (PRIORITY 2 - only if SL did not trigger on this bar) ---
if (not sl_triggered_this_bar) // Only proceed with TP if SL hasn't already closed the position on this bar
    if (strategy.position_size > 0) // --- LONG TP LOGIC ---
        extreme_long_tp_condition = stoch_k_5min_val > extreme_long_tp_level or stoch_k_15min_val > extreme_long_tp_level
        if (extreme_long_tp_condition)
            if (not first_tp_long_taken)
                strategy.close(id="LE", comment="TP1 Long", qty_percent=50)
                first_tp_long_taken := true
            else 
                strategy.close(id="LE", comment="TP2 Long")
            pending_long_tp_on_15m_reversal := false // Reset pending state as this TP takes precedence
        else 
            // Conditional TP logic (5-min trigger + 15-min reversal)
            if (stoch_5min_k_cross_under_d_tp and not pending_long_tp_on_15m_reversal) // Set pending state
                pending_long_tp_on_15m_reversal := true
        
            if (pending_long_tp_on_15m_reversal and confirm_15m_reversal_for_long_tp) // Check for confirmation
                if (not first_tp_long_taken)
                    strategy.close(id="LE", comment="TP1 Long", qty_percent=50)
                    first_tp_long_taken := true
                else 
                    strategy.close(id="LE", comment="TP2 Long")
                pending_long_tp_on_15m_reversal := false // Reset after TP

    if (strategy.position_size < 0) // --- SHORT TP LOGIC ---
        extreme_short_tp_condition = stoch_k_5min_val < extreme_short_tp_level or stoch_k_15min_val < extreme_short_tp_level
        if (extreme_short_tp_condition)
            if (not first_tp_short_taken)
                strategy.close(id="SE", comment="TP1 Short", qty_percent=50)
                first_tp_short_taken := true
            else 
                strategy.close(id="SE", comment="TP2 Short")
            pending_short_tp_on_15m_reversal := false // Reset pending state
        else
            // Conditional TP logic (5-min trigger + 15-min reversal)
            if (stoch_5min_k_cross_over_d_tp and not pending_short_tp_on_15m_reversal) // Set pending state
                pending_short_tp_on_15m_reversal := true

            if (pending_short_tp_on_15m_reversal and confirm_15m_reversal_for_short_tp) // Check for confirmation
                if (not first_tp_short_taken)
                    strategy.close(id="SE", comment="TP1 Short", qty_percent=50)
                    first_tp_short_taken := true
                else 
                    strategy.close(id="SE", comment="TP2 Short")
                pending_short_tp_on_15m_reversal := false // Reset after TP