Strategi henti untung dan henti rugi dinamik berdasarkan hentian mengekor dua ATR


Tarikh penciptaan: 2024-03-22 13:52:59 Akhirnya diubah suai: 2024-03-22 13:52:59
Salin: 1 Bilangan klik: 616
1
fokus pada
1617
Pengikut

Strategi henti untung dan henti rugi dinamik berdasarkan hentian mengekor dua ATR

Gambaran keseluruhan

Strategi ini menggunakan dua tempoh yang berbeza ATR ((Average True Range) penunjuk, untuk membina dua garis berhenti yang dinamika, untuk menghasilkan isyarat perdagangan apabila harga menembusi garis berhenti. Ia juga menggunakan entiti panjang garisan untuk menetapkan harga berhenti secara dinamik, untuk mencapai berhenti berhenti dinamik.

Prinsip Strategi

  1. Hitung nilai penunjuk ATR untuk dua kitaran yang berbeza (default 10 dan 20), kemudian kalikan dengan faktor kepekaan masing-masing (default 1 dan 2) untuk mendapatkan dua lebar hentian.
  2. Ia menghasilkan isyarat overhead atau overhead, bergantung kepada kedudukan harga di atas atau di bawah dua garis stop loss dan keadaan penembusan.
  3. Harga penangguhan dihitung secara dinamik berdasarkan 1.65 kali panjang entiti penangguhan semasa (boleh disesuaikan).
  4. Selepas membuka kedudukan, jika harga menyentuh harga hentian, kedudukan terbuka akan mendapat keuntungan.
  5. Menggunakan indikator seperti EMA untuk menilai trend semasa dan memberi rujukan untuk masuk.

Strategi ini menggunakan ciri-ciri penunjuk ATR, membina double dynamic stop loss, yang dapat menyesuaikan diri dengan lebih baik dengan kadar turun naik pasaran yang berbeza, dan juga dapat bertindak balas dengan cepat terhadap perubahan pasaran. Tetapan stop loss dinamik membolehkan strategi ini memperoleh lebih banyak keuntungan dalam keadaan trend. Secara keseluruhannya, strategi ini berkinerja baik dalam pasaran yang sedang berkembang, tetapi kerugian yang lebih tinggi mungkin berlaku di pasaran yang bergolak.

Analisis kelebihan

  1. Garis Hentian Dinamik Ganda mampu menyesuaikan diri dengan kadar turun naik pasaran yang berbeza dan mempunyai fleksibiliti yang tinggi.
  2. Stop-loss harga berdasarkan dinamika panjang entiti garis tangkapan semasa, untuk mendapatkan lebih banyak keuntungan dalam keadaan trend.
  3. Penggunaan indikator seperti EMA membantu menilai trend, memberikan rujukan untuk masuk, dan meningkatkan kebolehpercayaan strategi.
  4. Logik kod jelas, mudah dibaca, mudah difahami dan dioptimumkan.

Analisis risiko

  1. Dalam pasaran yang bergolak, perdagangan yang kerap boleh menyebabkan kos bayaran yang lebih tinggi dan menjejaskan keuntungan.
  2. Tetapan parameter barisan henti dan pengganda henti perlu dioptimumkan mengikut ciri-ciri pasaran dan produk yang berbeza, dan parameter yang tidak betul boleh menyebabkan prestasi strategi yang buruk.
  3. Strategi ini bergantung kepada penembusan harga untuk menghasilkan isyarat stop loss, dan mungkin menghasilkan isyarat yang salah untuk beberapa pergerakan besar.

Arah pengoptimuman

  1. Untuk pasaran yang bergolak, pertimbangkan untuk memperkenalkan lebih banyak petunjuk atau syarat untuk menapis isyarat perdagangan, seperti RSI, MACD dan sebagainya.
  2. Untuk produk dan pasaran yang berbeza, parameter garis hentian dan pengganda hentian yang optimum boleh dicari dengan mengkaji semula sejarah dan pengoptimuman parameter.
  3. Anda boleh mempertimbangkan untuk memperkenalkan modul pengurusan kedudukan dan kawalan risiko, menyesuaikan saiz kedudukan mengikut turun naik pasaran dan dinamika risiko akaun.
  4. Menambah lebih banyak petunjuk trend dan meningkatkan kebolehpercayaan dan ketepatan isyarat.

ringkaskan

Strategi ini dengan reka bentuk double-dynamic stop loss line dan dinamik stop stop, dapat beradaptasi dengan baik dengan keadaan pasaran yang berbeza, dan berfungsi dengan baik dalam keadaan trend. Tetapi dalam pasaran yang bergolak, mungkin menghadapi masalah perdagangan yang kerap dan kerugian yang diimbangi. Oleh itu, strategi ini lebih sesuai untuk digunakan di pasaran yang sedang tren, dan memerlukan pengoptimuman dan penyesuaian parameter yang digabungkan dengan ciri-ciri produk dan persekitaran pasaran. Selain itu, masih ada ruang untuk pengoptimuman lebih lanjut, seperti memperkenalkan lebih banyak modul kawalan seperti syarat penapisan, pengurusan kedudukan dan risiko, untuk meningkatkan kestabilan dan keuntungan strategi.

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