Strategi Penembusan Saluran Donchian

Penulis:ChaoZhang, Tanggal: 2023-09-14 14:44:44
Tag:

Logika Strategi

Donchian channel breakout strategy adalah strategi trend following yang didasarkan pada Donchian channel. Strategi ini menggunakan tertinggi tertinggi dan terendah terendah selama periode tertentu untuk menentukan titik masuk dan stop loss untuk posisi panjang dan pendek.

Aturan masuk adalah: pergi panjang ketika harga melanggar di atas tertinggi tertinggi selama periode review (misalnya 20 hari), dan pergi pendek ketika harga melanggar di bawah terendah rendah selama periode review lain (misalnya 10 hari).

Aturan EXIT adalah: Posisi panjang dihentikan di band tengah atau bawah saluran; posisi pendek dihentikan di band tengah atau atas.

Misalnya, perdagangan BTCUSDT dengan parameter berikut:

  • Periode pencarian entri panjang: 20 hari
  • Periode pengamatan stop loss panjang: 10 hari
  • Stop loss pada band tengah: Ya
  • Periode pencarian entri singkat: 10 hari
  • Periode pencarian stop loss pendek: 20 hari
  • Stop loss pada band tengah: Ya

Aturan masuk dan berhenti adalah:

  • Pergi panjang ketika harga melanggar di atas 20 hari tertinggi
  • Stop loss panjang pada titik tengah dari 10 hari tertinggi dan terendah
  • Pergi short saat harga turun di bawah level terendah 10 hari
  • Stop loss pendek pada titik tengah tertinggi dan terendah 20 hari

Dengan menyesuaikan periode lookback secara dinamis, strategi dapat dioptimalkan di seluruh siklus pasar untuk menangkap tren dengan imbalan/risiko yang lebih baik.

Keuntungan

  • Breakout dapat mengidentifikasi arah tren sejak dini
  • Hentikan kerugian dekat harga membantu mengelola risiko
  • Parameter yang fleksibel memungkinkan optimasi untuk siklus yang berbeda

Risiko

  • Penembusan rentan terhadap whipsaws, perlu untuk mengkonfirmasi validitas
  • Close stop loss yang rentan terhadap shakeout di pasar yang bergolak
  • Penyesuaian parameter yang buruk dapat menyebabkan over-trading atau berhenti yang tidak cukup

Ringkasan

Breakout saluran Donchian menggunakan breakout untuk mengidentifikasi tren, dengan titik tengah/band saluran sebagai berhenti untuk mengendalikan risiko. mengoptimalkan periode lookback dapat meningkatkan penangkapan tren dalam pergerakan yang kuat.


/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Donchian Channel Strategy", overlay=true, default_qty_type= strategy.percent_of_equity, initial_capital = 1000, default_qty_value = 20, commission_type=strategy.commission.percent, commission_value=0.036)

//Long optopns
buyPeriodEnter = input(10, "Channel Period for Long enter position")
buyPeriodExit = input(10, "Channel Period for Long exit position")
isMiddleBuy = input(true, "Is exit on Base Line? If 'no' - exit on bottom line")
takeProfitBuy = input(2.5, "Take Profit (%) for Long position")
isBuy = input(true, "Allow Long?")

//Short Options
sellPeriodEnter = input(20, "Channel Period for Short enter position")
sellPeriodExit = input(20, "Channel Period for Short exit position")
isMiddleSell = input(true, "Is exit on Base Line? If 'no' - exit on upper line")
takeProfitSell = input(2.5, "Take Profit (%) for Short position")
isSell = input(true, "Allow Short?")

// Test Start
startYear = input(2005, "Test Start Year")
startMonth = input(1, "Test Start Month")
startDay = input(1, "Test Start Day")
startTest = timestamp(startYear,startMonth,startDay,0,0)

//Test End
endYear = input(2050, "Test End Year")
endMonth = input(12, "Test End Month")
endDay = input(30, "Test End Day")
endTest = timestamp(endYear,endMonth,endDay,23,59)

timeRange = time > startTest and time < endTest ? true : false

// Long&Short Levels
BuyEnter = highest(buyPeriodEnter)
BuyExit = isMiddleBuy ? ((highest(buyPeriodExit) + lowest(buyPeriodExit)) / 2): lowest(buyPeriodExit)

SellEnter = lowest(sellPeriodEnter)
SellExit = isMiddleSell ? ((highest(sellPeriodExit) + lowest(sellPeriodExit)) / 2): highest(sellPeriodExit)

// Plot Data
plot(BuyEnter, style=plot.style_line, linewidth=2, color=color.blue, title="Buy Enter")
plot(BuyExit, style=plot.style_line, linewidth=1, color=color.blue, title="Buy Exit", transp=50)
plot(SellEnter, style=plot.style_line, linewidth=2, color=color.red, title="Sell Enter")
plot(SellExit, style=plot.style_line, linewidth=1, color=color.red, title="Sell Exit", transp=50)

// Calc Take Profits
TakeProfitBuy = 0.0
TakeProfitSell = 0.0
if strategy.position_size > 0
    TakeProfitBuy := strategy.position_avg_price*(1 + takeProfitBuy/100)
    
if strategy.position_size < 0
    TakeProfitSell := strategy.position_avg_price*(1 - takeProfitSell/100)

// Long Position    
if isBuy and timeRange
    strategy.entry("Long", strategy.long, stop = BuyEnter, when = strategy.position_size == 0) 
    
strategy.exit("Long Exit", "Long", stop=BuyExit, limit = TakeProfitBuy, when = strategy.position_size > 0)

// Short Position
if isSell and timeRange
    strategy.entry("Short", strategy.short, stop = SellEnter, when = strategy.position_size == 0) 
    
strategy.exit("Short Exit", "Short", stop=SellExit, limit = TakeProfitSell, when = strategy.position_size < 0)

// Close & Cancel when over End of the Test
if time > endTest
    strategy.close_all()
    strategy.cancel_all()


Lebih banyak