Stratégie de croisement RSI stochastique multi-périodes

RSI STOCH RSI MTF TRENDING MARKETS STOP LOSS MULTI-STAGE TP
Date de création: 2025-06-05 13:13:32 Dernière modification: 2025-06-05 13:13:32
Copier: 0 Nombre de clics: 336
2
Suivre
319
Abonnés

Stratégie de croisement RSI stochastique multi-périodes Stratégie de croisement RSI stochastique multi-périodes

Aperçu de la stratégie

La stratégie de croisement des indices de force et de faiblesse aléatoires de plusieurs périodes est un système de négociation composite basé sur le RSI stochastique (indicateur de force et de faiblesse aléatoires) qui utilise des données de deux périodes de 5 minutes et 15 minutes pour générer et confirmer des signaux de négociation. Il s’agit d’un système de négociation complet, comprenant des conditions d’entrée claires, des contrôles de stop-loss et des programmes de prise de bénéfices par étapes.

La stratégie fonctionne sur un graphique de 5 minutes, mais se réfère à des données de graphique de 15 minutes pour confirmer les signaux de négociation, reflétant la profondeur de l’analyse de plusieurs périodes. Elle utilise des paramètres différents pour les transactions à plusieurs têtes et à vide, ce qui suggère qu’elle est conçue pour s’adapter à un environnement de marché globalement pessimiste.

Principe de stratégie

