Strategi Perdagangan Isyarat Arah Aliran Kependaman Sifar Rangka Masa Berbilang Masa: Sistem Kemasukan dan Keluar Dinamik Berdasarkan ZLEMA

ZLEMA ATR EMA MTF RR TP SL
Tarikh penciptaan: 2025-05-20 14:45:41 Akhirnya diubah suai: 2025-05-20 14:45:41
Salin: 0 Bilangan klik: 592
2
fokus pada
319
Pengikut

Strategi Perdagangan Isyarat Arah Aliran Kependaman Sifar Rangka Masa Berbilang Masa: Sistem Kemasukan dan Keluar Dinamik Berdasarkan ZLEMA Strategi Perdagangan Isyarat Arah Aliran Kependaman Sifar Rangka Masa Berbilang Masa: Sistem Kemasukan dan Keluar Dinamik Berdasarkan ZLEMA

Gambaran keseluruhan

Strategi perdagangan isyarat trend sifar kelewatan bingkai masa pelbagai adalah sistem perdagangan kuantitatif berdasarkan indeks bergerak rata-rata kelewatan sifar ((ZLEMA) yang bertujuan untuk mengurangkan ketinggalan rata-rata bergerak tradisional dan memberikan isyarat pengenalan trend yang lebih cepat dan tepat. Strategi ini bukan sahaja menggabungkan saluran turun naik untuk mengenal pasti perubahan trend, tetapi juga mengintegrasikan pelbagai mekanisme keluar yang fleksibel, termasuk pelaporan risiko, keluar dari keuntungan sasaran keluar, stop loss dan berhenti berdasarkan ATR, pergerakan pengesanan stop loss dan keluar melalui semua garis.

Prinsip Strategi

Prinsip utama strategi ini adalah berdasarkan purata bergerak indeks penundaan sifar (ZLEMA), yang merupakan penunjuk teknikal untuk meningkatkan kelajuan tindak balas purata bergerak dengan menghapuskan atau mengurangkan penundaan data harga. Langkah-langkah untuk melaksanakan adalah seperti berikut:

  1. Pengiraan tanpa kelewatanStrategi: Pertama, ZLEMA dikira dengan formula:zlema = ta.ema(src + (src - src[lag]), length)Antara lain:lagKaedah ini berkesan mengurangkan ketinggalan dalam EMA tradisional.

  2. Mekanisme pengenalan trend

    • Pada asas ZLEMA, saluran berfluktuasi ditambah ((seperti pita Brin), lebar saluran ditentukan oleh nilai maksimum ATR kali ganda
    • Apabila harga naik ke atas, trend berubah ke atas.
    • Trend berubah ke bawah apabila harga turun ke bawah
    • Sistem ini juga menyediakan fungsi pengesahan 5 baris K berturut-turut dengan arah ZLEMA, melaluizlemaUpTrenddanzlemaDownTrendPencapaian pemboleh ubah
  3. Syarat kemasukan yang pelbagai

    • Multiple entry: harga naik dan dalam julat tarikh
    • Kemasukan lebih lanjut: Syarat asas ditambah dengan pengesahan ZLEMA berterusan 5 garis K naik
    • Pendaftaran udara: harga di bawah landasan dan dalam julat tarikh (fungsi pilihan)
    • ZLEMA kembali ke garis sifar: harga kembali ke atas ZLEMA selepas sedikit perubahan dan masih dalam trend
  4. Sistem permainan dinamik komprehensif

    • Hadiah/Risk/Pendapatan Sasaran: Hadiah/Risk/Pendapatan Sasaran berdasarkan harga masuk dan titik henti
    • ATR asas berhenti dan berhenti: menggunakan ATR kali dinamik mengira berhenti dan berhenti kedudukan
    • ATR Tracking Stop Loss: Stop loss naik secara automatik mengikut pergerakan harga
    • Hentian imbangan keuntungan dan kerugian: Hentian kerugian dipindahkan ke harga masuk apabila keuntungan mencapai nisbah pulangan risiko tertentu
    • Keluar semula trend: keluar secara automatik apabila indikator trend bertukar
    • EMA keluar: keluar apabila harga melepasi EMA tertentu

Kelebihan Strategik

Strategi perdagangan isyarat trend tanpa kelewatan pada pelbagai kerangka masa mempunyai kelebihan yang ketara:

  1. Mengurangkan ketinggalan isyaratDengan menggunakan teknologi ZLEMA, ia mengurangkan kelewatan pada purata bergerak tradisional, menjadikan pengiktirafan trend lebih awal dan dapat menangkap titik permulaan trend lebih awal.

  2. Sistem pengurusan risiko yang komprehensifMengintegrasikan mekanisme kawalan risiko pelbagai peringkat, dari penutupan tetap, penutupan ATR, penutupan pengesanan, penutupan imbangan kerugian, untuk memberikan perlindungan yang sempurna untuk keadaan pasaran yang berbeza.

  3. Pilihan perdagangan yang fleksibelIa boleh dikonfigurasikan sebagai strategi berbilang cara atau strategi perdagangan dua hala untuk menyesuaikan diri dengan keutamaan pasaran dan persekitaran peraturan yang berbeza.

  4. Mekanisme kemasukan semula: Menggunakan fungsi ZLEMA Zero Line Re-Entry, membolehkan masuk semula dalam trend yang kuat selepas penyesuaian jangka pendek, memaksimumkan keuntungan trend.

  5. Strategi Keluar BerbezaIa menawarkan pelbagai pilihan untuk keluar dari pasaran yang berbeza, baik untuk mengunci keuntungan dengan sasaran keuntungan, atau untuk memaksa keuntungan untuk berlari dengan menjejaki henti kerugian.

  6. Pembantu visual: Menunjukkan isyarat perdagangan dan kedudukan pengurusan risiko secara langsung melalui elemen visual seperti bayangan trend, garis stop loss, garis stop dan penunjuk trend.

  7. Statistik prestasi terperinciTabel statistik perdagangan bersepadu yang memaparkan petunjuk utama seperti kadar kemenangan, keuntungan bersih, dan pengeluaran maksimum untuk menilai dan mengoptimumkan strategi.

Risiko Strategik

Walaupun strategi ini direka dengan baik, terdapat beberapa risiko yang perlu diperhatikan:

  1. Kepekaan ParameterParameter teras seperti panjang ZLEMA dan kali ATR mempunyai kesan yang ketara terhadap prestasi strategi, dan penyesuaian yang tidak betul boleh menyebabkan terlalu banyak atau terlalu sedikit isyarat.

  2. Isyarat palsu pasaran yang bergolakDalam pasaran yang bergolak tanpa trend yang jelas, isyarat palsu yang kerap boleh menyebabkan kerugian berterusan.

  3. Risiko pembalikan arah aliranWalaupun terdapat pelbagai mekanisme untuk keluar, ia mungkin akan menyebabkan kerugian yang lebih besar jika trend berubah secara drastik.

  4. Risiko terlalu serasiKombinasi pelbagai parameter mungkin menyebabkan data sejarah terlalu sesuai dan tidak berfungsi dengan baik dalam keadaan pasaran masa depan.

  5. Isyarat kitaran panjang jarang berlakuApabila menggunakan panjang ZLEMA yang lebih panjang, strategi mungkin menghasilkan kurang isyarat perdagangan, menjejaskan kecekapan penggunaan dana.

  6. Cabaran KesempurnaanHentian berdasarkan ATR mungkin terlalu lebar dalam pasaran yang bergelombang tinggi, menyebabkan kerugian tunggal yang terlalu besar; dan dalam pasaran yang bergelombang rendah mungkin terlalu sempit, menyebabkan ia sering dicetuskan.

Kaedah untuk mengurangkan risiko ini merangkumi: pengulangan parameter yang ketat dan pengesahan ke hadapan, mengelakkan perdagangan di pasaran yang bergolak, menerapkan peraturan pengurusan wang yang ketat, dan mengoptimumkan semula parameter strategi secara berkala untuk menyesuaikan diri dengan perubahan pasaran.

Arah pengoptimuman strategi

Strategi ini mempunyai banyak ruang untuk pengoptimuman yang dapat meningkatkan prestasi dari arah berikut:

  1. Parameter dinamik menyesuaikan diriPembangunan mekanisme penyesuaian diri untuk menyesuaikan panjang ZLEMA dan ATR secara automatik mengikut turun naik pasaran, meningkatkan penyesuaian strategi dalam keadaan pasaran yang berbeza.

  2. Penapis keadaan pasaranMemperkenalkan penunjuk keadaan pasaran (seperti ADX, penunjuk turun naik), berdagang hanya dalam keadaan pasaran yang menguntungkan, dan mengelakkan perdagangan yang kerap dalam pasaran bergolak yang tidak cekap.

  3. Pengesahan pelbagai kerangka masaMeningkatkan kadar kejayaan: Bergabung dengan arah trend dalam jangka masa yang lebih tinggi, dan hanya menyertai apabila arah trend yang besar adalah sama.

  4. Pengesahan jumlah transaksiMengintegrasikan penunjuk jumlah dagangan sebagai pengesahan tambahan, contohnya, isyarat perubahan trend hanya disahkan apabila jumlah dagangan meningkat.

  5. Pengoptimuman Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin untuk mencari kombinasi parameter dan masa masuk yang optimum, terutamanya untuk melatih model untuk meramalkan isyarat mana yang lebih mungkin berjaya.

  6. Penapis bermusim dan masaTambah waktu dagangan dan penapis kalendar untuk mengelakkan masa dagangan yang tidak cekap atau berisiko tinggi.

  7. Analisis hubungan aset yang berkaitanPendahuluan: Memperkenalkan analisis relevansi bagi aset-aset yang berkaitan, meningkatkan kebolehpercayaan isyarat semasa pengesahan simetri pelbagai aset.

Arahan pengoptimuman ini bukan sahaja dapat meningkatkan kestabilan dan keuntungan strategi, tetapi juga dapat mengurangkan risiko, menjadikannya lebih sesuai untuk keadaan pasaran yang berbeza dan pilihan risiko individu.

ringkaskan

Strategi perdagangan isyarat trend sifar kelewatan bingkai masa pelbagai adalah sistem perdagangan kuantitatif yang komprehensif dan fleksibel yang membolehkan pengenalan trend yang cepat dan tepat melalui teknologi indeks bergerak rata-rata ((ZLEMA) dan saluran turun naik, dan digabungkan dengan mekanisme pengurusan risiko dinamik bertingkat untuk melindungi keselamatan dana. Strategi ini dapat menangkap peluang masuk pada awal trend dan memaksimumkan keuntungan melalui mekanisme masuk semula dalam perkembangan trend, sambil menyediakan pelbagai strategi keluar yang sesuai dengan keadaan pasaran yang berbeza.

Kelebihan utama strategi adalah mengurangkan keterlambatan isyarat, menyediakan sistem pengurusan risiko yang komprehensif dan pilihan konfigurasi perdagangan yang fleksibel. Walau bagaimanapun, pengguna perlu berhati-hati terhadap risiko yang berpotensi seperti sensitiviti parameter, isyarat palsu di pasaran yang bergolak dan kecocokan berlebihan.

Sebagai sistem perdagangan kuantitatif berdasarkan petunjuk teknikal, strategi ini sangat sesuai untuk perdagangan trend jangka panjang dan jangka panjang, yang boleh digunakan di pelbagai pasaran kewangan. Walau bagaimanapun, strategi apa pun memerlukan penyesuaian peribadi berdasarkan matlamat perdagangan individu, toleransi risiko dan keutamaan pasaran, dan digabungkan dengan prinsip pengurusan wang yang ketat untuk digunakan dalam perdagangan sebenar.

Kod sumber strategi
//@version=6
// Quant Trading Pro www.quanttradingpro.com
// #1 Strategy Optimizer on the chrome extension store Quant Trading Strategy Optimizer


strategy(title="Quant Trading Zero Lag Trend Signals (MTF) Strategy", shorttitle="QT0️⃣Zero Lag Signals Strategy", overlay=true, 
     commission_type=strategy.commission.percent, 
     commission_value=0.1, 
     slippage=3, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=1000, 
     margin_long=0, 
     margin_short=0)

// === INPUT PARAMETERS ===

// 📌 1️⃣ Main Calculations
length = input.int(70, title="Length", minval=70, maxval=7000)
mult   = input.float(1.2, "Band Multiplier", group="Main Calculations")

// === 📊 Trade Data Toggles ===
showFloatingTable = input.bool(true, "Show Floating Stats Table?", group="Trade Data")
showTradeLog      = input.bool(false, "Show Trade Log Labels on Chart?", group="Trade Data")
enableCSVExport = input.bool(false, "Enable CSV Export", group="Trade Data")

// 📌 ZLEMA Trend Confirmation for Entries
useZlemaTrendConfirm = input.bool(false, "Use ZLEMA Trend Confirmation for entry?", group="Entry Conditions")
reEnterOnLongTrend = input.bool(false, "Re-Enter on Long Trend continuation", group="Entry Conditions")

// 📌 2️⃣ Short Trades
allowShortTrades = input.bool(false, "Allow Short Trades?", group="Short Trades")

// 📌 Performance Settings
useProfitTarget  = input.bool(false, "Use Profit Target?", group="Performance Settings")
profitTargetRR   = input.float(2.0, "Profit Target (Risk-Reward Ratio)", group="Performance Settings")


// 📌 4️⃣ Dynamic TP/SL (Each Setting with Its Parameters Directly Below)
useATRStopTP    = input.bool(false, "Use ATR-Based Stop-Loss & Take-Profit?", group="Dynamic TP/SL")
atrLength       = input.int(14, "ATR Length", group="Dynamic TP/SL")
atrMultiplier   = input.float(1.5, "Stop-Loss ATR Multiplier", group="Dynamic TP/SL")
profitATRMultiplier = input.float(2.5, "Profit Target ATR Multiplier", group="Dynamic TP/SL")

useTrailingStop = input.bool(false, "Use ATR Trailing Stop?", group="Dynamic TP/SL")
trailStopMultiplier = input.float(1.5, "Trailing Stop ATR Multiplier", group="Dynamic TP/SL")

useBreakEven    = input.bool(false, "Use Break-Even Stop-Loss?", group="Dynamic TP/SL")
breakEvenRR     = input.float(1.5, "Move SL to Break-Even After RR", group="Dynamic TP/SL")

useTrendExit    = input.bool(false, "Use Trend-Based Take Profit (EMA Exit)?", group="Dynamic TP/SL")
emaExitLength   = input.int(9, "EMA Exit Length", group="Dynamic TP/SL")

// 📌 Debug Options
showZlemaDebug = input.bool(false, "Show ZLEMA Trend Debug?", group="Debug")




// ============================================================
// === 1️⃣ CALCULATIONS (Indicators, Trend, ATR, Stop/TP) ===
// ============================================================
src        = close
lag        = math.floor((length - 1) / 2)
zlema      = ta.ema(src + (src - src[lag]), length)
volatility = ta.highest(ta.atr(length), length * 3) * mult

var trend  = 0
if ta.crossover(close, zlema + volatility)
    trend := 1
if ta.crossunder(close, zlema - volatility)
    trend := -1

atrValue = ta.atr(atrLength)
emaExit  = ta.ema(close, emaExitLength)

var float stopLossLongLevel = na
var float profitTargetLongLevel = na
var float stopLossShortLevel = na
var float profitTargetShortLevel = na

var int lastEntryBarIndex = na
var float lastEntryPrice = na

// ✅ Corrected ZLEMA DownTrend Logic: Ensure ZLEMA has decreased for 5 consecutive bars
// ✅ ZLEMA Increasing for 5 Bars → Bullish Trend (Green Triangle Up at the Bottom)
zlemaUpTrend = zlema > zlema[1] and zlema[1] > zlema[2] and zlema[2] > zlema[3] and zlema[3] > zlema[4]

// ✅ ZLEMA Decreasing for 5 Bars → Bearish Trend (Red Triangle Down at the Top)
zlemaDownTrend = zlema < zlema[1] and zlema[1] < zlema[2] and zlema[2] < zlema[3] and zlema[3] < zlema[4]

if ta.crossover(trend, 0) // Long Entry
    stopLossLongLevel := useATRStopTP ? close - (atrValue * atrMultiplier) : zlema - volatility
    profitTargetLongLevel := useProfitTarget ? (close + ((close - stopLossLongLevel) * profitTargetRR)) : na

if ta.crossunder(trend, 0) // Short Entry
    stopLossShortLevel := useATRStopTP ? close + (atrValue * atrMultiplier) : zlema + volatility
    profitTargetShortLevel := useProfitTarget ? (close - ((stopLossShortLevel - close) * profitTargetRR)) : na

// ATR-Based Stop-Loss Levels for Trade Exits
var float atrStopLossLong = na
var float atrStopLossShort = na

if useATRStopTP
    if strategy.position_size > 0  // Long Position
        atrStopLossLong := na(atrStopLossLong) or strategy.position_size[1] == 0 ? close - (atrValue * atrMultiplier) : math.max(nz(atrStopLossLong[1]), close - (atrValue * atrMultiplier))  // Prevents SL from decreasing

    if strategy.position_size < 0  // Short Position
        atrStopLossShort := na(atrStopLossShort) or strategy.position_size[1] == 0 ? close + (atrValue * atrMultiplier) : math.min(nz(atrStopLossShort[1]), close + (atrValue * atrMultiplier))  // Prevents SL from increasing

// ATR-Based Take-Profit Levels
var float atrTakeProfitLong = na
var float atrTakeProfitShort = na

if useATRStopTP
    if strategy.position_size > 0  // Long Position
        atrTakeProfitLong := strategy.position_avg_price + (atrValue * profitATRMultiplier)  // Dynamic TP Based on ATR

    if strategy.position_size < 0  // Short Position
        atrTakeProfitShort := strategy.position_avg_price - (atrValue * profitATRMultiplier)  // Dynamic TP Based on ATR


// ATR Trailing Stop Levels for Trade Exits and Visualization
var float trailStopLongLine = na
var float trailStopShortLine = na

if useTrailingStop
    if strategy.position_size > 0  // Long Position
        trailStopLongLine := na(trailStopLongLine) or strategy.position_size[1] == 0 ? close - (atrValue * trailStopMultiplier) : 
                               math.max(nz(trailStopLongLine[1]), close - (atrValue * trailStopMultiplier))

    if strategy.position_size < 0  // Short Position
        trailStopShortLine := na(trailStopShortLine) or strategy.position_size[1] == 0 ? close + (atrValue * trailStopMultiplier) : 
                               math.min(nz(trailStopShortLine[1]), close + (atrValue * trailStopMultiplier))

// ============================================================
// === 2️⃣ ENTRY & EXIT LOGIC (Conditions for Trading) ===
// ============================================================


// ✅ Entry Conditions for Long Trades
longCondition = ta.crossover(trend, 0) and close > zlema + volatility 
canEnterLong = strategy.position_size == 0 or strategy.position_size[1] < 0  // Allows long entry right after short exit

if useZlemaTrendConfirm
    longCondition := longCondition and zlemaUpTrend  // Ensure ZLEMA Uptrend is true for long entries

// 🔥 Enforce that `longCondition` CANNOT be true if `zlemaUpTrend` is false
if useZlemaTrendConfirm and not zlemaUpTrend
    longCondition := false

// ✅ Entry Conditions for Short Trades
shortCondition = allowShortTrades and ta.crossunder(trend, 0) and close < zlema - volatility
canEnterShort = strategy.position_size == 0 or strategy.position_size[1] > 0  // Allows short entry right after long exit

if useZlemaTrendConfirm
    shortCondition := shortCondition and zlemaDownTrend  // Ensure ZLEMA Downtrend is true for short entries

// ✅ Long Re-Entry Condition: ZLEMA is green, position is flat, price closed below and now above ZLEMA
reEntryLongCondition = reEnterOnLongTrend and
     trend == 1 and
     trend[1] == 1 and  // ✅ Previous bar must also be in bullish trend (prevents triggering on trend change)
     strategy.position_size == 0 and
     close[1] < zlema[1] and
     close > zlema 


// ✅ Debugging: Display `longCondition` and `zlemaUpTrend` values only if the checkbox is checked
if showZlemaDebug and ta.crossover(trend, 0)
    label.new(x=bar_index, y=low, 
              text="LongCondition: " + str.tostring(longCondition) + 
                   "\nZLEMA UpTrend: " + str.tostring(zlemaUpTrend),
              color=color.white, textcolor=color.black, size=size.small, style=label.style_label_down)



// ============================================================
// === 3️⃣ TRADE EXECUTIONS (Entries, ATR SL/TP, Trailing Stop, Trend Exit) ===
// ============================================================

// 📌 Entry Conditions
if (canEnterLong and longCondition) or reEntryLongCondition
    lastEntryBarIndex := bar_index
    lastEntryPrice := close
    
    // 🛠️ Reset all SL/TP levels on Long Entry or Re-Entry
    if reEntryLongCondition
        // Trend-Based SL/TP
        stopLossLongLevel := useATRStopTP ? na : zlema - volatility
        profitTargetLongLevel := useProfitTarget and not useATRStopTP ? (close + ((close - stopLossLongLevel) * profitTargetRR)) : na

        // ATR-Based SL/TP
        atrStopLossLong := useATRStopTP ? close - (atrValue * atrMultiplier) : na
        atrTakeProfitLong := useATRStopTP ? close + (atrValue * profitATRMultiplier) : na

        // Trailing Stop
        trailStopLongLine := useTrailingStop ? close - (atrValue * trailStopMultiplier) : na

    strategy.entry(id="Long", direction=strategy.long, comment=reEntryLongCondition ? "Re-Entry Long" : "Bullish Trend Change")


if canEnterShort and shortCondition
    lastEntryBarIndex := bar_index
    lastEntryPrice := close
    strategy.entry(id="Short", direction=strategy.short, comment="Bearish Trend Change")


// 📌 ATR-Based Stop-Loss Exits (Ensures SL Always Triggers Correctly)
if useATRStopTP and strategy.position_size > 0
    if low <= atrStopLossLong
        strategy.close("Long", comment="ATR SL Hit - Long")

if useATRStopTP and strategy.position_size < 0
    if high >= atrStopLossShort
        strategy.close("Short", comment="ATR SL Hit - Short")

// 📌 ATR-Based Stop-Loss & Take-Profit Exits (Ensures TP Always Executes)
if useATRStopTP and strategy.position_size > 0 and high >= atrTakeProfitLong
    strategy.close("Long", comment="ATR TP Hit - Long")

if useATRStopTP and strategy.position_size < 0 and low <= atrTakeProfitShort
    strategy.close("Short", comment="ATR TP Hit - Short")


// 📌 Profit Target Exits (Ensures TP Always Executes Independently)
if useProfitTarget and strategy.position_size > 0 and high >= profitTargetLongLevel
    strategy.close("Long", comment="Profit Target Hit - Long")

if useProfitTarget and strategy.position_size < 0 and low <= profitTargetShortLevel
    strategy.close("Short", comment="Profit Target Hit - Short")

// 📌 Stop-Loss for Profit Target Trades (Ensures Stop-Loss Works with TP)
if useProfitTarget and strategy.position_size > 0 and low <= stopLossLongLevel
    strategy.close("Long", comment="Stop-Loss Hit - Long")

if useProfitTarget and strategy.position_size < 0 and high >= stopLossShortLevel
    strategy.close("Short", comment="Stop-Loss Hit - Short")

// 📌 ATR Trailing Stop Loss (Ensures It Works Alongside Other Exits)
if useTrailingStop and strategy.position_size > 0 and low <= trailStopLongLine
    strategy.close("Long", comment="Trailing Stop Hit - Long")

if useTrailingStop and strategy.position_size < 0 and high >= trailStopShortLine
    strategy.close("Short", comment="Trailing Stop Hit - Short")

// 📌 Trend-Based Exit (Closes Position When Trend Reverses)
if strategy.position_size > 0 and ta.crossunder(trend, 0)
    strategy.close("Long", comment="Trend Change to Bearish")

if strategy.position_size < 0 and ta.crossover(trend, 0)
    strategy.close("Short", comment="Trend Change to Bullish")

// 📌 Break-Even Stop-Loss (Adjusts Stop to Entry Price at Set Risk-Reward Ratio)
if useBreakEven and strategy.position_size > 0 and high >= strategy.position_avg_price + (strategy.position_avg_price - atrStopLossLong) * breakEvenRR
    atrStopLossLong := strategy.position_avg_price

if useBreakEven and strategy.position_size < 0 and low <= strategy.position_avg_price - (atrStopLossShort - strategy.position_avg_price) * breakEvenRR
    atrStopLossShort := strategy.position_avg_price

// 📌 EMA Exit (Closes Position if Price Crosses EMA)
if useTrendExit and strategy.position_size > 0 and low < emaExit
    strategy.close("Long", comment="Exit on EMA")

if useTrendExit and strategy.position_size < 0 and high > emaExit
    strategy.close("Short", comment="Exit on EMA")



// ============================================================
// === 4️⃣ VISUALIZATIONS (Trend Shading, Stop-Loss, TP, ATR TS) ===
// ============================================================

// 🟢🔴 Restore Bullish/Bearish Trend Shading
zlemaColor = trend == 1 ? color.new(#00ffbb, 70) : color.new(#ff1100, 70)
m = plot(series=zlema, title="Zero Lag Basis", linewidth=2, color=zlemaColor)

upper = plot(zlema + volatility, style=plot.style_linebr, color=color.new(#ff1100, 90), title="Upper Deviation Band")
lower = plot(zlema - volatility, style=plot.style_linebr, color=color.new(#00ffbb, 90), title="Lower Deviation Band")

fill(plot1=m, plot2=upper, color=(trend == -1 ? color.new(#ff1100, 80) : na), title="Bearish Fill")
fill(plot1=m, plot2=lower, color=(trend == 1 ? color.new(#00ffbb, 80) : na), title="Bullish Fill")

// ✅ Plot a lime green TriangleUp at the bottom when ZLEMA has been going UP for 5 bars
plotshape(series=zlemaUpTrend ? low - ta.atr(5) * 0.5 : na, 
          location=location.bottom, style=shape.triangleup, 
          color=color.lime, title="ZLEMA Uptrend Detected")

// ✅ Plot a red TriangleDown at the top when ZLEMA has been going DOWN for 5 bars
plotshape(series=zlemaDownTrend ? high + ta.atr(5) * 0.5 : na, 
          location=location.top, style=shape.triangledown, 
          color=color.red, title="ZLEMA Downtrend Detected")

// 🔴 Default Stop-Loss Lines (Red) - Only Show If ATR SL/TP Is Not Used
plot(series=(not useATRStopTP and strategy.position_size > 0) ? stopLossLongLevel : na, 
     style=plot.style_linebr, color=color.red, linewidth=2, title="Trend Stop-Loss - Long")

plot(series=(not useATRStopTP and strategy.position_size < 0) ? stopLossShortLevel : na, 
     style=plot.style_linebr, color=color.red, linewidth=2, title="Trend Stop-Loss - Short")

// 🟠 ATR Trailing Stop Loss Line (Thin Orange Line) - Only Draw When Checkbox is Checked
plot(series=(useTrailingStop and strategy.position_size > 0) ? trailStopLongLine : na, 
     style=plot.style_linebr, color=color.new(color.orange, 70), linewidth=1, title="ATR Trailing Stop - Long")

plot(series=(useTrailingStop and strategy.position_size < 0) ? trailStopShortLine : na, 
     style=plot.style_linebr, color=color.new(color.orange, 70), linewidth=1, title="ATR Trailing Stop - Short")

// ✅ ATR-Based Stop-Loss Visualization (Ensures Line Stays Until Trade Closes)
plot(series=(useATRStopTP and strategy.position_size > 0) ? atrStopLossLong : na, 
     style=plot.style_linebr, color=color.new(color.red, 50), linewidth=2, title="ATR-Based Stop-Loss - Long")

plot(series=(useATRStopTP and strategy.position_size < 0) ? atrStopLossShort : na, 
     style=plot.style_linebr, color=color.new(color.red, 50), linewidth=2, title="ATR-Based Stop-Loss - Short")

// ✅ ATR-Based Take-Profit Visualization (Ensures Line Stays Until Trade Closes)
plot(series=(useATRStopTP and strategy.position_size > 0) ? atrTakeProfitLong : na, 
     style=plot.style_linebr, color=color.new(color.green, 50), linewidth=2, title="ATR-Based Take-Profit - Long")

plot(series=(useATRStopTP and strategy.position_size < 0) ? atrTakeProfitShort : na, 
     style=plot.style_linebr, color=color.new(color.green, 50), linewidth=2, title="ATR-Based Take-Profit - Short")

// ✅ Standard Profit Target Visualization (Only Active if ATR SL/TP is NOT Used)
plot(series=(useProfitTarget and not useATRStopTP and strategy.position_size > 0) ? profitTargetLongLevel : na, 
     style=plot.style_linebr, color=color.green, linewidth=2, title="Profit Target - Long")

plot(series=(useProfitTarget and not useATRStopTP and strategy.position_size < 0) ? profitTargetShortLevel : na, 
     style=plot.style_linebr, color=color.green, linewidth=2, title="Profit Target - Short")

// === 📋 FLOATING TABLE: STRATEGY PERFORMANCE & SETTINGS ===

// === Track first and last trade times ===
var int firstTradeTime = na
var int lastTradeTime = na

if strategy.opentrades > 0 and na(firstTradeTime)
    firstTradeTime := time

if strategy.closedtrades > 0
    lastTradeTime := time

// === Format trade date strings safely ===
firstDateStr = "N/A"
lastDateStr  = "N/A"

if not na(firstTradeTime)
    firstDateStr := str.tostring(month(firstTradeTime)) + "/" + str.tostring(dayofmonth(firstTradeTime)) + "/" + str.tostring(year(firstTradeTime) % 100)

if not na(lastTradeTime)
    lastDateStr := str.tostring(month(lastTradeTime)) + "/" + str.tostring(dayofmonth(lastTradeTime)) + "/" + str.tostring(year(lastTradeTime) % 100)