Chiến lược giao cắt RSI ngẫu nhiên đa khung thời gian

RSI STOCH RSI MTF TRENDING MARKETS STOP LOSS MULTI-STAGE TP
Ngày tạo: 2025-06-05 13:13:32 sửa đổi lần cuối: 2025-06-05 13:13:32
sao chép: 0 Số nhấp chuột: 336
2
tập trung vào
319
Người theo dõi

Chiến lược giao cắt RSI ngẫu nhiên đa khung thời gian Chiến lược giao cắt RSI ngẫu nhiên đa khung thời gian

Tổng quan về chiến lược

Chiến lược giao dịch đa khung thời gian dựa trên Stochastic RSI là một hệ thống giao dịch phức hợp, sử dụng dữ liệu trong hai chu kỳ thời gian 5 phút và 15 phút để tạo và xác nhận tín hiệu giao dịch. Đây là một hệ thống giao dịch hoàn chỉnh, bao gồm các điều kiện nhập cảnh rõ ràng, kiểm soát dừng lỗ và chương trình thu lợi nhuận theo giai đoạn. Chiến lược này đặc biệt chú ý đến tình trạng quá mua / quá bán của thị trường, thu lợi nhuận bằng cách nắm bắt các cơ hội biến động của động lực giá.

Chiến lược này hoạt động trên biểu đồ 5 phút nhưng sẽ tham khảo dữ liệu trên biểu đồ 15 phút để xác nhận tín hiệu giao dịch, thể hiện sự sâu sắc của phân tích nhiều khung thời gian. Nó sử dụng các thiết lập tham số khác nhau cho giao dịch đa đầu và đầu trống, gợi ý rằng nó được thiết kế để thích ứng với môi trường thị trường lạc quan tổng thể.

Nguyên tắc chiến lược