Le principe de base de cette stratégie est basé sur les signaux croisés de l’indicateur Stochastic RSI, combinés à des mécanismes de confirmation de plusieurs périodes pour filtrer les signaux de mauvaise qualité. Le processus de travail est le suivant:

  1. Signal de déclenchement initial (en 5 minutes)

    • Signal multi-trigger: lorsque la ligne K du RSI de Stoch sur le graphique à 5 minutes traverse la ligne D vers le haut et que la valeur de K à la traversée est inférieure au niveau de déclenchement indiqué.
    • Signal de tête vide: lorsque la ligne K du RSI de Stoch sur le graphique à 5 minutes traverse la ligne D vers le bas et que la valeur de K au moment de la traversée est supérieure au niveau de déclenchement indiqué ([stoch_5min_k_short_trigger])
  2. Confirmation de niveau supérieur (température de 15 minutes)

    • Après le déclenchement du signal initial de 5 minutes, la stratégie demande la confirmation du délai de 15 minutes dans la fenêtre d’attente définie.
    • Confirmation de plusieurs têtes: la ligne K du RSI de Stoch à 15 minutes doit être strictement supérieure à sa ligne D, et la valeur de K à 15 minutes doit être inférieure à la valeur de configuration de stoch_15min_long_entry_level.
    • Confirmation à vide: la ligne K du RSI de Stoch à 15 minutes doit être strictement inférieure à sa ligne D, et la valeur de K à 15 minutes doit être supérieure à la valeur de configuration de stoch_15min_short_entry_level.
  3. Filtrage des signaux répétés

    • La stratégie implémente un mécanisme de période de refroidissement (min_bars_between_signals) qui doit passer un nombre spécifié de lignes K entre des signaux dans la même direction pour que les nouveaux signaux soient pris en compte.
  4. Gestion des positions

    • Blocage de la position d’ouverture: la stratégie ne génère pas de nouveau signal d’entrée lorsqu’une position non évacuée est détenue.
    • Arrêt de perte: basé sur le bas de la ligne K d’entrée (pour les paires à plusieurs têtes) ou le haut de la ligne (pour les paires à vide), si le prix de clôture de la ligne K suivante dépasse ce niveau, le stop loss est déclenché.
    • L’inspection des pertes est prioritaire à l’inspection des profits.
  5. Le mécanisme de profit en deux étapes

    • La première étape (TP1) consiste à liquider 50% de la position et à la déclencher de l’une des deux manières suivantes:
      • Mode de priorité A ((valeur K extrême): si la valeur de Stoch K de 5 minutes ou 15 minutes est supérieure à extreme_long_tp_level ((multi-têtes) ou inférieure à extreme_short_tp_level ((têtes vides)) [2].
      • Mode de priorité B ((Conditionnel croisement de 5 minutes + inversion de la valeur de K de 15 minutes): lorsque le croisement K/D de Stoch RSI de 5 minutes se produit ((K passe en dessous de D lorsque le polygone est en tête; K passe en haut de D lorsque le polygone est en tête), et que la valeur de Stoch K de 15 minutes est confirmée comme “inversion” ((15 minutes actuelles K < 15 minutes précédentes K pour le polygone; 15 minutes actuelles K > 15 minutes précédentes K pour le polygone)
    • Phase 2 (TP2): élimination des 50% restants de la position, activée uniquement après le déclenchement de TP1 et exécutée lorsque la valeur de Stoch K à 5 minutes ou 15 minutes atteint à nouveau le même niveau extrême.

Avantages stratégiques

  1. Mécanisme de confirmation de plusieurs périodes

    • La stratégie réduit les faux signaux et améliore la qualité des transactions en combinant des signaux sur des périodes de 5 minutes et 15 minutes. Les périodes plus courtes offrent des opportunités d’entrée, tandis que les périodes plus longues offrent une confirmation de tendance, ce qui permet de filtrer efficacement le bruit du marché à court terme.
  2. Détermination précise des conditions de surachat/survente

    • Le RSI stochastique est plus sensible que le RSI traditionnel et peut capturer plus tôt les changements de la dynamique des prix. La stratégie utilise cette caractéristique pour négocier lorsque les prix sont sur le point de se retourner, ce qui améliore la précision du moment d’entrée.
  3. Stratégie d’arrêt par étapes

    • Le stop-loss en deux étapes permet aux traders de bloquer une partie de leurs bénéfices tout en conservant les positions restantes pour capturer des positions plus importantes. Cette approche équilibre les risques et les bénéfices et convient particulièrement aux marchés plus volatils.
  4. Paramètres personnalisés

    • Les paramètres de la stratégie peuvent être ajustés pour refléter les préférences du marché (par exemple, les stratégies actuelles sont plus tolérantes pour les multipartites), ce qui lui permet de s’adapter à différents environnements de marché et préférences de négociation.
  5. Une gestion complète des risques

    • Le mécanisme de stop loss explicite est basé sur les valeurs maximales de la ligne K d’entrée, fournissant un contrôle de risque quantifiable pour chaque transaction. Les contrôles de stop loss ont la priorité sur les contrôles de profit, assurant que le contrôle du risque est toujours la première considération.
  6. Filtrage des signaux répétés

    • En mettant en œuvre une période de refroidissement du signal, on évite de trop négocier dans le même sens en peu de temps, ce qui réduit les coûts de transaction et améliore la qualité du signal.

Risque stratégique

  1. Paramètre Sensibilité

    • La stratégie repose sur plusieurs paramètres de seuil, tels que divers niveaux de déclenchement et de confirmation de seuil. Une configuration inappropriée des paramètres peut entraîner un excès de faux signaux ou la perte d’opportunités de négociation clés.
  2. Le point d’arrêt peut être plus large

    • Les arrêts basés sur les extrêmes de la ligne K d’entrée peuvent être plus indulgents dans certains cas, en particulier dans les marchés plus volatiles. Cela peut entraîner des pertes potentielles sur une seule transaction supérieures aux attentes.
  3. La dépendance aux conditions du marché

    • Le RSI stochastique se comporte bien dans les marchés à basse volatilité, mais peut générer des signaux de revers prématurés dans les marchés à forte tendance. La stratégie peut se comporter mal dans les mouvements unidirectionnels rapides, car les prix peuvent continuer à être en surachat ou en survente sans revenir.
  4. Préférence pour la polygamie

    • La configuration actuelle de la stratégie montre une préférence pour les transactions à plusieurs têtes, ce qui peut entraîner des signaux de survente ou de multiples inappropriés dans un environnement de baisse. Les paramètres doivent être ajustés en fonction des conditions du marché pour maintenir l’équilibre.
  5. 15 minutes de retard à la confirmation

    • L’attente de 15 minutes pour la confirmation de la période peut entraîner des retards d’entrée et peut manquer le point d’entrée idéal dans les marchés rapides. Dans les marchés extrêmement volatiles, ce retard peut avoir un impact significatif sur la performance de la stratégie.

Orientation de l’optimisation de la stratégie

  1. Système d’arrêt dynamique

    • Les stops à pourcentage fixe actuels peuvent être mis à niveau vers des stops dynamiques basés sur l’ATR (Average True Range), ou des stop-loss de suivi peuvent être mis en place pour capturer plus de profits dans des conditions de tendance. En particulier, pour les stops de deuxième phase, envisagez d’utiliser des niveaux de stop-loss ajustés en fonction de la volatilité ou de la force de la tendance.
  2. Les marchés s’adaptent à eux-mêmes

    • L’introduction d’un mécanisme de détection de l’état du marché (comme l’indicateur ADX qui évalue la force de la tendance) permet à la stratégie d’ajuster automatiquement les paramètres en fonction des différents environnements du marché. Par exemple, assouplir les conditions de retournement dans les marchés à forte tendance et les resserrer dans les marchés en choc.
  3. Confirmation synchronisée de plusieurs indicateurs

    • L’intégration d’indicateurs techniques supplémentaires tels que MACD, les bandes de Bryn ou les moyennes mobiles comme outils de confirmation auxiliaires. La résonance multi-indicateurs peut améliorer la fiabilité du signal et réduire les fausses percées.
  4. Optimisation de la prise de risque

    • La gestion dynamique de l’échelle des positions, l’ajustement de la marge de risque de chaque transaction en fonction de la volatilité actuelle ou de la performance des transactions récentes. En outre, des limites de stop-loss maximales peuvent être ajoutées pour prévenir les pertes extrêmes.
  5. Élargissement à plusieurs niveaux de cadres temporels

    • Considérez l’ajout d’une troisième période (par exemple, 1 heure ou 4 heures) pour fournir un niveau plus élevé d’analyse du contexte du marché, en particulier pour la confirmation de la tendance et l’identification des principaux points de support / résistance.
  6. Filtrage des périodes de transaction

    • Ajouter un filtre de période de négociation pour éviter de négocier à des moments de marché où la liquidité est insuffisante ou irrégulièrement volatile. Par exemple, il est possible de limiter la négociation aux périodes de forte volatilité avant et après l’ouverture et la fermeture du marché.

Résumer

La stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires d’une stratégie de croisement d’indicateurs aléatoires de force relative à la faiblesse d’une stratégie de croisement d’indicateurs aléatoires est un système de négociation bien structuré qui améliore la qualité des transactions grâce à l’une analyse de plusieurs périodes de temps et

Cependant, l’efficacité de cette stratégie est fortement dépendante des paramètres et des conditions du marché. Elle peut bien fonctionner dans un marché en tremblement de terre, mais peut nécessiter des ajustements dans un environnement de forte tendance ou de forte volatilité. Il est recommandé aux traders d’optimiser les paramètres en faisant un retour sur l’historique et d’envisager d’ajouter des fonctionnalités telles que la détection de l’état du marché et le mécanisme d’arrêt dynamique pour augmenter leur adaptabilité.

Cette stratégie est la mieux adaptée aux traders intermédiaires à avancés ayant des connaissances en programmation, capables de comprendre et de personnaliser ces règles de trading complexes. Avec un ajustement approprié des paramètres et une gestion des risques, ce système peut devenir un composant précieux dans la boîte à outils des traders à jour et à court terme, en particulier ceux qui se concentrent sur la capture des changements de la dynamique du marché.

Code source de la stratégie
/*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