
Strategi ini menggunakan harga yang terbentuk oleh pergerakan rata-rata dua indeks (EMA) untuk mengenal pasti peluang pembalikan yang berkemungkinan tinggi. Ia bukan strategi melintasi garis rata-rata yang mudah, tetapi mencari masa untuk menaikkan harga dari EMA dan membentuk momentum yang kuat. Strategi ini menggunakan EMA 12 kitaran dan 21 kitaran untuk membina kawasan perdagangan, dan menggabungkan bentuk grafik, konsistensi trend dan sistem pengurusan risiko yang tepat untuk menangkap pergerakan pasaran.
Prinsip teras strategi ini adalah mencari isyarat masuk dengan mengenal pasti keadaan di mana harga melonjak dari EMA. Ia menggunakan EMA 12 kitaran dan 21 kitaran untuk mencipta kawasan perdagangan ke atas dan ke bawah, menentukan arah trend pasaran berdasarkan kedudukan relatif EMA.
Apabila EMA12 > EMA21, pasaran berada dalam persekitaran bullish ((bandar hijau), kami mencari peluang untuk melakukan banyak perkara. Keadaan untuk melakukan banyak perkara termasuk: garis bawah harga menyentuh garis EMA, membentuk bullish yang kuat ((entiti yang lebih besar daripada garis bawah), garis atas meminimumkan (kurang daripada 2% dari julat bullish), harga penutupan lebih tinggi daripada dua EMA, yang sebelumnya tidak ditutup di bawah garis bawah, dan beberapa akar berturut-turut untuk mengekalkan trend bullish yang konsisten.
Apabila EMA12 < EMA21, pasaran berada dalam persekitaran penurunan harga (bendera merah), kami mencari peluang untuk melakukan shorting. Syarat untuk melakukan shorting termasuk: harga garis atas menyentuh EMA, membentuk garis penurunan harga yang kuat (entiti yang lebih besar daripada garis atas), garis bawah meminimumkan (kurang dari 2% dari julat tipis), harga penutupan di bawah dua EMA, satu tipis sebelumnya tidak ditutup di atas band atas, dan beberapa tipis berturut-turut mengekalkan konsistensi trend menurun.
Sistem pengurusan risiko dalaman untuk nisbah pulangan risiko tetap, secara lalai 3: 1, stop loss ditetapkan pada titik tinggi / rendah di set pertama, dan stop loss dikira secara automatik berdasarkan nisbah pulangan risiko.
Strategi ini mempunyai banyak kelebihan:
Potensi kemenangan yang tinggi: Dengan menangkap pergerakan momentum yang kuat selepas EMA bertolak ansur, strategi ini dapat mengenal pasti peluang perdagangan yang mempunyai kebarangkalian yang tinggi untuk berjaya.
Peraturan masuk dan keluar yang jelas: Strategi menyediakan syarat perdagangan yang jelas, mengurangkan kesan penilaian subjektif dan keputusan emosi.
Pengurusan risiko yang sangat baik: Rasio ganjaran risiko tetap dan tetapan stop-loss automatik untuk memastikan risiko setiap perdagangan terkawal.
Trend mengikuti kelebihan: Strategi hanya berdagang di arah yang mendominasi trend, mengelakkan risiko tinggi untuk berdagang ke arah yang berlawanan.
Berlaku untuk pelbagai tempoh masa: Strategi ini boleh beroperasi dengan berkesan dalam pelbagai tempoh masa, memberikan pilihan perdagangan yang fleksibel.
Sistem amaran menyeluruh: Fungsi amaran isyarat perdagangan terperinci yang dibina untuk memastikan anda tidak ketinggalan peluang perdagangan.
Bantuan visual: menunjukkan isyarat perdagangan dan keadaan keadaan secara intuitif melalui perubahan warna latar belakang dan isyarat label.
Walaupun strategi ini direka dengan baik, terdapat risiko yang berpotensi:
Risiko pasaran goyah: Dalam pasaran yang terbelakang atau goyah, jalur EMA mungkin menjadi ketat, menghasilkan isyarat yang kerap tetapi berkualiti rendah, yang menyebabkan kerugian berturut-turut.
Risiko tergesa-gesa: Pasaran mungkin tergesa-gesa selepas berita atau peristiwa utama, yang menyebabkan titik penangguhan tidak berfungsi dan menyebabkan kerugian melebihi jangkaan.
Terlalu banyak parameter yang dioptimumkan: Terlalu banyak parameter strategi yang dioptimumkan boleh menyebabkan curve fit yang menyebabkan strategi tidak berfungsi dengan baik dalam perdagangan cakera.
Kelemahan pengiktirafan trend: EMA sebagai penunjuk ketinggalan, mungkin bertindak balas lebih lambat pada titik perubahan trend, menyebabkan kehilangan titik masuk terbaik atau kelewatan keluar.
Stop loss triggered risk: bunyi pasaran boleh menyebabkan harga kembali ke arah yang dijangkakan selepas stop loss telah dicetuskan, menyebabkan kerugian yang tidak perlu.
Penyelesaian termasuk: menghentikan perdagangan di pasaran yang bergolak; mengelakkan isyarat berkualiti rendah dengan menggunakan penapis kadar lonjakan; mengesahkan trend dalam kombinasi dengan petunjuk lain; mengukur semula dan mengoptimumkan parameter secara berkala; pertimbangkan untuk menggunakan tracking stop loss.
Strategi ini boleh dioptimumkan dengan cara berikut:
Pengurusan risiko dinamik: Mengubah saiz kedudukan dan nisbah pulangan risiko secara automatik mengikut turun naik pasaran, untuk mengurangkan risiko dalam keadaan turun naik yang tinggi.
Penapis peringkat tinggi diperkenalkan: menggabungkan ATR (Average True Rate) untuk menapis isyarat semasa turun naik rendah; menambah pengesahan jumlah transaksi untuk mengesahkan keberkesanan kenaikan harga.
Analisis pelbagai kitaran masa: mengintegrasikan arah trend dalam kitaran masa yang lebih tinggi sebagai syarat penapis tambahan, hanya masuk jika trend dalam beberapa kitaran masa sama.
Pengoptimuman Pembelajaran Mesin: Mengubah parameter secara dinamik menggunakan algoritma pembelajaran mesin, menyesuaikan kombinasi parameter yang optimum mengikut keadaan pasaran yang berbeza.
Menjejaki penangguhan pencapaian: Setelah keuntungan mencapai tahap tertentu, pelaksanaan mekanisme penangguhan kerugian, mengunci sebahagian daripada keuntungan sambil membenarkan trend terus berkembang.
Strategi keuntungan separa: melaksanakan strategi keuntungan separa, mengurangkan kedudukan secara beransur-ansur pada harga sasaran yang berbeza, mengoptimumkan prestasi pulangan risiko keseluruhan.
Arahan pengoptimuman ini dapat meningkatkan strategi untuk menjadi lebih stabil, fleksibel dan menguntungkan dalam jangka masa panjang.
Strategi dagangan pergerakan rata-rata pergerakan dua indeks adalah sistem perdagangan komprehensif yang menggabungkan analisis teknikal, pengenalan corak grafik, dan pengurusan risiko yang ketat. Ia menangkap peluang pasaran yang mempunyai momentum letupan dengan mengenal pasti titik balik yang berkemungkinan tinggi harga dari EMA. Kelebihan utama strategi ini adalah peraturan dagangan yang jelas, rangka kerja pulangan risiko yang ditetapkan, dan keperluan konsistensi trend, menjadikannya sesuai untuk pelbagai jenis persekitaran pasaran dan masa kitaran.
Walaupun terdapat beberapa risiko yang berpotensi, dengan melaksanakan langkah-langkah pengoptimuman yang disyorkan, peniaga dapat meningkatkan lagi kestabilan dan keuntungan strategi. Strategi ini sangat sesuai untuk peniaga yang mencari kaedah perdagangan yang sistematik, disiplin dan terkawal risiko.
/*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)