Strategi Garis Tengah Henti Kerugian ATR Dinamik


Tarikh penciptaan: 2023-10-16 16:20:06 Akhirnya diubah suai: 2023-10-16 16:20:06
Salin: 0 Bilangan klik: 716
1
fokus pada
1617
Pengikut

Strategi Garis Tengah Henti Kerugian ATR Dinamik

Gambaran keseluruhan

Strategi ini menggunakan fungsi kemerosotan linear dan penggandaan minimum untuk mengira saluran harga, yang terdiri daripada dua garis hijau dan merah. Ia menggunakan stop loss dinamik berdasarkan ATR terkini untuk meletakkan pesanan stop loss.

Prinsip Strategi

Strategi ini menggunakan panjang 25, pengulangan linear pemindahan 5 untuk mengira garisan tengah xLG. Kemudian 6% dari harga masing-masing diambil di bawah garisan tengah sebagai julat saluran, dengan garisan atas saluran adalah xLG1r, dan garisan bawah saluran adalah xLG1s.

Apabila harga lebih tinggi daripada xLG1r, buat lebih banyak; apabila harga lebih rendah daripada xLG1s, buat lebih sedikit; dan rekodkan masa terakhir untuk melakukan lebih banyak dan lebih banyak; buat lebih banyak isyarat apabila masa terakhir untuk melakukan lebih banyak daripada masa terakhir untuk melakukan lebih banyak; buat isyarat lebih sedikit apabila masa terakhir untuk melakukan lebih banyak daripada masa terakhir untuk melakukan lebih banyak;

Hentikan ATR dinamik menggunakan kitaran ATR 1, kali ganda 2 untuk dikira. Apabila melakukan lebih banyak, garis hentikan sebagai harga penutupan tolak nilai ATR dan kali ganda; apabila kosong, garis hentikan sebagai harga penutupan ditambah nilai ATR dan kali ganda.

Analisis kelebihan

  • Menggunakan saluran regresi linear untuk mengesan trend jangka panjang
  • Berdasarkan ATR, anda boleh menyesuaikan secara dinamik untuk mengelakkan kerugian yang terlalu besar dan terlalu kecil
  • Meneroka harga untuk menghasilkan isyarat boleh mengurangkan isyarat palsu

Risiko dan penambahbaikan

  • Parameter saluran regresi linear perlu dioptimumkan, saluran mungkin terlalu sempit
  • Pekali ATR juga perlu diuji untuk mendapatkan parameter terbaik
  • Menambah mekanisme pengesahan semasa penembusan boleh dipertimbangkan untuk mengelakkan penembusan palsu

Optimum idea

  • Uji semula pelbagai kitaran panjang regresi untuk mencari parameter yang lebih baik
  • Cuba pelbagai kitaran ATR dan ATR Stop Loss
  • Tambah syarat pengesahan tambahan seperti jumlah transaksi yang dilalui semasa isyarat penembusan

ringkaskan

Strategi ini mengintegrasikan pelbagai petunjuk teknikal seperti trend tracking, stop loss dinamik dan isyarat penembusan untuk membentuk satu sistem trend tracking yang mempunyai daya serap yang lebih kuat. Dengan mengoptimumkan parameter dan menambah penapisan isyarat, anda boleh meningkatkan lagi kestabilan strategi dan keuntungan.

Kod sumber strategi
/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("Center of Gravity BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.15)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Center of Gravity /////////////
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

/////////////// Srategy ///////////////
long = possig == 1 
short = possig == -1 

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)