Strategi Crossover RSI Stochastic Rangka Masa Berbilang Masa

RSI STOCH RSI MTF TRENDING MARKETS STOP LOSS MULTI-STAGE TP
Tarikh penciptaan: 2025-06-05 13:13:32 Akhirnya diubah suai: 2025-06-05 13:13:32
Salin: 0 Bilangan klik: 336
2
fokus pada
319
Pengikut

Strategi Crossover RSI Stochastic Rangka Masa Berbilang Masa Strategi Crossover RSI Stochastic Rangka Masa Berbilang Masa

Gambaran Keseluruhan Strategi

Strategi silang indikator kuat-lemah berkala berkala adalah sistem perdagangan komposit berdasarkan Stochastic RSI (indikator kuat-lemah berkala) yang menggunakan data dalam dua tempoh masa 5 minit dan 15 minit untuk menghasilkan dan mengesahkan isyarat perdagangan. Ini adalah sistem perdagangan yang lengkap, dengan syarat masuk yang jelas, kawalan hentian, dan skema keuntungan bertahap.

Strategi ini beroperasi pada carta 5 minit, tetapi merujuk kepada data carta 15 minit untuk mengesahkan isyarat perdagangan, yang mencerminkan kedalaman analisis jangka masa berbilang. Ia menggunakan tetapan parameter yang berbeza untuk perdagangan berbilang dan kosong, yang menunjukkan kecenderungan reka bentuknya untuk menyesuaikan diri dengan keadaan pasaran yang lebih baik secara keseluruhan.

Prinsip Strategi

