Strategi Stop Loss dan Take Profit Dinamis Berdasarkan Stop Trailing ATR Ganda

Penulis:ChaoZhang, Tanggal: 2024-03-22 13:52:59
Tag:

img

Gambaran umum

Strategi ini membangun garis stop-loss trailing dinamis ganda menggunakan dua indikator Average True Range (ATR) dengan periode yang berbeda, menghasilkan sinyal perdagangan ketika harga menembus garis stop-loss.

Prinsip Strategi

  1. Menghitung nilai indikator ATR untuk dua periode yang berbeda (default 10 dan 20), kemudian mengalikannya dengan koefisien sensitivitas masing-masing (default 1 dan 2) untuk mendapatkan dua lebar stop loss.
  2. Menghasilkan sinyal panjang atau pendek berdasarkan posisi harga di atas atau di bawah dua garis stop-loss dan situasi breakout.
  3. Tingkat take-profit dihitung secara dinamis berdasarkan 1,65 kali (bisa disesuaikan) panjang tubuh lilin saat ini.
  4. Setelah membuka posisi, jika harga mencapai level take-profit, posisi ditutup untuk mengambil keuntungan.
  5. Gunakan indikator seperti EMA untuk membantu menilai tren saat ini dan memberikan referensi untuk masuk.

Strategi ini memanfaatkan karakteristik indikator ATR untuk membangun stop-loss dinamis ganda, yang dapat beradaptasi dengan baik dengan volatilitas pasar yang berbeda dan dengan cepat merespons perubahan pasar.

Analisis Keuntungan

  1. Garis stop-loss dual dinamis dapat beradaptasi dengan volatilitas pasar yang berbeda dan memiliki fleksibilitas yang tinggi.
  2. Tingkat mengambil keuntungan secara dinamis dihitung berdasarkan panjang tubuh lilin saat ini, memungkinkan lebih banyak keuntungan untuk ditangkap di pasar tren.
  3. Penggunaan EMA dan indikator lain untuk membantu penilaian tren memberikan referensi untuk masuk dan meningkatkan keandalan strategi.
  4. Logika kode jelas dan mudah dibaca, membuatnya mudah dipahami dan dioptimalkan.

Analisis Risiko

  1. Di pasar yang terikat rentang, perdagangan yang sering dapat menyebabkan biaya transaksi yang tinggi dan mempengaruhi profitabilitas.
  2. Pengaturan parameter garis stop-loss dan pengganda take-profit perlu dioptimalkan sesuai dengan karakteristik pasar dan produk yang berbeda; parameter yang tidak tepat dapat mengakibatkan kinerja strategi yang buruk.
  3. Strategi ini terutama mengandalkan price breakouts dari garis stop-loss dinamis untuk menghasilkan sinyal, yang dapat menghasilkan sinyal palsu dalam beberapa fluktuasi besar fake breakouts.

Arahan Optimasi

  1. Untuk pasar yang terikat kisaran, pertimbangkan untuk memperkenalkan lebih banyak indikator atau kondisi untuk menyaring sinyal perdagangan, seperti RSI dan MACD.
  2. Untuk produk dan pasar yang berbeda, backtesting historis dan pengoptimalan parameter dapat digunakan untuk menemukan parameter garis stop-loss optimal dan pengganda take-profit.
  3. Pertimbangkan untuk memperkenalkan modul manajemen posisi dan kontrol risiko untuk menyesuaikan ukuran posisi secara dinamis berdasarkan volatilitas pasar dan risiko akun.
  4. Tambahkan lebih banyak indikator penilaian tren untuk meningkatkan keandalan dan akurasi sinyal.

Ringkasan

Strategi ini, dengan desain garis stop-loss dinamis ganda dan take-profit dinamis, dapat beradaptasi dengan baik dengan lingkungan pasar yang berbeda dan berkinerja baik di pasar tren. Namun, di pasar yang terikat rentang, strategi ini mungkin menghadapi masalah perdagangan yang sering dan pengimbangi keuntungan dan kerugian. Oleh karena itu, strategi ini lebih cocok untuk digunakan di pasar tren dan perlu dioptimalkan dan disesuaikan berdasarkan karakteristik produk dan kondisi pasar. Selain itu, masih ada ruang untuk pengoptimalan lebih lanjut, seperti memperkenalkan lebih banyak kondisi penyaringan, manajemen posisi, dan modul kontrol risiko untuk meningkatkan ketahanan dan profitabilitas strategi. Secara keseluruhan, strategi ini memiliki ide yang jelas, logika yang sederhana dan mudah dimengerti, dan memiliki nilai praktis tertentu dan ruang untuk pengoptimalan, yang layak untuk penelitian dan aplikasi lebih lanjut.


/*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)

Lebih banyak