Nguyên tắc cốt lõi của chiến lược này dựa trên tín hiệu chéo của chỉ số Stochastic RSI, kết hợp với cơ chế xác nhận khung thời gian đa để lọc các tín hiệu chất lượng thấp. Các quy trình làm việc cụ thể như sau:

  1. Tín hiệu kích hoạt ban đầu ((khung thời gian 5 phút))

    • Tín hiệu đa đầu: Khi đường K của Stoch RSI trên biểu đồ 5 phút đi lên trên đường D và giá trị K khi đi qua thấp hơn mức kích hoạt được chỉ định.
    • Tín hiệu đầu trống: Khi đường K của Stoch RSI trên biểu đồ 5 phút đi xuống đường D và giá trị K khi đi qua cao hơn mức kích hoạt được chỉ định ((stoch_5min_k_short_trigger))
  2. Xác nhận cấp cao ((khung thời gian 15 phút))

    • Sau khi tín hiệu ban đầu được kích hoạt trong 5 phút, chiến lược sẽ tìm kiếm xác nhận khung thời gian 15 phút trong cửa sổ chờ được đặt.
    • Xác nhận đa đầu: Dòng K của 15 phút Stoch RSI phải nghiêm ngặt lớn hơn dòng D của nó, và giá trị K của 15 phút phải thấp hơn so với giá trị đặt của stoch_15min_long_entry_level.
    • Xác nhận không đầu: Dòng K của 15 phút Stoch RSI phải nghiêm ngặt nhỏ hơn dòng D của nó, và giá trị K của 15 phút phải cao hơn so với giá trị đặt của stoch_15min_short_entry_level.
  3. Bộ lọc tín hiệu lặp lại

    • Chiến lược này thực hiện cơ chế thời gian nguội ((min_bars_between_signals) mà chỉ cần một số lượng K được chỉ định giữa các tín hiệu theo cùng hướng mới được xem xét.
  4. Quản lý vị trí

    • Khóa vị trí mở vị trí: Chiến lược không tạo ra tín hiệu nhập cảnh mới khi đã nắm giữ vị trí chưa mở.
    • Cài đặt dừng lỗ: Dựa trên thiết lập điểm thấp (((đối với nhiều đầu) hoặc điểm cao (((đối với đầu trống) của đường K đầu vào, nếu giá đóng cửa của đường K tiếp theo vượt qua mức này, dừng lỗ sẽ được kích hoạt.
    • Kiểm tra thiệt hại ưu tiên hơn kiểm tra lợi nhuận.
  5. Cơ chế lợi nhuận hai giai đoạn

    • Giai đoạn 1 (TP1): Xóa 50% vị trí, kích hoạt bằng một trong hai cách sau:
      • Phương thức ưu tiên A ((giá trị K cực đoan): Nếu giá trị K của 5 phút hoặc 15 phút Stoch vượt quá extreme_long_tp_level ((hàng đầu) hoặc thấp hơn extreme_short_tp_level ((không đầu))
      • Phương pháp ưu tiên B ((trang 5 phút điều kiện + 15 phút K giá trị đảo ngược): Khi 5 phút Stoch RSI của K / D giao thoa xảy ra ((K đi xuống D khi đa đầu; K đi lên D khi vô đầu), và được xác nhận là 15 phút Stoch K giá trị “quay ngược” ((15 phút hiện tại K < 15 phút trước K đối với đa đầu; 15 phút hiện tại K > 15 phút trước K đối với vô đầu).
    • Giai đoạn 2 ((TP2)): xóa 50% vị trí còn lại, chỉ được kích hoạt sau khi TP1 đã được kích hoạt, thực hiện khi giá trị Stoch K 5 phút hoặc 15 phút đạt lại cùng mức cực đoan.

Lợi thế chiến lược

  1. Cơ chế xác nhận khung thời gian đa dạng

    • Bằng cách kết hợp các tín hiệu trong khung thời gian 5 phút và 15 phút, chiến lược này làm giảm các tín hiệu giả và cải thiện chất lượng giao dịch. Các khung thời gian ngắn hơn cung cấp cơ hội nhập, trong khi khung thời gian dài hơn cung cấp xác nhận xu hướng, phương pháp này có thể lọc hiệu quả tiếng ồn thị trường ngắn hạn.
  2. Xác định chính xác các điều kiện mua / bán quá mức

    • Stochastic RSI nhạy cảm hơn RSI truyền thống và có thể bắt được sự thay đổi trong động lực giá sớm hơn. Chiến lược sử dụng tính năng này để giao dịch khi giá sắp đảo ngược, tăng độ chính xác của thời gian nhập cảnh.
  3. Chiến lược dừng giai đoạn

    • Cơ chế dừng hai giai đoạn cho phép các nhà giao dịch khóa một phần lợi nhuận trong khi giữ vị trí còn lại để nắm bắt một thị trường lớn hơn. Phương pháp này cân bằng giữa rủi ro và lợi nhuận, đặc biệt phù hợp với thị trường có nhiều biến động.
  4. Cài đặt tùy chỉnh

    • Các tham số chiến lược có thể được điều chỉnh để phản ánh sở thích của thị trường (ví dụ như chiến lược hiện tại là thoải mái hơn đối với nhiều đầu), cho phép nó thích nghi với các môi trường thị trường và sở thích giao dịch khác nhau.
  5. Quản lý rủi ro đầy đủ

    • Cơ chế dừng lỗ rõ ràng dựa trên giá trị tối đa của đường K đầu vào, cung cấp kiểm soát rủi ro có thể định lượng cho mỗi giao dịch. Kiểm tra dừng lỗ được ưu tiên hơn so với kiểm tra lợi nhuận, đảm bảo kiểm soát rủi ro luôn là yếu tố quan tâm hàng đầu.
  6. Bộ lọc tín hiệu lặp lại

    • Bằng cách thực hiện thời gian làm mát tín hiệu, tránh giao dịch quá nhiều theo cùng một hướng trong một thời gian ngắn, giảm chi phí giao dịch và cải thiện chất lượng tín hiệu.

Rủi ro chiến lược

  1. Độ nhạy tham số

    • Chiến lược này phụ thuộc vào nhiều tham số giảm giá, chẳng hạn như các mức kích hoạt và xác nhận mức giảm giá. Thiết lập tham số không phù hợp có thể dẫn đến quá nhiều tín hiệu sai hoặc bỏ lỡ cơ hội giao dịch quan trọng. Các tham số này nên được tối ưu hóa bằng cách kiểm tra lại trong các điều kiện thị trường khác nhau.
  2. Điểm dừng lỗ có thể rộng hơn

    • Hạn lỗ dựa trên giá trị cực đại của đường K đầu vào có thể được nới lỏng trong một số trường hợp, đặc biệt là trong thị trường có nhiều biến động. Điều này có thể dẫn đến tổn thất tiềm năng của một giao dịch vượt quá dự kiến.
  3. Tùy thuộc vào điều kiện thị trường

    • Stochastic RSI hoạt động tốt trong thị trường biến động trong khoảng thời gian, nhưng có thể tạo ra tín hiệu đảo ngược quá sớm trong thị trường xu hướng mạnh. Chiến lược này có thể hoạt động không tốt trong hành động đơn chiều nhanh vì giá có thể tiếp tục quá mua hoặc quá bán mà không đảo ngược.
  4. Sự thiên vị đối với nhiều đầu

    • Cấu hình chiến lược hiện tại cho thấy sự ưa thích đối với giao dịch đa đầu, điều này có thể dẫn đến giao dịch quá mức hoặc tín hiệu đa đầu không phù hợp trong môi trường gấu. Các tham số nên được điều chỉnh theo môi trường thị trường để duy trì sự cân bằng.
  5. 15 phút xác nhận trễ.

    • Chờ đợi xác nhận khung thời gian 15 phút có thể gây ra sự chậm trễ vào, có thể bỏ lỡ điểm vào lý tưởng trong thị trường nhanh. Trong thị trường cực kỳ biến động, sự chậm trễ này có thể ảnh hưởng đáng kể đến hiệu suất chiến lược.

Hướng tối ưu hóa chiến lược

  1. Cơ chế dừng động

    • Cấp dừng phần trăm cố định hiện tại có thể được nâng cấp thành mức dừng động dựa trên ATR (Average True Range), hoặc thực hiện các cơ chế dừng theo dõi để thu được nhiều lợi nhuận hơn trong tình huống xu hướng. Đặc biệt đối với các điểm dừng giai đoạn 2, hãy xem xét sử dụng mức dừng điều chỉnh tỷ lệ biến động hoặc cường độ xu hướng.
  2. Thị trường tự điều chỉnh

    • Việc giới thiệu cơ chế kiểm tra trạng thái thị trường (như chỉ số ADX đánh giá cường độ của xu hướng) cho phép chiến lược tự động điều chỉnh các tham số cho các môi trường thị trường khác nhau. Ví dụ: nới lỏng các điều kiện đảo ngược trong thị trường xu hướng mạnh và thắt chặt các điều kiện này trong thị trường xung đột.
  3. Xác nhận đa chỉ số

    • Việc tích hợp các chỉ số kỹ thuật bổ sung như MACD, băng tần Brin hoặc đường trung bình di chuyển như một công cụ xác nhận phụ trợ. Sự cộng hưởng đa chỉ số có thể làm tăng độ tin cậy của tín hiệu và giảm đột phá giả.
  4. Tối ưu hóa lỗ hổng rủi ro

    • Thực hiện quản lý quy mô vị trí động, điều chỉnh ngưỡng rủi ro cho mỗi giao dịch dựa trên biến động hiện tại hoặc hiệu suất giao dịch gần đây. Ngoài ra, có thể thêm giới hạn dừng lỗ tối đa để ngăn chặn tổn thất cực đoan.
  5. Mở rộng nhiều tầng khung thời gian

    • Xem xét thêm khung thời gian thứ ba (ví dụ: 1 giờ hoặc 4 giờ) để cung cấp phân tích nền tảng thị trường cấp cao hơn, đặc biệt là xác nhận xu hướng và nhận diện các điểm hỗ trợ / kháng cự chính.
  6. Trình lọc thời gian giao dịch

    • Thêm bộ lọc thời gian giao dịch để tránh giao dịch trong thời gian thị trường thiếu thanh khoản hoặc biến động không thường xuyên. Ví dụ, giao dịch có thể bị giới hạn trong thời gian biến động cao trước và sau khi thị trường mở cửa.

Tóm tắt

Chiến lược giao dịch đa khung thời gian (MTF) là một hệ thống giao dịch có cấu trúc tốt, cải thiện chất lượng giao dịch thông qua phân tích đa khung thời gian và quá trình xác nhận tín hiệu nghiêm ngặt. Điểm mạnh cốt lõi của chiến lược này nằm ở điều kiện nhập cảnh toàn diện và hệ thống quản lý rủi ro, đặc biệt là cơ chế dừng hai giai đoạn cho phép khóa lợi nhuận trong khi duy trì một số vị trí theo dõi xu hướng.

Tuy nhiên, hiệu quả của chiến lược này phụ thuộc rất nhiều vào cài đặt tham số và điều kiện thị trường. Nó có thể hoạt động tốt trong thị trường chấn động, nhưng có thể cần điều chỉnh trong môi trường xu hướng mạnh hoặc biến động cao.

Chiến lược này phù hợp nhất với các nhà giao dịch trung cấp đến cao cấp có kiến thức lập trình, họ có thể hiểu và tùy chỉnh các quy tắc giao dịch phức tạp này. Với điều chỉnh tham số và quản lý rủi ro thích hợp, hệ thống này có thể là một thành phần có giá trị trong hộp công cụ của các nhà giao dịch trong ngày và ngắn hạn, đặc biệt là những nhà giao dịch tập trung vào việc nắm bắt các thay đổi động lực thị trường.

Mã nguồn chiến lược
/*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