Strategi Crossover Stochastic RSI Multi-Kerangka Waktu

RSI STOCH RSI MTF TRENDING MARKETS STOP LOSS MULTI-STAGE TP
Tanggal Pembuatan: 2025-06-05 13:13:32 Akhirnya memodifikasi: 2025-06-05 13:13:32
menyalin: 0 Jumlah klik: 336
2
fokus pada
319
Pengikut

Strategi Crossover Stochastic RSI Multi-Kerangka Waktu Strategi Crossover Stochastic RSI Multi-Kerangka Waktu

Tinjauan Strategi

Strategi crossover indikator kuat-lemah acak multi-frame adalah sistem perdagangan kompleks yang didasarkan pada Stochastic RSI (indikator kuat-lemah acak acak) yang menggunakan data dari dua periode waktu 5 menit dan 15 menit untuk menghasilkan dan mengkonfirmasi sinyal perdagangan. Ini adalah sistem perdagangan yang lengkap, dengan persyaratan masuk yang jelas, kontrol stop loss, dan skema keuntungan bertahap. Strategi ini berfokus pada keadaan overbought / oversold di pasar, dan menghasilkan keuntungan dari perubahan waktu dengan menangkap dinamika harga.

Strategi ini beroperasi pada grafik 5 menit, tetapi merujuk pada data dari grafik 15 menit untuk mengkonfirmasi sinyal perdagangan, yang mencerminkan kedalaman analisis multi-frame waktu. Ini menggunakan pengaturan parameter yang berbeda untuk perdagangan multihead dan kosong, yang mengisyaratkan kecenderungan desainnya untuk menyesuaikan diri dengan lingkungan pasar yang lebih bullish secara keseluruhan.

Prinsip Strategi

