
Strategi menangkap trend reversal adalah kaedah perdagangan kuantitatif berdasarkan jumlah perdagangan yang luar biasa dan tingkah laku harga yang bertujuan untuk mengenal pasti masa-masa penting di mana pasaran mungkin berbalik arah. Strategi ini berpusat pada mencari K-line yang mempunyai jumlah perdagangan yang jauh lebih tinggi daripada purata dan membuat keputusan perdagangan yang bertentangan dengan arah trend sebelumnya apabila jumlah perdagangan menurun. Ia memanfaatkan perubahan psikologi pasaran selepas jumlah perdagangan yang besar, yang disebut “modem mid-range” di mana pasaran biasanya berbalik dalam jangka pendek setelah banyak campur tangan.
Prinsip teras strategi ini adalah berdasarkan kepada fenomena pembalikan trend selepas jumlah dagangan luar biasa di pasaran. Logik operasi khusus adalah seperti berikut:
Kenali jumlah transaksi yang tidak normalSistem ini mengesan sama ada baris K terdahulu mempunyai jumlah dagangan yang jauh lebih tinggi daripada purata. Dalam tempoh dagangan biasa (RTH), jumlah dagangan perlu melebihi 3 kali ganda daripada jumlah dagangan purata terkini (boleh disesuaikan); dalam tempoh selepas tutup atau masa khas (ETH), lebih daripada 5 kali ganda diperlukan. Pengiraan jumlah dagangan purata secara automatik mengecualikan tempoh pinggiran RTH, 4-6 jam selepas tutup dan hari Ahad sebelum tutup.
Pengesahan penurunan jumlah transaksi: Jumlah dagangan pada baris K semasa mestilah lebih rendah daripada jumlah dagangan pada baris K sebelumnya, yang menunjukkan bahawa transaksi besar telah berakhir.
Menentukan arah trend: Menentukan arah trend dengan membandingkan hubungan harga penutupan dengan SMA (rata-rata bergerak sederhana) sebelum K-garis jumlah dagangan yang luar biasa.
Isyarat masuk ke belakang:
Pendaftaran:
Pengurusan RisikoBergantung kepada ciri-ciri pelbagai jenis, sistem ini menawarkan dua jenis tetapan stop loss / stop stop:
Penapisan masaStrategi ini boleh menyaring secara pilihan isyarat perdagangan RTH pada 15 minit pertama dan terakhir, dan sentiasa menyaring isyarat pada masa penutupan selepas penutupan rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai rantai r
Menangkap Titik PeralihanStrategi ini memberi tumpuan kepada menangkap titik-titik perubahan pasaran yang muncul dengan jumlah dagangan yang luar biasa, yang biasanya mewakili perubahan ketara dalam sentimen pasaran, yang memberikan peluang perdagangan yang lebih tinggi.
Masuk dengan tepat: Meningkatkan ketepatan kemasukan dengan menggunakan harga terhad untuk memasuki titik tinggi / rendah pada K-garis jumlah transaksi yang luar biasa, memastikan perdagangan pada tahap harga yang penting dari segi teknikal.
Mengenali kadar penyesuaianStrategi: Kriteria untuk menentukan jumlah dagangan yang tidak biasa secara dinamik mengikut masa dagangan yang berbeza (waktu dagangan biasa vs masa selepas tutup / masa khas), lebih sesuai dengan keadaan sebenar pasaran.
Pengurusan risiko yang fleksibel: Menyediakan pilihan stop loss / stop loss berdasarkan nilai tetap dan ATR, yang boleh disesuaikan mengikut ciri dan turun naik pelbagai jenis.
Penapisan masa pintar: Mengenali dan menapis secara automatik semasa transaksi yang kurang cair dan tidak stabil, mengelakkan isyarat palsu yang mudah muncul di sekitar pembukaan dan penutupan pasaran.
Maklumat visual yang jelasStrategi: menyediakan petunjuk visual yang intuitif pada carta, termasuk garis K yang tidak normal, garis SMA yang sedang tren, paras paras paras stop loss, memudahkan pemantauan dan analisis pedagang.
Pelaksanaan automatik: Apabila syarat-syarat dipenuhi, sistem secara automatik melaksanakan perintah harga terhad dan tetapan stop loss, mengurangkan campur tangan manusia dan mengekalkan disiplin perdagangan.
Risiko penembusan palsuJumlah dagangan yang luar biasa boleh menyebabkan harga untuk jangka pendek untuk memecahkan tahap penting, tetapi kemudian boleh dengan cepat menarik balik, menyebabkan isyarat yang salah. Untuk mengurangkan risiko ini, anda boleh mempertimbangkan untuk menambah penunjuk pengesahan, seperti pengesahan RSI overbought / oversold atau penembusan yang diperlukan untuk jangka masa yang berterusan.
Kesan peristiwa yang didorong oleh beritaData ekonomi utama atau pengumuman syarikat mungkin menyebabkan jumlah transaksi yang luar biasa, tetapi reaksi ini sering berlangsung lebih lama daripada segera dibalik. Ia disyorkan untuk menangguhkan strategi atau menambah syarat penapisan sebelum dan selepas data ekonomi penting dikeluarkan.
Risiko perubahan persekitaran pasaran: Dalam pasaran yang kuat trend, dagangan berlawanan mungkin menghadapi pergerakan harga yang berterusan yang tidak menguntungkan. Anda boleh mempertimbangkan untuk menambah penapis trend jangka panjang untuk mengelakkan operasi berlawanan dalam persekitaran yang kuat trend.
Had Had Had Had Had Had Had Had: Jika harga tidak mencapai tahap harga terhad yang ditetapkan pada baris K seterusnya, isyarat perdagangan mungkin tidak akan berfungsi. Anda boleh mempertimbangkan untuk menetapkan tempoh maksimum yang sah, atau beralih ke harga pasaran dalam keadaan tertentu.
Risiko kecairan rendahWalaupun terdapat penapis masa dalam strategi ini, beberapa jenis mungkin menghadapi masalah kekurangan kecairan pada masa tertentu.
Risiko Pengoptimuman ParameterParameter strategi yang dioptimumkan secara berlebihan boleh menyebabkan prestasi buruk pada masa akan datang kerana data sejarah yang terlalu sesuai. Parameter harus dijamin dalam julat yang munasabah, dan kehandalan strategi harus disahkan melalui ujian luar sampel.
Pengesahan pelbagai kitaran masa: Menambah penapis trend untuk tempoh masa yang lebih tinggi, memastikan bahawa terdapat kadar kemenangan yang lebih tinggi dalam arah trend yang lebih besar. Sebagai contoh, anda boleh memeriksa arah trend garis matahari, dan hanya masuk jika selaras dengan trend garis matahari.
Penilaian kualiti jumlah transaksiDi samping saiz tenaga kuantiti murni, penilaian kualiti boleh dipertimbangkan untuk meningkatkan jumlah urus niaga, seperti ketidaksamaan harga purata bertimbangan kuantiti ((VWAP), untuk lebih memahami tingkah laku pasaran di sebalik jumlah urus niaga yang besar.
Strategi Hentikan Kerosakan Dinamik: Mempunyai stop loss dinamik berdasarkan kadar turun naik, menyesuaikan kedudukan stop loss secara automatik semasa perdagangan bergerak ke arah yang menguntungkan, mengunci sebahagian daripada keuntungan. Sebagai contoh, boleh menggunakan tracking stop loss atau bergerak stop loss ke harga kos setelah menembusi tahap kritikal.
Penapisan berkaitan pelbagai varietiUntuk jenis yang berkaitan (seperti indeks saham berjangka dan tunai, emas dan perak, dan lain-lain), menambah penunjuk pengesahan jenis yang berkaitan dapat meningkatkan kualiti isyarat. Isyarat mungkin lebih dipercayai apabila terdapat jumlah perdagangan dan tingkah laku harga yang tidak normal pada beberapa jenis yang berkaitan pada masa yang sama.
Pengoptimuman Pembelajaran MesinAnalisis algoritma pembelajaran mesin terhadap ciri-ciri model jumlah transaksi yang luar biasa yang paling berjaya dalam data sejarah, menyesuaikan syarat dan parameter kemasukan secara dinamik. Sebagai contoh, pokok keputusan atau hutan rawak boleh digunakan untuk meramalkan tindakan terbaik di bawah ciri-ciri jumlah transaksi yang luar biasa yang diberikan.
Penyesuaian kadar turun naik: Sesuaikan kriteria untuk menentukan jumlah dagangan yang luar biasa dan tahap berhenti / hentikan mengikut keadaan kadar turun naik pasaran semasa. Dalam persekitaran yang bergelombang tinggi, peningkatan jumlah yang luar biasa dapat menentukan nilai ambang, mengurangkan jarak berhenti; sebaliknya dalam persekitaran yang bergelombang rendah.
Menambah penapis asas: Pada hari data ekonomi utama dikeluarkan atau pada hari laporan kewangan suku tahunan, ubah parameter strategi secara bermusim atau hentikan dagangan untuk mengelakkan isyarat palsu akibat gangguan berita.
Strategi menangkap trend reversal adalah sistem perdagangan kuantitatif yang memberi tumpuan kepada jumlah dagangan dan tingkah laku harga untuk menangkap titik balik yang berpotensi dengan mengenal pasti perubahan sentimen pasaran selepas jumlah dagangan yang luar biasa. Strategi ini secara teknikal menentukan syarat masuk, keluar dan peraturan pengurusan risiko, dan mengandungi mekanisme penapisan masa pintar untuk mengelakkan masa kualiti rendah di pasaran.
Kelebihan utama strategi ini adalah bahawa ia menangkap “bentuk tengah” pasaran dengan tepat, yang sering menimbulkan peluang untuk berbalik dalam jangka pendek ketika banyak peserta pasaran masuk dan kemudiannya keluar. Strategi ini menyediakan kaedah perdagangan yang disiplin dengan menetapkan harga terhad dengan tepat pada tahap harga kritikal, dan dikombinasikan dengan pengendalian stop loss yang munasabah.
Walau bagaimanapun, pengguna harus berhati-hati dengan potensi risiko strategi dalam pasaran yang kuat dan sensitiviti terhadap peristiwa berita. Dengan menambah pengesahan tempoh masa berbilang, parameter penyesuaian dinamik dan mekanisme pengurusan risiko yang dipertingkatkan, strategi ini dapat mengoptimumkan lagi kestabilan dan adaptasi prestasinya.
Secara keseluruhannya, strategi menangkap trend reversal jumlah dagangan menyediakan pedagang dengan sistem perdagangan yang berdasarkan pada tingkah laku pasaran dan prinsip psikologi, yang sangat sesuai untuk pasaran yang tidak menentu dan keadaan yang bergolak di antara kawasan. Dengan persediaan yang wajar dan pengoptimuman berterusan, strategi ini dijangka menjadi alat yang berkesan dalam portfolio perdagangan.
/*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)