
Sistem perdagangan pelacakan tren multi-indikator dengan tingkat volatilitas yang disesuaikan adalah strategi perdagangan kuantitatif yang dirancang untuk pasar yang berfluktuasi tinggi, yang menggabungkan indikator teknis yang disesuaikan secara dinamis dengan mekanisme manajemen risiko yang canggih. Inti dari strategi ini adalah menyesuaikan parameter rata-rata bergerak secara dinamis melalui ATR (rata-rata amplitudo riil) untuk menyesuaikan diri dengan fluktuasi pasar, sambil mengintegrasikan fungsi RSI seperti overbought dan oversold filter, identifikasi pola platform, konfirmasi tren dalam beberapa periode waktu, dan pembentukan posisi bertahap (DCA), untuk membentuk kerangka perdagangan yang komprehensif. Strategi ini sangat cocok untuk lingkungan yang berfluktuasi tinggi seperti pasar komoditas berjangka, dan memberikan mode operasi yang fleksibel untuk perdagangan intraday dan periode perdagangan gelombang.
Prinsip-prinsip inti dari strategi ini didasarkan pada beberapa modul utama:
Adaptive mobile homogenization systemStrategi: menggunakan garis rata-rata bergerak sederhana cepat dan lambat ((SMA), yang panjangnya disesuaikan secara dinamis melalui ATR. Dalam lingkungan yang berfluktuasi tinggi, panjang garis rata-rata akan dipersingkat untuk merespons perubahan pasar dengan cepat; dalam lingkungan yang berfluktuasi rendah, panjang garis rata-rata diperpanjang untuk mengurangi kebisingan.
Filter momentum RSIFitur ini dapat dinyalakan atau dimatikan, dan mendukung parameter RSI khusus (seperti panjang 14, overbuying 60, overselling 40).
Identifikasi bentuk runtuhSistem dapat mengidentifikasi bentuk bullish atau bearish yang kuat dan melakukan verifikasi dengan menggabungkan volume perdagangan dan intensitas jangkauan. Untuk menghindari sinyal palsu, sistem akan melewatkan perdagangan ketika dua bentuk yang berlawanan muncul secara bersamaan.
Konfirmasi tren multi-siklusOpsional: Align sinyal perdagangan dengan tren SMA pada periode waktu 15 menit, tambahkan lapisan mekanisme konfirmasi, meningkatkan kualitas perdagangan.
Mekanisme DCA: Mengizinkan banyak entri di arah tren, mendukung jumlah entri yang paling banyak (misalnya 4 kali), interval entri diatur berdasarkan kelipatan ATR. Mekanisme ini membantu mengoptimalkan biaya rata-rata di pasar yang terus tren.
Manajemen risiko tingkat tinggi:
Logika Eksekusi Transaksi: Sistem memprioritaskan sinyal bergerak rata-rata atau bergelombang ((sesuai dengan pilihan pengguna), dan menerapkan filter volume transaksi, volatilitas, dan waktu. Untuk memastikan kualitas masuk, kondisi puncak volume transaksi juga ditambahkan ((volume transaksi> 1.2*10 SMA)
Adaptasi pasar yang kuatDengan ATR secara dinamis menyesuaikan parameter indikator teknis, strategi dapat secara otomatis beradaptasi dengan kondisi pasar yang berbeda, tetap efektif di lingkungan yang berfluktuasi tinggi dan rendah.
Filter kualitas sinyalMekanisme penyaringan berlapis ((RSI, tren multi-siklus, volume transaksi dan volatilitas) efektif mengurangi sinyal palsu dan meningkatkan kualitas perdagangan.
Mekanisme Masuk Fleksibel: Dukungan untuk memprioritaskan penggunaan sinyal mobile linear atau trench asymmetrical sesuai dengan preferensi pengguna, dan mengoptimalkan titik masuk ke arah tren melalui fungsi DCA.
Manajemen risiko dinamisStop loss dan tracking stop loss disesuaikan dengan pergerakan pasar dan dinamika keuntungan perdagangan, memberikan ruang yang cukup untuk perkembangan tren sambil melindungi modal.
Alat visualisasi dan debuggingStrategi menyediakan lapisan grafik yang kaya, dashboard real-time, dan tabel debug untuk membantu pengguna mengoptimalkan parameter dan memahami logika perdagangan.
Desain modular: Pengguna dapat mengaktifkan atau menonaktifkan berbagai fitur sesuai dengan preferensi (seperti filter RSI, pengenalan pola kejatuhan, tren multi-siklus waktu, dll.), Sangat disesuaikan.
Kontrol masuk yang sangat baikFilter volume transaksi puncak memastikan hanya masuk dalam aktivitas pasar yang signifikan, sementara mekanisme periode dingin mencegah perdagangan berlebihan.
Solusi: melakukan pengujian optimasi parameter yang luas, tetapi hindari optimasi berlebihan; menggunakan pengujian berjalan maju (walk-forward testing) dan pengujian luar sampel untuk memvalidasi kehandalan strategi.
*Solusi*Pertimbangan untuk menambahkan mekanisme identifikasi status pasar, menggunakan set parameter yang berbeda dalam lingkungan pasar yang berbeda; menerapkan batasan risiko keseluruhan, seperti menghentikan perdagangan setelah kerugian maksimum harian atau kerugian berturut-turut.
*Solusi*Pertimbangan: Masukkan estimasi slippage dan komisi yang sebenarnya dalam pengukuran ulang; Hindari perdagangan pada saat likuiditas rendah; Pertimbangkan untuk menggunakan daftar harga batas daripada daftar harga pasar.
*Solusi*Menggunakan alat debug yang disediakan oleh strategi untuk memantau kinerja setiap komponen secara ketat; menjaga komentar kode yang baik; mempertimbangkan efek independen dari setiap komponen yang diuji secara modular.
*Solusi*Hal-hal yang perlu diperhatikan adalah: menetapkan periode pendinginan dan waktu penyimpanan minimum yang tepat; mempertimbangkan biaya transaksi secara ketat dalam pengukuran ulang; meninjau dan mengoptimalkan standar masuk secara teratur.
Pembelajaran MesinIntroduksi algoritma optimasi parameter adaptif, seperti optimasi Bayesian atau algoritma genetik, yang secara otomatis menemukan kombinasi parameter terbaik untuk berbagai kondisi pasar. Ini akan mengurangi kebutuhan untuk optimasi manual dan meningkatkan kemampuan adaptasi strategi terhadap perubahan pasar.
Klasifikasi lingkungan pasarMengembangkan sistem klasifikasi kondisi pasar ((trend, getaran, volatilitas tinggi, volatilitas rendah, dll) dan mengkonfigurasi parameter optimal untuk setiap kondisi. Metode ini dapat menyesuaikan perilaku strategi lebih cepat ketika pasar berubah dan mengurangi keterlambatan adaptasi.
Peningkatan manajemen posisiIntroduksi algoritma manajemen posisi yang lebih kompleks, seperti penyesuaian posisi dinamis berdasarkan Kelley Principle atau intensitas momentum. Ini dapat mengoptimalkan pemanfaatan dana, meningkatkan eksposur pada sinyal kuat, dan mengurangi risiko pada sinyal lemah.
Integrasi Indikator Alternatif: menguji efektivitas indikator teknis lainnya, seperti Bollinger Bands, MACD atau Ichimoku Cloud Graph, sebagai pelengkap atau pengganti sistem yang ada. Indikator yang berbeda mungkin memberikan sinyal yang lebih akurat dalam kondisi pasar tertentu.
Integrasi data emosiPertimbangkan untuk memasukkan indikator sentimen pasar, seperti indeks volatilitas VIX atau data pasar opsi, untuk mengidentifikasi potensi transformasi pasar lebih awal. Sumber data eksternal ini dapat memberikan informasi yang tidak dapat ditangkap oleh indikator teknis tradisional.
Analisis korelasi multi-aset: Mengembangkan analisa korelasi lintas kelas aset, menggunakan sinyal dari satu pasar untuk memverifikasi atau memperkuat keputusan perdagangan di pasar terkait lainnya. Misalnya, menggunakan perubahan harga komoditas untuk mengkonfirmasi tren di sektor saham terkait.
Mengoptimalkan efisiensi komputasiReorganisasi kode untuk meningkatkan efisiensi perhitungan, terutama untuk strategi frekuensi tinggi. Ini termasuk mengoptimalkan perhitungan ATR, urutan penilaian kondisi, dan mengurangi perhitungan berulang yang tidak perlu.
Adaptive volatility multi-indicator trend-tracking trading system mewakili metode perdagangan kuantitatif yang komprehensif dan fleksibel, yang secara efektif menanggapi berbagai kondisi pasar melalui penyesuaian parameter dinamis dan mekanisme penyaringan berlapis. Keunggulan inti dari strategi ini adalah kerangka manajemen risiko yang adaptif dan komprehensif, yang membuatnya sangat cocok untuk pasar berjangka tinggi.
Strategi ini mengintegrasikan berbagai alat analisis teknis klasik (moving average, RSI, bullish) dengan elemen perdagangan kuantitatif modern (parameter adaptif, analisis siklus multi-waktu, DCA) untuk membentuk sistem yang seimbang. Dengan pengendalian tepat waktu masuk, pengoptimalan beberapa strategi masuk, dan penyesuaian tingkat stop loss secara dinamis, strategi ini dapat memanfaatkan peluang tren pasar dengan baik sambil melindungi modal.
Namun, kompleksitas strategi juga membawa tantangan sensitivitas parameter dan pemeliharaan sistem. Investor harus melakukan pengembalian yang memadai dan pengujian ke depan sebelum menerapkan strategi, dan siap untuk menyesuaikan parameter sesuai dengan perubahan pasar. Arah optimasi di masa depan meliputi pengenalan parameter optimasi otomatis teknologi pembelajaran mesin, masuknya sistem klasifikasi lingkungan pasar, dan peningkatan algoritma manajemen posisi, yang akan meningkatkan lebih lanjut kehandalan dan adaptasi strategi.
Secara keseluruhan, strategi ini memberikan kerangka kerja perdagangan kuantitatif yang solid, yang disesuaikan dengan kebutuhan dan preferensi risiko tertentu bagi pedagang berpengalaman yang mencari keuntungan perdagangan yang konsisten di pasar keuangan yang berubah-ubah saat ini.
/*backtest
start: 2024-04-11 00:00:00
end: 2025-04-10 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy('Dskyz Adaptive Futures Elite (DAFE) - Updated',
overlay=true,
default_qty_type=strategy.fixed,
initial_capital=1000000,
commission_value=0,
slippage=1,
pyramiding=10)
// === INPUTS ===
// Moving Average Settings
fastLength = input.int(9, '[MA] Fast MA Length', minval=1)
slowLength = input.int(19, '[MA] Slow MA Length', minval=1)
// RSI Settings
useRSI = input.bool(false, '[RSI Settings] Use RSI Filter')
rsiLength = input.int(14, 'RSI Length', minval=1)
rsiOverbought = input.int(60, 'RSI Overbought', minval=50, maxval=100)
rsiOversold = input.int(40, 'RSI Oversold', minval=0, maxval=50)
rsiLookback = input.int(1, 'RSI Lookback', minval=1)
// Pattern Settings
usePatterns = input.bool(true, '[Pattern Settings] Use Candlestick Patterns')
patternLookback = input.int(19, 'Pattern Lookback Bars', minval=1)
// Filter Settings
useTrendFilter = input.bool(true, '[Filter Settings] Use 15m Trend Filter')
minVolume = input.int(10, 'Minimum Volume', minval=1)
volatilityThreshold = input.float(1.0, 'Volatility Threshold (%)', minval=0.1, step=0.1) / 100
tradingStartHour = input.int(9, 'Trading Start Hour (24h)', minval=0, maxval=23)
tradingEndHour = input.int(16, 'Trading End Hour (24h)', minval=0, maxval=23)
// DCA Settings
useDCA = input.bool(false, '[DCA Settings] Use DCA')
maxTotalEntries = input.int(4, 'Max Total Entries per Direction', minval=1)
dcaMultiplier = input.float(1.0, 'DCA ATR Multiplier', minval=0.1, step=0.1)
// Signal Settings
signalPriority = input.string('MA', '[Signal Settings] Signal Priority', options=['Pattern', 'MA'])
minBarsBetweenSignals = input.int(5, 'Min Bars Between Signals', minval=1)
plotMode = input.string('Potential Signals', 'Plot Mode', options=['Potential Signals', 'Actual Entries'])
// Exit Settings
trailOffset = input.float(0.5, '[Exit Settings] Trailing Stop Offset ATR Multiplier', minval=0.01, step=0.01)
trailPointsMult = input.float(0.5, 'Trailing Stop Points ATR Multiplier', minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, 'Profit Target ATR Multiplier', minval=0.1, step=0.1) // Profit target factor
fixedStopMultiplier = input.float(1.3, 'Fixed Stop Multiplier', minval=0.5, step=0.1) // Fixed stop multiplier
// General Settings
debugLogging = input.bool(true, '[General Settings] Enable Debug Logging')
fixedQuantity = input.int(2, 'Trade Quantity', minval=1)
cooldownMinutes = input.int(0, 'Cooldown Minutes', minval=0)
// ATR Settings – Use Dynamic ATR or fixed value
useDynamicATR = input.bool(true, title="Use Dynamic ATR")
userATRPeriod = input.int(7, title="ATR Period (if not using dynamic)", minval=1)
defaultATR = timeframe.isminutes and timeframe.multiplier <= 2 ? 5 :
timeframe.isminutes and timeframe.multiplier <= 5 ? 7 : 10
atrPeriod = useDynamicATR ? defaultATR : userATRPeriod
// === TRADE TRACKING VARIABLES ===
var int lastSignalBar = 0
var int lastSignalType = 0 // 1 for long, -1 for short
var int entryBarIndex = 0
var bool inLongTrade = false
var bool inShortTrade = false
// DCA Tracking Variables
var int longEntryCount = 0
var int shortEntryCount = 0
var float longInitialEntryPrice = na
var float shortInitialEntryPrice = na
var float longEntryATR = na
var float shortEntryATR = na
var float long_stop_price = na
var float short_stop_price = na
// Signal Plotting Variables
var int lastLongPlotBar = 0
var int lastShortPlotBar = 0
// === CALCULATIONS ===
// Volume and Time Filters
volumeOk = volume >= minVolume
currentHour = hour(time)
timeWindow = currentHour >= tradingStartHour and currentHour <= tradingEndHour
// Additional Entry Filter: Volume Spike Condition
volumeSpike = volume > 1.2 * ta.sma(volume, 10)
// ATR & Volatility Calculations
atr = ta.atr(atrPeriod)
volatility = nz(atr / close, 0)
volatilityOk= volatility <= volatilityThreshold
// Adaptive MA Lengths
fastLengthAdaptive = math.round(fastLength / (1 + volatility))
slowLengthAdaptive = math.round(slowLength / (1 + volatility))
fastLengthSafe = math.max(1, not na(atr) ? fastLengthAdaptive : fastLength)
slowLengthSafe = math.max(1, not na(atr) ? slowLengthAdaptive : slowLength)
fastMA = ta.sma(close, fastLengthSafe)
slowMA = ta.sma(close, slowLengthSafe)
// RSI Calculation
rsi = ta.rsi(close, rsiLength)
rsiCrossover = ta.crossover(rsi, rsiOversold)
rsiCrossunder = ta.crossunder(rsi, rsiOverbought)
rsiLongOk = not useRSI or (rsiCrossover and rsi[rsiLookback] < 70)
rsiShortOk = not useRSI or (rsiCrossunder and rsi[rsiLookback] > 30)
// 15m Trend Filter
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, '15', [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
// Candlestick Patterns
isBullishEngulfing() =>
close[1] < open[1] and close > open and open < close[1] and close > open[1] and (close - open) > (open[1] - close[1]) * 0.8
isBearishEngulfing() =>
close[1] > open[1] and close < open and open > close[1] and close < open[1] and (open - close) > (close[1] - open[1]) * 0.8
// Pattern Strength Calculation
patternStrength(isBull) =>
bull = isBull ? 1 : 0
bear = isBull ? 0 : 1
volumeStrength = volume > ta.sma(volume, 10) ? 1 : 0
rangeStrength = (high - low) > ta.sma(high - low, 10) ? 1 : 0
strength = bull * (volumeStrength + rangeStrength) - bear * (volumeStrength + rangeStrength)
strength
bullStrength = patternStrength(true)
bearStrength = patternStrength(false)
// Detect Patterns
bullishEngulfingOccurred = ta.barssince(isBullishEngulfing()) <= patternLookback and bullStrength >= 1
bearishEngulfingOccurred = ta.barssince(isBearishEngulfing()) <= patternLookback and bearStrength <= -1
patternConflict = bullishEngulfingOccurred and bearishEngulfingOccurred
// MA Conditions with Trend & RSI Filters
maAbove = close > fastMA and fastMA > slowMA and close > close[1]
maBelow = close < fastMA and fastMA < slowMA and close < close[1]
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk = not useTrendFilter or trend15m <= 0
// Signal Priority Logic
bullPattern = usePatterns and bullishEngulfingOccurred
bearPattern = usePatterns and bearishEngulfingOccurred
bullMA = maAbove and trendLongOk and rsiLongOk
bearMA = maBelow and trendShortOk and rsiShortOk
longCondition = false
shortCondition = false
if signalPriority == 'Pattern'
longCondition := bullPattern or (not bearPattern and bullMA)
shortCondition := bearPattern or (not bullPattern and bearMA)
else
longCondition := bullMA or (not bearMA and bullPattern)
shortCondition := bearMA or (not bullMA and bearPattern)
// Apply Filters and require volume spike for quality entries
longCondition := longCondition and volumeOk and volumeSpike and timeWindow and volatilityOk and not patternConflict
shortCondition := shortCondition and volumeOk and volumeSpike and timeWindow and volatilityOk and not patternConflict
// Update Trade Status
if strategy.position_size > 0
inLongTrade := true
inShortTrade := false
else if strategy.position_size < 0
inShortTrade := true
inLongTrade := false
else
inLongTrade := false
inShortTrade := false
// Entry Checks
canTrade = strategy.position_size == 0
validQuantity = fixedQuantity > 0
quantity = fixedQuantity
// Prevent Multiple Alerts Per Bar
var bool alertSent = false
if barstate.isnew
alertSent := false
// Cooldown Logic
var float lastExitTime = na
if strategy.position_size == 0 and strategy.position_size[1] != 0
lastExitTime := time
canEnter = na(lastExitTime) or ((time - lastExitTime) / 60000 >= cooldownMinutes)
// === ENTRY LOGIC ===
if canTrade and validQuantity and not alertSent and canEnter and barstate.isconfirmed
if longCondition and not shortCondition and (lastSignalBar != bar_index or lastSignalType != 1)
strategy.entry('Long', strategy.long, qty=quantity)
longInitialEntryPrice := close
longEntryATR := atr
longEntryCount := 1
alert('Enter Long', alert.freq_once_per_bar)
alertSent := true
lastSignalBar := bar_index
lastSignalType := 1
entryBarIndex := bar_index
else if shortCondition and not longCondition and (lastSignalBar != bar_index or lastSignalType != -1)
strategy.entry('Short', strategy.short, qty=quantity)
shortInitialEntryPrice := close
shortEntryATR := atr
shortEntryCount := 1
alert('Enter Short', alert.freq_once_per_bar)
alertSent := true
lastSignalBar := bar_index
lastSignalType := -1
entryBarIndex := bar_index
// === DCA LOGIC (IF ENABLED) ===
if useDCA
if strategy.position_size > 0 and longEntryCount < maxTotalEntries and bullMA and rsi < 70
nextDCALevel = longInitialEntryPrice - longEntryCount * longEntryATR * dcaMultiplier
if close <= nextDCALevel
strategy.entry('Long DCA ' + str.tostring(longEntryCount), strategy.long, qty=quantity)
longEntryCount := longEntryCount + 1
if strategy.position_size < 0 and shortEntryCount < maxTotalEntries and bearMA and rsi > 30
nextDCALevel = shortInitialEntryPrice + shortEntryATR * shortEntryCount * dcaMultiplier
if close >= nextDCALevel
strategy.entry('Short DCA ' + str.tostring(shortEntryCount), strategy.short, qty=quantity)
shortEntryCount := shortEntryCount + 1
// === RESET DCA VARIABLES ON EXIT ===
if strategy.position_size == 0 and strategy.position_size[1] != 0
longEntryCount := 0
shortEntryCount := 0
longInitialEntryPrice := na
shortInitialEntryPrice := na
longEntryATR := na
shortEntryATR := na
// === FIXED STOP-LOSS CALCULATION (WIDER INITIAL STOP) ===
long_stop_price := strategy.position_avg_price - atr * fixedStopMultiplier
short_stop_price := strategy.position_avg_price + atr * fixedStopMultiplier
// === ADJUST TRAILING POINTS BASED ON PROFIT ===
profitLong = strategy.position_size > 0 ? close - strategy.position_avg_price : 0
profitShort = strategy.position_size < 0 ? strategy.position_avg_price - close : 0
trailPointsMultAdjusted = profitLong > atr ? 0.3 : profitLong > atr * 0.66 ? 0.4 : trailPointsMult // For long positions
trailPointsMultAdjustedShort = profitShort > atr ? 0.3 : profitShort > atr * 0.66 ? 0.4 : trailPointsMult // For short positions
trailPointsLong = atr * trailPointsMultAdjusted
trailPointsShort = atr * trailPointsMultAdjustedShort
// === EXIT LOGIC ===
// On the entry bar, always use the fixed stop; thereafter, use a combination of fixed stop, trailing stop, and a profit target.
// Profit Target: For longs, exit at avg_entry + atr * profitTargetATRMult; for shorts, exit at avg_entry - atr * profitTargetATRMult.
if strategy.position_size > 0
if bar_index == entryBarIndex
if debugLogging
log.info("Long exit on entry bar: fixed stop applied. Price=" + str.tostring(close))
strategy.exit('Long Exit', 'Long', stop=long_stop_price)
else
if debugLogging
log.info("Long Trade: profit=" + str.tostring(profitLong) + ", ATR=" + str.tostring(atr))
strategy.exit('Long Exit', 'Long',
stop=long_stop_price,
limit = strategy.position_avg_price + atr * profitTargetATRMult,
trail_points=trailPointsLong,
trail_offset=atr * trailOffset)
if strategy.position_size < 0
if bar_index == entryBarIndex
if debugLogging
log.info("Short exit on entry bar: fixed stop applied. Price=" + str.tostring(close))
strategy.exit('Short Exit', 'Short', stop=short_stop_price)
else
if debugLogging
log.info("Short Trade: profit=" + str.tostring(profitShort) + ", ATR=" + str.tostring(atr))
strategy.exit('Short Exit', 'Short',
stop=short_stop_price,
limit = strategy.position_avg_price - atr * profitTargetATRMult,
trail_points=trailPointsShort,
trail_offset=atr * trailOffset)
// === FORCE CLOSE ON LAST BAR (OPTIONAL) ===
if barstate.islast
if strategy.position_size > 0
strategy.close('Long', comment='Forced Exit')
if strategy.position_size < 0
strategy.close('Short', comment='Forced Exit')
// === SIGNAL PLOTTING LOGIC ===
plotLongSignal = longCondition and canTrade and (bar_index - lastLongPlotBar >= minBarsBetweenSignals or lastLongPlotBar == 0)
plotShortSignal = shortCondition and canTrade and (bar_index - lastShortPlotBar >= minBarsBetweenSignals or lastShortPlotBar == 0)
if plotLongSignal
lastLongPlotBar := bar_index
if plotShortSignal
lastShortPlotBar := bar_index
// Define plotting conditions based on plotMode
plotLongShape = plotMode == 'Potential Signals' ? plotLongSignal : strategy.position_size > 0 and strategy.position_size[1] <= 0
plotShortShape = plotMode == 'Potential Signals' ? plotShortSignal : strategy.position_size < 0 and strategy.position_size[1] >= 0
// === VISUALIZATION ===
plot(fastMA, color=color.blue, linewidth=2, title='Fast MA')
plot(slowMA, color=color.red, linewidth=2, title='Slow MA')
var float longSL = na
var float shortSL = na
if strategy.position_size > 0
longSL := math.max(longSL, high - trailPointsLong)
else
longSL := na
plot(longSL, color=color.green, style=plot.style_stepline, title='Long SL')
if strategy.position_size < 0
shortSL := math.min(shortSL, low + trailPointsShort)
else
shortSL := na
plot(shortSL, color=color.red, style=plot.style_stepline, title='Short SL')
bgcolor(timeWindow ? color.new(color.blue, 95) : na, title="Trading Hours Highlight")
if plotLongShape
label.new(bar_index, low, "Buy", yloc=yloc.belowbar, color=color.green, textcolor=color.white, style=label.style_label_up)
if plotShortShape
label.new(bar_index, high, "Sell", yloc=yloc.abovebar, color=color.red, textcolor=color.white, style=label.style_label_down)
// === DEBUG TABLE ===
var table debugTable = table.new(position.top_right, 3, 10, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.white, border_width=1)
if barstate.islast
table.cell(debugTable, 0, 0, 'Signal', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(debugTable, 1, 0, 'Status', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(debugTable, 2, 0, 'Priority', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(debugTable, 0, 1, 'MA Long', text_color=color.blue)
table.cell(debugTable, 1, 1, bullMA ? 'Yes' : 'No', text_color=bullMA ? color.green : color.red)
table.cell(debugTable, 2, 1, signalPriority == 'MA' ? 'High' : 'Low', text_color=color.white)
table.cell(debugTable, 0, 2, 'MA Short', text_color=color.blue)
table.cell(debugTable, 1, 2, bearMA ? 'Yes' : 'No', text_color=bearMA ? color.green : color.red)
table.cell(debugTable, 2, 2, signalPriority == 'MA' ? 'High' : 'Low', text_color=color.white)
table.cell(debugTable, 0, 3, 'Bull Pattern', text_color=color.blue)
table.cell(debugTable, 1, 3, bullPattern ? 'Yes' : 'No', text_color=bullPattern ? color.green : color.red)
table.cell(debugTable, 2, 3, signalPriority == 'Pattern' ? 'High' : 'Low', text_color=color.white)
table.cell(debugTable, 0, 4, 'Bear Pattern', text_color=color.blue)
table.cell(debugTable, 1, 4, bearPattern ? 'Yes' : 'No', text_color=bearPattern ? color.green : color.red)
table.cell(debugTable, 2, 4, signalPriority == 'Pattern' ? 'High' : 'Low', text_color=color.white)
table.cell(debugTable, 0, 5, 'Filters', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(debugTable, 1, 5, 'Status', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(debugTable, 2, 5, '', text_color=color.white, bgcolor=color.rgb(50, 50, 50))
table.cell(debugTable, 0, 6, 'Time Window', text_color=color.blue)
table.cell(debugTable, 1, 6, timeWindow ? 'OK' : 'Closed', text_color=timeWindow ? color.green : color.red)
table.cell(debugTable, 2, 6, str.tostring(currentHour) + 'h', text_color=color.white)
table.cell(debugTable, 0, 7, 'Volume', text_color=color.blue)
table.cell(debugTable, 1, 7, volumeOk ? 'OK' : 'Low', text_color=volumeOk ? color.green : color.red)
table.cell(debugTable, 2, 7, str.tostring(volume, '#'), text_color=color.white)
table.cell(debugTable, 0, 8, 'Volatility', text_color=color.blue)
table.cell(debugTable, 1, 8, volatilityOk ? 'OK' : 'High', text_color=volatilityOk ? color.green : color.red)
table.cell(debugTable, 2, 8, str.tostring(volatility * 100, '#.##') + '%', text_color=color.white)
table.cell(debugTable, 0, 9, 'Signals', text_color=color.blue)
table.cell(debugTable, 1, 9, longCondition and not shortCondition ? 'LONG' : shortCondition and not longCondition ? 'SHORT' : longCondition and shortCondition ? 'CONFLICT' : 'NONE', text_color=longCondition and not shortCondition ? color.green : shortCondition and not longCondition ? color.red : color.yellow)
table.cell(debugTable, 2, 9, canEnter ? alertSent ? 'Sent' : 'Ready' : 'Cooldown', text_color=canEnter ? alertSent ? color.yellow : color.green : color.gray)
// === PERFORMANCE DASHBOARD ===
var table dashboard = table.new(position.bottom_left, 3, 3, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.white, border_width=1)
if barstate.islast
table.cell(dashboard, 0, 0, 'Position', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(dashboard, 1, 0, 'P/L', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(dashboard, 2, 0, 'Statistics', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
table.cell(dashboard, 0, 1, strategy.position_size > 0 ? 'Long' : strategy.position_size < 0 ? 'Short' : 'Flat', text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
table.cell(dashboard, 1, 1, str.tostring(strategy.netprofit, '#.##'), text_color=strategy.netprofit >= 0 ? color.green : color.red)
table.cell(dashboard, 2, 1, 'Win Rate', text_color=color.white)
table.cell(dashboard, 0, 2, strategy.position_size != 0 ? 'Bars: ' + str.tostring(bar_index - entryBarIndex) : '', text_color=color.white)
table.cell(dashboard, 1, 2, strategy.position_size != 0 ? 'Cooldown: ' + str.tostring(cooldownMinutes) + 'm' : '', text_color=color.white)
table.cell(dashboard, 2, 2, strategy.closedtrades > 0 ? str.tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##') + '%' : 'N/A', text_color=color.white)
// === CHART TITLE ===
var table titleTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
table.cell(titleTable, 0, 0, "Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)