Chiến lược giao dịch động lượng bật lại theo đường trung bình động hàm mũ kép

EMA SL TP R:R 趋势一致性 反弹交易 动量交易 风险管理 蜡烛图形态
Ngày tạo: 2025-06-03 10:59:06 sửa đổi lần cuối: 2025-06-03 10:59:06
sao chép: 0 Số nhấp chuột: 281
2
tập trung vào
319
Người theo dõi

Chiến lược giao dịch động lượng bật lại theo đường trung bình động hàm mũ kép Chiến lược giao dịch động lượng bật lại theo đường trung bình động hàm mũ kép

Tổng quan

Chiến lược này sử dụng các đường trung bình di chuyển hai chỉ số (EMA) để xác định cơ hội đảo ngược có khả năng cao. Nó không phải là một chiến lược vượt qua đường trung bình đơn giản, mà là tìm kiếm thời gian để giá từ EMA trở lại và tạo ra động lực mạnh. Chiến lược này sử dụng EMA 12 chu kỳ và 21 chu kỳ để xây dựng các khu vực giao dịch và kết hợp hình dạng đồ thị, sự nhất quán của xu hướng và hệ thống quản lý rủi ro chính xác để nắm bắt động lực thị trường.

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

Nguyên tắc cốt lõi của chiến lược này là tìm kiếm tín hiệu nhập cảnh bằng cách xác định các trường hợp giá tăng trở lại từ EMA. Nó sử dụng EMA 12 chu kỳ và 21 chu kỳ để tạo ra các vùng giao dịch lên xuống và xác định hướng xu hướng của thị trường dựa trên vị trí tương đối của EMA.

