Strategi Best ATR Stop Multiple adalah strategi mengikuti tren yang menggunakan kelipatan dari Average True Range (ATR) untuk menetapkan titik stop loss dan menyesuaikan risiko secara dinamis.
Strategi ini pertama-tama menghitung rata-rata bergerak sederhana dari periode SMA cepat dan lambat.
Setelah masuk, ia memantau nilai ATR secara real-time. ATR mewakili volatilitas rata-rata selama periode lookback tertentu. Strategi ini memungkinkan kita untuk mengatur periode ATR (default 14) dan pengganda (default 2). Sistem menghitung nilai ATR saat masuk, kemudian mengalikannya dengan pengganda yang ditetapkan sebagai jarak berhenti.
Misalnya, jika ATR setelah masuk adalah 50 poin, dan pengganda diatur menjadi 2, maka jarak stop akan menjadi 100 poin. Jika harga kemudian bergerak lebih dari 100 poin, perintah stop loss akan dipicu. Ini memungkinkan stop loss yang tepat waktu untuk menghindari kerugian yang berlebihan.
Strategi ini juga mempertimbangkan penentuan tren. Stop loss panjang hanya diaktifkan ketika sinyal beli cocok dengan tren naik. Stop loss pendek cocok dengan tren turun.
Garis stop loss digambarkan pada grafik sehingga kita dapat memverifikasinya secara real time.
Keuntungan terbesar dari strategi ini adalah bahwa ia secara dinamis menyesuaikan jarak stop loss dan secara otomatis memodifikasi eksposur risiko berdasarkan perubahan volatilitas pasar. Ketika volatilitas berkembang, jarak stop juga meningkat, mengurangi kemungkinan stop loss terkena.
Dibandingkan dengan jarak stop loss yang tetap, pendekatan ini secara efektif mengendalikan kerugian berdasarkan per perdagangan sambil melacak tren.
Selain itu, dikombinasikan dengan penentuan tren, metode stop loss tersebut dapat mengurangi kemungkinan dihentikan oleh whipsaws di zona konsolidasi.
Risiko utama dari strategi ini adalah kemungkinan harga menarik kembali dalam jangka pendek selama posisi, memicu stop loss.
Risiko lain adalah bahwa harga mungkin selisih melalui tingkat stop loss dalam pergerakan yang ganas. Ini akan membutuhkan pengaturan multiplier ATR yang lebih besar, tetapi itu juga berarti potensi keuntungan yang berkurang.
Akhirnya, strategi ini tidak mempertimbangkan dampak perdagangan setelah jam kerja dan sebelum pasar pada nilai ATR. Hal ini dapat menyebabkan perhitungan data ATR yang tidak akurat pada pembukaan atau penutupan.
Strategi dapat dioptimalkan dalam beberapa aspek:
Mengoptimalkan parameter periode ATR dan menguji kombinasi terbaik untuk pasar yang berbeda
Bandingkan kelipatan ATR tetap vs dinamis dalam hal laba
Menggabungkan data setelah jam dalam perhitungan ATR untuk mengurangi kesenjangan pada buka
Atur kondisi ATR: hanya mengaktifkan pemberhentian ketika ATR mencapai tingkat tertentu, menghindari pemberhentian yang tidak perlu di lingkungan volatilitas rendah
Masukkan lebih banyak filter: tren utama, indikator volume/momentum dll.
Best ATR Stop Multiple Strategy secara efektif menyeimbangkan tren mengikuti dan pengendalian risiko dengan menyesuaikan jarak berhenti secara dinamis.
Tentu saja beberapa risiko tetap, seperti kesenjangan harga dan berhenti terlalu sensitif Optimasi lebih lanjut di berbagai dimensi dapat meningkatkan ketahanan dan pengembalian.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //@author=Daveatt //This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ SystemName = "BEST ATR Stop Multiple Strategy" TradeId = "BEST" InitCapital = 100000 InitPosition = 100 InitCommission = 0.075 InitPyramidMax = 1 CalcOnorderFills = true CalcOnTick = true DefaultQtyType = strategy.fixed DefaultQtyValue = strategy.fixed Precision = 2 Overlay=true strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay ) fastSMAperiod = input(defval=15, title='Fast SMA', type=input.integer, minval=2, step=1) slowSMAperiod = input(defval=45, title='Slow SMA', type=input.integer, minval=2, step=1) src = close // Calculate moving averages fastSMA = sma(src, fastSMAperiod) slowSMA = sma(src, slowSMAperiod) // Calculate trading conditions enterLong = crossover(fastSMA, slowSMA) enterShort = crossunder(fastSMA, slowSMA) // trend states since_buy = barssince(enterLong) since_sell = barssince(enterShort) buy_trend = since_sell > since_buy sell_trend = since_sell < since_buy is_signal = enterLong or enterShort // get the entry price entry_price = valuewhen(enterLong or enterShort, src, 0) // Plot moving averages plot(series=fastSMA, color=color.teal) plot(series=slowSMA, color=color.orange) // Plot the entries plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small) plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small) /////////////////////////////// //======[ Trailing STOP ]======// /////////////////////////////// // use SL? useSL = input(true, "Use stop Loss") // ATR multiple Stop stop_atr_length = input(14,title="ATR Length", minval=1, type=input.integer) stop_atr_mult = input(2,title="ATR Multiple", minval=0.05, step=0.1, type=input.float) // Global STOP stop_price = 0.0, stop_price := nz(stop_price[1]) // STOP ATR var stop_atr = 0.0 var entry_stop_atr = 0.0 stop_atr := nz(atr(stop_atr_length)) if enterLong or enterShort entry_stop_atr := stop_atr * stop_atr_mult // display the ATR value multiple plotshape(enterLong, title='ATR Long Stop value', style=shape.labelup, location=location.bottom, color=color.green, transp=0, text='', textcolor=color.navy, editable=true, size=size.small, show_last=1, size=size.small) // var label atr_long_label = na // var label atr_short_label = na lapos_y_entry_up = lowest(30) lapos_y_entry_dn = highest(30) // text_label = "ATR value: " + tostring(stop_atr, '#.#') + "\n\nATR Multiple value: " + tostring(entry_stop_atr, '#.#') // if enterLong // label.delete(atr_long_label) // atr_long_label := label.new(bar_index, lapos_y_entry_up, text=text_label, // xloc=xloc.bar_index, yloc=yloc.price, color=color.green, style=label.style_labelup, textcolor=color.white, // size=size.normal) // if enterShort // label.delete(atr_short_label) // atr_short_label := label.new(bar_index, lapos_y_entry_dn, text=text_label, // xloc=xloc.bar_index, yloc=yloc.price, color=color.red, style=label.style_labeldown, textcolor=color.black, // size=size.normal) // Determine trail stop loss prices longStopPrice = 0.0, shortStopPrice = 0.0 longStopPrice := if useSL and buy_trend stopValue = entry_price - entry_stop_atr else 0 shortStopPrice := if useSL and sell_trend stopValue = entry_price + entry_stop_atr else 999999 ////////////////////////////////////////////////////////////////////////////////////////// //*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS ***// ////////////////////////////////////////////////////////////////////////////////////////// cond_long_stop_loss_hit = useSL and buy_trend and crossunder(low, longStopPrice[1]) cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) // Plot stop loss values for confirmation plot(series=useSL and buy_trend and low >= longStopPrice ? longStopPrice : na, color=color.fuchsia, style=plot.style_cross, linewidth=2, title="Long Trail Stop") plot(series=useSL and sell_trend and high <= shortStopPrice ? shortStopPrice : na, color=color.fuchsia, style=plot.style_cross, linewidth=2, title="Short Trail Stop") close_long = cond_long_stop_loss_hit close_short = cond_short_stop_loss_hit // Submit entry orders strategy.entry(TradeId + " L", long=true, when=enterLong) strategy.close(TradeId + " L", when=close_long) //if (enterShort) strategy.entry(TradeId + " S", long=false, when=enterShort) strategy.close(TradeId + " S", when=close_short)