Prinsip inti dari strategi ini didasarkan pada sinyal silang dari indikator Stochastic RSI, yang dikombinasikan dengan mekanisme konfirmasi multi-frame waktu untuk menyaring sinyal berkualitas rendah. Proses kerja spesifiknya adalah sebagai berikut:

  1. Sinyal pemicu awal (frame waktu 5 menit)

    • Sinyal multihead: Ketika garis K dari Stoch RSI pada grafik 5 menit melintasi garis D ke atas, dan nilai K pada saat melintasi berada di bawah tingkat pemicu yang ditentukan.
    • Sinyal kosong: Ketika garis K dari Stoch RSI di grafik 5 menit melintasi garis D ke bawah, dan nilai K saat melintasi lebih tinggi dari tingkat pemicu yang ditentukan (stoch_5min_k_short_trigger) [2].
  2. Konfirmasi tingkat tinggi (frame waktu 15 menit)

    • Setelah sinyal awal 5 menit dipicu, kebijakan akan mencari konfirmasi dari kerangka waktu 15 menit dalam wait_window_5min_bars.
    • Konfirmasi multihead: K-line dari 15 menit Stoch RSI harus secara ketat lebih besar dari garis D-nya, dan nilai K 15 menit harus lebih rendah dari nilai set stoch_15min_long_entry_level.
    • Konfirmasi kosong: 15 menit Stoch RSI K-line harus lebih kecil dari garis D-nya, dan 15 menit K-value harus lebih tinggi dari set stoch_15min_short_entry_level.
  3. Menyaring sinyal berulang

    • Strategi ini menerapkan mekanisme periode pendinginan ((min_bars_between_signals), di mana sinyal baru harus melewati jumlah K yang ditentukan antara sinyal yang sama arah untuk dipertimbangkan.
  4. Manajemen Posisi

    • Kunci posisi terbuka: Strategi tidak menghasilkan sinyal masuk baru ketika posisi yang belum dibuka telah dipegang.
    • Pengaturan Stop Loss: Berdasarkan low point ((untuk multi head) atau high point ((untuk head) pada garis K yang masuk, jika harga penutupan garis K berikutnya melampaui level ini, maka akan terjadi stop loss.
    • Pemeriksaan stop loss lebih diutamakan daripada pemeriksaan profit.
  5. Mekanisme keuntungan dua tahap

    • Tahap pertama (TP1): Menghilangkan 50% dari posisi, yang dipicu oleh salah satu dari dua cara berikut:
      • Metode prioritas A ((extreme K-value): jika 5 menit atau 15 menit Stoch K-value lebih dari extreme_long_tp_level ((multihead) atau kurang dari extreme_short_tp_level ((blank))
      • Metode prioritas B ((kondisional 5 menit persilangan + 15 menit K reversal): ketika 5 menit Stoch RSI K / D persilangan terjadi ((K downward crossing D pada multihead; K upward crossing D pada hollowhead), dan dikonfirmasi 15 menit Stoch K “reversal” ((K saat ini 15 menit < 15 menit sebelumnya K untuk multihead; K saat ini 15 menit > 15 menit sebelumnya K untuk hollowhead)
    • Tahap kedua ((TP2)): menebus sisa 50% dari posisi, hanya diaktifkan setelah TP1 telah dipicu, dan dieksekusi ketika 5 menit atau 15 menit Stoch K nilai mencapai tingkat ekstrim yang sama lagi.

Keunggulan Strategis

  1. Mekanisme Konfirmasi Multi-Frames Time

    • Strategi ini mengurangi sinyal palsu dan meningkatkan kualitas perdagangan dengan menggabungkan sinyal dari jangka waktu 5 menit dan 15 menit. Kerangka waktu yang lebih pendek memberikan kesempatan masuk, sedangkan kerangka waktu yang lebih lama memberikan konfirmasi tren, metode ini dapat secara efektif menyaring kebisingan pasar jangka pendek.
  2. Determinasi tepat dari kondisi overbought/oversold

    • Stochastic RSI lebih sensitif dari RSI tradisional dan dapat menangkap perubahan dalam dinamika harga lebih awal. Strategi memanfaatkan fitur ini untuk melakukan perdagangan ketika harga akan berbalik, meningkatkan akurasi waktu masuk.
  3. Strategi penghentian bertahap

    • Mekanisme stop-loss dua tahap memungkinkan pedagang untuk mengunci sebagian dari keuntungan, sementara mempertahankan sisa posisi untuk menangkap tren yang lebih besar. Metode ini menyeimbangkan risiko dan keuntungan, terutama cocok untuk pasar yang lebih berfluktuasi.
  4. Pengaturan preferensi yang disesuaikan

    • Parameter strategi dapat disesuaikan untuk mencerminkan preferensi pasar (misalnya, strategi saat ini lebih longgar untuk multipel), sehingga dapat disesuaikan dengan lingkungan pasar yang berbeda dan preferensi perdagangan.
  5. Manajemen risiko yang lengkap

    • Mekanisme stop loss yang jelas didasarkan pada nilai teratas dari garis K masuk, memberikan kontrol risiko yang dapat diukur untuk setiap transaksi. Pemeriksaan stop loss diutamakan atas pemeriksaan keuntungan, memastikan kontrol risiko selalu menjadi pertimbangan utama.
  6. Menyaring sinyal berulang

    • Dengan menerapkan periode pendinginan sinyal, untuk menghindari terlalu banyak perdagangan dalam waktu singkat, mengurangi biaya transaksi dan meningkatkan kualitas sinyal.

Risiko Strategis

  1. Parameter Sensitivitas

    • Strategi ini bergantung pada beberapa parameter threshold, seperti berbagai tingkat pemicu dan konfirmasi threshold. Pengaturan parameter yang tidak tepat dapat menyebabkan terlalu banyak sinyal palsu atau kehilangan peluang perdagangan penting. Parameter ini harus dioptimalkan dengan pengujian ulang dalam berbagai kondisi pasar.
  2. Stop loss mungkin lebih luas

    • Stop loss berdasarkan batas K-line entry mungkin lebih longgar dalam beberapa kasus, terutama di pasar yang lebih berfluktuasi. Hal ini dapat menyebabkan potensi kerugian dalam satu transaksi lebih besar dari yang diharapkan. Pertimbangkan untuk menetapkan batas maksimum stop loss untuk menghindari paparan risiko yang berlebihan.
  3. Ketergantungan pada kondisi pasar

    • Stochastic RSI berkinerja baik di pasar yang bergoyang-goyang, tetapi dapat memberikan sinyal reversal yang prematur di pasar yang sedang tren kuat. Strategi ini dapat berkinerja buruk dalam pergerakan satu arah yang cepat, karena harga dapat terus melakukan overbought atau oversold tanpa reversal.
  4. Kecenderungan pada banyak kepala

    • Konfigurasi strategi saat ini menunjukkan preferensi untuk perdagangan multihead, yang dapat menyebabkan overtrading atau sinyal multihead yang tidak sesuai dalam lingkungan bear market. Parameter harus disesuaikan sesuai dengan kondisi pasar untuk menjaga keseimbangan.
  5. 15 Menit Konfirmasi Delay

    • Tunggu 15 menit untuk waktu frame konfirmasi dapat menyebabkan keterlambatan masuk, dan mungkin kehilangan titik masuk ideal di pasar yang cepat. Dalam pasar yang sangat bergejolak, keterlambatan ini dapat secara signifikan mempengaruhi kinerja strategi.

Arah optimasi strategi

  1. Mekanisme penghentian dinamis

    • Stop stop persentase tetap saat ini dapat ditingkatkan menjadi stop stop dinamis berdasarkan ATR (Average True Range) atau menerapkan mekanisme stop loss yang mengikuti untuk menangkap lebih banyak keuntungan dalam situasi tren. Khusus untuk stop stop tahap dua, pertimbangkan untuk menggunakan tingkat stop stop yang disesuaikan dengan tingkat fluktuasi atau intensitas tren.
  2. Kondisi pasar beradaptasi

    • Memperkenalkan mekanisme deteksi kondisi pasar (seperti indikator ADX yang menilai kekuatan tren), memungkinkan strategi untuk menyesuaikan parameter secara otomatis sesuai dengan berbagai kondisi pasar. Misalnya, melonggarkan kondisi reversal di pasar tren yang kuat dan memperketat kondisi ini di pasar goyah.
  3. Konfirmasi multisensor

    • Integrasi indikator teknis tambahan seperti MACD, Brinks atau Moving Average sebagai alat konfirmasi tambahan. Resonansi multi-indikator dapat meningkatkan keandalan sinyal dan mengurangi false breaks.
  4. Optimalisasi lubang risiko

    • Menerapkan manajemen skala posisi dinamis, menyesuaikan ambang risiko setiap perdagangan berdasarkan volatilitas saat ini atau kinerja perdagangan terbaru. Selain itu, Anda dapat menambahkan batasan stop loss maksimum untuk mencegah kerugian ekstrem.
  5. Ekstensi multi-kerangka waktu

    • Pertimbangkan untuk menambahkan kerangka waktu ketiga (seperti 1 jam atau 4 jam) untuk memberikan analisis latar belakang pasar tingkat yang lebih tinggi, terutama untuk konfirmasi tren dan identifikasi titik dukungan / resistensi utama.
  6. Filter waktu transaksi

    • Tambahkan filter waktu perdagangan untuk menghindari perdagangan pada saat pasar yang kurang likuiditas atau tidak teratur. Misalnya, perdagangan dapat dibatasi pada periode fluktuasi tinggi sebelum dan sesudah buka dan tutup pasar.

Meringkaskan

Strategi crossover indikator acak yang relatif kuat dalam kerangka waktu multi adalah sistem perdagangan yang terstruktur dengan baik yang meningkatkan kualitas perdagangan melalui analisis kerangka waktu multi dan proses konfirmasi sinyal yang ketat. Keunggulan inti dari strategi ini adalah kondisi masuknya yang komprehensif dan sistem manajemen risiko, khususnya mekanisme stop-loss dua tahap yang memungkinkan untuk mengunci keuntungan sambil tetap mengikuti tren di beberapa posisi.

Namun, efektivitas strategi ini sangat tergantung pada pengaturan parameter dan kondisi pasar. Strategi ini mungkin berkinerja baik di pasar yang bergoyang, tetapi mungkin memerlukan penyesuaian di bawah tren yang kuat atau lingkungan yang tinggi.

Strategi ini paling cocok untuk pedagang menengah ke tingkat lanjut dengan pengetahuan pemrograman yang dapat memahami dan menyesuaikan aturan perdagangan yang kompleks. Dengan penyesuaian parameter dan manajemen risiko yang tepat, sistem ini dapat menjadi komponen yang berharga dalam toolkit pedagang harian dan jangka pendek, terutama mereka yang berfokus pada menangkap perubahan dinamika pasar.

Kode 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