
Это торговая стратегия, которая использует много временных масштабов для определения точек входа и выхода. Основная идея стратегии заключается в следующем: на более длинных временных масштабах определять направление тренда, чтобы найти время входа; на более коротких временных масштабах определять обратный тренд, чтобы найти время выхода.
Стратегия основывается на концепции туннеля Тончи. Он состоит из верхней, нижней и средней линий туннеля. Ширина туннеля изменяется в зависимости от временных масштабов.
Логика входа: когда цена прорывает верхнюю границу более длительного временного канала, считается, что это многосторонний момент входа. Чтобы избежать ложного прорыва, мы требуем, чтобы по крайней мере одна из последних трех K-линий закрывалась выше верхней границы этого канала, чтобы избежать ложного прорыва, вызванного краткосрочным чрезмерным расширением.
Логика выхода: когда цена пробивается вниз по каналу более короткого временного масштаба, считается, что настало время для выхода на рынок. Мы также требуем, чтобы по крайней мере одна из последних трех K-линий закрывалась ниже нижнего полюса этого канала, чтобы подтвердить эффективность прорыва и избежать подкупа.
Эта стратегия сочетает в себе преимущества отслеживания трендов и торговли реверсией. Более длинные временные шкалы определяют направление тренда, более короткие временные шкалы определяют локальные реверсии, которые в сочетании могут улавливать локальные колебания в тренде.
Использование многократного анализа времени позволяет лучше решать проблему ложных прорывов, что делает вход и выход более четкими и эффективными.
Посредством оптимизации параметров можно адаптироваться к различным видам и рыночным условиям.
Эта стратегия чувствительна к параметрам, и разные параметры могут давать совершенно разные результаты. Для того, чтобы найти оптимальную комбинацию параметров, требуется тщательное тестирование и оптимизация.
В шоковых ситуациях стратегия может генерировать большое количество торговых сигналов, что приводит к чрезмерной торговле. Одноразовые потери можно контролировать с помощью конфигурации стоп-лосса.
Стратегия не учитывает логику определения тренда на большом уровне, и может потерпеть неудачу в точке перехода быков и медведей. Можно объединить другие показатели для определения тренда на большом уровне.
Оптимизация параметров, чтобы найти оптимальное сочетание параметров. Параметры, такие как длина оптимизационного цикла, тип каналов.
Добавление логики остановки убытков. Конфигурация разумного мобильного остановки, контроль одиночных потерь.
В сочетании с другими показателями, чтобы определить тенденции на большом уровне. Например, EMA, K-линейный канал, Мак-показатель и т. д. Избегайте неудач в ключевых переломных моментах.
Эта стратегия в целом является типичной многовременной стратегией прорыва канала. Она хорошо сочетает в себе преимущества отслеживания тенденций и реверсивной торговли, чтобы улавливать локальные колебания в тренде с помощью канала различных временных масштабов.
/*backtest
start: 2023-02-20 00:00:00
end: 2024-02-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © venkyrocker7777
//@version=5
strategy('Donchain channel based investment strategy', shorttitle='Donchain channel strategy', overlay=true)
Length = input.int(21, minval=1)
xPrice = close
xvnoise = math.abs(xPrice - xPrice[1])
nAMA = 0.0
nfastend = 0.666
nslowend = 0.0645
nsignal = math.abs(xPrice - xPrice[Length])
nnoise = math.sum(xvnoise, Length)
nefratio = nnoise != 0 ? nsignal / nnoise : 0
nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1]))
plot(nAMA, color=color.new(color.blue, 0), title='KAMA')
// Function to get Lower Channel, Upper Channel, Middle Channel for a period length
getLCUCMC(PeriodLength) =>
lowestValueInThePeriod = ta.lowest(PeriodLength) // LC
highestValueInThePeriod = ta.highest(PeriodLength) // UC
middleChannelInTheperiod = math.avg(highestValueInThePeriod, lowestValueInThePeriod) // MC
// Returns Lower Channel, Upper Channel, Middle Channel for a period length
[lowestValueInThePeriod, highestValueInThePeriod, middleChannelInTheperiod]
// Longer time frame for entry
longerPeriod = 52
// Shorter time frame for exit
shorterPeriod = 12
if timeframe.period == 'D'
// Longer time frame for entry
longerPeriod := 52 * 5
// Shorter time frame for exit
shorterPeriod := 12 * 5
shorterPeriod
if timeframe.period == 'M'
// Longer time frame for entry
longerPeriod := 12
// Shorter time frame for exit
shorterPeriod := 3
shorterPeriod
// Get Lower Channel, Upper Channel, Middle Channel for longerPeriod, shorterPeriod
[lowestValueInTheLongerPeriodLength, highestValueInTheLongerPeriodLength, middleChannelInLongerperiod] = getLCUCMC(longerPeriod)
[lowestValueInTheShorterPeriodLength, highestValueInTheShorterPeriodLength, middleChannelInShorterperiod] = getLCUCMC(shorterPeriod)
// Plot Upper Channel of longerPeriod in dark green
plot(highestValueInTheLongerPeriodLength, 'highestValueInTheLongerPeriodLength', color=color.new(color.green, 0))
// Plot Lower Channel of shorterPeriod in dark red
plot(lowestValueInTheShorterPeriodLength, 'lowestValueInTheShorterPeriodLength', color=color.new(color.red, 0))
// Entry Plan
// Will start to see if we can enter when high crosses up longer period high (high >= highestValueInTheLongerPeriodLength)
// Check if any of the three past candles and enter when any of the 3 past candles satisfy
// 1) high of that candle >= highestValueInTheLongerPeriodLength of that candle (high[i] >= highestValueInTheLongerPeriodLength[i])
// 2) close of entry point consideration candle is above close of that candle (close > close[i])
isThisPointAnEntry() =>
// Check last 3 bars
isThisPointAnEntry = false
offset = 0
for i = 1 to 3 by 1
isCurrentCandleALongerPeriodHigh = high >= highestValueInTheLongerPeriodLength
isCurrentCandleCloseGreaterThanPreiousIthOne = close > close[i]
isPreviousIthCandleAlsoALongerPeriodHigh = high[i] >= highestValueInTheLongerPeriodLength[i]
isThisPointAnEntry := isCurrentCandleALongerPeriodHigh and isCurrentCandleCloseGreaterThanPreiousIthOne and isPreviousIthCandleAlsoALongerPeriodHigh
if isThisPointAnEntry
offset := -i
break
[isThisPointAnEntry, offset]
// Exit Plan - same as entry plan, with things reversed and also on a shorter time frame
// Will start to see if we should exit when low crosses down longer period low (low <= lowestValueInTheShorterPeriodLength)
// Check if any of the three past candles and exit when any of the 3 past candles satisfy
// 1) low of that candle <= highestValueInTheLongerPeriodLength of that candle (low[i] <= lowestValueInTheShorterPeriodLength[i])
// 2) close of exit point consideration candle is below close of that candle (close < close[i])
isThisPointAnExit() =>
// Check last 3 bars
isThisPointAnExit = false
for i = 1 to 3 by 1
isCurrentCandleAShorterPeriodLow = low <= lowestValueInTheShorterPeriodLength
isCurrentCandleCloseLesserThanPreiousIthOne = close < close[i]
isPreviousIthCandleAlsoAShorterPeriodLow = low[i] <= lowestValueInTheShorterPeriodLength[i]
isThisPointAnExit := isCurrentCandleAShorterPeriodLow and isCurrentCandleCloseLesserThanPreiousIthOne and isPreviousIthCandleAlsoAShorterPeriodLow
break
isThisPointAnExit
[isEntry, offset] = isThisPointAnEntry()
if isEntry
strategy.entry('Buy', strategy.long)
strategy.close_all(when=isThisPointAnExit() == true)
if year(timenow) == year(time) and month(timenow) == month(time) and dayofmonth(timenow) - 2 == dayofmonth(time)
strategy.close_all()