Estratégia de Crossover Estocástico RSI de Múltiplos Períodos

RSI STOCH RSI MTF TRENDING MARKETS STOP LOSS MULTI-STAGE TP
Data de criação: 2025-06-05 13:13:32 última modificação: 2025-06-05 13:13:32
cópia: 0 Cliques: 336
2
focar em
319
Seguidores

Estratégia de Crossover Estocástico RSI de Múltiplos Períodos Estratégia de Crossover Estocástico RSI de Múltiplos Períodos

Visão geral da estratégia

A estratégia de cruzamento de indicadores de força relativamente fracos de quadros múltiplos é um sistema de negociação baseado no Stochastic RSI (indicador de força relativamente fraco aleatório), que usa dados de dois períodos de tempo de 5 minutos e 15 minutos para a geração e confirmação de sinais de negociação. É um sistema de negociação completo, com condições de entrada definidas, controle de stop loss e esquemas de lucro em etapas.

A estratégia opera em gráficos de 5 minutos, mas refere-se a dados de gráficos de 15 minutos para confirmar os sinais de negociação, refletindo a profundidade da análise de múltiplos prazos de tempo. Ele usa diferentes configurações de parâmetros para negociações de multi-cabeças e de cabeças vazias, o que sugere que ele foi projetado para se adaptar a um mercado otimista como um todo.

Princípio da estratégia

