Динамическая стратегия прорыва ценового канала - это количественная стратегия торговли, основанная на индикаторе Дончианского ценового канала.
Основная идея этой стратегии заключается в использовании прорывов ценового канала Дончан. Когда цена проходит через верхний предел канала, установите длинную позицию для поиска тренда; Когда цена проходит через нижний предел канала, установите короткую позицию для поиска тренда.
Канал цены рассчитывается по следующим формулам:
Верхняя линия = максимальный максимум за последние N периодов
Нижняя линия = наименьшее значение за последние N периодов
Средняя линия = (верхняя линия + нижняя линия) / 2
где N представляет собой длину цикла канала.
Когда самая высокая цена последней K-линии пробивается через верхнюю границу канала, устанавливается длинная позиция;
Когда самая низкая цена последней K-линии пройдет через нижнюю границу канала, установите короткую позицию.
Пример:
Высокая точка предыдущей K-линии не превышала верхнюю границу канала;
Высокая точка текущей K-линии прорывается через верхнюю границу канала;
Установьте длинную позицию
Существует два необязательных правила выхода:
Закрытие длинной позиции: цена остановки потери - это нижний предел канала;
Закрытие короткой позиции: цена остановки потери - верхняя граница канала;
Независимо от длинных или коротких позиций, закрывайте все позиции, когда цены опускаются ниже средней линии канала.
Контроль рисков использует пропорциональные стоп-потери для расчета конкретного стоп-потеря расстояния на основе амплитуды канала и допустимого процента риска.
Продолжительность стоп-лосса = цена входа * (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)