Strategi perdagangan kuantitatif mekanisme pasaran penyesuaian rangka masa berbilang masa

ATR EMA RSI MACD ADX 布林带 蜡烛图形态 多时间框架分析 自适应算法 市场机制检测
Tarikh penciptaan: 2025-04-21 16:20:34 Akhirnya diubah suai: 2025-04-21 16:20:34
Salin: 0 Bilangan klik: 522
2
fokus pada
319
Pengikut

Strategi perdagangan kuantitatif mekanisme pasaran penyesuaian rangka masa berbilang masa Strategi perdagangan kuantitatif mekanisme pasaran penyesuaian rangka masa berbilang masa

Gambaran keseluruhan

Strategi dagangan kuantitatif yang menyesuaikan diri dengan mekanisme pasaran pelbagai kerangka masa adalah sistem dagangan kuantitatif yang canggih berdasarkan analisis komprehensif pelbagai indikator yang dapat menyesuaikan strategi dagangan secara automatik mengikut keadaan pasaran yang berbeza. Strategi ini menggunakan kecerdasan buatan untuk menyesuaikan diri dengan teknologi untuk mengenal pasti empat mekanisme pasaran: trend, interval, riak, dan statik, dan menyesuaikan parameter perdagangan mengikut keadaan pasaran semasa.

Prinsip Strategi

