Динамическая стратегия прорыва ценового канала

Автор:Чао Чжан, Дата: 2023-12-13 16:03:37
Тэги:

img

Обзор

Динамическая стратегия прорыва ценового канала - это количественная стратегия торговли, основанная на индикаторе Дончианского ценового канала.

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

Принцип стратегии

Расчет показателя

Канал цены рассчитывается по следующим формулам:

Верхняя линия = максимальный максимум за последние N периодов

Нижняя линия = наименьшее значение за последние N периодов

Средняя линия = (верхняя линия + нижняя линия) / 2

где N представляет собой длину цикла канала.

Правила въезда

Когда самая высокая цена последней K-линии пробивается через верхнюю границу канала, устанавливается длинная позиция;

Когда самая низкая цена последней K-линии пройдет через нижнюю границу канала, установите короткую позицию.

Пример:

Высокая точка предыдущей K-линии не превышала верхнюю границу канала;
Высокая точка текущей K-линии прорывается через верхнюю границу канала; Установьте длинную позицию

Правила выхода

Существует два необязательных правила выхода:

  1. Выход из канала

Закрытие длинной позиции: цена остановки потери - это нижний предел канала;

Закрытие короткой позиции: цена остановки потери - верхняя граница канала;

  1. Выход на середине линии

Независимо от длинных или коротких позиций, закрывайте все позиции, когда цены опускаются ниже средней линии канала.

Контроль рисков

Контроль рисков использует пропорциональные стоп-потери для расчета конкретного стоп-потеря расстояния на основе амплитуды канала и допустимого процента риска.

Продолжительность стоп-лосса = цена входа * (1 - Допустимый процент риска)

Расстояние короткой остановки потери = цена входа * (1 + Допустимый процент риска)

Например, если приемлемый риск установлен на уровне 2%, цена входа составляет 10 000 долларов, то линия остановки для длинной позиции составляет 10 000 * (1 - 2%) = 9 800 долларов.

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

Зафиксировать прорывы тренда

Когда цены прорываются через верхние и нижние границы канала, очень вероятно, что начнется новая направленная тенденция.

Контролируемые риски

Использование пропорционального стоп-лосса может поддерживать одиночные потери в пределах приемлемого диапазона.

Большое пространство оптимизации параметров

Параметры, такие как цикл канала, соотношение рисков, метод остановки потери, могут быть оптимизированы и объединены для адаптации к более широкой рыночной среде.

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

Провалившиеся побеги

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

Рынок с ограниченным диапазоном

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

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

Динамический канал

Подумайте о том, чтобы сделать длину ценового канала переменной, которая автоматически корректируется на основе волатильности рынка.

Оптимизируйте возможности для поступления

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

Оптимизация параметров

Использовать больше исторических данных для тестирования и оптимизации комбинаций параметров для определения оптимальных параметров для адаптации к более широким рыночным условиям.

Резюме

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


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro

//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong  = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype  = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize   = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen     = input(50, minval = 1, title = "Price Channel Length")
showll    = input(true, defval = true, title = "Show lines")
showof    = input(true, defval = true, title = "Show offset")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(false, defval = false, title = "Show background")
fromyear  = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear    = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth   = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday   = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today     = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center

//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
if h > 0
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Больше