Stratégie de négociation de moyennes mobiles adaptatives

Auteur:ChaoZhang est là., Date: 2024-02-22 17:09:39
Les étiquettes:

img

Résumé

Cette stratégie est une stratégie de suivi des tendances basée sur des moyennes mobiles adaptatives. Elle utilise deux moyennes mobiles DEMA avec des périodes différentes pour générer des signaux de trading.

La logique de la stratégie

La stratégie utilise une ligne DEMA rapide et une ligne DEMA lente pour construire des signaux de trading. La ligne rapide a une période de tf et la ligne lente a une période de tf*2. Un signal d'achat est généré lorsque la ligne rapide traverse au-dessus de la ligne lente. Un signal de vente est généré lorsque la ligne rapide traverse au-dessous de la ligne lente. Cela permet à la stratégie de suivre les tendances à moyen et long terme. En outre, la stratégie utilise également un filtre à moyenne mobile double Hull pour réduire les transactions bruyantes. Les signaux ne sont générés que lorsque le filtre Hull s'accorde sur la directionnalité.

Analyse des avantages

Le plus grand avantage de cette stratégie est qu'elle peut s'adapter automatiquement à différentes périodes. Elle choisira le laps de temps d'analyse de quotidien à hebdomadaire en fonction de la période en cours. Cela rend la stratégie adaptée à une variété d'environnements de marché. En outre, la structure de moyenne mobile double peut suivre les tendances efficacement et le double filtre augmente la qualité du signal. En conséquence, cette stratégie est très appropriée pour suivre les tendances à moyen et long terme.

Analyse des risques

Le principal risque de cette stratégie provient des renversements de tendance. Lorsque le marché passe d'un marché haussier à un marché baissier, les lignes rapides et lentes peuvent se croiser brusquement vers le bas, entraînant d'énormes pertes flottantes. En outre, le filtre à lignes peut également manquer certaines opportunités rentables. Si le filtre n'est pas d'accord avec la direction des prix, les signaux autrement rentables seront ignorés. En conséquence, cette stratégie cible principalement les marchés à tendance stable à moyen et long terme.

Directions d'optimisation

La stratégie peut être optimisée en ajustant les paramètres du filtre ou en utilisant d'autres indicateurs en remplacement. Par exemple, le MACD peut être testé au lieu de HullMA, ou les paramètres de la période HullMA peuvent être ajustés. Différentes combinaisons de paramètres peuvent également être testées pour trouver des règles de trading mieux adaptées. En outre, des indicateurs de volatilité peuvent également être incorporés pour contrôler la taille des positions. Des positions plus petites peuvent être prises lorsque la volatilité du marché augmente.

Conclusion

En conclusion, il s'agit d'une stratégie de suivi de tendance adaptative très pratique. Il peut ajuster automatiquement le délai d'analyse pour différentes périodes et convient au trading sur différentes périodes. La structure de moyenne mobile double peut suivre les tendances de manière régulière et le filtre améliore également la qualité du signal. Dans l'ensemble, il convient aux investisseurs à la recherche de rendements stables à moyen et long terme.


/*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     ----------------------------------------





Plus de