Strategi ini menggunakan saluran Donchian 24 periode dikombinasikan dengan rata-rata bergerak 200 periode sebagai sinyal perdagangan utama. posisi pendek dibuka ketika harga berfluktuasi ke bawah dan posisi panjang ketika berfluktuasi ke atas.
Logika strategi didasarkan pada poin-poin berikut:
Saluran Donchian dibangun dengan menggunakan tertinggi tertinggi dan terendah terendah selama 24 periode terakhir.
Rata-rata bergerak 200 periode bertindak sebagai filter untuk bias panjang/pendek. Jika harga melanggar Saluran Donchian dan berada di sisi lain dari rata-rata bergerak, pembalikan mungkin terjadi.
Sinyal masuk adalah:
Stop loss untuk posisi pendek ditetapkan pada level tertinggi selama 3 bar terakhir. Take profit ditetapkan pada harga masuk dikurangi 3 kali perbedaan antara stop loss dan harga masuk. Logika posisi panjang stop loss dan take profit adalah sebaliknya.
Keuntungan dari strategi ini adalah bahwa dengan menggabungkan saluran Donchian dan filter rata-rata bergerak, ia menghindari sinyal palsu dari mengandalkan satu indikator, secara signifikan meningkatkan tingkat kemenangan.
Strategi ini memiliki keuntungan berikut:
Tingkat kemenangan yang tinggi: Dengan menggabungkan saluran Donchian dan filter rata-rata bergerak, kerugian yang tidak perlu karena sinyal palsu dari satu indikator dihindari.
Risiko yang dapat dikendalikan: Menggunakan level stop loss tertinggi tertinggi/rendah terendah terbaru secara efektif mengelola penurunan pada perdagangan yang kalah.
Sederhana dan mudah diterapkan: Logika menggunakan indikator sederhana dan intuitif yang mudah dipahami dan dieksekusi.
Kekuatan di seluruh pasar dan kerangka waktu: Dengan relatif sedikit parameter, strategi stabil di berbagai produk dan kerangka waktu.
Risiko utama yang dihadapi oleh strategi ini adalah:
Gerakan pasar yang ekstrim: Tren satu arah yang sangat kuat dapat memicu stop loss yang menyebabkan kerugian yang diperkuat. Hal ini dapat dikurangi dengan memperluas stop atau mengurangi ukuran posisi.
Risiko sinyal keluar yang prematur: Keluar pada sinyal yang berlawanan baru dapat menyebabkan over-trading di pasar yang bergolak karena masuk dan keluar berulang.
Risiko pengoptimalan parameter: Penyesuaian parameter periode lookback saluran Donchian atau moving average yang buruk dapat menyebabkan sinyal tertunda atau sering. Hal ini dapat diminimalkan melalui pengoptimalan yang ketat dan pengujian kombinasi.
Strategi dapat ditingkatkan dengan cara berikut:
Mengoptimalkan saluran Donchian dan periode lookback rata-rata bergerak untuk menemukan kombinasi terbaik dari parameter.
Uji stop loss yang berbeda untuk mengambil rasio keuntungan untuk menyeimbangkan tingkat kemenangan versus reward/risiko.
Masukkan filter tambahan pada sinyal masuk menggunakan indikator seperti MACD, RSI dll untuk meningkatkan ketahanan.
Mengoptimalkan logika keluar untuk menghindari keluar yang tidak perlu di pasar bergolak. Metrik tren juga dapat dipertimbangkan untuk keluar.
Mengembangkan kombinasi baru menggunakan kerangka strategi ini, misalnya dengan saluran lain, indikator band dll.
Strategi Slow Moving Average memiliki logika yang jelas dan mudah dimengerti dengan menggunakan kombinasi Donchian Channel dan moving average untuk generasi sinyal. Pendekatan hibrida ini secara signifikan meningkatkan stabilitas dan tingkat kemenangan. Rasio laba rugi 3: 1 juga memberikan potensi imbalan yang baik. Sementara risiko ada dalam hal gerakan ekstrem dan kesalahan sinyal, banyak peluang optimasi dapat meningkatkan kinerja dan memperluas strategi inti.
/*backtest start: 2023-11-06 00:00:00 end: 2023-12-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Mysteriown //@version=4 strategy("Lagged Donchian Channel + EMA", overlay = true) //tradePeriod = time(timeframe.period,"0000-0000:1234567")?true:false // ------------------------------------------ // // ----------------- Inputs ----------------- // // ------------------------------------------ // period = input(24, title="Channel's periods") Pema = input(200, title="EMA's periods ?") ratio = input(3, title="Ratio TP", type=input.float) loss = input(20, title="Risk Loss ($)") lev = input(5, title="Leverage *...") chan = input(title="Plot channel ?", type=input.bool, defval=false) Bpos = input(title="Plot Bull positions ?", type=input.bool, defval=false) bpos = input(title="Plot Bear positions ?", type=input.bool, defval=false) labels = input(title="Plot labels of bets ?", type=input.bool, defval=true) supp = input(title="Delete last labels ?", type=input.bool, defval=true) // ------------------------------------------ // // ---------- Canal, EMA and arrow ---------- // // ------------------------------------------ // pema = ema(close,Pema) plot(pema, title="EMA", color=color.blue) canalhaut = highest(period)[1] canalbas = lowest(period)[1] bear = close[1] > canalhaut[1] and close < open and high > pema bull = close[1] < canalbas[1] and open < close and low < pema canalhautplot = plot(chan? canalhaut:na, color=color.yellow) canalbasplot = plot(chan? canalbas:na, color=color.yellow) plotshape(bear, title='Bear', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0) plotshape(bull, title='Bull', style=shape.triangleup, location=location.belowbar, color=color.green, offset=0) // ------------------------------------------ // // ------------- Position Short ------------- // // ------------------------------------------ // SlShort = highest(3) BidShort = close[1] TpShort = BidShort-((SlShort-BidShort)*ratio) deltaShort = (SlShort-BidShort)/BidShort betShort = round(loss/(lev*deltaShort)*100)/100 cryptShort = round(betShort*lev/BidShort*1000)/1000 // if bear[1] and labels //and low < low[1] // Lbear = label.new(bar_index, na, text="SHORT\n\nSL: " + tostring(SlShort) + "\n\nBid: " + tostring(BidShort) + "\n\nTP: " + tostring(TpShort) + "\n\nMise: " + tostring(betShort) + "\n\nCryptos: " + tostring(cryptShort), color=color.red, textcolor=color.white, style=label.style_labeldown, yloc=yloc.abovebar) // label.delete(supp ? Lbear[1] : na) var bentry=0.0 var bsl=0.0 var btp=0.0 if bear[1] and low < low[1] bentry:=BidShort bsl:=SlShort btp:=TpShort pbentry = plot(bpos? bentry:na, color=color.orange) plot(bpos? (bentry+btp)/2:na, color=color.gray) pbsl = plot(bpos? bsl:na, color=color.red) pbtp = plot(bpos? btp:na, color=color.green) fill(pbentry,pbsl, color.red, transp=70) fill(pbentry,pbtp, color.green, transp=70) // ------------------------------------------ // // ------------- Position Long -------------- // // ------------------------------------------ // SlLong = lowest(3) BidLong = close[1] TpLong = BidLong + ((BidLong - SlLong) * ratio) deltaBull = (BidLong - SlLong)/BidLong betLong = round(loss/(lev*deltaBull)*100)/100 cryptLong = round(betLong*lev/BidLong*1000)/1000 // if bull[1] and labels //and high > high[1] // Lbull = label.new(bar_index, na, text="LONG\n\nSL: " + tostring(SlLong) + "\n\nBid: " + tostring(BidLong) + "\n\nTP: " + tostring(TpLong) + "\n\nMise: " + tostring(betLong) + "\n\nCryptos: " + tostring(cryptLong), color=color.green, textcolor=color.white, style=label.style_labelup, yloc=yloc.belowbar) // label.delete(supp ? Lbull[1] : na) var Bentry=0.0 var Bsl=0.0 var Btp=0.0 if bull[1] and high > high[1] Bentry:=BidLong Bsl:=SlLong Btp:=TpLong pBentry = plot(Bpos?Bentry:na, color=color.orange) plot(Bpos?(Bentry+Btp)/2:na, color=color.gray) pBsl = plot(Bpos?Bsl:na, color=color.red) pBtp = plot(Bpos?Btp:na, color=color.green) fill(pBentry,pBsl, color.red, transp=70) fill(pBentry,pBtp, color.green, transp=70) // ------------------------------------------ // // --------------- Strategie ---------------- // // ------------------------------------------ // Bear = bear[1] and low < low[1] Bull = bull[1] and high > high[1] if (Bear and strategy.opentrades==0) strategy.order("short", false, 1, limit=BidShort) strategy.exit("exit", "short", limit = TpShort, stop = SlShort) strategy.cancel("short", when = high > SlShort or low < (BidShort+TpShort)/2) strategy.close("short", when=bull) if (Bull and strategy.opentrades==0) strategy.order("long", true, 1, limit=BidLong) strategy.exit("exit", "long", limit = TpLong, stop = SlLong) strategy.cancel("long", when = low < SlLong or high > (BidLong+TpLong)/2) strategy.close("long", when=bear)