Адаптивная торговая стратегия скользящей средней


Дата создания: 2024-02-22 17:09:39 Последнее изменение: 2024-02-22 17:09:39
Копировать: 0 Количество просмотров: 642
1
Подписаться
1617
Подписчики

Адаптивная торговая стратегия скользящей средней

Обзор

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

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

Стратегия построения торгового сигнала с использованием быстрой и медленной линий DEMA.*2 ❚ Когда быстрая линия проходит медленную линию, появляется сигнал покупки; когда быстрая линия проходит медленную линию, появляется сигнал продажи. Таким образом, можно отслеживать средне-длинную линию. Кроме того, стратегия также использует двойные мобильные однонаправленные фильтры Hull, чтобы уменьшить шум торговли.

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

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

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

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

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

Стратегию можно оптимизировать путем корректировки параметров фильтра или замены других показателей. Например, можно проверить MACD вместо HullMA, или корректировать циклические параметры HullMA. Также можно проверить различные комбинации параметров, чтобы найти более подходящие правила торговли. Кроме того, можно использовать волатильность в сочетании с индикатором волатильности для контроля масштаба позиции.

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

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

Исходный код стратегии
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//
//---------------------------------------------
//* Author - PPSingnal
//* http://ppsignal.com
//---------------------------------------------
//
//

strategy (title="PPSignal V4 (Auto Adaptive Times)", shorttitle="PPSignal V4", overlay=true)
delayOffset = input(defval = 0, title = "Delay Open/Close MA (Forces Non-Repainting)", minval = 0, step = 1)

//----------------------------------------    INICIO PPI     ----------------------------------------

// - PARÁMETROS DE ENTRADA
// SE DEFINE LA RESOLUCIÓN
useRes1 = true
setRes1 = true


tf = timeframe.period == "60" ? 4 : timeframe.period == "240" ? 4 : timeframe.period == "D" ? 4 : timeframe.period == "W" ?4 : 4


// PRIMER DEMA
type   = "DEMA"
src   = close
len    = tf
off   = 0
lsma   = 0
// SEGUNDA DEMA
type2   = "DEMA"
src2    = open
len2    = tf
off2    = 0
lsma2   = 0

// - INPUTS END

//----------------------------------------    INICIO FUNCIONES     ----------------------------------------

// RETORNA UNA MEDIA MOVIL (TYPE=TIPO / SRC = TIPO DE PRECIO / LEN=LONGITUD / LSMA=0)
variant(type, src, len, lsma) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, lsma)                                         // Least Squares
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : v1

// SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1*(src + nz(src[1])) / 2 + c2*nz(v12[1]) + c3*nz(v12[2])
   

// RETORNA LA RESOLUCIÓN SETEADA Y SINO LA DEFAULT
// 3H:      1min - 3min - 5min - 15min
// DIARIO:  30 - 45 - 60
// SEMANAL: 120 - 180 - 240 - D


reso(exp, use, res) => use ? request.security(syminfo.tickerid, timeframe.period=="1" ? "D" : timeframe.period=="3" ? "D" : timeframe.period=="5" ? "D" : timeframe.period=="15" ? "D" : timeframe.period=="30" ? "D" : timeframe.period=="45" ? "W" : timeframe.period=="60" ? "W" : timeframe.period=="120" ? "W" : timeframe.period=="180" ? "W" : timeframe.period=="240" ? "W" : timeframe.period=="D" ? "W" : "W", exp) : exp




//----------------------------------------    FIN FUNCIONES     ----------------------------------------

//----------------------------------------    INICIO VARIABLES     ----------------------------------------

// DEMAS
ma_short    = reso(variant(type, src[off], len, lsma), useRes1, setRes1)
ma_long     = reso(variant(type2, src2[off2], len2, lsma2), useRes1, setRes1)


//----------------------------------------    FIN VARIABLES     ----------------------------------------


//----------------------------------------    FIN PPI     ----------------------------------------

//----------------------------------------    PRIMER FILTRO      ----------------------------------------
// Double HullMA
scolor      = false

n=1
n2ma=2*wma(close,round(n/2))
nma=wma(close,n)
diff=n2ma-nma
sqn=round(sqrt(n))

n2ma1=2*wma(close[1],round(n/2))
nma1=wma(close[1],n)
diff1=n2ma1-nma1
sqn1=round(sqrt(n))

n1=wma(diff,sqn)
n2=wma(diff1,sqn)

//----------------------------------------    FIN PRIMER FILTRO     ----------------------------------------

//----------------------------------------    INICIO CONDICIONES      ----------------------------------------

// CONDICION CON FILTRO
cruce= (ma_short > ma_long) and n1>n2 ? true : ma_short < ma_long ? false : cruce[1]
// Condition

// FONDO DE COLOR
bground = cruce ? white : red
bgcolor(bground, transp=90)


// BARRAS COLOREADAS
barcol = cruce ? yellow : red 
barcolor(barcol, transp=0)

closePlot   = plot(ma_short, title = "Zone 1", color = gray, circles = 0, style = circles, transp = 100)
openPlot   = plot(ma_long, title = "Zone 2", color = green, circles = 0, style = circles, transp = 100)
trendState  = ma_short > ma_long ? true : ma_short < ma_long ? false : trendState[1]

// channel fill
closePlotU  = plot(trendState ? ma_short : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? ma_long : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : ma_short, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : ma_long, transp = 100, editable = false)

fill(openPlotU, closePlotU, title = "Up Trend Fill", color = yellow, transp = 70)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = red, transp = 70)




//----------------------------------------    FIN CONDICIONES     ----------------------------------------

//----------------------------------------    INICIO ESTRATEGIA      ----------------------------------------

//CONDICION COMPRA
longCond    = (ma_short > ma_long) and n1>=n2

//CONDICION VENTA

shortCond    = (ma_short < ma_long)

//ABRO COMPRA A
strategy.entry("Bull Trend", strategy.long, when = longCond)

//ABRO VENTA A
strategy.entry("Bearish Trend", strategy.short, when = shortCond)

//CIERRO VENTA A
strategy.exit("Exit Short", from_entry = "Bull Trend", when = shortCond)

//CIERRO COMPRA A
strategy.exit("Exit Long", from_entry = "Bearish Trend", when = longCond)

//----------------------------------------    FIN ESTRATEGIA     ----------------------------------------