Strategi Line Pusat Loss Stop ATR Dinamis

Penulis:ChaoZhang, Tarikh: 2023-10-16 16:20:06
Tag:

img

Ringkasan

Strategi ini menggunakan fungsi regresi linear dan kaedah persegi terkecil untuk mengira saluran harga, yang terdiri daripada dua garis hijau dan merah.

Logika Strategi

Strategi ini mengira garis pusat xLG menggunakan regresi linear dengan panjang 25 dan pergeseran 5. Kemudian ia mengambil 6% di atas dan di bawah garis pusat sebagai julat saluran, dengan xLG1r sebagai garis atas dan xLG1s sebagai garis bawah.

Apabila harga di atas xLG1r, ia pergi panjang. Apabila harga di bawah xLG1s, ia pergi pendek. Ia merakam masa panjang dan pendek terakhir. Isyarat panjang dihasilkan apabila masa panjang terakhir lebih besar daripada masa pendek terakhir. Isyarat pendek dihasilkan apabila masa pendek terakhir lebih besar daripada masa panjang terakhir.

Stop loss ATR dinamik menggunakan tempoh ATR sebanyak 1 dan pengganda sebanyak 2. Untuk perdagangan panjang, stop loss adalah harga penutupan dikurangkan dari pengganda nilai ATR. Untuk perdagangan pendek, stop loss adalah harga penutupan ditambah pengganda nilai ATR.

Analisis Kelebihan

  • Menggunakan saluran regresi linear untuk mengesan trend jangka panjang
  • Pengaturan stop loss berasaskan ATR secara dinamik untuk mengelakkan stop terlalu lebar atau terlalu ketat
  • Isyarat penembusan harga membantu mengelakkan isyarat palsu

Risiko dan Penambahbaikan

  • Parameter saluran regresi perlu dioptimumkan, julat semasa mungkin terlalu sempit
  • Pengganda ATR juga memerlukan ujian untuk mencari parameter optimum
  • Pertimbangkan untuk menambah pengesahan mengenai breakout untuk mengelakkan breakouts palsu

Arahan pengoptimuman

  • Uji panjang tempoh regresi yang berbeza untuk mencari parameter yang lebih baik
  • Cuba tempoh ATR yang berbeza dan pengganda stop loss
  • Tambah pengesahan tambahan pada isyarat pecah, seperti pecah jumlah

Kesimpulan

Strategi ini menggabungkan pelbagai teknik seperti mengikuti trend, berhenti dinamik dan isyarat pecah untuk mewujudkan sistem penjejakan trend adaptif. Penambahbaikan lanjut dalam pengoptimuman parameter dan penapisan isyarat dapat meningkatkan ketahanan dan keuntungan. Ia menyediakan pendekatan yang berharga untuk peniaga kuant.


/*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)

Lebih lanjut