tren mengikuti strategi berdasarkan Saluran Donchian

Penulis:ChaoZhang, Tanggal: 2023-10-31 17:44:19
Tag:

img

Gambaran umum

Strategi Pulling adalah strategi mengikuti tren berdasarkan saluran Donchian. Ini menggunakan saluran Donchian cepat dan lambat untuk mengidentifikasi arah tren dan masuk pada pullbacks. Keuntungan dari strategi ini adalah bahwa ia dapat melacak tren secara otomatis dan memotong kerugian dalam waktu ketika tren berubah.

Logika Strategi

Strategi ini pertama-tama mendefinisikan periode saluran cepat sebagai 20 bar, dan periode saluran lambat sebagai 50 bar.

Pertama, tertinggi tertinggi dan terendah terendah saluran cepat dihitung, dan titik tengah diambil sebagai garis stop loss. Pada saat yang sama, tertinggi tertinggi dan terendah terendah saluran lambat dihitung, dan saluran atas dan bawah digunakan sebagai garis masuk.

Ketika harga menembus bagian atas saluran lambat, pergi panjang. Ketika harga menembus bagian bawah saluran lambat, pergi pendek. Setelah memasuki posisi, atur stop loss di titik tengah saluran cepat.

Jadi saluran lambat menentukan arah tren utama, sementara saluran cepat melacak pecah kecil dalam kisaran kecil untuk menentukan titik stop loss.

Keuntungan

  • Struktur saluran ganda dapat secara otomatis melacak tren dan dengan cepat memotong kerugian ketika tren berbalik.

  • Hanya dengan mengambil entri ketika harga menembus batas saluran dapat menyaring beberapa pecah palsu tanpa tren nyata.

  • Risiko terkontrol. Jarak stop loss dekat dapat mengontrol kerugian tunggal.

Risiko

  • Strategi mengikuti tren dapat memiliki drawdown yang relatif besar yang membutuhkan persiapan psikologis.

  • Stop loss terlalu dekat. periode fast channel pendek sehingga stop loss dekat, rentan untuk dihentikan. kita dapat dengan tepat meringankan periode fast channel.

  • Struktur saluran ganda dapat menghasilkan entri yang berlebihan, yang membutuhkan ukuran posisi yang wajar.

Arahan Optimasi

  • Kita bisa menambahkan volatilitas dll dalam kondisi masuk untuk menyaring breakout tanpa kekuatan tren yang cukup.

  • Kami dapat menemukan kombinasi parameter saluran yang optimal secara sistematis.

  • Menggabungkan beberapa kerangka waktu. Menentukan tren utama pada kerangka waktu yang lebih tinggi dan perdagangan pada kerangka waktu yang lebih rendah.

  • Jarak stop loss yang dinamis, menyesuaikan jarak stop secara dinamis berdasarkan volatilitas pasar.

Ringkasan

Strategi Puling adalah strategi trend berikut standar secara keseluruhan. Ini menggunakan saluran harga untuk menentukan arah tren dan menetapkan stop loss untuk mengendalikan risiko. Strategi ini memiliki beberapa keuntungan tetapi juga masalah penarikan dan stop loss yang terlalu dekat. Kita dapat mengoptimalkannya melalui penyesuaian parameter saluran, menambahkan filter dll.


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

//Noro
//2020

//@version=4
strategy("Noro's RiskTurtle Strategy", shorttitle = "RiskTurtle str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risk      = input(2, minval = 0.1, maxval = 99, title = "Risk size, %")
fast      = input(20, minval = 1, title = "Fast channel (for stop-loss)")
slow      = input(50, minval = 1, title = "Slow channel (for entries)")
showof    = input(true, defval = true, title = "Show offset")
showll    = input(true, defval = true, title = "Show lines")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(true, defval = true, title = "Show background")
fromyear  = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear    = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth   = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday   = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today     = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Donchian price channel fast
hf = highest(high, fast)
lf = lowest(low, fast)
center = (hf + lf) / 2

//Donchian price chennal slow
hs = highest(high, slow)
ls = lowest(low, slow)

//Lines
colorpc = showll ? color.blue : na
colorsl = showll ? color.red : na
offset = showof ? 1 : 0
plot(hs, offset = offset, color = colorpc, title = "Slow channel high")
plot(ls, offset = offset, color = colorpc, title = "Slow channel low")
plot(center, offset = offset, color = colorsl, title = "Fast channel stop-loss")

//Background
size = strategy.position_size
colorbg = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(colorbg, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = true

//Lot size
risksize = -1 * risk
risklong = ((center / hs) - 1) * 100
coeflong = abs(risksize / risklong)
lotlong = (strategy.equity / close) * coeflong
riskshort = ((center / ls) - 1) * 100
coefshort = abs(risksize / riskshort)
lotshort = (strategy.equity / close) * coefshort

//Orders
strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and hs > 0 and truetime)
strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and ls > 0 and truetime)
strategy.exit("LongExit", "Long", stop = center, when = needlong and strategy.position_size > 0)
strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Lebih banyak