Торговая стратегия на основе многомасштабного пошагового канала Donqi


Дата создания: 2024-02-27 14:57:37 Последнее изменение: 2024-02-27 14:57:37
Копировать: 0 Количество просмотров: 657
1
Подписаться
1617
Подписчики

Торговая стратегия на основе многомасштабного пошагового канала Donqi

Обзор

Это торговая стратегия, которая использует много временных масштабов для определения точек входа и выхода. Основная идея стратегии заключается в следующем: на более длинных временных масштабах определять направление тренда, чтобы найти время входа; на более коротких временных масштабах определять обратный тренд, чтобы найти время выхода.

Стратегический принцип

Стратегия основывается на концепции туннеля Тончи. Он состоит из верхней, нижней и средней линий туннеля. Ширина туннеля изменяется в зависимости от временных масштабов.

  1. Используя 52 цикла для построения более длинных временных масштабов туннелей Тонч, полученных вдоль верхнего, нижнего и центрального направлений
  2. Используя 12-циклический построить более короткие временные масштабы тончинского канала, полученных вдоль канала, вдоль и в центре

Логика входа: когда цена прорывает верхнюю границу более длительного временного канала, считается, что это многосторонний момент входа. Чтобы избежать ложного прорыва, мы требуем, чтобы по крайней мере одна из последних трех K-линий закрывалась выше верхней границы этого канала, чтобы избежать ложного прорыва, вызванного краткосрочным чрезмерным расширением.

Логика выхода: когда цена пробивается вниз по каналу более короткого временного масштаба, считается, что настало время для выхода на рынок. Мы также требуем, чтобы по крайней мере одна из последних трех K-линий закрывалась ниже нижнего полюса этого канала, чтобы подтвердить эффективность прорыва и избежать подкупа.

Стратегические преимущества

  1. Эта стратегия сочетает в себе преимущества отслеживания трендов и торговли реверсией. Более длинные временные шкалы определяют направление тренда, более короткие временные шкалы определяют локальные реверсии, которые в сочетании могут улавливать локальные колебания в тренде.

  2. Использование многократного анализа времени позволяет лучше решать проблему ложных прорывов, что делает вход и выход более четкими и эффективными.

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

Риски и решения

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

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

  3. Стратегия не учитывает логику определения тренда на большом уровне, и может потерпеть неудачу в точке перехода быков и медведей. Можно объединить другие показатели для определения тренда на большом уровне.

Направление оптимизации

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

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

  3. В сочетании с другими показателями, чтобы определить тенденции на большом уровне. Например, 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()