Strategi ini berpusat pada kerangka analisis pasaran bertingkat yang membolehkan pengesanan dan penjanaan isyarat keadaan pasaran yang tepat dengan menggabungkan pelbagai petunjuk teknikal:

  1. Sistem purata bergerak: Menggunakan purata bergerak indeks ((9 kitaran) dan ((34 kitaran) bergerak ((EMA) untuk menentukan arah trend, digabungkan dengan nilai terendah ATR untuk meningkatkan ketepatan penghakiman.

  2. Mekanisme pengesahan pelbagai kerangka masa: Memberi perspektif pasaran yang lebih besar melalui RSI dan MACD pada jangka masa yang lebih tinggi, menapis isyarat bunyi pada jangka masa yang lebih rendah. Strategi memberi perhatian khusus kepada pengesahan trend pada jangka masa yang tinggi, menggunakan persimpangan HTF_RSI dan HTF_MACD sebagai penapis kekuatan.

  3. Algoritma pengenalan mekanisme pasaran

    • Pasaran trend: ADX > 20 dengan jurang MA lebih besar daripada ATR sebanyak 0.3 kali dan disahkan oleh trend jangka masa yang tinggi
    • Pasaran berjadual: ADX < 25 dan nisbah jadual harga kurang daripada 0.03, neutral dalam jangka masa yang tinggi
    • Pasaran yang tidak menentu: Brin bandwidth lebih besar daripada 1.5 kali rata-rata lebar dan ATR lebih besar daripada 1.2 kali rata-rata ATR
    • Pasaran tenang: lebar jalur Brin kurang daripada 0.8 kali lebar purata dan ATR kurang daripada 0.9 kali ATR purata
  4. Pengiktirafan bentuk dan pengesahan jumlahStrategi untuk mengesan pelbagai bentuk grafik yang berkemungkinan tinggi, termasuk bentuk penciptaan bullish, garisan kelinci, bentuk bintang pagi, garisan penembusan, dan garisan kedua-dua, serta bentuk yang berlawanan dengan penurunan. Setiap bentuk memerlukan pengesahan peningkatan jumlah transaksi untuk meningkatkan kebolehpercayaan isyarat.

  5. Sistem penarafan pelbagai faktorPenilaian komprehensif: Indikator teknikal, pengenalan bentuk dan keadaan jumlah transaksi, menghasilkan skor komprehensif. Isyarat membeli memerlukan pasaran lembu skor ≥1.0, isyarat menjual memerlukan pasaran beruang skor ≥1.0.

  6. Hentian dinamik dan hentian pengesanan: Menggunakan ATR untuk mengira tahap stop loss dinamik, memastikan pengurusan risiko menyesuaikan diri dengan turun naik pasaran. Jarak stop loss disesuaikan secara automatik mengikut nilai ATR, berkembang apabila turun naik turun naik dan menyusut apabila turun naik turun naik.

  7. Pengesanan prestasi auto-optimumSistem ini merekodkan prestasi dagangan di bawah pelbagai mekanisme pasaran untuk menyesuaikan parameter perdagangan dan penilaian penurunan nilai, untuk mencapai pengoptimuman strategi penyesuaian diri.

Kelebihan Strategik

  1. Kesesuaian seluruh pasaranKelebihan paling ketara strategi ini adalah keupayaan untuk mengenal pasti dan menyesuaikan diri dengan empat keadaan pasaran yang berbeza secara automatik, mengelakkan batasan strategi tunggal dalam keadaan pasaran yang berubah-ubah. Sama ada pasaran berada dalam keadaan trend yang kuat, penyusunan menyilang, turun naik tinggi atau turun naik rendah, sistem dapat menyesuaikan parameter dan penurunan isyarat.

  2. Pengesahan pelbagai kerangka masaDengan mengintegrasikan penunjuk jangka masa yang lebih tinggi, strategi ini meningkatkan kualiti isyarat dengan ketara. Kaedah analisis “atas ke bawah” ini secara berkesan menapis isyarat berkualiti rendah, mengurangkan penembusan palsu dan perdagangan bunyi.

  3. Pengiktirafan bentuk lanjutanPengiktirafan bentuk grafik yang digabungkan dengan pengesahan lalu lintas memberikan isyarat masuk dengan kebarangkalian tinggi. Bentuk-bentuk ini sangat berkesan apabila ia muncul berhampiran kedudukan sokongan dan rintangan dan disertai dengan peningkatan lalu lintas.

  4. Pengurusan risiko dinamik: Mekanisme berhenti dan mengesan berhenti yang berasaskan ATR memastikan pengurusan risiko dapat menyesuaikan diri secara automatik dengan turun naik pasaran. Kaedah ini, sambil melindungi modal, juga membenarkan kedudukan yang menguntungkan untuk terus beroperasi, mengoptimumkan nisbah pulangan risiko.

  5. Mekanisme pengoptimuman diriStrategi mampu merekodkan prestasi di bawah pelbagai mekanisme pasaran, memberikan maklum balas dan asas penyesuaian untuk perdagangan masa depan, dan mencapai peningkatan diri yang berterusan.

  6. Pemantauan visualDengan latar belakang dan dashboard prestasi yang dikodkan dengan warna, peniaga dapat mengetahui secara intuitif keadaan pasaran semasa, prestasi strategi dan petunjuk utama, meningkatkan ketelusan operasi.

Risiko Strategik

  1. Kepekaan ParameterStrategi ini menggunakan pelbagai parameter dan had untuk mengenal pasti mekanisme pasaran dan menghasilkan isyarat. Tetapan parameter ini perlu disesuaikan dengan berhati-hati, jika tidak, ia boleh menyebabkan salah menilai keadaan pasaran atau menghasilkan isyarat yang salah.

  2. Kerumitan pengiraanPerhitungan petunjuk dan penghakiman logik bertingkat meningkatkan kerumitan strategi, yang boleh menyebabkan kelajuan pengesanan dan pelaksanaan masa nyata menjadi perlahan, terutamanya dalam kitaran masa rendah atau persekitaran perdagangan frekuensi tinggi.

  3. Penangguhan penukaran pasaranWalaupun strategi direka untuk mengenal pasti keadaan pasaran yang berbeza, proses peralihan pasaran mungkin tidak seketika, tetapi secara beransur-ansur. Semasa peralihan, strategi mungkin menghadapi risiko salah persepsi dan isyarat yang salah.

  4. Terlalu banyak bergantung kepada petunjuk teknikalStrategi ini berdasarkan kepada indikator teknikal dan bentuk harga, tanpa mempertimbangkan faktor asas dan sentimen pasaran. Analisis teknikal semata-mata mungkin tidak berfungsi apabila berlaku berita besar atau peristiwa Black Swan.

  5. Kecacatan pengesananOleh kerana kerumitan dan kebolehlakuannya untuk menyesuaikan strategi, terdapat risiko bahawa data sejarah akan dipadankan secara berlebihan, dan prestasi sebenar mungkin kurang daripada hasil tinjauan semula.

  6. Keperluan modalMekanisme pengurusan risiko dinamik mungkin memerlukan jarak hentian yang lebih besar dalam keadaan pasaran tertentu, yang memerlukan modal dagangan yang mencukupi untuk mengekalkan nisbah risiko yang wajar.

Arah pengoptimuman

  1. Pembelajaran Mesin: Memperkenalkan algoritma pembelajaran mesin untuk mengoptimumkan pengenalan mekanisme pasaran dan penyesuaian parameter. Model latihan data sejarah boleh digunakan untuk mengenal pasti corak yang berpotensi dalam keadaan pasaran yang berbeza, meningkatkan ketepatan klasifikasi.

  2. Penunjuk emosi bersepadu: Memperkenalkan penunjuk sentimen pasaran (seperti VIX, rasio opsyen bearish / bullish, analisis sentimen media sosial, dan lain-lain) sebagai lapisan pengesahan tambahan. Data sentimen pasaran boleh digunakan sebagai penunjuk utama untuk membantu meramalkan titik peralihan pasaran.

  3. Integrasi data asasPembangunan rangka kerja untuk mengintegrasikan data asas yang penting seperti peristiwa kalendar ekonomi, laporan pendapatan atau siaran berita utama. Ini membantu menyesuaikan celah risiko sebelum pengumuman penting dan mengelakkan kerugian yang disebabkan oleh turun naik yang tidak disengajakan.

  4. Penapis masaPelaksanaan penapis masa dagangan untuk mengelakkan masa-masa yang kurang cair atau tidak stabil. Ini sangat penting untuk perdagangan merentas pasaran, dan dapat mengelakkan kelakuan yang tidak normal pada masa persilangan di pasaran Asia, Eropah dan Amerika Syarikat.

  5. Modul Analisis Relevansi: Tambah fungsi analisis hubungan antara aset, mengenal pasti corak pasaran berbilang dan isyarat pelepasan. Sebagai contoh, hubungan antara pasangan mata wang, hubungan indeks saham dengan VIX dan sebagainya dapat memberikan pengesahan perdagangan tambahan.

  6. Peningkatan kadar pegangan dinamikPendaftaran: Mengubah saiz kedudukan secara automatik berdasarkan mekanisme pasaran semasa dan prestasi sejarah. Pendaftaran boleh meningkatkan risiko di bawah mekanisme pasaran yang berfungsi dengan baik dan mengurangkan risiko di bawah keadaan yang tidak menentu atau prestasi sejarah yang buruk.

  7. Pengoptimuman perkakasan: Meningkatkan kecekapan kod, mengurangkan kerumitan pengiraan, terutamanya dalam persekitaran transaksi masa nyata. Anda boleh mempertimbangkan untuk menulis semula sebahagian logik, menggunakan algoritma dan struktur data yang lebih cekap.

ringkaskan

Strategi perdagangan kuantitatif yang menyesuaikan diri dengan mekanisme pasaran dalam bingkai masa berbilang mewakili inovasi penting dalam sistem perdagangan kuantitatif yang menggabungkan pengenalan mekanisme pasaran, analisis bingkai masa berbilang, pengenalan bentuk dan pengurusan risiko dinamik. Keupayaan penyesuaian dan integrasi indikator teknikal yang komprehensif membolehkan ia bersaing dalam pelbagai persekitaran pasaran dan tidak hanya terhad kepada keadaan pasaran tunggal.

Nilai sebenar strategi ini terletak pada kerangka keseluruhan dan bukan komponen tunggal. Strategi ini dapat menghasilkan isyarat berkualiti tinggi dan menguruskan risiko dengan berkesan melalui identifikasi mekanisme pasaran, pengesahan pelbagai kerangka masa, pengenalan bentuk dan pengurusan risiko dinamik. Pendekatan bertingkat ini mengurangkan isyarat salah dan meningkatkan ketahanan keseluruhan.

Walau bagaimanapun, strategi ini juga menghadapi cabaran seperti sensitiviti parameter, kerumitan pengiraan dan potensi over-fit. Para peniaga harus memperhatikan risiko ini, melakukan pengoptimuman parameter yang mencukupi dan ujian ke hadapan semasa menggunakan strategi ini.

Arah pengoptimuman masa depan termasuk peningkatan pembelajaran mesin, integrasi penunjuk emosi dan penyesuaian saiz kedudukan yang dinamik. Peningkatan ini akan meningkatkan lagi kebolehpasaran dan kestabilan strategi, menjadikannya sistem perdagangan yang lebih menyeluruh. Secara keseluruhan, strategi ini memberikan kerangka kerja yang kuat yang boleh disesuaikan dan diperluas mengikut pilihan risiko pedagang dan pandangan pasaran.

Kod sumber strategi
/*backtest
start: 2025-04-13 00:00:00
end: 2025-04-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"TRX_USD"}]
*/

//@version=6
strategy("Dskyz (DAFE) AI Adaptive Regime - Pro", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1, calc_on_order_fills=true, calc_on_every_tick=true)

// This script uses higher timeframe values for RSI/MACD, integrated into regime detection and scoring.
// Logic uses closed HTF bars to avoid repainting.

// D=====================================================Z
// 1. ATR SETTINGS==Z
// D=====================================================Z
group_atr = "⚡ ATR Settings"
atr_period     = input.int(14, "ATR Period", minval=1, group=group_atr)
atr_multiplier = input.float(1.5, "ATR Multiplier", minval=0.1, step=0.1, group=group_atr)
atr_val        = ta.atr(atr_period)
atr_avg        = ta.sma(atr_val, 50)

// D=====================================================Z
// 2. MOVING AVERAGE (MA) SETTINGS==Z
// D=====================================================Z
group_ma = "📊 Moving Averages"
fast_ma_length        = input.int(9, "Fast MA Length", minval=1, group=group_ma)
slow_ma_length        = input.int(34, "Slow MA Length", minval=1, group=group_ma)
ma_fast               = ta.ema(close, fast_ma_length)
ma_slow               = ta.ema(close, slow_ma_length)
ma_strength_threshold = input.float(0.5, "MA Strength Threshold", minval=0.0, step=0.1, group=group_ma)
trend_dir = ma_fast > ma_slow + (atr_val * ma_strength_threshold) ? 1 : ma_fast < ma_slow - (atr_val * ma_strength_threshold) ? -1 : 0

// D=====================================================Z
// 3. MULTI-TIMEFRAME (HTF) SETTINGS==Z
// D=====================================================Z
group_MTA = "⏱️ Multi-Timeframe Inputs"
htf = input.timeframe("D", "HTF for RSI & MACD", group=group_MTA)
htf_rsi_raw = request.security(syminfo.tickerid, htf, ta.rsi(close, 14))
htf_rsi = htf_rsi_raw[1]
[htf_macd_line_raw, htf_macd_signal_raw, htf_macd_hist_raw] = request.security(syminfo.tickerid, htf, ta.macd(close, 12, 26, 9))
htf_macd_line = htf_macd_line_raw[1]
htf_macd_signal = htf_macd_signal_raw[1]
htf_macd_hist = htf_macd_hist_raw[1]
// new: HTF trend direction for regime detection
htf_trend_bull = htf_macd_line > htf_macd_signal and htf_rsi > 50
htf_trend_bear = htf_macd_line < htf_macd_signal and htf_rsi < 50

// D=====================================================Z
// 4. TRADE SETTINGS==Z
// D=====================================================Z
group_trade = "⚙️ Trade Settings"
risk_per_trade      = input.int(500, "Risk per Trade ($)", minval=50, group=group_trade)
max_contracts       = input.int(5, "Max Contracts", minval=1, group=group_trade)
max_daily_drawdown  = input.float(0.05, "Max Daily Drawdown (%)", minval=0.01, group=group_trade)
tick_value          = input.float(12.5, "Tick Value ($)", minval=0.01, group=group_trade)
ticks_per_point     = input.int(4, "Ticks per Point", minval=1, group=group_trade)
default_stop_points = input.float(8.0, "Default Stop (Points)", minval=0.25, group=group_trade)

// D=====================================================Z
// 5. ADVANCED INDICATOR CALCULATIONS==Z
// D=====================================================Z

// --- ADX Calculation ---Z
adx_len   = 14
up        = ta.change(high)
down      = -ta.change(low)
plus_dm   = na(up) ? na : (up > down and up > 0 ? up : 0)
minus_dm  = na(down) ? na : (down > up and down > 0 ? down : 0)
trur      = ta.rma(ta.tr, adx_len)
plus_di   = 100 * ta.rma(plus_dm, adx_len) / trur
minus_di  = 100 * ta.rma(minus_dm, adx_len) / trur
adx_val   = 100 * ta.rma(math.abs(plus_di - minus_di) / (plus_di + minus_di), adx_len)

// --- Bollinger Bands Calculation ---Z
bb_basis     = ta.sma(close, 20)
bb_dev       = 2 * ta.stdev(close, 20)
bb_upper     = bb_basis + bb_dev
bb_lower     = bb_basis - bb_dev
bb_width     = (bb_upper - bb_lower) / bb_basis
bb_width_avg = ta.sma(bb_width, 50)

// --- Price Action Range ---Z
price_range = ta.highest(high, 20) - ta.lowest(low, 20)
range_ratio = price_range / close

// D=====================================================Z
// 6. REGIME ASSIGNMENT & PATTERN RECOGNITION==Z
// D=====================================================Z

// Regime assignment with HTF influence and looser thresholds
is_trending = adx_val > 20 and math.abs(ma_fast - ma_slow) > atr_val * 0.3 and htf_trend_bull or htf_trend_bear // loosened ADX and MA thresholds, added HTF
is_range    = adx_val < 25 and range_ratio < 0.03 and not htf_trend_bull and not htf_trend_bear // loosened ADX and range, HTF neutral
is_volatile = bb_width > bb_width_avg * 1.5 and atr_val > atr_avg * 1.2 and (htf_rsi > 70 or htf_rsi < 30) // loosened BB/ATR, added HTF overbought/oversold
is_quiet    = bb_width < bb_width_avg * 0.8 and atr_val < atr_avg * 0.9 // loosened BB/ATR
regime      = is_trending ? 1 : is_range ? 2 : is_volatile ? 3 : is_quiet ? 4 : 5
regime_name = regime == 1 ? "Trending" : regime == 2 ? "Range" : regime == 3 ? "Volatile" : regime == 4 ? "Quiet" : "Other"

// Pattern Recognition & Volume Confirmation-Z
vol_avg       = ta.sma(volume, 20)
vol_spike     = volume > vol_avg * 1.5
recent_low    = ta.lowest(low, 20)
recent_high   = ta.highest(high, 20)
is_near_support    = low <= recent_low * 1.01
is_near_resistance = high >= recent_high * 0.99

bullish_engulfing = close[1] < open[1] and close > open and close > open[1] and open < close[1] and is_near_support and vol_spike
hammer            = high - low > 3 * math.abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and is_near_support and vol_spike
morning_star      = close[2] < open[2] and math.abs(close[1] - open[1]) < 0.2 * (high[1] - low[1]) and close > open and close > (open[2] + close[2]) / 2 and is_near_support and vol_spike
piercing          = close[1] < open[1] and close > open and close > (open[1] + close[1]) / 2 and open < close[1] and is_near_support and vol_spike
double_bottom     = low < low[1] and low[1] > low[2] and low[2] < low[3] and close > open and is_near_support and vol_spike

bearish_engulfing = close[1] > open[1] and close < open and close < open[1] and open > close[1] and is_near_resistance and vol_spike
shooting_star     = high - low > 3 * math.abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and is_near_resistance and vol_spike
evening_star      = close[2] > open[2] and math.abs(close[1] - open[1]) < 0.2 * (high[1] - low[1]) and close < open and close < (open[2] + close[2]) / 2 and is_near_resistance and vol_spike
dark_cloud        = close[1] > open[1] and close < open and close < (open[1] + close[1]) / 2 and open > close[1] and is_near_resistance and vol_spike
double_top        = high > high[1] and high[1] < high[2] and high[2] > high[3] and close < open and is_near_resistance and vol_spike

bull_signal = (bullish_engulfing ? 0.5 : 0.0) +
              (hammer ? (regime == 2 ? 0.4 : 0.2) : 0.0) +
              (morning_star ? 0.2 : 0.0) +
              (piercing ? 0.2 : 0.0) +
              (double_bottom ? (regime == 3 ? 0.3 : 0.15) : 0.0)

bear_signal = (bearish_engulfing ? 0.5 : 0.0) +
              (shooting_star ? (regime == 2 ? 0.4 : 0.2) : 0.0) +
              (evening_star ? 0.2 : 0.0) +
              (dark_cloud ? 0.2 : 0.0) +
              (double_top ? (regime == 3 ? 0.3 : 0.15) : 0.0)

// Multi-Factor Confirmation with HTF-Z
rsi_val   = ta.rsi(close, 14)
[macd_line, macd_signal, macd_hist] = ta.macd(close, 12, 26, 9)
trend_bull = ma_fast > ma_slow
trend_bear = ma_fast < ma_slow
rsi_bull   = rsi_val < 30
rsi_bear   = rsi_val > 70
macd_bull  = macd_line > macd_signal
macd_bear  = macd_line < macd_signal
vol_expansion = atr_val > atr_avg * 1.2
// new: HTF confirmation for scoring
htf_bull_confirm = htf_trend_bull and htf_rsi < 70
htf_bear_confirm = htf_trend_bear and htf_rsi > 30

bull_score = bull_signal + (trend_bull ? 0.2 : 0) + (rsi_bull ? 0.15 : 0) + (macd_bull ? 0.15 : 0) + (vol_expansion ? 0.1 : 0) + (htf_bull_confirm ? 0.2 : 0)
bear_score = bear_signal + (trend_bear ? 0.2 : 0) + (rsi_bear ? 0.15 : 0) + (macd_bear ? 0.15 : 0) + (vol_expansion ? 0.1 : 0) + (htf_bear_confirm ? 0.2 : 0)

// D=====================================================Z
// 7. PERFORMANCE TRACKING & ADAPTIVE THRESHOLDS==Z
// D=====================================================Z
var float[] regime_pnl_long  = array.new_float(5, 0)
var float[] regime_pnl_short = array.new_float(5, 0)
var int[] regime_win_long    = array.new_int(5, 0)
var int[] regime_loss_long   = array.new_int(5, 0)
var int[] regime_win_short   = array.new_int(5, 0)
var int[] regime_loss_short  = array.new_int(5, 0)
var int entry_regime = na

if barstate.isconfirmed and strategy.closedtrades > 0 and not na(entry_regime)
    last_trade_profit = strategy.closedtrades.profit(strategy.closedtrades - 1)
    last_trade_entry_id = strategy.closedtrades.entry_id(strategy.closedtrades - 1)
    idx = entry_regime - 1
    if last_trade_entry_id == "Long"
        array.set(regime_pnl_long, idx, array.get(regime_pnl_long, idx) + last_trade_profit)
        if last_trade_profit > 0
            array.set(regime_win_long, idx, array.get(regime_win_long, idx) + 1)
        else
            array.set(regime_loss_long, idx, array.get(regime_loss_long, idx) + 1)
    else if last_trade_entry_id == "Short"
        array.set(regime_pnl_short, idx, array.get(regime_pnl_short, idx) + last_trade_profit)
        if last_trade_profit > 0
            array.set(regime_win_short, idx, array.get(regime_win_short, idx) + 1)
        else
            array.set(regime_loss_short, idx, array.get(regime_loss_short, idx) + 1)
    entry_regime := na

// D=====================================================Z
// 8. DRAWDOWN & CIRCUIT BREAKER==Z
// D=====================================================Z
var float max_equity = strategy.equity
if strategy.equity > max_equity
    max_equity := strategy.equity
daily_drawdown = (max_equity - strategy.equity) / max_equity
pause_trading  = daily_drawdown > max_daily_drawdown

// D=====================================================Z
// 9. ENTRY & EXIT LOGIC WITH DYNAMIC STOPS & TRAILING STOPS=Z
// D=====================================================Z
swing_low  = ta.lowest(low, 5)
swing_high = ta.highest(high, 5)
long_condition  = bull_score >= 1.0 and not pause_trading
short_condition = bear_score >= 1.0 and not pause_trading

var float trail_stop_long  = na
var float trail_stop_short = na
var float long_stop_price  = na
var float long_limit_price = na
var float short_stop_price = na
var float short_limit_price = na

if long_condition and strategy.position_size <= 0
    intended_stop = swing_low - atr_multiplier * atr_val
    stop_distance_points = close - intended_stop
    risk_per_contract = stop_distance_points * syminfo.pointvalue
    contracts = math.floor(risk_per_trade / risk_per_contract)
    contracts := contracts > 0 ? contracts : 1
    contracts := math.min(contracts, max_contracts)
    long_limit = close + stop_distance_points * 2
    strategy.entry("Long", strategy.long, qty = contracts)
    strategy.exit("Exit", from_entry = "Long", stop = intended_stop, limit = long_limit)
    long_stop_price  := intended_stop
    long_limit_price := long_limit
    trail_stop_long  := intended_stop
    entry_regime     := regime

if short_condition and strategy.position_size >= 0
    intended_stop = swing_high + atr_multiplier * atr_val
    stop_distance_points = intended_stop - close
    risk_per_contract = stop_distance_points * syminfo.pointvalue
    contracts = math.floor(risk_per_trade / risk_per_contract)
    contracts := contracts > 0 ? contracts : 1
    contracts := math.min(contracts, max_contracts)
    short_limit = close - stop_distance_points * 2
    strategy.entry("Short", strategy.short, qty = contracts)
    strategy.exit("Exit", from_entry = "Short", stop = intended_stop, limit = short_limit)
    short_stop_price  := intended_stop
    short_limit_price := short_limit
    trail_stop_short  := intended_stop
    entry_regime      := regime

if strategy.position_size > 0
    if close > long_limit_price * 0.5
        trail_stop_long := math.max(trail_stop_long, close - atr_val * atr_multiplier)
    strategy.exit("Long Trailing Stop", from_entry = "Long", stop = trail_stop_long)

if strategy.position_size < 0
    if close < short_limit_price * 0.5
        trail_stop_short := math.min(trail_stop_short, close + atr_val * atr_multiplier)
    strategy.exit("Short Trailing Stop", from_entry = "Short", stop = trail_stop_short)

if strategy.position_size == 0
    long_stop_price  := na
    long_limit_price := na
    short_stop_price := na
    short_limit_price := na

// D=====================================================Z
// 10. VISUALIZATION==Z
// D=====================================================Z
bgcolor(regime == 1 ? color.new(color.green, 85) : 
       regime == 2 ? color.new(color.orange, 85) : 
       regime == 3 ? color.new(color.red, 85) : 
       regime == 4 ? color.new(color.gray, 85) : 
       color.new(color.navy, 85))

plotshape(long_condition, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Long Signal")
plotshape(short_condition, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Short Signal")
plot(ma_fast, "Fast MA", color=color.new(color.blue, 0), linewidth=2)
plot(ma_slow, "Slow MA", color=color.new(color.red, 0), linewidth=2)
plot(strategy.position_size > 0 ? long_stop_price  : na, "Long Stop", color=color.new(color.red, 0), style=plot.style_linebr)
plot(strategy.position_size > 0 ? long_limit_price : na, "Long Target", color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? short_stop_price  : na, "Short Stop", color=color.new(color.red, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? short_limit_price : na, "Short Target", color=color.new(color.green, 0), style=plot.style_linebr)

// D=====================================================Z
// 11. DASHBOARD: METRICS TABLE (Bottom-Left)=Z
// D=====================================================Z
var table dashboard = table.new(position.bottom_left, 2, 13, bgcolor=color.new(#000000, 29), border_color=color.rgb(80,80,80), border_width=1)
if barstate.islast
    table.cell(dashboard, 0, 0, "⚡(DAFE) AI Adaptive Regime™", text_color=color.rgb(96,8,118), text_size=size.small)
    modeStr = pause_trading ? "Paused" : "Active"
    table.cell(dashboard, 0, 1, "Mode:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 1, modeStr, text_color=color.white, text_size=size.small)
    trendText = trend_dir == 1 ? "Bullish" : trend_dir == -1 ? "Bearish" : "Neutral"
    table.cell(dashboard, 0, 2, "Trend:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 2, trendText, text_color=trend_dir == 1 ? color.green : trend_dir == -1 ? color.red : color.gray, text_size=size.small)
    table.cell(dashboard, 0, 3, "ATR:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 3, str.tostring(atr_val, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 4, "ATR Avg:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 4, str.tostring(atr_avg, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 5, "Volume Spike:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 5, vol_spike ? "YES" : "NO", text_color=vol_spike ? color.green : color.red, text_size=size.small)
    table.cell(dashboard, 0, 6, "RSI:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 6, str.tostring(rsi_val, "#.##"), text_color=color.white, text_size=size.small)
    rsiCondText = rsi_val < 30 ? "Oversold" : rsi_val > 70 ? "Overbought" : "Neutral"
    table.cell(dashboard, 0, 7, "RSI Cond:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 7, rsiCondText, text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 8, "HTF RSI:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 8, str.tostring(htf_rsi, "#.##"), text_color=color.white, text_size=size.small)
    htfTrendText = htf_trend_bull ? "Bullish" : htf_trend_bear ? "Bearish" : "Neutral"
    table.cell(dashboard, 0, 9, "HTF Trend:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 9, htfTrendText, text_color=htf_trend_bull ? color.green : htf_trend_bear ? color.red : color.gray, text_size=size.small)
    lastSignal = long_condition ? "Buy" : short_condition ? "Sell" : "None"
    table.cell(dashboard, 0, 10, "Last Signal:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 10, lastSignal, text_color=long_condition ? color.green : short_condition ? color.red : color.white, text_size=size.small)
    table.cell(dashboard, 0, 11, "Regime:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 11, regime_name, text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 12, "Bull Score:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 12, str.tostring(bull_score, "#.##"), text_color=color.white, text_size=size.small)

// D=====================================================Z
// REGIME CONDITIONS
// D=====================================================Z
var table debug_table = table.new(position.top_right, 2, 5, bgcolor=color.new(#000000, 50), border_color=color.rgb(80,80,80), border_width=1)
if barstate.islast
    table.cell(debug_table, 0, 0, "Regime Conditions", text_color=color.rgb(96,8,118), text_size=size.small)
    table.cell(debug_table, 0, 1, "ADX:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 1, str.tostring(adx_val, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(debug_table, 0, 2, "BB Width Ratio:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 2, str.tostring(bb_width / bb_width_avg, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(debug_table, 0, 3, "ATR Ratio:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 3, str.tostring(atr_val / atr_avg, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(debug_table, 0, 4, "Range Ratio:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 4, str.tostring(range_ratio, "#.##"), text_color=color.white, text_size=size.small)

// --- Bollinger Bands Visuals ---Z
p_bb_basis = plot(bb_basis, title="BB Basis", color=color.new(#ffffff, 50), linewidth=1)
p_bb_upper = plot(bb_upper, title="BB Upper", color=color.new(#4caf4f, 45), linewidth=2)
p_bb_lower = plot(bb_lower, title="BB Lower", color=color.new(#ff5252, 45), linewidth=2)
fill(p_bb_upper, p_bb_lower, color=color.new(#423645, 65))

//D=================================================================Z
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
//D=================================================================Z
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0,0,0,80), border_color=color.rgb(0,50,137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz (DAFE) AI Adaptive Regime - Pro", text_color=color.rgb(96,8,118), text_size=size.normal)

// --- ALERTS ---Z
alertcondition(long_condition, title="Long Signal Alert", message="Enhanced Strategy Long Signal")
alertcondition(short_condition, title="Short Signal Alert", message="Enhanced Strategy Short Signal")