Strategi SAR Parabolik Trailing Stop Berdasarkan Indikator ATR

Penulis:ChaoZhang, Tarikh: 2023-09-13 15:53:00
Tag:

Strategi ini dinamakan Parabolic SAR Trailing Stop Strategy Based on ATR Indicator. Ia menggunakan penunjuk ATR untuk menyesuaikan faktor pecutan Parabolic SAR untuk menyesuaikan diri dengan perubahan turun naik pasaran.

Faktor pecutan SAR Parabolik tradisional tetap tetap dan tidak dapat menyesuaikan diri dengan peningkatan turun naik. Strategi ini menjadikan kontrak lengkung SAR lebih cepat apabila nilai ATR berkembang, jadi hentian boleh mengetatkan harga lebih cepat apabila turun naik meningkat untuk mengawal risiko dengan berkesan.

Khususnya, selepas menentukan trend harga, faktor pecutan adaptif dikira berdasarkan nilai ATR untuk merangka keluk stop trailing Parabolic SAR. Apabila harga melanggar tahap berhenti, stop loss dicetuskan.

Kelebihan strategi ini adalah membuat paras SAR Parabolik tradisional berhenti dinamik berdasarkan turun naik pasaran. Tetapi parameter ATR memerlukan pengoptimuman, dan garis berhenti boleh terdedah kepada pelanggaran dini.

Secara amnya, hentian penyesuaian adalah penting untuk melindungi keuntungan dan mengehadkan risiko. Pedagang harus memilih penunjuk hentian yang sesuai berdasarkan keadaan pasaran, dan menguji dan mengoptimumkan parameter, untuk memaksimumkan utiliti strategi hentian kerugian.


/*backtest
start: 2023-08-13 00:00:00
end: 2023-09-12 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="ATR Parabolic SAR Strategy [QuantNomad]", shorttitle="ATR PSAR Strategy [QN]", overlay=true, default_qty_type = strategy.percent_of_equity,  default_qty_value = 100)

atr_length = input(14)
start      = input(0.02)
increment  = input(0.02)
maximum    = input(0.2)
entry_bars = input(1, title = "Entry on Nth trend bar") 

atr = atr(atr_length)

atr := na(atr) ? tr : atr

psar        = 0.0 // PSAR
af          = 0.0 // Acceleration Factor
trend_dir   = 0   // Current direction of PSAR
ep          = 0.0 // Extreme point
trend_bars  = 0

sar_long_to_short = trend_dir[1] == 1  and close <= psar[1] // PSAR switches from long to short
sar_short_to_long = trend_dir[1] == -1 and close >= psar[1] // PSAR switches from short to long

trend_change = barstate.isfirst[1] or sar_long_to_short or sar_short_to_long

// Calculate trend direction
trend_dir    :=  barstate.isfirst[1] and close[1]  > open[1] ?  1 : 
                 barstate.isfirst[1] and close[1] <= open[1] ? -1 : 
                 sar_long_to_short ? -1 : 
                 sar_short_to_long ?  1 : nz(trend_dir[1])

trend_bars := sar_long_to_short ? -1 : 
              sar_short_to_long ?  1 : 
              trend_dir ==  1   ? nz(trend_bars[1]) + 1 : 
              trend_dir == -1   ? nz(trend_bars[1]) - 1 : 
              nz(trend_bars[1])

// Calculate  Acceleration Factor
af := trend_change ? start : 
   (trend_dir == 1 and high > ep[1]) or  
   (trend_dir == -1 and low < ep[1]) ? 
   min(maximum, af[1] + increment) : 
   af[1]

// Calculate extreme point
ep := trend_change and trend_dir == 1 ? high :  
   trend_change and trend_dir == -1 ? low : 
   trend_dir == 1 ? max(ep[1], high) : 
   min(ep[1], low)

// Calculate PSAR
psar :=  barstate.isfirst[1] and close[1]  > open[1] ? low[1]  : 
         barstate.isfirst[1] and close[1] <= open[1] ? high[1] : 
         trend_change ? ep[1] :    
         trend_dir == 1 ? psar[1] + af * atr : 
                          psar[1] - af * atr

plot(psar, style=plot.style_cross, color=trend_dir == 1 ? color.green : color.red,  linewidth = 2)


// Strategy 
strategy.entry("Long",  true,  when = trend_bars ==  entry_bars)
strategy.entry("Short", false, when = trend_bars == -entry_bars)

Lebih lanjut