Strategi Stop Loss dan Take Profit Dinamik Berdasarkan Stop Trailing ATR Berganda

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

img

Ringkasan

Strategi ini membina garis stop-loss yang berganda menggunakan dua penunjuk Julat Benar Purata (ATR) dengan tempoh yang berbeza, menjana isyarat perdagangan apabila harga memecahkan garis stop-loss. Ia juga secara dinamik menetapkan tahap mengambil keuntungan berdasarkan panjang badan lilin semasa untuk mencapai stop-loss dan mengambil keuntungan yang dinamik. Strategi ini juga menggabungkan penunjuk EMA untuk membantu menilai trend.

Prinsip Strategi

  1. Mengira nilai penunjuk ATR untuk dua tempoh yang berbeza (default 10 dan 20), kemudian kalikan dengan pekali sensitiviti masing-masing (default 1 dan 2) untuk mendapatkan dua lebar stop-loss.
  2. Menghasilkan isyarat panjang atau pendek berdasarkan kedudukan harga di atas atau di bawah dua garis stop-loss dan keadaan pecah.
  3. Tahap mengambil keuntungan dikira secara dinamik berdasarkan 1,65 kali (boleh diselaraskan) panjang badan lilin semasa.
  4. Selepas membuka kedudukan, jika harga mencapai tahap mengambil keuntungan, kedudukan ditutup untuk mengambil keuntungan.
  5. Gunakan penunjuk seperti EMA untuk membantu menilai trend semasa dan memberikan rujukan untuk kemasukan.

Strategi ini menggunakan ciri-ciri penunjuk ATR untuk membina stop-loss dinamik berganda, yang dapat menyesuaikan diri dengan baik dengan turun naik pasaran yang berbeza dan dengan cepat bertindak balas terhadap perubahan pasaran. Tetapan mengambil keuntungan dinamik membolehkan strategi untuk menangkap lebih banyak keuntungan di pasaran yang sedang berkembang. Secara keseluruhan, strategi ini berfungsi dengan baik di pasaran yang sedang berkembang tetapi mungkin mengalami keuntungan dan kerugian yang kerap di pasaran yang terhad.

Analisis Kelebihan

  1. Garis stop-loss dinamik berganda boleh menyesuaikan diri dengan turun naik pasaran yang berbeza dan mempunyai fleksibiliti yang tinggi.
  2. Tahap mengambil keuntungan dikira secara dinamik berdasarkan panjang badan lilin semasa, yang membolehkan lebih banyak keuntungan ditangkap di pasaran tren.
  3. Penggunaan EMA dan penunjuk lain untuk membantu penilaian trend menyediakan rujukan untuk kemasukan dan meningkatkan kebolehpercayaan strategi.
  4. Logik kod jelas dan boleh dibaca, menjadikannya mudah difahami dan dioptimumkan.

Analisis Risiko

  1. Di pasaran terhad julat, perdagangan yang kerap boleh membawa kepada kos urus niaga yang tinggi dan menjejaskan keuntungan.
  2. Tetapan parameter garis stop-loss dan pengganda keuntungan perlu dioptimumkan mengikut ciri pasaran dan produk yang berbeza; parameter yang tidak betul boleh menyebabkan prestasi strategi yang buruk.
  3. Strategi ini terutamanya bergantung pada harga pecah dari garis stop-loss dinamik untuk menjana isyarat, yang boleh menghasilkan isyarat palsu dalam beberapa fluktuasi besar pecah palsu.

Arahan pengoptimuman

  1. Untuk pasaran terikat julat, pertimbangkan untuk memperkenalkan lebih banyak penunjuk atau keadaan untuk menapis isyarat perdagangan, seperti RSI dan MACD.
  2. Untuk produk dan pasaran yang berbeza, pengujian semula sejarah dan pengoptimuman parameter boleh digunakan untuk mencari parameter garis stop-loss yang optimum dan pengganda keuntungan.
  3. Mempertimbangkan pengenalan modul pengurusan kedudukan dan kawalan risiko untuk menyesuaikan saiz kedudukan secara dinamik berdasarkan turun naik pasaran dan risiko akaun.
  4. Tambah lebih banyak penunjuk penilaian trend untuk meningkatkan kebolehpercayaan dan ketepatan isyarat.

Ringkasan

Strategi ini, dengan reka bentuk garis stop-loss dinamik berganda dan mengambil keuntungan dinamik, dapat menyesuaikan diri dengan baik dengan persekitaran pasaran yang berbeza dan berfungsi dengan baik di pasaran trend. Walau bagaimanapun, di pasaran yang terhad, ia mungkin menghadapi masalah perdagangan yang kerap dan keuntungan dan kerugian. Oleh itu, strategi ini lebih sesuai untuk digunakan di pasaran trend dan perlu dioptimumkan dan diselaraskan berdasarkan ciri-ciri produk dan keadaan pasaran. Selain itu, masih ada ruang untuk pengoptimuman lanjut, seperti memperkenalkan lebih banyak syarat penapisan, pengurusan kedudukan, dan modul kawalan risiko untuk meningkatkan ketahanan dan keuntungan strategi. Secara keseluruhan, strategi ini mempunyai idea yang jelas, logik yang mudah dan mudah difahami, dan mempunyai nilai praktikal dan ruang pengoptimuman tertentu, yang layak untuk penyelidikan dan penerapan 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 lanjut