Strategi ini berdasarkan purata gelombang sebenar (ATR) untuk menetapkan garis hentian yang dinamik, mengesan perubahan harga saham, dan mencapai perlindungan hentian sambil mengunci keuntungan maksimum.
Strategi ini dilaksanakan melalui langkah-langkah berikut:
Untuk mengira ATR, kitaran ATR ditetapkan oleh parameter nATRPeriod, dengan default 5;
Berdasarkan nilai ATR yang dikira pada garis stop loss, amplitudo stop loss ditetapkan oleh parameter nATRMultip, 3.5 kali ATR secara lalai;
Apabila harga saham naik, jika lebih tinggi daripada had berhenti sebelum ini, had berhenti akan dinaikkan kepada harga saham tolak had berhenti; apabila harga saham turun, jika lebih rendah daripada had berhenti sebelum ini, had berhenti akan dinaikkan kepada harga saham tolak had berhenti;
menilai sama ada harga saham telah melanggar garis berhenti, dan apabila ia melanggar ia akan memberi isyarat untuk membeli atau menjual;
Bergantung pada isyarat untuk menembusi garisan berhenti, masuk ke dalam kedudukan untuk melakukan lebih banyak atau kosong, dan kosongkan kedudukan apabila menyentuh garisan berhenti sekali lagi.
Apabila harga saham naik, barisan hentikan akan terus naik, sehingga mengunci keuntungan; apabila harga saham turun, barisan hentikan akan terus turun, sehingga hentikan. Indeks ATR dapat mencerminkan dengan lebih tepat tahap turun naik harga saham, menyesuaikan barisan hentikan mengikut dinamik ATR, dapat mengelakkan hentikan terlalu radikal atau konservatif.
Anda boleh mengoptimumkan parameter, menyesuaikan parameter kitaran ATR dan amplitud hentian, dan mencari kombinasi parameter terbaik untuk mengimbangi hentian dan pengesanan. Anda juga boleh menggabungkan penyaringan masa masuk ke pasaran dengan petunjuk teknikal lain untuk mengurangkan hentian yang tidak perlu.
Strategi ini mencapai penutupan dan penguncian keuntungan dalam proses pemegangan dengan cara menyesuaikan garis stop loss ATR secara dinamik. Ia lebih sesuai dengan turun naik harga saham, dan mengelakkan penutupan yang terlalu radikal atau konservatif daripada kedudukan stop loss tetap. Indeks ATR membuat penyesuaian garis stop loss lebih disasarkan. Tetapi strategi penetapan parameter dan kemasukan kembali memerlukan pengoptimuman lebih lanjut untuk mengurangkan kerugian yang tidak perlu dan mengembangkan ruang 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)