Strategi Menangkap Tren Pembalikan Volume

SMA ATR VOLUME ETH RTH TP SL
Tanggal Pembuatan: 2025-05-13 10:39:29 Akhirnya memodifikasi: 2025-05-13 10:39:29
menyalin: 1 Jumlah klik: 346
2
fokus pada
319
Pengikut

Strategi Menangkap Tren Pembalikan Volume Strategi Menangkap Tren Pembalikan Volume

Tinjauan Strategi

Strategi menangkap tren reversal volume adalah metode perdagangan kuantitatif berdasarkan volume perdagangan yang tidak biasa dan perilaku harga, yang bertujuan untuk mengidentifikasi saat-saat penting di mana pasar mungkin mengalami reversal arah. Inti dari strategi ini adalah mencari K-line dengan volume perdagangan yang jauh lebih tinggi dari rata-rata dan, ketika volume perdagangan turun, membuat keputusan perdagangan yang berlawanan berdasarkan arah tren sebelumnya.

Prinsip Strategi

Prinsip inti dari strategi ini didasarkan pada fenomena pembalikan tren setelah volume perdagangan yang tidak biasa di pasar. Logika operasi spesifiknya adalah sebagai berikut:

  1. Identifikasi volume transaksi yang tidak normalSistem mendeteksi apakah K-line sebelumnya memiliki volume transaksi yang jauh lebih tinggi dari rata-rata. Pada periode perdagangan normal (RTH), volume transaksi perlu melebihi 3 kali lipat volume transaksi rata-rata terbaru (RTH) yang dapat disesuaikan. Pada periode pasca atau khusus (ETH), perlu melebihi 5 kali lipat volume transaksi. Perhitungan volume transaksi rata-rata secara otomatis mengecualikan periode marginal RTH, 4-6 hari setelah penutupan dan hari Minggu sebelum penutupan.

  2. Konfirmasi penurunan volume transaksi: Volume transaksi pada K-line saat ini harus lebih rendah dari volume transaksi pada K-line sebelumnya, yang menunjukkan bahwa transaksi besar telah berakhir.

  3. Menentukan arah tren: Mengidentifikasi arah tren dengan membandingkan hubungan antara harga close out sebelum volume transaksi yang tidak normal K-line dengan SMA (simple moving average).

  4. Sinyal masuk mundur

    • Melakukan sinyal lebih: Ketika volume K yang tidak normal berada di depan garis K sebagai tren turun ((harga penutupan lebih rendah dari SMA), dan volume K saat ini lebih rendah.
    • Sinyal shorting: ketika volume K yang tidak normal adalah tren bullish ((harga penutupan lebih tinggi dari SMA), dan volume K saat ini lebih rendah.
  5. Penetapan

    • Buat lebih banyak: Setel harga batas dengan volume transaksi yang luar biasa dengan harga minimum K line.
    • Tentukan harga terendah untuk K-line dengan volume transaksi yang tidak normal.
  6. Manajemen RisikoAda dua jenis pengaturan stop loss / stop stop yang tersedia, tergantung pada karakteristik varietas:

    • Untuk varietas tertentu (misalnya NQ): Stop loss dan stop loss dengan pengaturan poin tetap.
    • Untuk varietas lain: Anda dapat memilih stop loss / stop stop yang dinamis berdasarkan ATR, atau menggunakan nilai tetap.
  7. Filter waktuStrategi: Filter secara selektif sinyal perdagangan RTH selama 15 menit pertama dan terakhir, dan selalu filter sinyal pada saat penutupan setelah penutupan dan sebelum penutupan pada hari Minggu.

Keunggulan Strategis

  1. Menangkap titik balikStrategi ini berfokus pada menangkap titik-titik pivot pasar yang muncul seiring volume transaksi yang tidak biasa, yang biasanya mewakili perubahan signifikan dalam sentimen pasar, yang memberikan peluang perdagangan dengan tingkat kemenangan yang lebih tinggi.

  2. Tempat Masuk yang TepatDengan menggunakan harga terbatas untuk masuk pada titik tinggi/rendah dari volume transaksi K yang luar biasa, untuk memastikan perdagangan pada tingkat harga yang penting secara teknis, meningkatkan akurasi masuk.

  3. Adaptasi yang dapat diidentifikasiStrategi: Kriteria penilaian volume transaksi yang tidak biasa secara dinamis sesuai dengan waktu perdagangan yang berbeda (waktu perdagangan normal vs waktu pasca perdagangan / waktu khusus), lebih sesuai dengan situasi pasar yang sebenarnya.

  4. Manajemen risiko yang fleksibel: Menyediakan opsi stop loss / stop loss berdasarkan nilai tetap dan ATR, yang dapat diatur secara individual sesuai dengan karakteristik dan volatilitas dari berbagai varietas.

  5. Filter waktu cerdas: Mengidentifikasi dan memfilter secara otomatis saat transaksi yang kurang likuid dan tidak stabil, untuk menghindari sinyal palsu yang mudah muncul di sekitar pembukaan dan penutupan pasar.

  6. Umpan balik visual yang jelasStrategi: memberikan petunjuk visual yang intuitif pada grafik, termasuk K-line highlight volume yang tidak normal, SMA tren, stop loss stop loss, yang memudahkan pemantauan dan analisis pedagang.

  7. Pelaksanaan otomatisSetelah memenuhi persyaratan, sistem akan secara otomatis melakukan pesanan dengan batas harga dan pengaturan stop loss, mengurangi intervensi manusia dan menjaga disiplin perdagangan.

Risiko Strategis

  1. Risiko Penembusan PalsuVolume perdagangan yang tidak biasa dapat menyebabkan harga untuk jangka pendek untuk mencapai level penting, tetapi kemudian dapat dengan cepat mundur, menyebabkan sinyal yang salah. Untuk mengurangi risiko ini, pertimbangkan untuk menambahkan indikator konfirmasi, seperti RSI overbought / oversold konfirmasi atau persyaratan durasi penembusan.

  2. Efek dari peristiwa yang didorong oleh beritaData ekonomi besar atau pengumuman perusahaan dapat menyebabkan volume transaksi yang tidak biasa, tetapi reaksi ini cenderung berlangsung lebih lama daripada segera dibalik. Disarankan untuk menangguhkan strategi atau menambahkan kondisi penyaringan sebelum dan sesudah pengumuman data ekonomi besar.

  3. Risiko perubahan lingkungan pasarDalam pasar tren kuat, perdagangan berlawanan mungkin menghadapi pergerakan harga yang terus-menerus merugikan. Pertimbangkan untuk menambahkan filter tren jangka panjang untuk menghindari operasi berlawanan dalam lingkungan tren kuat.

  4. Risiko tidak terjual: Jika harga tidak mencapai tingkat harga batas yang ditetapkan pada garis K berikutnya, sinyal perdagangan mungkin tidak berlaku. Anda dapat mempertimbangkan untuk mengatur periode validitas maksimum, atau beralih ke harga pasar dalam kondisi tertentu.

  5. Risiko likuiditas rendahMeskipun strategi ini telah menyertakan fitur penyaringan waktu, beberapa varietas mungkin masih menghadapi kekurangan likuiditas pada waktu tertentu.

  6. Risiko Optimasi ParameterParameter strategi yang dioptimalkan secara berlebihan dapat menyebabkan kinerja yang buruk di masa depan dengan data historis yang terlalu cocok. Parameter harus dijamin dalam kisaran yang wajar dan validasi strategi yang kuat melalui pengujian luar sampel.

Arah optimasi strategi

  1. Konfirmasi multi-periode: Tambahkan filter tren untuk periode waktu yang lebih tinggi, memastikan bahwa ada tingkat kemenangan yang lebih tinggi di arah tren yang lebih besar. Misalnya, Anda dapat memeriksa arah tren sundial dan hanya masuk jika sesuai dengan tren sundial.

  2. Penilaian Kualitas Volume TransaksiSelain ukuran energi kuantitatif murni, dapat dipertimbangkan untuk meningkatkan penilaian kualitas volume transaksi, seperti deviasi dari volume transaksi yang tertimbang rata-rata harga (VWAP), untuk lebih memahami perilaku pasar di balik volume transaksi yang besar.

  3. Strategi Stop Loss Dinamis: Mengimplementasikan stop loss dinamis berdasarkan volatilitas, secara otomatis menyesuaikan posisi stop loss dan mengunci sebagian dari keuntungan saat perdagangan bergerak ke arah yang menguntungkan. Misalnya, stop loss dapat digunakan untuk melacak atau stop loss dapat dipindahkan ke harga biaya setelah level kritis telah terjatuh.

  4. Filter relevansi multi-varietasUntuk varietas terkait (seperti indeks saham berjangka dan tunai, emas dan perak, dll), menambahkan indikator konfirmasi varietas terkait dapat meningkatkan kualitas sinyal. Sinyal mungkin lebih dapat diandalkan ketika beberapa varietas terkait mengalami volume perdagangan dan perilaku harga yang tidak biasa pada saat yang sama.

  5. Optimalisasi Pembelajaran Mesin: Analisis algoritma pembelajaran mesin untuk menganalisis karakteristik model volume transaksi yang tidak biasa yang paling sukses dalam data historis, menyesuaikan kondisi dan parameter masuk secara dinamis. Misalnya, pohon keputusan atau hutan acak dapat digunakan untuk memprediksi tindakan terbaik di bawah karakteristik volume transaksi yang tidak biasa.

  6. Adaptasi fluktuasi: Mengatur kriteria untuk menentukan volume transaksi yang tidak normal dan tingkat stop loss / stop loss sesuai dengan kondisi volatilitas pasar saat ini. Dalam lingkungan dengan volatilitas tinggi, meningkatkan volume yang tidak normal dapat menentukan nilai ambang dan mengurangi jarak stop loss; Di lingkungan dengan volatilitas rendah, sebaliknya.

  7. Menambahkan filter dasarPada tanggal rilis data ekonomi besar atau laporan keuangan kuartal, sesuaikan parameter strategi atau hentikan perdagangan untuk menghindari sinyal palsu yang disebabkan oleh gangguan berita.

Meringkaskan

Strategi menangkap tren reversal volume perdagangan adalah sistem perdagangan kuantitatif yang berfokus pada volume perdagangan dan perilaku harga untuk menangkap titik balik potensial dengan mengidentifikasi perubahan sentimen pasar setelah volume perdagangan yang tidak biasa. Strategi ini secara teknis mendefinisikan persyaratan masuk, keluar, dan aturan manajemen risiko, dan menyertakan mekanisme penyaringan waktu cerdas untuk menghindari periode kualitas rendah di pasar.

Keunggulan utama dari strategi ini adalah bahwa strategi ini secara akurat menangkap “bentuk jari tengah” pasar yang sering kali menciptakan peluang reversal jangka pendek ketika banyak peserta pasar masuk dan kemudian menarik diri. Strategi ini memberikan metode perdagangan yang disiplin dengan penentuan posisi harga yang tepat pada tingkat harga kritis dengan pembatasan harga yang sederhana dan didukung oleh manajemen stop loss yang masuk akal.

Namun, pengguna harus memperhatikan potensi risiko strategi di pasar tren yang kuat, serta sensitivitas terhadap peristiwa berita. Dengan menambahkan konfirmasi periode multi-waktu, menyesuaikan parameter secara dinamis, dan meningkatkan mekanisme manajemen risiko, strategi dapat lebih mengoptimalkan stabilitas dan adaptasi kinerjanya.

Secara keseluruhan, strategi untuk menangkap tren reversal volume perdagangan memberikan pedagang sistem perdagangan yang didasarkan pada perilaku pasar dan prinsip-prinsip psikologi, yang sangat cocok untuk pasar yang berfluktuasi dan situasi yang bergejolak. Dengan pengaturan yang masuk akal dan pengoptimalan berkelanjutan, strategi ini diharapkan menjadi alat yang efektif dalam portofolio perdagangan.

Kode Sumber Strategi
/*backtest
start: 2024-05-13 00:00:00
end: 2025-05-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Strategy Title Reflects Latest Logic
strategy(title="Middle Finger Trading Strategy",
         shorttitle="Middle_Finger",
         overlay=true,
         pyramiding=0, // Only one entry at a time
         default_qty_type=strategy.percent_of_equity,
         default_qty_value=1, // Trade 1% of equity
         commission_value=0.04, // Example commission (adjust as needed)
         commission_type=strategy.commission.percent,
         initial_capital = 10000, // Example starting capital
         process_orders_on_close=false // Important for limit orders to potentially fill intra-bar
         )

// --- Inputs ---

// Volume Settings Group
grp_vol = "Volume Settings"
float rthHugeVolMultiplier = input.float(3.0, title="1. RTH Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for core RTH (9:45-15:44 ET)")
float ethHugeVolMultiplier = input.float(5.0, title="2. ETH/Excluded Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for ETH and first/last 15min RTH (default 5x)")
int   volLookback         = input.int(20, title="3. Volume SMA Lookback", minval=1, group=grp_vol, tooltip="Lookback for calculating the filtered average volume (Used ONLY for identifying the HUGE spike)")
// Removed normalVolMultiplier as it's no longer used for entry confirmation

// Trend Settings Group
grp_trend = "Trend Settings"
int   trendLookback       = input.int(20, title="1. Trend SMA Lookback", minval=2, group=grp_trend, tooltip="Lookback period for the Simple Moving Average used to determine the trend before the spike")

// Risk Management Group
grp_risk = "Risk Management (SL/TP)"
string nqTargetTickerId   = input.string("CME:NQ1!", title="1. Target Ticker ID for Fixed NQ Points", group=grp_risk, tooltip="Specify the exact Ticker ID (e.g., CME:NQ1!, TVC:NDX) for fixed SL/TP. Found in Symbol Info.")
float nqFixedStopPoints   = input.float(20.0, title="2. Fixed SL Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
float nqFixedTpPoints     = input.float(50.0, title="3. Fixed TP Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)

// General SL/TP Settings (used if NOT the target ticker)
bool  useAtrStops         = input.bool(true, title="4. Use ATR for SL/TP (Other Tickers)?", group=grp_risk)
int   atrLookback         = input.int(14, title="5. ATR Lookback", group=grp_risk, inline="atr_other")
float atrStopMultiplier   = input.float(2.0, title="6. ATR SL Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float atrTpMultiplier     = input.float(4.0, title="7. ATR TP Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float fixedStopPoints     = input.float(100.0, title="6. Fixed SL Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
float fixedTpPoints       = input.float(200.0, title="7. Fixed TP Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)

// Time Filter Settings Group
grp_time = "Time Filter (ET)"
bool  enableEntryFilterRthEdges = input.bool(true, title="1. Filter Entries First/Last 15 Min RTH (ET)?", group=grp_time, tooltip="If checked, ignores entries from 9:30-9:44 ET and 15:45-15:59 ET. Avg Vol calc *always* filters these times, 4-6PM ET, and Sun pre-6PM ET.")
string targetTimezone     = "America/New_York" // Specify Eastern Time zone

// --- Time Calculation Function ---
isTimeInSession(t, tz, sessionString) =>
    not na(time(timeframe.period, sessionString, tz))

// --- Time Context Functions ---
getTimeContext(t, tz) =>
    h = hour(t, tz)
    m = minute(t, tz)
    d = dayofweek(t, tz)

    // Core RTH: 9:45 AM to 15:44 PM ET (Mon-Fri)
    bool isCoreRTH = d >= dayofweek.monday and d <= dayofweek.friday and
       ((h == 9 and m >= 45) or (h >= 10 and h <= 14) or (h == 15 and m <= 44))

    // Excluded RTH Edges: 9:30-9:44 ET and 15:45-15:59 ET (Mon-Fri)
    bool isExcludedRTH = d >= dayofweek.monday and d <= dayofweek.friday and
       ((h == 9 and m >= 30 and m <= 44) or (h == 15 and m >= 45))

    // After Hours Closed: 4:00 PM to 5:59 PM ET (Mon-Fri)
    bool isAfterHoursClosed = d >= dayofweek.monday and d <= dayofweek.friday and
       (h >= 16 and h < 18)

    // Sunday Pre-Market: Sunday before 6:00 PM ET
    bool isSundayPreMarket = d == dayofweek.sunday and h < 18

    // Combine ALL periods where activity should be ignored or volume excluded from avg
    bool isExcludedPeriod = isExcludedRTH or isAfterHoursClosed or isSundayPreMarket

    [isCoreRTH, isExcludedRTH, isAfterHoursClosed, isSundayPreMarket, isExcludedPeriod]

// --- Get Time Context for Current and Previous Bar ---
[isCurrentBarCoreRTH, isCurrentBarExcludedRTH, isCurrentBarAfterHoursClosed, isCurrentBarSundayPreMarket, isCurrentBarExcludedPeriod] = getTimeContext(time, targetTimezone)
[isPreviousBarCoreRTH, isPreviousBarExcludedRTH, isPreviousBarAfterHoursClosed, isPreviousBarSundayPreMarket, isPreviousBarExcludedPeriod] = getTimeContext(time[1], targetTimezone)

// --- Calculations ---

// Volume Averaging: Exclude RTH edges, 4-6 PM ET, and Sunday Pre-6 PM ET ALWAYS
// This average is *only* used to define the huge volume spike threshold
bool excludeCurrentVolFromAvg = isCurrentBarExcludedPeriod
float volumeForAvgCalc = excludeCurrentVolFromAvg ? na : volume
float avgVolume = ta.sma(volumeForAvgCalc, volLookback)

// Dynamic Huge Volume Multiplier: Based on *previous* bar's time (Core RTH or not)
float activeHugeVolMultiplier = isPreviousBarCoreRTH ? rthHugeVolMultiplier : ethHugeVolMultiplier
// Use avgVolume[1] as current avgVolume excludes current bar, and we compare previous volume to avg *before* it
float hugeVolThreshold   = nz(avgVolume[1]) * activeHugeVolMultiplier

// --- MODIFIED Volume Conditions ---
// 1. Check if the *previous* bar had huge volume compared to its preceding average
bool isHugeVolumePrevBar = volume[1] > hugeVolThreshold and hugeVolThreshold > 0
// 2. Check if the *current* bar's volume is simply lower than the previous (huge) bar's volume
bool isVolumeLowerThanSpike = volume < volume[1]

// Trend Condition
float priceSma = ta.sma(close, trendLookback)
// Ensure trend condition uses close[2] vs sma[2] (trend state *before* the spike bar)
bool isBullishTrendBeforeSpike = close[2] > nz(priceSma[2])
bool isBearishTrendBeforeSpike = close[2] < nz(priceSma[2])

// --- Entry Time Filtering ---
// Always filter After Hours Closed and Sunday Pre-Market.
// Optionally filter RTH Edges based on input.
bool shouldFilterRthEdges = enableEntryFilterRthEdges and isCurrentBarExcludedRTH
bool isIgnoreEntryTime = shouldFilterRthEdges or isCurrentBarAfterHoursClosed or isCurrentBarSundayPreMarket

// --- MODIFIED Base Conditions ---
// Uses the simplified `isVolumeLowerThanSpike` check
bool baseLongCondition = isBearishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
bool baseShortCondition = isBullishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike

// Final Conditions (Apply Time Filter)
bool finalLongCondition = baseLongCondition and not isIgnoreEntryTime
bool finalShortCondition = baseShortCondition and not isIgnoreEntryTime

// --- Stop Loss & Take Profit Calculation (Conditional Logic) ---
// This part remains the same
float atrValue = ta.atr(atrLookback)
float tickValue = syminfo.mintick
int stopLossTicks = 100 // Default fallback SL ticks
int takeProfitTicks = 200 // Default fallback TP ticks

// Check if the current symbol matches the target ticker ID
bool isTargetTicker = str.upper(syminfo.tickerid) == str.upper(nqTargetTickerId) // Case-insensitive comparison

if (isTargetTicker and tickValue > 0)
    // --- Target Ticker Logic (e.g., NQ Fixed Points) ---
    float ticksPerPoint = 1.0 / tickValue
    stopLossTicks := math.max(1, math.round(nqFixedStopPoints * ticksPerPoint))
    takeProfitTicks := math.max(1, math.round(nqFixedTpPoints * ticksPerPoint))
else if tickValue > 0 // Use only if tickValue is valid
    // --- Standard Logic (Other Tickers: ATR or Fixed) ---
    float stopLossDistance = useAtrStops ? atrValue * atrStopMultiplier : fixedStopPoints * tickValue
    float takeProfitDistance = useAtrStops ? atrValue * atrTpMultiplier : fixedTpPoints * tickValue

    // Calculate ticks, ensuring it's at least 1 tick
    stopLossTicks := na(stopLossDistance) ? 100 : math.max(1, math.round(stopLossDistance / tickValue))
    takeProfitTicks := na(takeProfitDistance) ? 200 : math.max(1, math.round(takeProfitDistance / tickValue))

// Final check to ensure SL/TP are not na
stopLossTicks := nz(stopLossTicks, 100)
takeProfitTicks := nz(takeProfitTicks, 200)


// --- Strategy Execution ---
// Uses Limit Orders based on previous bar's low/high - Remains the same
float limitEntryPriceLong = low[1]  // Target entry at the low of the huge volume bar
float limitEntryPriceShort = high[1] // Target entry at the high of the huge volume bar

if (finalLongCondition and strategy.position_size == 0)
    strategy.cancel("S") // Cancel any pending short limit order first
    strategy.entry("L", strategy.long, limit = limitEntryPriceLong)
    strategy.exit("L SL/TP", from_entry="L", loss=stopLossTicks, profit=takeProfitTicks)

if (finalShortCondition and strategy.position_size == 0)
    strategy.cancel("L") // Cancel any pending long limit order first
    strategy.entry("S", strategy.short, limit = limitEntryPriceShort)
    strategy.exit("S SL/TP", from_entry="S", loss=stopLossTicks, profit=takeProfitTicks)


// --- Plotting & Visuals ---
plot(avgVolume, title="Filtered Avg Volume", color=color.new(color.blue, 60), style=plot.style_line)
// Removed the plot for the normal volume threshold as it's no longer used

// Highlight huge volume bar (previous bar that triggered the signal)
bgcolor(isHugeVolumePrevBar[1] ? color.new(color.yellow, 85) : na, title="Huge Volume Bar [-1]")

// Highlight bars excluded from volume average calculation
bgcolor(excludeCurrentVolFromAvg ? color.new(color.teal, 90) : na, title="Vol Excluded from Avg Calc")

// Highlight bars where entries are ignored due to time filters
bgcolor(isIgnoreEntryTime and (baseLongCondition or baseShortCondition) ? color.new(color.gray, 75) : na, title="Entry Time Filtered Bar")

// --- MODIFIED Highlight base conditions met ---
// Reflects the updated base conditions using isVolumeLowerThanSpike
bgcolor(baseLongCondition and not isIgnoreEntryTime ? color.new(color.green, 90) : na, title="Base Long Condition Met")
bgcolor(baseShortCondition and not isIgnoreEntryTime ? color.new(color.red, 90) : na, title="Base Short Condition Met")

plot(priceSma, title="Trend SMA", color=color.gray)

// Plot SL/TP levels for visualization - Remains the same
var float entryPrice = na
var float slLevel = na
var float tpLevel = na

if (strategy.opentrades > 0 and strategy.opentrades[1] == 0) // Just entered a trade
    entryPrice := strategy.opentrades.entry_price(0)
    if (strategy.position_size > 0) // Long
        slLevel := entryPrice - stopLossTicks * tickValue
        tpLevel := entryPrice + takeProfitTicks * tickValue
    else // Short
        slLevel := entryPrice + stopLossTicks * tickValue
        tpLevel := entryPrice - takeProfitTicks * tickValue
else if (strategy.opentrades == 0 and strategy.opentrades[1] > 0) // Position closed
    entryPrice := na
    slLevel := na
    tpLevel := na
else if (strategy.opentrades > 0) // Position still open
    entryPrice := strategy.opentrades.entry_price(0)
    if (strategy.position_size > 0) // Long
        slLevel := entryPrice - stopLossTicks * tickValue
        tpLevel := entryPrice + takeProfitTicks * tickValue
    else // Short
        slLevel := entryPrice + stopLossTicks * tickValue
        tpLevel := entryPrice - takeProfitTicks * tickValue

plot(strategy.opentrades > 0 ? slLevel : na, title="Stop Loss Level", color=color.red, style=plot.style_linebr)
plot(strategy.opentrades > 0 ? tpLevel : na, title="Take Profit Level", color=color.green, style=plot.style_linebr)

// Optional Debugging Plots
// plotchar(isHugeVolumePrevBar, "HugeVol[1]", "H", location.bottom, color.yellow, size=size.tiny)
// plotchar(isVolumeLowerThanSpike, "VolLow", "v", location.bottom, color.purple, size=size.tiny) // Changed char
// plotchar(finalLongCondition, "FinalLong", "L", location.top, color.green, size=size.tiny)
// plotchar(finalShortCondition, "FinalShort", "S", location.top, color.red, size=size.tiny)
// plot(finalLongCondition ? limitEntryPriceLong : na, "Long Limit Target", color.lime, style=plot.style_circles, linewidth=2)
// plot(finalShortCondition ? limitEntryPriceShort : na, "Short Limit Target", color.fuchsia, style=plot.style_circles, linewidth=2)