Стратегия торговли адаптивными скользящими средними

Автор:Чао Чжан, Дата: 22 февраля 2024 года 17:09:39
Тэги:

img

Обзор

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

Логика стратегии

Стратегия использует быструю линию DEMA и медленную линию DEMA для построения торговых сигналов. Быстрая линия имеет период tf, а медленная линия имеет период tf * 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     ----------------------------------------





Больше