Тенденция Дончиа в соответствии со стратегией

Автор:Чао Чжан, Дата: 2024-01-31 16:53:31
Тэги:

img

Обзор

Стратегия Donchian Trend Following разработана на основе принципа Donchian Channel, описанного в статье Black Box Trend Following Lifting the Veil. Эта стратегия использует Donchian Channel для определения направления тренда и устанавливает длинные или короткие позиции, когда цены достигают новых максимумов или минимумов.

Логика стратегии

Стратегия основана на индикаторе Дончианского канала для оценки направления тренда. Дончианский канал состоит из более длительного периода и более короткого периода. Когда цена проходит через более длительный период, это сигнализирует о начале тренда. Когда цена проходит через более короткий период, это сигнализирует о конце тренда.

Если цена равна самой высокой цене за последние 50 дней, открывается короткая позиция. Если цена равна самой низкой цене за последние 20 дней, закрываются короткие позиции. Если цена равна самой низкой цене за последние 20 или 10 дней, закрываются короткие позиции.

Объединив два Донкианских канала разных периодов, он может определить направление для установления позиций, когда начинается тренд, и реализовать своевременную остановку потерь, когда тренд заканчивается.

Анализ преимуществ

Основными преимуществами этой стратегии являются:

  1. Он может эффективно отслеживать тенденции, идентифицируя начало и конец тенденций с помощью прорывов Дончианского канала.

  2. Правильный контроль рисков. Он использует движущийся стоп-лосс для контроля одиночных потерь.

  3. Гибкая настройка параметров: комбинация периодов канала может быть свободно выбрана для адаптации к различным продуктам и рыночным условиям.

  4. Простая и понятная логика торговли.

Анализ рисков

Риски этой стратегии включают:

  1. Неспособность адаптироваться к рынкам с ограниченным диапазоном.

  2. Риск неудачного прорыва. Цены могут отступить после прорыва канала, вызывая стоп-лосс.

  3. Риск выбора периода. Неправильное настройка периода канала может привести к торговле шумом.

  4. Риск снижения коэффициента Sharpe. Увеличение размера позиции без корректировки стоп-лосса может привести к снижению коэффициента Sharpe.

Решения:

  1. Оптимизировать параметры для выбора подходящих комбинаций периодов канала.
  2. Правильно регулируйте размер позиции и стоп-лосс, чтобы контролировать риск.
  3. Используйте эту стратегию для продуктов и рынков с очевидными тенденциями.

Руководство по оптимизации

Направления оптимизации для этой стратегии:

  1. Добавление условий фильтрации, чтобы избежать ударов, например, сочетание громкости, чтобы судить о настоящих прорывах.

  2. Оптимизация сочетания периодов канала и размещения позиций для увеличения коэффициента прибыли.

  3. Пробую оптимизировать точки прерывания, чтобы найти оптимальные наборы параметров.

  4. Увеличение алгоритмов машинного обучения для динамической оптимизации и корректировки параметров.

Заключение

Данная стратегия определяет начало и конец ценовых тенденций с использованием двойных каналов и использует стиль торговли с эффективным контролем потерь на одной сделке. Эта стратегия имеет гибкую корректировку параметров и легкую реализацию, что делает ее очень практичной стратегией.


/*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
// =============================================================================

Больше