
Тренд-трекер Donchian channel - стратегия, основанная на индикаторе Donchian channel. Она использует Donchian channel различной длины, чтобы идентифицировать ценовые тенденции и генерировать торговые сигналы при прорыве цены через канал.
Основная идея этой стратегии заключается в том, чтобы использовать длинноциклические донхианские каналы для определения направления большого тренда, используя короткоциклические донхианские каналы в качестве сигналов для входа и остановки. Она предназначена для захвата ценовых тенденций в средне-длинной линии, чтобы избежать заблуждения от краткосрочных колебаний на рынке.
Вычисление максимальных и минимальных цен на закрытие длительного периода (например, 50 дней) создает Donchian Channel. Когда цена прорывает канал, она становится более высокой, а когда она прорывает канал, она становится более низкой. Это является основой для определения тенденции.
Вычислите максимальную цену закрытия и минимальную цену закрытия в течение короткого периода (например, 20 дней) в качестве критериев для входа и остановки. Когда цена прорывает длинный канал, если цена закрытия также прорывает короткий канал, вход будет продан / пустой.
При держании позиции с большим количеством позиций, если цена опустится ниже короткой линии, она прекратится. При держании позиции с пустым лицом, если цена прорвется ниже короткой линии, она прекратится.
Стоп-стоп устанавливается на N-кратный ATR. Это может автоматически корректироваться в зависимости от волатильности рынка, что способствует уменьшению вероятности активирования стоп-стоп.
Можно выбрать, чтобы погасить позицию до окончания сделки, или держать позицию до момента остановки. Это можно контролировать с помощью входного параметра.
Эта стратегия учитывает одновременно тенденции и прибыль, чтобы улавливать ценовые тенденции и контролировать риски, подходящие для средне- и долгосрочных операций.
Эффективно идентифицируйте долгосрочные тенденции и избегайте помех от шума краткосрочного рынка.
Автоматические механизмы по удержанию убытков могут ограничивать индивидуальные убытки.
ATR-стоп может корректировать стоп-дистанцию в зависимости от волатильности рынка, снижая вероятность того, что стоп-убытки будут ударены.
Выбор автоматического ликвидации позиций при невозможности торговли, управление рисками торговли.
Логика стратегии проста, ясна и понятна.
На рынках, где нет четкой тенденции, стратегия приводит к большему количеству сделок, что увеличивает стоимость сделок и вероятность потерь.
Хотя существует механизм остановки убытков, в исключительных ситуациях ценовые разрывы могут привести к значительным убыткам, если они упадут прямо за пределы остановки убытков.
ATR рассчитывается только на основе исторических данных и не может точно прогнозировать будущие тенденции и волатильность, фактическое стоп-дальность может быть слишком большим или слишком маленьким.
В реальном мире стоп-лосс не может быть выполнен на 100%. В крайних случаях он может быть пропущен и привести к убыткам.
Настройка параметров Donchian channel для оптимизации эффективности идентификации трендов.
В сочетании с другими индикаторами, подтверждающими торговые сигналы, такие как MACD, KDJ и т. д., повышает стратегическую стабильность.
Увеличение движущегося стоп-лоска, позволяющего стоп-лоску двигаться вместе с ценой, что еще больше ограничивает потери.
Испытание влияния различных периодов хранения позиций на общую эффективность и определение оптимального периода хранения позиций.
Рассмотреть возможность динамического изменения размеров позиций и увеличения позиций в условиях тренда.
Стратегия отслеживания трендов Дончианского канала объединяет определение тренда и управление рисками, чтобы получить избыточную отдачу с помощью распознавания тренда, а также сдерживание риска хвоста с помощью стоп-механизмов. Эта стратегия подходит для выявления и захвата средне- и длиннолинейных ценовых тенденций, которые обеспечивают стабильную положительную прибыль после оптимизации параметров и дополнения механизмов.
/*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, calc_on_every_tick=true)
// =============================================================================
// VARIABLES
// =============================================================================
donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10')
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 = true)
// =============================================================================
// 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 BG VERTICAL COLOR
// =============================================================================
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 HORIZONTAL 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='In end')
// =============================================================================
// END
// =============================================================================