Khi EMA12 > EMA21, thị trường đang ở môi trường lạc quan ((vùng xanh), chúng tôi tìm kiếm nhiều cơ hội để làm nhiều điều kiện. Các điều kiện bao gồm: đường giá dưới chạm vào đường EMA, tạo ra đường đi lạc quan mạnh mẽ ((các thực thể lớn hơn đường đi lạc quan), tối thiểu hóa đường đi lạc quan ((nhỏ hơn 2% trong phạm vi lạc quan), giá đóng cửa cao hơn hai đường EMA, một đường đi trước không nằm dưới đường đi lạc quan, và một số đường đi lạc quan liên tục duy trì sự nhất quán trong xu hướng lạc quan.

Khi EMA12 < EMA21, thị trường đang ở trong môi trường giảm giá ((vùng đỏ), chúng tôi tìm kiếm cơ hội giảm giá. Các điều kiện giảm giá bao gồm: đường giá lên chạm vào vùng EMA, tạo ra đường giảm mạnh ((các thực thể lớn hơn đường bóng trên), giảm thiểu đường bóng dưới ((nhỏ hơn 2% trong phạm vi thềm), giá đóng cửa thấp hơn hai EMA, một thềm trước đã không đóng cửa trên vùng trên, và một số thềm liên tiếp duy trì sự nhất quán của xu hướng giảm giá.

Hệ thống quản lý rủi ro với tỷ lệ rủi ro / lợi nhuận cố định trong chiến lược, mặc định 3: 1, dừng lỗ được đặt ở điểm cao / thấp của hàng trước, dừng lỗ được tính tự động dựa trên tỷ lệ rủi ro / lợi nhuận.

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

Chiến lược này có nhiều ưu điểm đáng chú ý:

  1. Tiềm năng chiến thắng cao: Chiến lược này có thể xác định các cơ hội giao dịch có khả năng thành công cao bằng cách nắm bắt các hoạt động động động lực mạnh sau khi EMA trở lại.

  2. Các quy tắc nhập cảnh và xuất cảnh rõ ràng: Chiến lược cung cấp các điều kiện giao dịch rõ ràng, giảm ảnh hưởng của phán đoán chủ quan và quyết định cảm xúc.

  3. Quản lý rủi ro tốt: Sử dụng tỷ lệ lợi nhuận rủi ro cố định và thiết lập dừng lỗ tự động để đảm bảo rủi ro của mỗi giao dịch được kiểm soát.

  4. Xu hướng đi theo lợi thế: Chiến lược chỉ giao dịch theo xu hướng thống trị, tránh rủi ro cao khi hoạt động ngược.

  5. Thích hợp cho nhiều chu kỳ thời gian: Chiến lược này có thể hoạt động hiệu quả trong nhiều chu kỳ thời gian, cung cấp các lựa chọn giao dịch linh hoạt.

  6. Hệ thống nhắc nhở toàn diện: Cấu tạo thông báo tín hiệu giao dịch chi tiết để đảm bảo không bỏ lỡ cơ hội giao dịch.

  7. Hỗ trợ trực quan: hiển thị trực quan các tín hiệu giao dịch và trạng thái điều kiện thông qua thay đổi màu nền và gợi ý nhãn.

Rủi ro chiến lược

Mặc dù chiến lược này được thiết kế tốt, nhưng vẫn có những rủi ro tiềm ẩn:

  1. Rủi ro của thị trường chấn động: Trong thị trường ngang hoặc chấn động, vùng EMA có thể trở nên chặt chẽ, tạo ra tín hiệu thường xuyên nhưng chất lượng thấp, dẫn đến tổn thất liên tục.

  2. Rủi ro nhảy vọt: Thị trường có thể nhảy vọt sau một tin tức hoặc sự kiện quan trọng, làm cho điểm dừng lỗ bị vô hiệu hóa và gây ra tổn thất vượt quá dự kiến.

  3. Tối ưu hóa tham số quá mức: Các tham số chiến lược được tối ưu hóa quá mức có thể dẫn đến sự phù hợp đường cong, làm cho chiến lược hoạt động kém trong giao dịch thực.

  4. Sự chậm trễ trong nhận dạng xu hướng: EMA là một chỉ số chậm trễ, có thể phản ứng chậm hơn ở các điểm biến xu hướng, dẫn đến việc bỏ lỡ điểm nhập cảnh tốt nhất hoặc trì hoãn thoát ra.

  5. Rủi ro kích hoạt dừng lỗ: tiếng ồn thị trường có thể dẫn đến việc dừng lỗ được kích hoạt, giá sẽ quay trở lại hướng dự kiến, gây ra tổn thất không cần thiết.

Các giải pháp bao gồm: tạm dừng giao dịch trong thị trường chấn động; sử dụng bộ lọc tỷ lệ dao động để tránh tín hiệu chất lượng thấp; xác nhận xu hướng kết hợp với các chỉ số khác; đo lại và tối ưu hóa các tham số thường xuyên; xem xét sử dụng tracking stop loss.

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

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Quản lý rủi ro động: Tự động điều chỉnh tỷ lệ lợi nhuận rủi ro và kích thước vị trí tùy theo biến động của thị trường, giảm lỗ hổng rủi ro trong môi trường biến động cao.

  2. Bộ lọc cấp cao được giới thiệu: kết hợp với chỉ số ATR để lọc tín hiệu trong giai đoạn biến động thấp; thêm xác nhận khối lượng giao dịch để xác nhận hiệu quả của sự phục hồi giá.

  3. Phân tích nhiều chu kỳ thời gian: tích hợp hướng xu hướng của chu kỳ thời gian cao hơn làm điều kiện lọc bổ sung, chỉ tham gia khi xu hướng của nhiều chu kỳ thời gian phù hợp.

  4. Tối ưu hóa học máy: Sử dụng thuật toán học máy để điều chỉnh các tham số động, thích ứng với các tổ hợp tham số tối ưu theo các môi trường thị trường khác nhau.

  5. Theo dõi thực hiện dừng lỗ: Sau khi lợi nhuận đạt đến một mức độ nhất định, thực hiện cơ chế theo dõi dừng lỗ, khóa một phần lợi nhuận và cho phép xu hướng tiếp tục phát triển.

  6. Chiến lược thu lợi nhuận một phần: Thực hiện chiến lược thu lợi nhuận theo từng đợt, giảm dần vị thế ở các mức giá mục tiêu khác nhau, tối ưu hóa hiệu suất lợi nhuận rủi ro tổng thể.

Các hướng tối ưu hóa này có thể cải thiện tính bền vững, khả năng thích ứng và khả năng sinh lợi lâu dài của chiến lược.

Tóm tắt

Chiến lược giao dịch với động lực đảo ngược của đường trung bình di chuyển hai chỉ số là một hệ thống giao dịch tổng hợp kết hợp phân tích kỹ thuật, nhận dạng hình dạng đồ thị và quản lý rủi ro nghiêm ngặt. Nó nắm bắt các cơ hội thị trường có động lực bùng nổ bằng cách xác định các điểm đảo ngược có khả năng cao khi giá từ EMA trở lại.

Mặc dù có một số rủi ro tiềm ẩn, các nhà giao dịch có thể cải thiện hơn nữa sự ổn định và lợi nhuận của chiến lược bằng cách thực hiện các biện pháp tối ưu hóa được đề xuất. Chiến lược này đặc biệt phù hợp với các nhà giao dịch tìm kiếm phương pháp giao dịch có hệ thống, có kỷ luật và có thể kiểm soát rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2025-05-26 00:00:00
end: 2025-06-02 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Enhanced EMA Band Rejection Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// Input parameters
ema12_length = input.int(12, title="EMA 12 Length")
ema21_length = input.int(21, title="EMA 21 Length")
max_wick_percent = input.float(2.0, title="Max Wick % at High/Low", minval=0.0, maxval=10.0)
risk_reward_ratio = input.float(3.0, title="Risk/Reward Ratio (R)", minval=1.0, maxval=10.0)
trend_consistency_bars = input.int(5, title="Trend Consistency Required (Bars)", minval=1, maxval=20)

// Notification Settings
enable_notifications = input.bool(true, title="Enable Notifications", group="Notifications")
notify_on_entry = input.bool(true, title="Notify on Trade Entry", group="Notifications")
notify_on_exit = input.bool(true, title="Notify on Trade Exit", group="Notifications")
notify_on_setup = input.bool(false, title="Notify on Potential Setup (Pre-Entry)", group="Notifications")
notify_on_failed_conditions = input.bool(false, title="Notify on Failed Conditions", group="Notifications")

// Calculate EMAs
ema12 = ta.ema(close, ema12_length)
ema21 = ta.ema(close, ema21_length)

// Determine upper and lower EMA bands
ema_upper = math.max(ema12, ema21)
ema_lower = math.min(ema12, ema21)

// Plot EMAs
plot(ema12, color=color.blue, linewidth=2, title="EMA 12")
plot(ema21, color=color.red, linewidth=2, title="EMA 21")

// Calculate candle components
body_size = math.abs(close - open)
upper_wick = high - math.max(open, close)
lower_wick = math.min(open, close) - low
candle_range = high - low

// Calculate wick percentages
upper_wick_percent = candle_range > 0 ? (upper_wick / candle_range) * 100 : 0
lower_wick_percent = candle_range > 0 ? (lower_wick / candle_range) * 100 : 0

// Determine EMA trend direction
ema_bullish = ema12 > ema21  // Green bands - bullish trend
ema_bearish = ema12 < ema21  // Red bands - bearish trend

// Check trend consistency for required number of bars
bullish_consistency_check = true
bearish_consistency_check = true

for i = 0 to trend_consistency_bars - 1
    ema12_past = ta.ema(close[i], ema12_length)
    ema21_past = ta.ema(close[i], ema21_length)
    if ema12_past <= ema21_past
        bullish_consistency_check := false
    if ema12_past >= ema21_past
        bearish_consistency_check := false

// Final trend conditions with consistency requirement
ema_bullish_consistent = ema_bullish and bullish_consistency_check
ema_bearish_consistent = ema_bearish and bearish_consistency_check

// NEW RULE: Previous candle close position relative to bands
prev_close_above_upper_band = close[1] > ema_upper[1]
prev_close_below_lower_band = close[1] < ema_lower[1]
prev_close_within_bands = close[1] >= ema_lower[1] and close[1] <= ema_upper[1]

// Long setup conditions (only when EMAs are bullish/green consistently)
long_wick_condition = low <= ema_lower or (low <= ema_upper and low >= ema_lower)
long_body_condition = body_size >= lower_wick
long_wick_percent_condition = upper_wick_percent <= max_wick_percent
long_bullish_candle = close > open
long_trend_condition = ema_bullish_consistent  // Only long when bands are consistently green
long_close_above_bands = close > ema_upper  // NEW: Close must be above both EMAs
// Previous candle must not have closed below the lower band
long_prev_close_condition = not prev_close_below_lower_band
long_setup = long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and long_trend_condition and long_close_above_bands and long_prev_close_condition

// Short setup conditions (only when EMAs are bearish/red consistently)
short_wick_condition = high >= ema_upper or (high >= ema_lower and high <= ema_upper)
short_body_condition = body_size >= upper_wick
short_wick_percent_condition = lower_wick_percent <= max_wick_percent
short_bearish_candle = close < open
short_trend_condition = ema_bearish_consistent  // Only short when bands are consistently red
short_close_below_bands = close < ema_lower  // NEW: Close must be below both EMAs
// Previous candle must not have closed above the upper band
short_prev_close_condition = not prev_close_above_upper_band
short_setup = short_wick_condition and short_body_condition and short_wick_percent_condition and short_bearish_candle and short_trend_condition and short_close_below_bands and short_prev_close_condition

// Entry conditions
var float long_sl = na
var float short_sl = na
var float long_tp = na
var float short_tp = na

if long_setup and strategy.position_size == 0
    strategy.entry("Long", strategy.long)
    long_sl := low
    risk_amount = close - long_sl
    long_tp := close + (risk_amount * risk_reward_ratio)
    label.new(bar_index, low, "LONG", style=label.style_label_up, color=color.green, size=size.small)
    
    // Entry Notification
    if enable_notifications and notify_on_entry
        alert("🟢 LONG ENTRY SIGNAL\n" + 
              "Symbol: " + syminfo.ticker + "\n" + 
              "Price: " + str.tostring(close, "#.####") + "\n" + 
              "Stop Loss: " + str.tostring(long_sl, "#.####") + "\n" + 
              "Take Profit: " + str.tostring(long_tp, "#.####") + "\n" + 
              "Risk/Reward: " + str.tostring(risk_reward_ratio, "#.##") + "R\n" + 
              "Time: " + str.tostring(time), alert.freq_once_per_bar)

if short_setup and strategy.position_size == 0
    strategy.entry("Short", strategy.short)
    short_sl := high
    risk_amount = short_sl - close
    short_tp := close - (risk_amount * risk_reward_ratio)
    label.new(bar_index, high, "SHORT", style=label.style_label_down, color=color.red, size=size.small)
    
    // Entry Notification
    if enable_notifications and notify_on_entry
        alert("🔴 SHORT ENTRY SIGNAL\n" + 
              "Symbol: " + syminfo.ticker + "\n" + 
              "Price: " + str.tostring(close, "#.####") + "\n" + 
              "Stop Loss: " + str.tostring(short_sl, "#.####") + "\n" + 
              "Take Profit: " + str.tostring(short_tp, "#.####") + "\n" + 
              "Risk/Reward: " + str.tostring(risk_reward_ratio, "#.##") + "R\n" + 
              "Time: " + str.tostring(time), alert.freq_once_per_bar)

// Exit conditions with fixed R:R
if strategy.position_size > 0
    // Long position - fixed stop loss and take profit
    strategy.exit("Long Exit", "Long", stop=long_sl, limit=long_tp)
    
    // Exit Notifications
    if enable_notifications and notify_on_exit
        if close <= long_sl
            alert("🛑 LONG STOP LOSS HIT\n" + 
                  "Symbol: " + syminfo.ticker + "\n" + 
                  "Exit Price: " + str.tostring(close, "#.####") + "\n" + 
                  "Loss: " + str.tostring(close - strategy.position_avg_price, "#.####") + "\n" + 
                  "Time: " + str.tostring(time), alert.freq_once_per_bar)
        if close >= long_tp
            alert("🎯 LONG TAKE PROFIT HIT\n" + 
                  "Symbol: " + syminfo.ticker + "\n" + 
                  "Exit Price: " + str.tostring(close, "#.####") + "\n" + 
                  "Profit: " + str.tostring(close - strategy.position_avg_price, "#.####") + "\n" + 
                  "Time: " + str.tostring(time), alert.freq_once_per_bar)

if strategy.position_size < 0
    // Short position - fixed stop loss and take profit
    strategy.exit("Short Exit", "Short", stop=short_sl, limit=short_tp)
    
    // Exit Notifications
    if enable_notifications and notify_on_exit
        if close >= short_sl
            alert("🛑 SHORT STOP LOSS HIT\n" + 
                  "Symbol: " + syminfo.ticker + "\n" + 
                  "Exit Price: " + str.tostring(close, "#.####") + "\n" + 
                  "Loss: " + str.tostring(strategy.position_avg_price - close, "#.####") + "\n" + 
                  "Time: " + str.tostring(time), alert.freq_once_per_bar)
        if close <= short_tp
            alert("🎯 SHORT TAKE PROFIT HIT\n" + 
                  "Symbol: " + syminfo.ticker + "\n" + 
                  "Exit Price: " + str.tostring(close, "#.####") + "\n" + 
                  "Profit: " + str.tostring(strategy.position_avg_price - close, "#.####") + "\n" + 
                  "Time: " + str.tostring(time), alert.freq_once_per_bar)

// Plot stop levels and take profit levels
plot(strategy.position_size > 0 ? long_sl : na, color=color.red, linewidth=2, style=plot.style_line, title="Long SL")
plot(strategy.position_size < 0 ? short_sl : na, color=color.red, linewidth=2, style=plot.style_line, title="Short SL")
plot(strategy.position_size > 0 ? long_tp : na, color=color.green, linewidth=2, style=plot.style_line, title="Long TP")
plot(strategy.position_size < 0 ? short_tp : na, color=color.green, linewidth=2, style=plot.style_line, title="Short TP")

// Additional Notification Logic
// Potential Setup Notifications (when most conditions are met but not all)
long_potential_setup = long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and long_trend_condition and long_prev_close_condition and not long_close_above_bands
short_potential_setup = short_wick_condition and short_body_condition and short_wick_percent_condition and short_bearish_candle and short_trend_condition and short_prev_close_condition and not short_close_below_bands

if enable_notifications and notify_on_setup and strategy.position_size == 0
    if long_potential_setup
        alert("⚠️ POTENTIAL LONG SETUP\n" + 
              "Symbol: " + syminfo.ticker + "\n" + 
              "Price: " + str.tostring(close, "#.####") + "\n" + 
              "Status: Close needs to be above " + str.tostring(ema_upper, "#.####") + "\n" + 
              "Current Close: " + str.tostring(close, "#.####") + "\n" + 
              "Time: " + str.tostring(time), alert.freq_once_per_bar)
    
    if short_potential_setup
        alert("⚠️ POTENTIAL SHORT SETUP\n" + 
              "Symbol: " + syminfo.ticker + "\n" + 
              "Price: " + str.tostring(close, "#.####") + "\n" + 
              "Status: Close needs to be below " + str.tostring(ema_lower, "#.####") + "\n" + 
              "Current Close: " + str.tostring(close, "#.####") + "\n" + 
              "Time: " + str.tostring(time), alert.freq_once_per_bar)

// Failed Conditions Notifications (for debugging)
if enable_notifications and notify_on_failed_conditions and strategy.position_size == 0
    if long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and not long_trend_condition
        alert("❌ LONG SETUP FAILED\n" + 
              "Symbol: " + syminfo.ticker + "\n" + 
              "Reason: " + (not ema_bullish ? "EMA trend bearish" : "EMA trend not consistent") + "\n" + 
              "EMA12: " + str.tostring(ema12, "#.####") + "\n" + 
              "EMA21: " + str.tostring(ema21, "#.####") + "\n" + 
              "Time: " + str.tostring(time), alert.freq_once_per_bar)
    
    if short_wick_condition and short_body_condition and short_wick_percent_condition and short_bearish_candle and not short_trend_condition
        alert("❌ SHORT SETUP FAILED\n" + 
              "Symbol: " + syminfo.ticker + "\n" + 
              "Reason: " + (not ema_bearish ? "EMA trend bullish" : "EMA trend not consistent") + "\n" + 
              "EMA12: " + str.tostring(ema12, "#.####") + "\n" + 
              "EMA21: " + str.tostring(ema21, "#.####") + "\n" + 
              "Time: " + str.tostring(time), alert.freq_once_per_bar)
bgcolor(long_setup ? color.new(color.green, 90) : na, title="Long Setup")
bgcolor(short_setup ? color.new(color.red, 90) : na, title="Short Setup")
// Show when previous close condition fails
bgcolor(long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and long_trend_condition and prev_close_below_lower_band ? color.new(color.orange, 95) : na, title="Long Rejected by Prev Close")
bgcolor(short_wick_condition and short_body_condition and short_wick_percent_condition and short_bearish_candle and short_trend_condition and prev_close_above_upper_band ? color.new(color.orange, 95) : na, title="Short Rejected by Prev Close")

// Detailed debugging for failed conditions
long_all_conditions_except_prev = long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and long_trend_condition and long_close_above_bands
bgcolor(long_all_conditions_except_prev and prev_close_below_lower_band ? color.new(color.purple, 90) : na, title="Long Failed: Prev Close Below Band")
bgcolor(long_wick_condition and not long_body_condition ? color.new(color.yellow, 90) : na, title="Long Failed: Body Too Small")
bgcolor(long_wick_condition and long_body_condition and not long_wick_percent_condition ? color.new(color.blue, 90) : na, title="Long Failed: Upper Wick Too Big")
bgcolor(long_wick_condition and long_body_condition and long_wick_percent_condition and not long_bullish_candle ? color.new(color.gray, 90) : na, title="Long Failed: Not Bullish Candle")
bgcolor(long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and ema_bullish and not ema_bullish_consistent ? color.new(color.fuchsia, 90) : na, title="Long Failed: Trend Not Consistent")
bgcolor(long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and not ema_bullish ? color.new(color.maroon, 90) : na, title="Long Failed: EMA Trend Bearish")
bgcolor(long_wick_condition and long_body_condition and long_wick_percent_condition and long_bullish_candle and long_trend_condition and not long_close_above_bands ? color.new(color.lime, 90) : na, title="Long Failed: Close Not Above Bands")

// Similar debugging for shorts
short_all_conditions_except_prev = short_wick_condition and short_body_condition and short_wick_percent_condition and short_bearish_candle and short_trend_condition and short_close_below_bands
bgcolor(short_all_conditions_except_prev and prev_close_above_upper_band ? color.new(color.purple, 90) : na, title="Short Failed: Prev Close Above Band")
bgcolor(short_wick_condition and short_body_condition and short_wick_percent_condition and short_bearish_candle and short_trend_condition and not short_close_below_bands ? color.new(color.aqua, 90) : na, title="Short Failed: Close Not Below Bands")

// Enhanced table for debugging
if barstate.islast
    var table debug_table = table.new(position.top_right, 2, 19, bgcolor=color.white, border_width=1)
    table.cell(debug_table, 0, 0, "Condition", text_color=color.black, bgcolor=color.gray)
    table.cell(debug_table, 1, 0, "Value", text_color=color.black, bgcolor=color.gray)
    table.cell(debug_table, 0, 1, "Body Size", text_color=color.black)
    table.cell(debug_table, 1, 1, str.tostring(body_size, "#.##"), text_color=color.black)
    table.cell(debug_table, 0, 2, "Upper Wick", text_color=color.black)
    table.cell(debug_table, 1, 2, str.tostring(upper_wick, "#.##"), text_color=color.black)
    table.cell(debug_table, 0, 3, "Lower Wick", text_color=color.black)
    table.cell(debug_table, 1, 3, str.tostring(lower_wick, "#.##"), text_color=color.black)
    table.cell(debug_table, 0, 4, "Upper Wick %", text_color=color.black)
    table.cell(debug_table, 1, 4, str.tostring(upper_wick_percent, "#.##") + "%", text_color=color.black)
    table.cell(debug_table, 0, 5, "Lower Wick %", text_color=color.black)
    table.cell(debug_table, 1, 5, str.tostring(lower_wick_percent, "#.##") + "%", text_color=color.black)
    table.cell(debug_table, 0, 6, "EMA Upper", text_color=color.black)
    table.cell(debug_table, 1, 6, str.tostring(ema_upper, "#.##"), text_color=color.black)
    table.cell(debug_table, 0, 7, "EMA Lower", text_color=color.black)
    table.cell(debug_table, 1, 7, str.tostring(ema_lower, "#.##"), text_color=color.black)
    table.cell(debug_table, 0, 8, "R:R Ratio", text_color=color.black)
    table.cell(debug_table, 1, 8, str.tostring(risk_reward_ratio, "#.##") + "R", text_color=color.black)
    table.cell(debug_table, 0, 9, "Position", text_color=color.black)
    table.cell(debug_table, 1, 9, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "NONE", text_color=color.black)
    // NEW DEBUG INFO
    table.cell(debug_table, 0, 10, "Prev Close", text_color=color.black)
    table.cell(debug_table, 1, 10, str.tostring(close[1], "#.##"), text_color=color.black)
    table.cell(debug_table, 0, 11, "Prev Above Upper", text_color=color.black)
    table.cell(debug_table, 1, 11, prev_close_above_upper_band ? "YES" : "NO", text_color=color.black)
    table.cell(debug_table, 0, 12, "Prev Below Lower", text_color=color.black)
    table.cell(debug_table, 1, 12, prev_close_below_lower_band ? "YES" : "NO", text_color=color.black)
    table.cell(debug_table, 0, 13, "Prev Within Bands", text_color=color.black)
    table.cell(debug_table, 1, 13, prev_close_within_bands ? "YES" : "NO", text_color=color.black)
    // NEW: Trend consistency info
    table.cell(debug_table, 0, 14, "Bullish Consistent", text_color=color.black)
    table.cell(debug_table, 1, 14, ema_bullish_consistent ? "YES" : "NO", text_color=color.black)
    table.cell(debug_table, 0, 15, "Bearish Consistent", text_color=color.black)
    table.cell(debug_table, 1, 15, ema_bearish_consistent ? "YES" : "NO", text_color=color.black)
    table.cell(debug_table, 0, 16, "Consistency Bars", text_color=color.black)
    table.cell(debug_table, 1, 16, str.tostring(trend_consistency_bars), text_color=color.black)
    // NEW: Close position relative to bands
    table.cell(debug_table, 0, 17, "Close Above Upper", text_color=color.black)
    table.cell(debug_table, 1, 17, close > ema_upper ? "YES" : "NO", text_color=color.black)
    table.cell(debug_table, 0, 18, "Close Below Lower", text_color=color.black)
    table.cell(debug_table, 1, 18, close < ema_lower ? "YES" : "NO", text_color=color.black)