Strategi terbaik ATR Stop Multiple

Penulis:ChaoZhang, Tanggal: 2024-02-21 14:24:22
Tag:

img

Gambaran umum

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.

Logika Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

Strategi dapat dioptimalkan dalam beberapa aspek:

  1. Mengoptimalkan parameter periode ATR dan menguji kombinasi terbaik untuk pasar yang berbeda

  2. Bandingkan kelipatan ATR tetap vs dinamis dalam hal laba

  3. Menggabungkan data setelah jam dalam perhitungan ATR untuk mengurangi kesenjangan pada buka

  4. Atur kondisi ATR: hanya mengaktifkan pemberhentian ketika ATR mencapai tingkat tertentu, menghindari pemberhentian yang tidak perlu di lingkungan volatilitas rendah

  5. Masukkan lebih banyak filter: tren utama, indikator volume/momentum dll.

Kesimpulan

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)


Lebih banyak