Prinsip utama strategi ini adalah berdasarkan isyarat silang Stochastic RSI, yang digabungkan dengan mekanisme pengesahan pelbagai bingkai masa untuk menyaring isyarat berkualiti rendah. Proses kerja spesifik adalah seperti berikut:

  1. Isyarat pemicu awal ((5 minit time frame)

    • Isyarat berbilang kepala: apabila garis K Stoch RSI pada carta 5 minit melintasi garis D ke atas, dan nilai K pada waktu melintasi adalah lebih rendah daripada tahap pemicu yang ditetapkan ((stoch_5min_k_long_trigger))
    • Isyarat kosong: apabila garis K Stoch RSI di carta 5 minit melintasi garis D ke bawah, dan nilai K semasa melintasi lebih tinggi daripada tahap pemicu yang ditetapkan ((stoch_5min_k_short_trigger))
  2. Pengesahan peringkat tinggi (dalam jangka masa 15 minit)

    • Selepas isyarat awal 5 minit, strategi akan meminta pengesahan tempoh 15 minit dalam tetingkap menunggu yang ditetapkan.
    • Pengesahan berbilang kepala: 15 minit Stoch RSI K baris mestilah lebih besar daripada garis D, dan 15 minit K mestilah lebih rendah daripada nilai set stoch_15min_long_entry_level.
    • Pengesahan kosong: Garis K 15 minit Stoch RSI mestilah lebih kecil daripada garis Dnya, dan nilai K 15 minit mestilah lebih tinggi daripada nilai set stoch_15min_short_entry_level.
  3. Penapis isyarat berulang

    • Strategi ini menggunakan mekanisme tempoh penyejukan (min_bars_between_signals) di mana satu isyarat baru harus dilalui melalui bilangan K yang ditetapkan antara isyarat yang sama arah.
  4. Pengurusan kedudukan

    • Penutupan kedudukan terbuka: Strategi tidak akan menghasilkan isyarat masuk baru apabila anda sudah memegang kedudukan yang belum dibuka.
    • Tetapan berhenti: Berdasarkan titik rendah (untuk pasangan berbilang) atau titik tinggi (untuk pasangan kosong) garis K yang masuk, jika harga penutupan garis K seterusnya melampaui tahap ini, maka ia akan mencetuskan berhenti.
    • Pemeriksaan kerugian lebih penting daripada pemeriksaan keuntungan.
  5. Mekanisme keuntungan dua peringkat

    • Tahap Pertama (TP1): Menghapuskan 50% daripada kedudukan, yang akan dicetuskan dengan salah satu daripada dua cara berikut:
      • Kaedah keutamaan A ((nilai K ekstrim): jika nilai Stoch K 5 minit atau 15 minit melebihi extreme_long_tp_level ((berbuntut) atau lebih rendah daripada extreme_short_tp_level ((berbuntut kosong))
      • Kaedah keutamaan B ((keutamaan 5 minit bersilang + 15 minit K berbalik): apabila persilangan K/D pada 5 minit Stoch RSI berlaku ((K melintasi D ke bawah pada multicore; K melintasi D ke atas pada hollowhead), dan nilai Stoch K pada 15 minit “berbalik” disahkan ((K semasa 15 minit < K 15 minit sebelumnya untuk multicore; K semasa 15 minit > K 15 minit sebelumnya untuk hollowhead)
    • Fasa kedua ((TP2)): menebus baki 50% kedudukan, hanya diaktifkan selepas TP1 telah dicetuskan, dan dilaksanakan apabila 5 minit atau 15 minit Stoch K nilai mencapai tahap yang sama melampau sekali lagi.

Kelebihan Strategik

  1. Mekanisme pengesahan pelbagai kerangka masa

    • Strategi ini mengurangkan isyarat palsu dan meningkatkan kualiti dagangan dengan menggabungkan isyarat dalam jangka masa 5 minit dan 15 minit. Rangka masa yang lebih pendek memberikan peluang masuk, manakala jangka masa yang lebih lama memberikan pengesahan trend, kaedah ini dapat menyaring dengan berkesan bunyi pasaran jangka pendek.
  2. Penentuan tepat keadaan overbought/oversold

    • Stochastic RSI lebih sensitif daripada RSI tradisional dan dapat menangkap perubahan pergerakan harga lebih awal. Strategi menggunakan ciri ini untuk berdagang ketika harga akan berbalik, meningkatkan ketepatan waktu masuk.
  3. Strategi berhenti beransur-ansur

    • Mekanisme penutupan dua peringkat membolehkan peniaga mengunci sebahagian daripada keuntungan, sambil mengekalkan kedudukan yang tersisa untuk menangkap keadaan yang lebih besar. Kaedah ini mengimbangi risiko dan keuntungan, terutama sesuai untuk pasaran yang lebih tidak menentu.
  4. Tetapan keutamaan tersuai

    • Parameter strategi boleh disesuaikan untuk mencerminkan keutamaan pasaran (seperti strategi semasa yang lebih longgar untuk berbilang), yang membolehkan ia menyesuaikan diri dengan keadaan pasaran dan keutamaan perdagangan yang berbeza.
  5. Pengurusan risiko yang lengkap

    • Mekanisme Hentikan Kerugian yang jelas adalah berdasarkan nilai teratas K-Line Entry, yang memberikan kawalan risiko yang boleh diukur untuk setiap urus niaga. Pemeriksaan Hentikan Kerugian memberi keutamaan kepada Pemeriksaan Keuntungan, memastikan kawalan risiko sentiasa menjadi pertimbangan utama.
  6. Penapis isyarat berulang

    • Dengan melaksanakan tempoh penyejukan isyarat, ia mengelakkan terlalu banyak perdagangan dalam arah yang sama dalam masa yang singkat, mengurangkan kos transaksi dan meningkatkan kualiti isyarat.

Risiko Strategik

  1. Kepekaan Parameter

    • Strategi ini bergantung kepada pelbagai parameter penurunan nilai seperti pelbagai tahap pemicu dan pengesahan penurunan nilai. Tetapan parameter yang tidak sesuai boleh menyebabkan terlalu banyak isyarat palsu atau kehilangan peluang perdagangan utama.
  2. Stop loss mungkin lebih luas

    • Penutupan berdasarkan nilai maksimum K-Line entry mungkin lebih longgar dalam beberapa kes, terutamanya dalam pasaran yang lebih bergolak. Ini mungkin menyebabkan potensi kerugian dalam satu perdagangan melebihi jangkaan. Pertimbangkan untuk menetapkan had maksimum untuk mengelakkan pendedahan risiko yang berlebihan.
  3. Kepercayaan kepada keadaan pasaran

    • Stochastic RSI berprestasi baik di dalam pasaran bergolak, tetapi mungkin memberi isyarat pembalikan yang terlalu awal di dalam pasaran yang sedang tren kuat. Strategi ini mungkin berprestasi buruk di dalam pergerakan satu arah yang cepat, kerana harga mungkin terus melampaui atau melampaui keadaan tanpa membalikkan.
  4. Kecenderungan kepada banyak kepala

    • Konfigurasi strategi semasa menunjukkan keutamaan untuk berdagang berbilang, yang boleh menyebabkan berdagang berlebihan atau isyarat berbilang yang tidak sesuai dalam persekitaran bear market. Parameter harus disesuaikan dengan keadaan pasaran untuk mengekalkan keseimbangan.
  5. 15 minit untuk mengesahkan kelewatan

    • Menunggu pengesahan bingkai masa 15 minit boleh menyebabkan kelewatan kemasukan dan mungkin terlepas titik kemasukan yang ideal dalam pasaran pantas. Dalam pasaran yang sangat bergolak, kelewatan ini boleh mempengaruhi prestasi strategi secara signifikan.

Arah pengoptimuman strategi

  1. Mekanisme penangguhan dinamik

    • Peratusan berhenti tetap semasa boleh dinaik taraf kepada berhenti dinamik berdasarkan ATR, atau melaksanakan mekanisme hentian susulan untuk menangkap lebih banyak keuntungan dalam keadaan trend. Khususnya untuk berhenti peringkat kedua, pertimbangkan untuk menggunakan tahap berhenti yang disesuaikan dengan kadar turun naik atau kekuatan trend.
  2. Keadaan Pasaran Beradaptasi

    • Memperkenalkan mekanisme pengesanan keadaan pasaran (seperti penunjuk ADX yang menilai kekuatan trend), membolehkan strategi menyesuaikan parameter secara automatik mengikut keadaan pasaran yang berbeza. Sebagai contoh, kelonggaran syarat-syarat pembalikan dalam pasaran trend yang kuat dan pengetatan syarat-syarat ini dalam pasaran yang bergolak.
  3. Pengesahan serentak

    • Mengintegrasikan penunjuk teknikal tambahan seperti MACD, Brinband atau Moving Average sebagai alat pengesahan tambahan. Resonansi pelbagai penunjuk dapat meningkatkan kebolehpercayaan isyarat dan mengurangkan penembusan palsu.
  4. Pengoptimuman lubang risiko

    • Melaksanakan pengurusan skala kedudukan yang dinamik, menyesuaikan ambang risiko setiap perdagangan berdasarkan kadar turun naik semasa atau prestasi perdagangan baru-baru ini. Di samping itu, anda boleh menambah had maksimum untuk menghentikan kerugian untuk mengelakkan kerugian yang melampau.
  5. Perpanjangan peringkat kerangka masa berbilang

    • Pertimbangkan untuk menambah jangka masa ketiga (seperti 1 jam atau 4 jam) untuk memberikan analisis latar belakang pasaran yang lebih tinggi, terutamanya untuk pengesahan trend dan pengenalan tahap sokongan / rintangan utama.
  6. Penapisan masa transaksi

    • Tambahkan penapis masa perdagangan untuk mengelakkan perdagangan pada masa pasaran yang kurang cair atau tidak teratur. Sebagai contoh, perdagangan boleh dibatasi pada masa turun naik yang tinggi sebelum dan selepas pembukaan dan penutupan pasaran.

ringkaskan

Strategi cross-indicator yang agak kuat dengan kadar acak dalam jangka masa yang berbilang adalah sistem perdagangan yang tersusun dengan baik yang meningkatkan kualiti perdagangan melalui analisis jangka masa yang berbilang dan proses pengesahan isyarat yang ketat. Kelebihan utama strategi ini adalah syarat kemasukan yang komprehensif dan sistem pengurusan risiko, terutamanya mekanisme penutupan dua peringkat yang membolehkan untuk mengunci keuntungan sambil mengekalkan trend di bahagian kedudukan.

Walau bagaimanapun, keberkesanan strategi ini sangat bergantung kepada tetapan parameter dan keadaan pasaran. Ia mungkin berfungsi dengan baik dalam pasaran yang bergolak, tetapi mungkin memerlukan penyesuaian dalam keadaan trend yang kuat atau bergolak tinggi.

Strategi ini paling sesuai untuk pedagang menengah ke kanan yang mempunyai pengetahuan pengaturcaraan, yang dapat memahami dan menyesuaikan peraturan perdagangan yang kompleks ini. Dengan penyesuaian parameter dan pengurusan risiko yang sesuai, sistem ini boleh menjadi komponen yang berharga dalam kotak alat pedagang harian dan jangka pendek, terutamanya mereka yang memberi tumpuan kepada menangkap perubahan dinamik pasaran.

Kod sumber strategi
/*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