Strategi ini menetapkan garis stop loss dinamis berdasarkan indikator Average True Range (ATR) untuk melacak perubahan harga saham, untuk melindungi stop loss sambil memaksimalkan pengambilan keuntungan.
Strategi ini terutama dilaksanakan melalui langkah-langkah berikut:
Menghitung indikator ATR, periode ATR ditetapkan oleh parameter nATRPeriod, default menjadi 5;
Menghitung garis stop loss berdasarkan nilai ATR, besar stop loss ditetapkan oleh parameter nATRMultip, default 3,5 kali ATR;
Ketika harga naik, jika lebih tinggi dari garis stop loss sebelumnya, sesuaikan garis stop loss ke harga dikurangi besarnya stop loss; ketika harga turun, jika lebih rendah dari garis stop loss sebelumnya, sesuaikan garis stop loss ke bawah ke harga ditambah besarnya stop loss;
Menghakimi apakah harga menembus garis stop loss, jika menembus, mengirim sinyal beli atau jual;
Masukkan posisi panjang atau pendek berdasarkan sinyal stop loss line breakout, dan tutup posisi ketika harga menyentuh stop loss line lagi.
Ketika harga naik, garis stop loss akan terus bergerak ke atas untuk mengunci keuntungan. Ketika harga turun, garis stop loss akan terus bergerak ke bawah untuk menghentikan kerugian. Indikator ATR dapat mencerminkan fluktuasi harga dengan lebih akurat. Mengatur secara dinamis garis stop loss berdasarkan ATR dapat menghindari stop loss yang terlalu agresif atau terlalu konservatif.
Parameter dapat dioptimalkan dengan menyesuaikan periode ATR dan stop loss magnitude untuk menemukan keseimbangan optimal antara stop loss dan trailing.
Strategi ini merealisasikan stop loss dan profit taking selama holding melalui line stop loss trailing ATR yang dinamis. Dibandingkan dengan titik stop loss tetap, ia lebih beradaptasi dengan fluktuasi harga, menghindari stop loss yang terlalu agresif atau terlalu konservatif. Indikator ATR membuat penyesuaian line stop loss lebih ditargetkan. Tetapi parameter dan strategi re-entry perlu dioptimalkan lebih lanjut untuk mengurangi stop yang tidak perlu dan memperluas margin keuntungan.
/*backtest start: 2023-09-08 00:00:00 end: 2023-10-08 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //@okadoke //////////////////////////////////////////////////////////// // Based on Average True Range Trailing Stops Strategy by HPotter // Average True Range Trailing Stops Strategy, by Sylvain Vervoort // The related article is copyrighted material from Stocks & Commodities Jun 2009 //////////////////////////////////////////////////////////// strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0) nATRPeriod = input(5, "ATR Period") nATRMultip = input(3.5, "ATR Multiplier") useShorts = input(false, "Test w/Shorts?") daysBackMax = input(defval = 360, title = "Max Days Back to Test", minval = 0) daysBackMin = input(defval = 0, title = "Min Days Back to Test", minval = 0) msBackMax = 1000 * 60 * 60 * 24 * daysBackMax msBackMin = 1000 * 60 * 60 * 24 * daysBackMin xATR = atr(nATRPeriod) nLoss = nATRMultip * xATR xATRTrailingStop = na xATRTrailingStop := iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss), iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss))) pos = na pos := iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1, iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) color = pos == -1 ? red: pos == 1 ? green : blue plot(xATRTrailingStop, color=color, title="ATR Trailing Stop") isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin))) buy = crossover(close, xATRTrailingStop) sell = crossunder(close, xATRTrailingStop) strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds) strategy.close("LONG", when=sell and isWithinTimeBounds) strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds) strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)