Стратегия Donchian Trend Following разработана на основе принципа Donchian Channel, описанного в статье
Стратегия основана на индикаторе Дончианского канала для оценки направления тренда. Дончианский канал состоит из более длительного периода и более короткого периода. Когда цена проходит через более длительный период, это сигнализирует о начале тренда. Когда цена проходит через более короткий период, это сигнализирует о конце тренда.
Если цена равна самой высокой цене за последние 50 дней, открывается короткая позиция. Если цена равна самой низкой цене за последние 20 дней, закрываются короткие позиции. Если цена равна самой низкой цене за последние 20 или 10 дней, закрываются короткие позиции.
Объединив два Донкианских канала разных периодов, он может определить направление для установления позиций, когда начинается тренд, и реализовать своевременную остановку потерь, когда тренд заканчивается.
Основными преимуществами этой стратегии являются:
Он может эффективно отслеживать тенденции, идентифицируя начало и конец тенденций с помощью прорывов Дончианского канала.
Правильный контроль рисков. Он использует движущийся стоп-лосс для контроля одиночных потерь.
Гибкая настройка параметров: комбинация периодов канала может быть свободно выбрана для адаптации к различным продуктам и рыночным условиям.
Простая и понятная логика торговли.
Риски этой стратегии включают:
Неспособность адаптироваться к рынкам с ограниченным диапазоном.
Риск неудачного прорыва. Цены могут отступить после прорыва канала, вызывая стоп-лосс.
Риск выбора периода. Неправильное настройка периода канала может привести к торговле шумом.
Риск снижения коэффициента Sharpe. Увеличение размера позиции без корректировки стоп-лосса может привести к снижению коэффициента Sharpe.
Решения:
Направления оптимизации для этой стратегии:
Добавление условий фильтрации, чтобы избежать ударов, например, сочетание громкости, чтобы судить о настоящих прорывах.
Оптимизация сочетания периодов канала и размещения позиций для увеличения коэффициента прибыли.
Пробую оптимизировать точки прерывания, чтобы найти оптимальные наборы параметров.
Увеличение алгоритмов машинного обучения для динамической оптимизации и корректировки параметров.
Данная стратегия определяет начало и конец ценовых тенденций с использованием двойных каналов и использует стиль торговли с эффективным контролем потерь на одной сделке. Эта стратегия имеет гибкую корректировку параметров и легкую реализацию, что делает ее очень практичной стратегией.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Donchian", overlay=true, pyramiding=0, initial_capital=1000, commission_type=strategy.commission.cash_per_order, commission_value=2, slippage=2) // ============================================================================= // VARIABLES // ============================================================================= donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50') permit_long = input.bool(title = 'Permit long', defval = true) permit_short = input.bool(title = 'Permit short', defval = true) risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25) stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5) atrLen = input.int(title="ATR Length", defval=20) close_in_end = input.bool(title = 'Close in end', defval = true) permit_stop = input.bool(title = 'Permit stop', defval = false) // ============================================================================= // CALCULATIONS // ============================================================================= donch_len_big = donch_string == '50/20' ? 50 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 20 : donch_string == '100/100' ? 100 : na donch_len_small = donch_string == '50/20' ? 20 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 10 : donch_string == '100/100' ? 100 : na big_maxclose = ta.highest(close, donch_len_big) big_minclose = ta.lowest(close, donch_len_big) small_maxclose = ta.highest(close, donch_len_small) small_minclose = ta.lowest(close, donch_len_small) atrValue = ta.atr(atrLen)[1] tradeWindow = true // ============================================================================= // NOTOPEN QTY // ============================================================================= risk_usd = (risk_percent / 100) * strategy.equity atr_currency = (atrValue * syminfo.pointvalue) notopen_qty = risk_usd / (stopOffset * atr_currency) // ============================================================================= // LONG STOP // ============================================================================= long_stop_price = 0.0 long_stop_price := strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price: strategy.position_size > 0 ? long_stop_price[1] : na // ============================================================================= // SHORT STOP // ============================================================================= short_stop_price = 0.0 short_stop_price := strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price : strategy.position_size < 0 ? short_stop_price[1] : na // ============================================================================= // PLOT VERTICAL COLOR BAR // ============================================================================= cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long cross_dn = strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short bg_color = cross_up ? color.green : cross_dn ? color.red : na bg_color := color.new(bg_color, 70) bgcolor(bg_color) // ============================================================================= // PLOT DONCHIAN LINES // ============================================================================= s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black") plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black") plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow") plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red") plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia") // ============================================================================= // ENTRY ORDERS // ============================================================================= if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long strategy.entry("Long", strategy.long, qty=notopen_qty) if strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short strategy.entry("Short", strategy.short, qty=notopen_qty) // ============================================================================= // EXIT ORDERS // ============================================================================= if strategy.position_size > 0 and permit_stop strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price) if strategy.position_size < 0 and permit_stop strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price) // ========== if strategy.position_size > 0 and close == small_minclose and not barstate.islast strategy.close(id="Long", comment='Donch') if strategy.position_size < 0 and close == small_maxclose and not barstate.islast strategy.close(id="Short", comment='Donch') // ========== if close_in_end if not tradeWindow strategy.close_all(comment='Close in end') // ============================================================================= // END // =============================================================================