Strategi retracement crossover SMA trailing stop loss posisi dinamis

SMA MA RRR TP SL
Tanggal Pembuatan: 2025-02-21 13:51:50 Akhirnya memodifikasi: 2025-02-21 13:51:50
menyalin: 0 Jumlah klik: 338
2
fokus pada
319
Pengikut

Strategi retracement crossover SMA trailing stop loss posisi dinamis Strategi retracement crossover SMA trailing stop loss posisi dinamis

Ringkasan

Strategi ini adalah sistem perdagangan otomatis yang didasarkan pada crossover rata-rata dan manajemen posisi dinamis. Ini menggunakan rata-rata bergerak sederhana 50-hari dan 200-hari (SMA) sebagai indikator utama, digabungkan dengan penyesuaian posisi dinamis dan mekanisme tracking stop loss, untuk mencari peluang perdagangan dalam tren pasar.

Prinsip Strategi

Strategi ini didasarkan pada prinsip-prinsip inti berikut:

  1. Sinyal masuk didasarkan pada persilangan harga dengan 50 hari rata-rata garis, dan merujuk pada 50 hari rata-rata garis dengan 200 hari rata-rata garis untuk menilai tren besar
  2. Bila harga terjatuh dari arah di bawah garis rata-rata, maka akan memicu sinyal multisignal; sebaliknya, akan memicu sinyal gap
  3. Manajemen posisi menggunakan mekanisme penyesuaian dinamis, meningkatkan jumlah posisi yang dipegang ketika keuntungan akun melebihi 4000
  4. Stop loss menggunakan mekanisme tracking stop loss, yang secara dinamis menyesuaikan posisi stop loss seiring peningkatan keuntungan
  5. Rasio risiko-keuntungan ditetapkan menjadi 1: 2.5, memastikan bahwa ekspektasi keuntungan dari setiap transaksi lebih besar dari risiko

Keunggulan Strategis

  1. Logika perdagangan yang jelas dan jelas, yang dikombinasikan dengan indikator teknis dan perilaku harga untuk menentukan waktu masuk
  2. Mengadopsi manajemen posisi dinamis, dapat meningkatkan skala perdagangan secara tepat pada saat keuntungan, meningkatkan efisiensi penggunaan dana
  3. Tracking Stop Loss Mechanism dapat secara efektif mengunci keuntungan dan menghindari penarikan besar-besaran
  4. Menetapkan penyaring waktu perdagangan, hanya beroperasi pada saat perdagangan utama, menghindari risiko periode likuiditas rendah
  5. Mempunyai mekanisme pengendalian risiko yang baik, termasuk pengelolaan stop loss, profit target, dan posisi

Risiko Strategis

  1. Dalam pasar yang bergoyang dapat sering memicu sinyal breakout palsu yang menyebabkan stop loss berturut-turut
  2. Manajemen posisi dinamis dapat menyebabkan kerugian yang lebih besar jika pasar tiba-tiba bergeser
  3. Bergantung pada sistem linier dapat bereaksi lambat dalam pasar yang berfluktuasi cepat
  4. Rasio risiko-keuntungan tetap mungkin melewatkan beberapa peluang tren besar yang potensial
  5. Pembatasan waktu perdagangan dapat melewatkan beberapa peluang pasar penting

Arah optimasi strategi

  1. Indikator volatilitas dapat diperkenalkan untuk menyesuaikan parameter secara dinamis dalam berbagai kondisi pasar
  2. Pertimbangkan untuk menambahkan indikator sentimen pasar untuk meningkatkan akurasi sinyal masuk
  3. Optimalkan parameter tracking stop loss agar lebih sesuai dengan kondisi pasar yang berbeda
  4. Menambahkan analisis siklus waktu ganda untuk meningkatkan stabilitas sistem perdagangan
  5. Pendahuluan analisis lalu lintas untuk meningkatkan keandalan sinyal

Meringkaskan

Strategi ini membangun sistem perdagangan yang relatif lengkap dengan menggabungkan sistem linear, manajemen posisi dinamis, dan mekanisme tracking stop loss. Keunggulan strategi ini adalah memiliki logika perdagangan yang jelas dan mekanisme kontrol risiko yang baik, tetapi ada juga beberapa tempat yang perlu dioptimalkan. Dengan perbaikan dan pengoptimalan terus menerus, strategi ini diharapkan dapat berkinerja lebih baik dalam perdagangan nyata.

Kode 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)