Стратегия фильтра двойной скользящей средней «Прорыв тренда»


Дата создания: 2023-11-27 17:03:08 Последнее изменение: 2023-11-27 17:03:08
Копировать: 0 Количество просмотров: 689
1
Подписаться
1617
Подписчики

Стратегия фильтра двойной скользящей средней «Прорыв тренда»

Обзор

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

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

Стратегия состоит из следующих частей:

  1. Определение трендов: использование MACD для определения ценовых тенденций, различающих многоголовые и пустые тенденции.

  2. Фильтрация диапазона: используйте канал Бринна, чтобы определить диапазон колебаний цены и отфильтровать сигналы, которые не нарушают диапазон.

  3. Подтверждение двойной средней линии: двойная средняя линия, состоящая из быстрой ЭМА и медленной ЭМА, используется для подтверждения сигнала тренда. Сигнал покупки создается только тогда, когда быстрая ЭМА> медленная ЭМА.

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

Входящий сигнал имеет следующую логику:

  1. MACD считает, что это тенденция вверх
  2. Цены вышли на трассу через Буринский канал
  3. Быстрая EMA выше, чем медленная

Сигнал покупки создается, когда выполняются все три условия.

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

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

Эта стратегия имеет следующие преимущества:

  1. Это позволяет быстро отслеживать изменения в тренде, а не отслеживать их.
  2. Повышение качества сигнала с помощью фильтрации ошибочных сигналов через двойную равномерность.
  3. Система сдерживания убытков эффективно контролирует убытки.
  4. Параметры оптимизируются в большом объеме и могут быть отрегулированы до оптимального состояния.

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

Однако эта стратегия также несет в себе некоторые риски:

  1. Неправильный сигнал при землетрясении может привести к ущербу.
  2. Неправильная установка стоп-пойнтов может привести к ненужным потерям.
  3. Неправильные параметры могут привести к неэффективности стратегии.

Эти риски могут быть оптимизированы и улучшены путем оптимизации параметров, корректировки стоп-позиции и т. Д.

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

Эта стратегия может быть оптимизирована в следующих направлениях:

  1. Настройка длины двойной равномерной линии для поиска оптимальной комбинации параметров.
  2. Тестирование различных способов остановки, таких как отслеживание остановки, шоковой остановки и т. д.
  3. Тестирование MACD-параметров для поиска оптимальных.
  4. Автоматическая оптимизация параметров с использованием машинного обучения.
  5. Добавление дополнительных условных фильтров.

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)