Strategi ini menetapkan garis stop loss dinamik berdasarkan indikator Average True Range (ATR) untuk mengikuti perubahan harga saham, untuk melindungi stop loss sambil memaksimumkan keuntungan.
Strategi ini dilaksanakan terutamanya melalui langkah-langkah berikut:
Mengira penunjuk ATR, tempoh ATR ditetapkan oleh parameter nATRPeriod, lalai menjadi 5;
Mengira garis stop loss berdasarkan nilai ATR, besar stop loss ditetapkan oleh parameter nATRMultip, lalai kepada 3.5 kali ATR;
Apabila harga naik, jika lebih tinggi daripada garis stop loss sebelumnya, sesuaikan garis stop loss sehingga harga dikurangkan dari besar stop loss; apabila harga jatuh, jika lebih rendah daripada garis stop loss sebelumnya, sesuaikan garis stop loss ke bawah kepada harga ditambah dengan besar stop loss;
Menghakimi jika harga menembusi garis stop loss, jika menembusi, menghantar isyarat beli atau jual;
Masukkan kedudukan panjang atau pendek berdasarkan isyarat penembusan barisan stop loss, dan tutup kedudukan apabila harga menyentuh barisan stop loss lagi.
Apabila harga meningkat, garis stop loss akan terus bergerak ke atas untuk mengunci keuntungan. Apabila harga jatuh, garis stop loss akan terus bergerak ke bawah untuk menghentikan kerugian. Indikator ATR dapat mencerminkan turun naik harga dengan lebih tepat. Mengatur secara dinamik garis stop loss berdasarkan ATR dapat mengelakkan stop loss yang terlalu agresif atau terlalu konservatif.
Parameter boleh dioptimumkan dengan menyesuaikan tempoh ATR dan kebesaran kehilangan berhenti untuk mencari keseimbangan optimum antara kehilangan berhenti dan jejak.
Strategi ini merealisasikan stop loss dan mengambil keuntungan semasa memegang melalui garis stop loss trailing ATR dinamik. Berbanding dengan titik stop loss tetap, ia menyesuaikan diri dengan lebih baik dengan turun naik harga, mengelakkan stop loss yang terlalu agresif atau terlalu konservatif. Indikator ATR menjadikan penyesuaian garis stop loss lebih disasarkan. Tetapi parameter dan strategi masuk semula memerlukan pengoptimuman lanjut untuk mengurangkan berhenti yang tidak perlu dan memperluaskan margin keuntungan. Secara keseluruhan ini adalah idea stop loss trailing dinamik yang baik yang bernilai penyelidikan dan penerapan lanjut.
/*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)