Strategi stop-profit dan stop-loss dinamis berdasarkan ATR double trailing stop


Tanggal Pembuatan: 2024-03-22 13:52:59 Akhirnya memodifikasi: 2024-03-22 13:52:59
menyalin: 1 Jumlah klik: 616
1
fokus pada
1617
Pengikut

Strategi stop-profit dan stop-loss dinamis berdasarkan ATR double trailing stop

Ringkasan

Strategi ini menggunakan dua indikator ATR (Average True Range) dengan periode yang berbeda untuk membangun garis stop yang dinamika ganda, menghasilkan sinyal perdagangan ketika harga melewati garis stop. Strategi ini juga menggabungkan indikator EMA untuk membantu menilai tren.

Prinsip Strategi

  1. Hitung nilai indikator ATR untuk dua periode yang berbeda (default 10 dan 20), lalu kalikan dengan faktor sensitivitas masing-masing (default 1 dan 2) untuk mendapatkan dua lebar stop loss.
  2. Sebuah sinyal overhead atau overhead dihasilkan berdasarkan posisi harga di atas atau di bawah dua garis stop loss dan pada saat terjadi penembusan.
  3. Harga stop loss dihitung secara dinamis berdasarkan 1.65 kali panjang entitas stop loss saat ini.
  4. Setelah membuka posisi, jika harga menyentuh harga stop loss, maka posisi terbuka akan berakhir.
  5. Menggunakan indikator seperti EMA untuk menilai tren saat ini dan memberikan referensi untuk masuk.

Strategi ini memanfaatkan karakteristik indikator ATR, membangun stop loss dinamis ganda, dapat beradaptasi dengan lebih baik terhadap berbagai tingkat fluktuasi pasar, tetapi juga dapat dengan cepat menanggapi perubahan pasar. Pengaturan stop loss dinamis memungkinkan strategi untuk mendapatkan lebih banyak keuntungan dalam situasi tren. Secara keseluruhan, strategi ini berkinerja baik di pasar yang sedang tren, tetapi dapat mengimbangi kerugian yang lebih banyak di pasar yang bergolak.

Analisis Keunggulan

  1. Garis stop loss dinamis ganda dapat beradaptasi dengan fluktuasi pasar yang berbeda, dan memiliki fleksibilitas yang lebih tinggi.
  2. Stop-loss harga berdasarkan dinamika panjang entitas pivot saat ini, dapat memperoleh lebih banyak keuntungan dalam situasi tren.
  3. Menggunakan indikator pendukung untuk menilai tren, seperti EMA, untuk memberikan referensi untuk masuk, meningkatkan keandalan strategi.
  4. Kode logis yang jelas, mudah dibaca, mudah dipahami dan dioptimalkan.

Analisis risiko

  1. Dalam pasar yang bergejolak, transaksi yang sering dapat menyebabkan biaya biaya yang lebih tinggi, yang mempengaruhi keuntungan.
  2. Pengaturan parameter stop loss dan stop loss multiplier perlu dioptimalkan sesuai dengan karakteristik pasar dan produk yang berbeda. Parameter yang tidak tepat dapat menyebabkan kinerja strategi yang buruk.
  3. Strategi ini terutama bergantung pada sinyal yang dihasilkan oleh harga yang menerobos garis stop loss yang dinamis, dan mungkin menghasilkan sinyal yang salah untuk beberapa situasi penembusan palsu yang berfluktuasi besar.

Arah optimasi

  1. Untuk pasar yang bergoyang, pertimbangkan untuk memperkenalkan lebih banyak indikator atau kondisi untuk memfilter sinyal perdagangan, seperti RSI, MACD, dll.
  2. Untuk produk dan pasar yang berbeda, parameter stop-loss line parameter dan stop-loss multiplier yang optimal dapat ditemukan melalui retrospeksi historis dan optimasi parameter.
  3. Modul manajemen posisi dan kontrol risiko dapat dipertimbangkan untuk menyesuaikan ukuran posisi berdasarkan volatilitas pasar dan dinamika risiko akun.
  4. Menambahkan lebih banyak indikator untuk menilai tren, meningkatkan keandalan dan akurasi sinyal.

Meringkaskan

Strategi ini dirancang dengan stop loss dan stop loss yang dinamis ganda, sehingga dapat beradaptasi dengan baik dengan berbagai lingkungan pasar, dan berkinerja baik dalam situasi tren. Namun, dalam pasar yang bergolak, mungkin menghadapi masalah perdagangan yang sering terjadi dan offset keuntungan dan kerugian. Oleh karena itu, strategi ini lebih cocok untuk digunakan di pasar yang sedang tren, dan perlu mengoptimalkan dan menyesuaikan parameternya dengan menggabungkan karakteristik produk dan lingkungan pasar. Selain itu, masih ada ruang untuk pengoptimalan lebih lanjut, seperti memperkenalkan lebih banyak kondisi penyaringan, manajemen posisi, dan modul kontrol seperti risiko, untuk meningkatkan kehandalan dan profitabilitas strategi.

Kode Sumber Strategi
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
h = input(false, title="Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
 
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=false) : close

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

xATRTrailingStop2 = 0.0
xATRTrailingStop2 := iff(src > nz(xATRTrailingStop2[1], 0) and src[1] > nz(xATRTrailingStop2[1], 0), max(nz(xATRTrailingStop2[1]), src - nLoss2),
   iff(src < nz(xATRTrailingStop2[1], 0) and src[1] < nz(xATRTrailingStop2[1], 0), min(nz(xATRTrailingStop2[1]), src + nLoss2), 
   iff(src > nz(xATRTrailingStop2[1], 0), src - nLoss2, src + nLoss2)))
 
pos = 0   
pos := iff(src[1] < nz(xATRTrailingStop1[1], 0) and src > nz(xATRTrailingStop1[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop1[1], 0) and src < nz(xATRTrailingStop1[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)