O princípio central da estratégia é baseado no sinal de cruzamento do indicador Stochastic RSI, combinado com o mecanismo de confirmação de múltiplos quadros de tempo para filtrar sinais de baixa qualidade. O processo de trabalho específico é o seguinte:

  1. Trigger inicial (quadro de tempo de 5 minutos)

    • Multi-cabeça: Quando a linha K do Stoch RSI no gráfico de 5 minutos atravessa a linha D para cima, e o valor de K na travessia é menor do que o nível de gatilho indicado.
    • Sinal de cabeçalho: quando a linha K do Stoch RSI no gráfico de 5 minutos atravessa a linha D para baixo e o valor de K na passagem é superior ao nível de disparo indicado ((stoch_5min_k_short_trigger))
  2. Confirmação de nível superior (quadro de tempo de 15 minutos)

    • Após o disparo do sinal inicial de 5 minutos, a estratégia procura a confirmação do período de tempo de 15 minutos dentro da janela de espera definida.
    • Confirmação multi-cabeça: A linha K do RSI de Stoch de 15 minutos deve ser estritamente maior que a sua linha D, e o valor de K de 15 minutos deve ser inferior ao valor definido de stoch_15min_long_entry_level.
    • Confirmação em branco: a linha K do RSI de 15 minutos de Stoch deve ser estritamente menor que a sua linha D, e o valor de 15 minutos de K deve ser maior que o valor definido de stoch_15min_short_entry_level.
  3. Filtragem de sinais repetidos

    • A estratégia implementa um mecanismo de período de resfriamento (min_bars_between_signals), em que um novo sinal deve passar por um número especificado de linhas K entre sinais na mesma direção para ser considerado.
  4. Gestão de posições

    • Bloqueio de posições abertas: a estratégia não gera novos sinais de entrada quando uma posição não aberta já está em posse.
    • Parar a perda: baseado no ponto baixo da linha K de entrada ((para a linha multi-cabeça) ou no ponto alto ((para a linha vazia), se o preço de fechamento da linha K subsequente for superior a esse nível, a perda de parada será acionada.
    • A verificação de prejuízos tem prioridade sobre a verificação de lucros.
  5. Mecanismo de lucro em duas etapas

    • Fase I (TP1): Eliminação de 50% das posições, acionadas de uma das duas maneiras:
      • Modo de prioridade A ((extreme K-valor): se o valor de 5 minutos ou 15 minutos de Stoch K for superior a extreme_long_tp_level ((multi-cabeça) ou inferior a extreme_short_tp_level ((cabeça)) [2].
      • Método de prioridade B ((Condicional 5 minutos de cruzamento + 15 minutos de inversão de K): Quando ocorre um cruzamento K/D de 5 minutos de Stoch RSI ((K atravessa D para baixo quando o multiverso; K atravessa D para cima quando o caudal), e é confirmado que o valor de 15 minutos de Stoch K “inverteu” ((15 minutos atuais K < 15 minutos anteriores K para o multiverso; 15 minutos atuais K > 15 minutos anteriores K para o caudal)
    • Fase 2 ((TP2)): liquidação dos 50% restantes das posições, ativada apenas após o TP1 ter sido acionado, executada quando o valor de Stoch K de 5 minutos ou 15 minutos atingir novamente o mesmo nível extremo.

Vantagens estratégicas

  1. Mecanismo de confirmação de multi-quadros temporais

    • A estratégia reduz os falsos sinais e aumenta a qualidade de negociação, combinando sinais de 5 e 15 minutos. Os períodos mais curtos oferecem oportunidades de entrada, enquanto os períodos mais longos fornecem confirmação de tendência, o que pode filtrar efetivamente o ruído do mercado de curto prazo.
  2. Determinação exata das condições de sobrecompra/sobrevenda

    • O RSI estocástico é mais sensível do que o RSI tradicional, e pode capturar mudanças na dinâmica dos preços mais cedo. A estratégia utiliza essa característica para negociar quando os preços estão prestes a inverter, aumentando a precisão do tempo de entrada.
  3. Estratégia de suspensão por etapas

    • O mecanismo de stop-loss em duas etapas permite que os comerciantes bloqueiem parte dos lucros, mantendo as posições restantes para capturar um mercado maior. Esta abordagem equilibra riscos e ganhos, especialmente para mercados com maior volatilidade.
  4. Definições de preferências personalizadas

    • Os parâmetros da estratégia podem ser ajustados para refletir as preferências do mercado (por exemplo, a estratégia atual é mais tolerante para a maioria), permitindo que ela se adapte a diferentes ambientes de mercado e preferências de negociação.
  5. Gerenciamento de riscos completo

    • O mecanismo de stop loss explicito baseia-se nos limites da linha K de entrada, fornecendo controle de risco quantificável para cada transação. O controle de stop loss tem prioridade sobre o controle de ganho, garantindo que o controle de risco seja sempre o principal fator de consideração.
  6. Filtragem de sinais repetidos

    • Implementando um período de arrefecimento do sinal, evita-se o excesso de negociação no mesmo sentido em um curto período de tempo, reduzindo os custos de negociação e aumentando a qualidade do sinal.

Risco estratégico

  1. Sensibilidade do parâmetro

    • A estratégia depende de vários parâmetros de margem, como vários níveis de disparo e margens de confirmação. A configuração inadequada de parâmetros pode levar a excesso de falsos sinais ou a perda de oportunidades de negociação importantes.
  2. O ponto de parada pode ser mais amplo

    • O stop loss baseado no valor máximo da linha K de entrada pode ser mais flexível em algumas situações, especialmente em mercados com maior volatilidade. Isso pode levar a uma perda potencial de uma única transação acima do esperado. Considere a criação de um limite de stop loss máximo para evitar exposição excessiva ao risco.
  3. Dependência de condições de mercado

    • O RSI estocástico tem um bom desempenho em mercados de intervalo de oscilação, mas pode produzir um sinal de reversão prematura em mercados de forte tendência. A estratégia pode ter um mau desempenho em movimentos unidirecionais rápidos, pois o preço pode continuar a ser sobrecomprado ou sobrevendido sem reversão.
  4. Preconceitos sobre a polygamia

    • A configuração da estratégia atual mostra uma preferência por negociações multi-cabeças, o que pode levar a negociações excessivas ou sinais de negociação multi-cabeças inadequados em um ambiente de mercado de baixa. Os parâmetros devem ser ajustados de acordo com a situação do mercado para manter o equilíbrio.
  5. 15 minutos de atraso confirmado

    • A espera de 15 minutos para a confirmação do time frame pode causar atrasos de entrada e pode perder o ponto de entrada ideal em mercados rápidos. Em mercados extremamente voláteis, esse atraso pode afetar significativamente a performance da estratégia.

Direção de otimização da estratégia

  1. Mecanismo de travagem dinâmica

    • Os paradas de percentual fixo atuais podem ser atualizados para paradas dinâmicas baseadas no ATR (Average True Range) ou implementar mecanismos de parada de seguimento para capturar mais lucros em situações de tendência. Especialmente para paradas de segunda fase, considere o uso de níveis de paradas ajustados à taxa de flutuação ou à intensidade da tendência.
  2. O estado do mercado adapta-se

    • A introdução de mecanismos de detecção de estado de mercado (como o indicador ADX que avalia a força da tendência) permite que a estratégia ajuste automaticamente os parâmetros de acordo com diferentes condições de mercado. Por exemplo, relaxar as condições de reversão em mercados de forte tendência e apertar essas condições em mercados de turbulência.
  3. Confirmação de múltiplos indicadores

    • A integração de indicadores técnicos adicionais, como MACD, Brinks ou Moving Averages, como ferramentas de confirmação auxiliares. A ressonância multi-indicador pode aumentar a confiabilidade do sinal e reduzir as falsas brechas.
  4. Optimização de aberturas de risco

    • Implementar a gestão dinâmica de escala de posição, ajustando a margem de risco de cada transação com base na volatilidade atual ou no desempenho das transações mais recentes. Além disso, pode ser adicionado um limite de parada máxima para evitar perdas extremas.
  5. Extensão a níveis de quadros temporais múltiplos

    • Considere a adição de um terceiro período de tempo (por exemplo, 1 hora ou 4 horas) para fornecer um nível mais elevado de análise de contexto de mercado, especialmente para a confirmação de tendências e identificação de pontos de suporte/resistência principais.
  6. Filtro de tempo de transação

    • Adicionar filtros de horário de negociação para evitar negociação em momentos de mercado de baixa liquidez ou flutuação irregular. Por exemplo, pode ser limitado a negociação durante os períodos de alta volatilidade antes e depois do fechamento do mercado.

Resumir

A estratégia de cruzamento de indicadores de força relativamente forte em quadros de tempo múltiplos é um sistema de negociação bem estruturado que aumenta a qualidade de negociação por meio da análise de quadros de tempo múltiplos e de um rigoroso processo de confirmação de sinais. A vantagem central da estratégia reside em suas condições de entrada abrangentes e no sistema de gerenciamento de risco, especialmente o mecanismo de parada em dois estágios que permite bloquear os lucros enquanto mantém a tendência de rastreamento de algumas posições.

No entanto, a eficácia da estratégia é altamente dependente da configuração dos parâmetros e das condições do mercado. Pode ter um bom desempenho em mercados turbulentos, mas pode precisar de ajustes em ambientes de forte tendência ou alta volatilidade. É recomendado que os comerciantes otimizem os parâmetros através de histórico de retrospectiva e considerem adicionar recursos como detecção de estado do mercado e mecanismos de suspensão dinâmica para aumentar sua adaptabilidade.

A estratégia é mais adequada para os intermediários a comerciantes avançados com conhecimentos de programação, que são capazes de entender e personalizar essas regras de negociação complexas. Com o ajuste de parâmetros e o gerenciamento de risco apropriados, o sistema pode ser uma parte valiosa do kit de ferramentas dos comerciantes diários e de curto prazo, especialmente aqueles que se concentram em capturar as mudanças na dinâmica do mercado.

Código-fonte da estratégia
/*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