Strategi dagangan kuantitatif terobosan dinamik berbilang tempoh, berbilang penunjuk, frekuensi tinggi

EMA SMA RSI ATR 突破策略 时间过滤 追踪止损 动态风险管理
Tarikh penciptaan: 2025-08-04 11:57:30 Akhirnya diubah suai: 2025-08-04 11:57:30
Salin: 0 Bilangan klik: 241
2
fokus pada
319
Pengikut

Strategi dagangan kuantitatif terobosan dinamik berbilang tempoh, berbilang penunjuk, frekuensi tinggi Strategi dagangan kuantitatif terobosan dinamik berbilang tempoh, berbilang penunjuk, frekuensi tinggi

Gambaran keseluruhan

Strategi dagangan kuantitatif pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan pergerakan

Prinsip Strategi

Logik teras strategi ini adalah berdasarkan sistem penembusan harga yang disahkan oleh pelbagai syarat, dengan mekanisme pelaksanaan seperti berikut:

  1. Kumpulan penunjuk teknikal

    • Menggunakan EMA cepat ((34 kitaran) dan EMA perlahan ((63 kitaran) untuk menentukan arah trend
    • Menggunakan SMA ((34 kitaran) sebagai penapis harga
    • Menggunakan RSI ((14 kitaran) untuk mengenal pasti kawasan overbought dan oversold
    • Menggunakan ATR ((14 kitaran) untuk mengira tahap stop loss dan keuntungan dinamik
  2. Logik pengesanan terobosan

    • Kenali nilai tertinggi dalam N kitaran (default 1) sebagai titik rintangan
    • Kenali harga terendah dalam tempoh N kitaran ((default1)) sebagai kedudukan sokongan
    • Isyarat lebih banyak apabila harga menembusi rintangan dan memenuhi syarat lain
    • Mencetuskan isyarat shorting apabila harga melepasi tahap sokongan dan memenuhi syarat lain
  3. Pengesahan pelbagai syarat

    • Buat banyak syarat: Harga menembusi rintangan + EMA pantas di atas garis perlahan + RSI tidak melebihi + Harga di atas SMA
    • Syarat kosong: harga di bawah sokongan + EMA di bawah garis perlahan + RSI tidak melebihi + harga di bawah SMA
  4. Sistem penapisan masa

    • Mempunyai empat tempoh dagangan yang boleh disesuaikan dan tetingkap dagangan yang boleh diatur dengan fleksibel
    • Algoritma pengiraan masa yang dioptimumkan untuk meningkatkan kecekapan pemprosesan dengan menukar masa menjadi nilai berjumlah minit
  5. Pengurusan risiko dinamik

    • Kerosakan dinamik berdasarkan ATR, 3 kali ganda daripada ATR secara lalai
    • Target keuntungan dinamik berdasarkan ATR, 3 kali ganda ATR secara lalai
    • Fungsi tracking stop loss yang boleh dipilih, yang secara automatik menyesuaikan kedudukan stop loss mengikut turun naik pasaran
  6. Reka bentuk yang dioptimumkan

    • Kestabilan pra-kaedah mengurangkan pengiraan berulang
    • Mempercepatkan pemprosesan hasil pengiraan penunjuk cache
    • Pengolahan yang cekap menggunakan tetapan penapisan masa penyimpanan array

Kelebihan Strategik

Strategi ini mempunyai kelebihan yang ketara:

  1. Keupayaan pelaksanaan pantas: Dengan calc_on_every_tick=true, ia dapat bertindak balas dengan segera terhadap setiap perubahan harga, terutamanya untuk persekitaran perdagangan frekuensi tinggi. Ia menggunakan pengiraan berterusan dan teknologi cache penunjuk dalam kodnya, yang meningkatkan lagi kelajuan pelaksanaan.

  2. Mekanisme pengesahan bergandaGabungan pelbagai isyarat perdagangan yang disahkan oleh EMA, SMA, RSI, dan lain-lain mengurangkan risiko penembusan palsu. Sistem pengesahan ini memastikan bahawa kedudukan hanya akan dibuka apabila pelbagai syarat dipenuhi pada masa yang sama, meningkatkan kualiti perdagangan.

  3. Penapisan masa yang fleksibelDengan empat tempoh dagangan yang boleh disesuaikan, ia membolehkan peniaga menumpukan perhatian kepada tempoh pasaran yang tinggi dan turun naik, mengelakkan tempoh pasaran yang kurang aktif dan tidak stabil.

  4. Pengurusan risiko dinamikTarikan dinamik untuk menghentikan kerugian dan keuntungan berdasarkan ATR membolehkan strategi untuk menyesuaikan parameter risiko secara automatik mengikut turun naik pasaran dan menyesuaikan diri dengan keadaan pasaran yang berbeza.

  5. Sokongan automatik penuh: Melalui PineConnector dan integrasi dengan MT5, transaksi sepenuhnya automatik, mengurangkan campur tangan manusia dan kesan emosi. Kod mengandungi sistem amaran lengkap, menyokong mod pelaksanaan cepat.

  6. Pengoptimuman penggunaan sumber: Mengurangkan penggunaan sumber pengkomputeran dengan berkesan dengan mengira hasil metrik konstan dan cache, memastikan operasi yang cekap dalam persekitaran perdagangan masa nyata.

  7. Keputusan Pembantu VisualStrategi ini mempunyai panel paparan penunjuk prestasi dan penanda kedudukan, yang memberikan status perdagangan dan visualisasi isyarat yang intuitif, membantu pemantauan dan membuat keputusan secara manual.

Risiko Strategik

Walaupun terdapat banyak kelebihan, strategi ini mempunyai risiko dan cabaran:

  1. Pengecilan yang tinggiDalam persekitaran perdagangan frekuensi tinggi, slippage, kelewatan, dan kos dagangan boleh mempengaruhi hasil perdagangan sebenar secara ketara. Walaupun terdapat mod pelaksanaan cepat dalam kod, ia mungkin masih terhad kepada kelajuan pelaksanaan platform perdagangan dan broker dalam persekitaran perdagangan sebenar.

  2. Menembusi PerangkapWalaupun menggunakan mekanisme pengesahan berganda, ia masih boleh mencetuskan isyarat pecah palsu di pasaran yang bergelombang tinggi, menyebabkan kerugian perdagangan yang tidak perlu. Risiko ini lebih ketara terutamanya apabila parameter tidak betul atau keadaan pasaran berubah secara mendadak.

  3. Risiko yang terlalu optimumStrategi melibatkan pelbagai parameter (seperti EMA, SMA, RSI dan lain-lain), terdapat risiko terlalu optimasi (seperti curve-fitting) yang boleh menyebabkan strategi tidak berfungsi dengan baik di mata wang sebenar.

  4. Keterbatasan penapisan masaWalaupun penapisan masa dapat mengelakkan perdagangan yang tidak cekap, peluang perdagangan yang menguntungkan di luar waktu tertentu juga boleh dilewatkan, terutamanya semasa peristiwa pasaran utama atau siaran akhbar.

  5. Batasan kawalan risiko asas ATRDalam keadaan pasaran yang melampau, sasaran stop-loss dan profit berdasarkan ATR mungkin tidak mencukupi untuk menangani turun naik yang besar, yang menyebabkan stop-loss tidak berkesan atau berakhirnya keuntungan terlalu awal.

Pengurangan risiko

  • Cadangan untuk melakukan pengesahan semula dan pengesahan transaksi simulasi yang mencukupi sebelum pelepasan sebenar
  • Tetapan parameter yang disesuaikan dengan keadaan pasaran yang berbeza, terutamanya kelipatan ATR dan kitaran indikator
  • Pertimbangkan untuk menambah penapis keadaan pasaran tambahan, seperti indikator turun naik atau syarat jumlah dagangan
  • Menerapkan peraturan pengurusan wang untuk mengehadkan risiko transaksi tunggal
  • Memantau dan menilai prestasi strategi secara berkala, menyesuaikan dengan perubahan pasaran

Arah pengoptimuman strategi

Berdasarkan analisis kod, berikut adalah arah di mana strategi ini boleh dioptimumkan:

  1. Parameter dinamik menyesuaikan diri

    • Menerapkan penyesuaian dinamik parameter penunjuk seperti EMA, SMA, RSI, parameter pengoptimuman automatik mengikut keadaan pasaran
    • Pertimbangan untuk memperkenalkan algoritma pembelajaran mesin untuk mencapai penyesuaian parameter dan meningkatkan penyesuaian strategi
  2. Klasifikasi keadaan pasaran

    • Tambahan modul pengenalan keadaan pasaran untuk membezakan pasaran trend dan pasaran goyah
    • Menggunakan logik perdagangan dan parameter risiko yang berbeza mengikut keadaan pasaran yang berbeza
  3. Penambahbaikan sistem penapisan

    • Memperkenalkan penunjuk jumlah transaksi sebagai syarat penapisan tambahan untuk mengelakkan penembusan palsu dalam persekitaran kecairan rendah
    • Menambah penapis turun naik untuk menangguhkan dagangan dalam keadaan pasaran yang terlalu turun naik atau tidak cukup turun naik
  4. Pengoptimuman strategi hentikan kerugian

    • Memperkenalkan strategi hentian yang lebih kompleks, seperti hentian pintar berdasarkan kedudukan sokongan / rintangan
    • Tambah fungsi keuntungan separa yang membolehkan pelonggaran saham secara berturut-turut untuk mengunci sebahagian keuntungan
  5. Penilaian kualiti isyarat

    • Membangunkan sistem penilaian kekuatan isyarat untuk menilai kualiti isyarat berdasarkan pelbagai faktor
    • Mengubah saiz kedudukan secara dinamik berdasarkan kekuatan isyarat untuk pengurusan wang yang lebih halus
  6. Penghapusan kawalan

    • Menambah mekanisme kawalan penarikan balik maksimum, menghentikan perdagangan apabila kerugian berturut-turut mencapai paras terendah
    • Mewujudkan mekanisme perlindungan keuntungan untuk memastikan tidak berbalik dari keuntungan kepada kerugian
  7. Mengoptimumkan kecekapan pengiraan

    • Mengoptimumkan operasi intensif pengiraan, seperti menggunakan jadual carian sebagai ganti pengiraan berulang
    • Menerima algoritma penapisan masa yang lebih cekap, mengurangkan beban perhitungan untuk setiap carta pilar

Arahan pengoptimuman ini bukan sahaja meningkatkan prestasi dan kestabilan strategi, tetapi juga meningkatkan keupayaan mereka untuk menyesuaikan diri dengan keadaan pasaran yang berbeza, untuk mencapai keuntungan jangka panjang yang lebih mampan.

ringkaskan

Strategi perdagangan kuantitatif terobosan dinamik frekuensi tinggi pelbagai indikator adalah sistem perdagangan frekuensi tinggi yang komprehensif yang direka untuk pedagang garis pendek. Strategi ini membina kerangka perdagangan yang lengkap dengan menggabungkan pelbagai petunjuk teknikal, pengenalan terobosan harga, penapisan masa dan pengurusan risiko dinamik.

Ciri-ciri teknikal utama strategi ini termasuk EMA untuk menilai trend silang, SMA sebagai penapis harga, RSI untuk mengelakkan perdagangan zon overbought dan oversold, dan ATR untuk pengurusan risiko dinamik. Integrasi sistem penapisan masa dan PineConnector meningkatkan lagi kepraktisan dan fleksibiliti strategi ini.

Walaupun strategi ini menghadapi cabaran seperti risiko dan perangkap penembusan palsu yang unik untuk perdagangan frekuensi tinggi, risiko ini dapat dikawal dengan baik melalui pengurusan risiko yang munasabah dan pengoptimuman parameter. Arah pengoptimuman masa depan termasuk penyesuaian parameter, klasifikasi keadaan pasaran, peningkatan sistem penapisan dan strategi berhenti rugi pintar, dan lain-lain.

Bagi peniaga yang ingin mendapatkan kelebihan dalam perdagangan garis pendek, strategi ini menawarkan penyelesaian perdagangan kuantitatif yang berteknologi canggih dan logik, yang sangat sesuai untuk pengguna yang berminat dengan perdagangan pantas dan ingin meningkatkan kecekapan perdagangan melalui teknologi automatik.

Kod sumber strategi
/*backtest
start: 2024-08-04 00:00:00
end: 2025-08-02 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=5
strategy("Scalper TURBO", overlay=true, initial_capital=1000, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=50,
         calc_on_every_tick=true, process_orders_on_close=false)

// ==================== PERFORMANCE OPTIMIZATIONS ====================
// Pre-calculate constants to avoid repeated calculations
const int MINUTES_PER_HOUR = 60

// ==================== INPUT PARAMETERS ====================
// Technical Parameters
emaFastLen    = input.int(34, "EMA Rápida", minval=1)
emaSlowLen    = input.int(63, "EMA Lenta", minval=1)
smaLen        = input.int(34, "SMA Filtro", minval=1)
rsiLen        = input.int(14, "Periodo RSI", minval=1)
rsiOverbought = input.int(70, "RSI Sobrecompra", minval=1, maxval=100)
rsiOversold   = input.int(30, "RSI Sobreventa", minval=1, maxval=100)
breakoutPeriod = input.int(1, "Periodos para Breakout", minval=1)
atrLen        = input.int(14, "Periodo ATR", minval=1)
atrMultSL     = input.float(3, "Multiplicador ATR Stop-Loss", step=0.1)
atrMultTrail  = input.float(3, "Multiplicador ATR Trailing Stop", step=0.1)

// ==================== TIME FILTER SETTINGS ====================
var g_timefilters = "Time Filters"

// Time Filter Arrays for faster processing
useTimeFilter = array.new_bool(4)
startHour = array.new_int(4)
startMin = array.new_int(4)
endHour = array.new_int(4)
endMin = array.new_int(4)

// Time Filter 1
array.set(useTimeFilter, 0, input.bool(false, "Enable Time Filter 1", group=g_timefilters))
array.set(startHour, 0, input.int(9, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1start"))
array.set(startMin, 0, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1start"))
array.set(endHour, 0, input.int(11, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1end"))
array.set(endMin, 0, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1end"))

// Time Filter 2
array.set(useTimeFilter, 1, input.bool(false, "Enable Time Filter 2", group=g_timefilters))
array.set(startHour, 1, input.int(13, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2start"))
array.set(startMin, 1, input.int(30, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2start"))
array.set(endHour, 1, input.int(15, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2end"))
array.set(endMin, 1, input.int(0, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2end"))

// Time Filter 3
array.set(useTimeFilter, 2, input.bool(false, "Enable Time Filter 3", group=g_timefilters))
array.set(startHour, 2, input.int(16, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3start"))
array.set(startMin, 2, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3start"))
array.set(endHour, 2, input.int(18, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3end"))
array.set(endMin, 2, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3end"))

// Time Filter 4
array.set(useTimeFilter, 3, input.bool(false, "Enable Time Filter 4", group=g_timefilters))
array.set(startHour, 3, input.int(20, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4start"))
array.set(startMin, 3, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4start"))
array.set(endHour, 3, input.int(22, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4end"))
array.set(endMin, 3, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4end"))

// ==================== PINECONNECTOR SETTINGS ====================
var g_connector = "PineConnector Settings"
pcID = input.string(" ", "Pine Connector ID", group=g_connector)
symbolName = input.string("XAUUSD", "Symbol Name", tooltip="Symbol exactly as it appears in your MT5", group=g_connector)
lotSize = input.float(0.01, "Lot Size", step=0.01, group=g_connector)
enableRealTrading = input.bool(true, "Enable Real Trading", group=g_connector)
useFastExecution = input.bool(true, "Use Fast Execution Mode", group=g_connector)
showLabels = input.bool(true, "Show Info Labels", group=g_connector)

// Risk Management
useStopLoss = input.bool(true, "Use Stop Loss", group=g_connector)
useTakeProfit = input.bool(true, "Use Take Profit", group=g_connector)
useTrailingStop = input.bool(false, "Use Trailing Stop", group=g_connector)
stopLossATRMult = input.float(3, "Stop Loss ATR Multiple", step=0.1, group=g_connector)
takeProfitATRMult = input.float(3, "Take Profit ATR Multiple", step=0.1, group=g_connector)
trailingStopATRMult = input.float(3, "Trailing Stop ATR Multiple", step=0.1, group=g_connector)

// ==================== OPTIMIZED TIME FILTER FUNCTION ====================
// Cache current time components
currentHour = hour(time)
currentMin = minute(time)
currentTimeMinutes = currentHour * MINUTES_PER_HOUR + currentMin

// Optimized time check function
isTimeAllowed() =>
    anyEnabled = false
    timeOK = false
    
    for i = 0 to 3
        if array.get(useTimeFilter, i)
            anyEnabled := true
            startTimeMin = array.get(startHour, i) * MINUTES_PER_HOUR + array.get(startMin, i)
            endTimeMin = array.get(endHour, i) * MINUTES_PER_HOUR + array.get(endMin, i)
            
            inRange = startTimeMin <= endTimeMin ? 
                     (currentTimeMinutes >= startTimeMin and currentTimeMinutes <= endTimeMin) :
                     (currentTimeMinutes >= startTimeMin or currentTimeMinutes <= endTimeMin)
            
            if inRange
                timeOK := true
                break
    
    not anyEnabled or timeOK

// ==================== CACHED INDICATOR CALCULATIONS ====================
// Calculate indicators only once per bar
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
sma34   = ta.sma(close, smaLen)
rsi     = ta.rsi(close, rsiLen)
atr     = ta.atr(atrLen)

// Support/Resistance with caching
var float resistenciaReciente = na
var float soporteReciente = na
if barstate.isconfirmed
    resistenciaReciente := ta.highest(high, breakoutPeriod)[1]
    soporteReciente := ta.lowest(low, breakoutPeriod)[1]

// ==================== SIGNAL CONDITIONS ====================
// Pre-calculate all conditions
tendenciaAlcista = emaFast > emaSlow
tendenciaBajista = emaFast < emaSlow
rsiNotOverbought = rsi < rsiOverbought
rsiNotOversold = rsi > rsiOversold
priceAboveSMA = close > sma34
priceBelowSMA = close < sma34
timeAllowed = isTimeAllowed()

// Breakout conditions
breakoutUp = close > resistenciaReciente
breakoutDown = close < soporteReciente

// Final entry conditions - simplified logic
longSignal = breakoutUp and tendenciaAlcista and rsiNotOverbought and priceAboveSMA and timeAllowed
shortSignal = breakoutDown and tendenciaBajista and rsiNotOversold and priceBelowSMA and timeAllowed

// ==================== POSITION MANAGEMENT ====================
// Efficient position tracking
var int currentPosition = 0  // 1 = long, -1 = short, 0 = flat
var bool positionChanged = false
var string pendingAlert = ""

// Detect position changes
newLong = longSignal and currentPosition <= 0
newShort = shortSignal and currentPosition >= 0

// ==================== OPTIMIZED ALERT SYSTEM ====================
// Pre-build alert components for faster execution
stopPips = useStopLoss ? str.tostring(math.round(atr * stopLossATRMult * 100)) : ""
tpPips = useTakeProfit ? str.tostring(math.round(atr * takeProfitATRMult * 100)) : ""
trailPips = useTrailingStop ? str.tostring(math.round(atr * trailingStopATRMult * 100)) : ""

// Build risk management string once
riskParams = useStopLoss ? ",sl=" + stopPips : ""
riskParams += useTakeProfit ? ",tp=" + tpPips : ""
riskParams += useTrailingStop ? ",trailingstop=" + trailPips : ""

// ==================== FAST EXECUTION MODE ====================
if enableRealTrading
    // LONG ENTRY
    if newLong
        // Close short first if needed
        if currentPosition < 0
            alert(pcID + ",closeshort," + symbolName, alert.freq_once_per_bar)
        
        // Enter long
        strategy.entry("Long", strategy.long)
        longAlert = pcID + ",buy," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
        alert(longAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
        currentPosition := 1
    
    // SHORT ENTRY
    else if newShort
        // Close long first if needed
        if currentPosition > 0
            alert(pcID + ",closelong," + symbolName, alert.freq_once_per_bar)
        
        // Enter short
        strategy.entry("Short", strategy.short)
        shortAlert = pcID + ",sell," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
        alert(shortAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
        currentPosition := -1
else
    // Backtest mode
    if newLong
        strategy.entry("Long", strategy.long)
        currentPosition := 1
    else if newShort
        strategy.entry("Short", strategy.short)
        currentPosition := -1

// ==================== STOP LOSS MANAGEMENT ====================
// Calculate stops only when in position
if currentPosition != 0
    if currentPosition > 0
        stopLong = strategy.position_avg_price - atr * atrMultSL
        strategy.exit("Exit Long", "Long", stop=stopLong, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)
    else
        stopShort = strategy.position_avg_price + atr * atrMultSL
        strategy.exit("Exit Short", "Short", stop=stopShort, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)

// Detect exits
if strategy.position_size == 0 and currentPosition != 0
    if enableRealTrading
        exitAlert = currentPosition > 0 ? pcID + ",closelong," + symbolName : pcID + ",closeshort," + symbolName
        alert(exitAlert, alert.freq_once_per_bar)
    currentPosition := 0