Kedudukan dinamik trailing stop loss Strategi anjakan silang silang SMA

SMA MA RRR TP SL
Tarikh penciptaan: 2025-02-21 13:51:50 Akhirnya diubah suai: 2025-02-21 13:51:50
Salin: 0 Bilangan klik: 338
2
fokus pada
319
Pengikut

Kedudukan dinamik trailing stop loss Strategi anjakan silang silang SMA Kedudukan dinamik trailing stop loss Strategi anjakan silang silang SMA

Gambaran keseluruhan

Strategi ini adalah sistem perdagangan automatik yang berasaskan crossover rata-rata dan pengurusan kedudukan dinamik. Ia menggunakan purata bergerak sederhana 50 dan 200 hari ((SMA) sebagai petunjuk utama, digabungkan dengan penyesuaian kedudukan dinamik dan mekanisme berhenti untuk mencari peluang perdagangan dalam trend pasaran.

Prinsip Strategi

Strategi ini adalah berdasarkan kepada prinsip-prinsip utama berikut:

  1. Isyarat masuk berdasarkan persilangan harga dengan garis purata 50 hari, sambil merujuk kedudukan relatif garis purata 50 hari dengan garis purata 200 hari untuk menilai trend besar
  2. Apabila harga menembusi arah di bawah garis purata, ia akan mencetuskan isyarat lebih; sebaliknya ia akan mencetuskan isyarat kurang
  3. Pengurusan kedudukan menggunakan mekanisme penyesuaian dinamik, meningkatkan jumlah pegangan apabila keuntungan akaun melebihi 4000
  4. Stop loss menggunakan mekanisme tracking stop loss yang secara dinamik menyesuaikan kedudukan stop loss apabila keuntungan meningkat
  5. Rasio risiko-keuntungan ditetapkan sebagai 1: 2.5, memastikan jangkaan keuntungan setiap dagangan lebih besar daripada risiko

Kelebihan Strategik

  1. Logik dagangan jelas dan jelas, digabungkan dengan petunjuk teknikal dan tingkah laku harga untuk menentukan masa masuk
  2. Menggunakan pengurusan kedudukan dinamik untuk meningkatkan skala dagangan dan kecekapan penggunaan wang semasa keuntungan
  3. Mekanisme Hentikan Kerosakan yang dikesan dapat mengunci keuntungan dan mengelakkan penarikan balik yang besar
  4. Penapis waktu dagangan yang ditetapkan, beroperasi hanya pada masa dagangan utama, mengelakkan risiko semasa tempoh kecairan rendah
  5. Mempunyai mekanisme kawalan risiko yang baik, termasuk kawalan kerugian, sasaran keuntungan dan pengurusan kedudukan

Risiko Strategik

  1. Mungkin sering mencetuskan isyarat pecah palsu dalam pasaran yang bergolak, menyebabkan hentian berterusan
  2. Pengurusan kedudukan dinamik boleh menyebabkan kerugian yang lebih besar apabila pasaran berubah secara tiba-tiba
  3. Sistem yang bergantung kepada sistem linear mungkin terlambat bereaksi dalam pasaran yang berubah-ubah dengan cepat
  4. Risiko tetap berbanding ganjaran mungkin terlepas peluang untuk trend besar yang berpotensi
  5. Pembatasan masa perdagangan mungkin terlepas peluang pasaran yang penting

Arah pengoptimuman strategi

  1. Boleh memperkenalkan indikator kadar turun naik, parameter penyesuaian dinamik dalam keadaan pasaran yang berbeza
  2. Pertimbangkan untuk menambah indikator sentimen pasaran untuk meningkatkan ketepatan isyarat masuk
  3. Mengoptimumkan parameter tracking stop loss agar lebih sesuai dengan keadaan pasaran yang berbeza
  4. Menambah analisis pelbagai kitaran masa untuk meningkatkan kestabilan sistem perdagangan
  5. Pengenalan analisis kuantiti lalu lintas untuk meningkatkan kebolehpercayaan isyarat

ringkaskan

Strategi ini membina sistem perdagangan yang agak lengkap dengan menggabungkan sistem garis lurus, pengurusan kedudukan dinamik, dan mekanisme pengesanan berhenti. Strategi ini mempunyai kelebihan dengan logik perdagangan yang jelas dan mekanisme kawalan risiko yang baik, tetapi terdapat juga beberapa tempat yang perlu dioptimumkan. Dengan penambahbaikan dan pengoptimuman berterusan, strategi ini dijangka dapat mencapai prestasi yang lebih baik dalam perdagangan sebenar.

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

//@version=5
strategy("15m - Rebound 50SMA with Dynamic Lots & Trailing Stop, RRR 2:1, Date Filter (Closed Bars Only)", 
     overlay=true, 
     initial_capital=50000, 
     default_qty_type=strategy.fixed, 
     default_qty_value=1, 
     pyramiding=0, 
     calc_on_order_fills=true)

// ===== INPUTS =====
sma50Period  = input.int(50, "50 SMA Period", minval=1)
sma200Period = input.int(200, "200 SMA Period", minval=1)

// ===== CALCULATE SMAs =====
sma50  = ta.sma(close, sma50Period)
sma200 = ta.sma(close, sma200Period)

// ===== PLOT SMAs =====
plot(sma50, color=color.red, title="50 SMA")
plot(sma200, color=color.blue, title="200 SMA")

// ===== DEFINE TRADING SESSIONS =====
// Trading is allowed 15 minutes after market open:
//   - New York: 09:45–16:00 (America/New_York)
//   - London:   08:15–16:00 (Europe/London)
nySession     = not na(time("15", "0945-1600", "America/New_York"))
londonSession = not na(time("15", "0815-1600", "Europe/London"))
inSession     = nySession or londonSession

// ===== DEFINE DATE RANGE =====
// Only allow orders on or after January 1, 2024.
// (We include seconds in the timestamp for proper parsing.)
startDate   = timestamp("UTC", 2024, 1, 1, 0, 0, 0)
inDateRange = time >= startDate

// ===== DEFINE ENTRY CONDITIONS =====
// ----- LONG ENTRY CONDITION -----
// A long entry is triggered when:
//   - The previous candle closed below the 50 SMA and the current candle closes above it,
//   - And the 50 SMA is above the 200 SMA.
longCondition = (close[1] < sma50[1]) and (close > sma50) and (sma50 > sma200)

// ----- SHORT ENTRY CONDITION -----
// A short entry is triggered when:
//   - The previous candle closed above the 50 SMA and the current candle closes below it,
//   - And the 50 SMA is below the 200 SMA.
shortCondition = (close[1] > sma50[1]) and (close < sma50) and (sma50 < sma200)

// ===== DEBUG PLOTS =====
plotshape(longCondition and barstate.isconfirmed, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.tiny)
plotshape(shortCondition and barstate.isconfirmed, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.tiny)

// ===== VARIABLES FOR STOP LOSS MANAGEMENT =====
// For long positions.
var float initialLongStop = na   // Set at entry: low of the rebound candle.
var float trailStopLong   = na   // Updated trailing stop for long.
// For short positions.
var float initialShortStop = na  // Set at entry: high of the rebound candle.
var float trailStopShort   = na  // Updated trailing stop for short.

// ===== DYNAMIC LOT SIZE =====
// If current profit (strategy.equity - 50000) exceeds 4000, lot size becomes 3; otherwise, 2.
lotSize = (strategy.equity - 50000 > 4000) ? 3 : 2

// ===== ENTRY LOGIC (EXECUTED ON CONFIRMED BARS) =====
if barstate.isconfirmed and inSession and inDateRange and longCondition and strategy.position_size <= 0
    initialLongStop := low
    trailStopLong   := initialLongStop
    if strategy.position_size < 0
        strategy.close("Short", comment="Close Short before Long")
    // Submit a market order entry (no offset).
    strategy.entry("Long", strategy.long, qty=lotSize, comment="Enter Long")
    
if barstate.isconfirmed and inSession and inDateRange and shortCondition and strategy.position_size >= 0
    initialShortStop := high
    trailStopShort   := initialShortStop
    if strategy.position_size > 0
        strategy.close("Long", comment="Close Long before Short")
    // Submit a market order entry (no offset).
    strategy.entry("Short", strategy.short, qty=lotSize, comment="Enter Short")
    
// ===== TRAILING STOP LOGIC & EXIT ORDERS (ON CLOSED BARS) =====

if barstate.isconfirmed and strategy.position_size > 0
    // For Long Positions:
    floatingProfitLong = (close - strategy.position_avg_price) / syminfo.mintick
    newTrailLong = trailStopLong  // Default: no change.
    if floatingProfitLong >= 20 and floatingProfitLong < 30
        newTrailLong := initialLongStop + 5 * syminfo.mintick
    else if floatingProfitLong >= 31 and floatingProfitLong < 40
        newTrailLong := initialLongStop + 10 * syminfo.mintick
    else if floatingProfitLong >= 41 and floatingProfitLong < 50
        newTrailLong := initialLongStop + 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopLong := math.max(trailStopLong, newTrailLong)
    
    longRisk = strategy.position_avg_price - trailStopLong
    tpLong   = strategy.position_avg_price + 2.5 * longRisk
    strategy.exit("Exit Long", from_entry="Long", stop=trailStopLong, limit=tpLong)

if barstate.isconfirmed and strategy.position_size < 0
    // For Short Positions:
    floatingProfitShort = (strategy.position_avg_price - close) / syminfo.mintick
    newTrailShort = trailStopShort  // Default: no change.
    if floatingProfitShort >= 20 and floatingProfitShort < 30
        newTrailShort := initialShortStop - 5 * syminfo.mintick
    else if floatingProfitShort >= 31 and floatingProfitShort < 40
        newTrailShort := initialShortStop - 10 * syminfo.mintick
    else if floatingProfitShort >= 41 and floatingProfitShort < 50
        newTrailShort := initialShortStop - 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopShort := math.min(trailStopShort, newTrailShort)
    
    shortRisk = trailStopShort - strategy.position_avg_price
    tpShort = strategy.position_avg_price - 2.5 * shortRisk
    strategy.exit("Exit Short", from_entry="Short", stop=trailStopShort, limit=tpShort)