Эта стратегия использует 24-периодический Дончианский канал в сочетании с 200-периодической скользящей средней как основные торговые сигналы.
Логика стратегии основывается главным образом на следующих моментах:
Дончианский канал построен с использованием самого высокого максимума и самого низкого минимума за последние 24 периода.
200-периодная скользящая средняя действует как фильтр для длинного/короткого уклонения.
Сигналы входа:
Стоп-лосс для коротких позиций устанавливается на самый высокий максимум за последние 3 бара. Приобретение прибыли устанавливается на цену входа минус 3 раза разницу между стоп-лосом и ценой входа. Логика длинной позиции стоп-лосса и приобретения прибыли является противоположной.
Преимущество этой стратегии заключается в том, что, объединив Донкянский канал и фильтр скользящей средней, он предотвращает ложные сигналы, опирающиеся на один индикатор, значительно улучшая показатель выигрыша.
Стратегия имеет следующие преимущества:
Высокий показатель выигрыша: путем объединения Дончианского канала и фильтра скользящей средней, избегаются ненужные потери из-за ложных сигналов от одного индикатора.
Контролируемый риск: Использование последнего максимального максимума/нижнего минимума в качестве уровня остановки потери эффективно управляет негативными последствиями для проигрышных сделок.
Простая и простая в реализации: логика использует простые, интуитивные индикаторы, которые легко понять и выполнить.
Устойчивость на разных рынках и в разные периоды времени: при сравнительно небольшом количестве параметров стратегия стабильна на разных продуктах и в разные периоды времени.
Основными рисками этой стратегии являются:
Экстремальные рыночные движения: очень сильные односторонние тенденции могут вызвать стоп-потери, вызывающие усиленные потери. Это может быть смягчено путем расширения стопов или сокращения размера позиции.
Риск преждевременного сигнала выхода: выход на новые противоположные сигналы может вызвать чрезмерную торговлю на нестабильных рынках из-за повторного входа и выхода.
Риск оптимизации параметров: Плохая настройка параметров периода просмотра Дончианского канала или скользящей средней может привести к задержке или частоте сигналов. Это может быть сведено к минимуму посредством строгой оптимизации и комбинаторного тестирования.
Стратегия может быть улучшена следующими способами:
Оптимизируйте канал Дончиана и перемещающиеся средние периоды просмотра, чтобы найти наилучшую комбинацию параметров.
Проверьте различные коэффициенты стоп-лосса для получения прибыли, чтобы сбалансировать уровень выигрыша по сравнению с вознаграждением/риском.
Включить дополнительные фильтры на входные сигналы с использованием таких индикаторов, как MACD, RSI и т. д., чтобы улучшить надежность.
Оптимизируйте логику выхода, чтобы избежать ненужных выходов на нестабильных рынках.
Разработать новые комбинации с использованием этой стратегии, например, с другими каналами, индикаторами диапазона и т.д.
Стратегия медленной скользящей средней имеет четкую, понятную логику с использованием комбинации канала Дончиана и скользящей средней для генерации сигнала. Этот гибридный подход значительно улучшает стабильность и показатель выигрыша. Соотношение прибыли к убыткам 3:1 также обеспечивает хороший потенциал вознаграждения.
/*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)