Это торговая стратегия, которая использует каналы Donchain в течение нескольких временных рамок для определения точек входа и выхода.
Стратегия в основном использует концепцию каналов Donchain, которая состоит из верхних, нижних и средних линий канала. Ширина канала варьируется в течение разных временных рамок. В частности, мы строим каналы Donchain по двум временным шкалам:
Используйте 52 периода, чтобы построить долгосрочный канал Donchain и получить его верхнюю, нижнюю и среднюю линию.
Используйте 12 периодов, чтобы построить короткосрочный канал Donchain и получить его верхнюю, нижнюю и среднюю линию.
Логика входа: когда цена превышает верхнюю часть длительного канала, мы определяем это как сигнал длинного входа.
Логика выхода: когда цена прорывается ниже нижней точки короткосрочного канала, мы определяем это как выходный сигнал для закрытия длинных позиций.
Стратегия объединяет в себе преимущества торговли как по тренду, так и по средней реверсии.
Использование анализа с использованием нескольких временных рамок помогает решить проблемы с ложными прорывами и делает входы/выходы более действительными.
Параметры могут быть оптимизированы для различных продуктов и режимов рынка.
Стратегия чувствительна к параметрам. Различные параметры могут привести к радикально разным результатам. Необходимо адекватное тестирование и оптимизация, чтобы найти оптимальный набор параметров.
Это может привести к чрезмерным сделкам на различных рынках.
Он не учитывает общий рыночный режим. Может потерпеть неудачу в важнейших точках переворота тенденции. Для оценки основной тенденции следует использовать другие показатели.
Провести оптимизацию параметров для поиска наилучших параметров, включая периоды канала, типы каналов и т.д.
Включить логику стоп-потери с разумными остановками для контроля потери.
Комбинируйте другие индикаторы для определения основных тенденций, таких как EMA, Keltner Channels, MACD и т. д., избегая сбоев в ключевых поворотных моментах.
В целом, это типичная многочасовая стратегия прорыва каналов Donchain. Она хорошо объединяет как следующее за трендом, так и среднее реверсионное изменение, чтобы уловить местные изменения в трендах. С оптимизированными параметрами она может очень хорошо работать на трендовых рынках. Однако сама стратегия хрупка, чувствительна к параметрам и общему режиму рынка. Рекомендуется комбинировать ее с другими стратегиями или индикаторами для достижения более надежных результатов.
/*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()