Stratégie de croisement des onze moyennes mobiles

Auteur:ChaoZhang est là., Date: 15 janvier 2024 à 13h57
Les étiquettes:

img

Résumé

Cette stratégie combine des croisements de 11 types différents de moyennes mobiles pour les entrées longues et courtes. Les 11 moyennes mobiles utilisées sont: Simple (SMA), Exponentiel (EMA), Poids (WMA), Poids de volume (VWMA), Lissé (SMMA), Double Exponentiel (DEMA), Triple Exponentiel (TEMA), Hull (HMA), Zero Lag Exponentiel (ZEMA), Triangulaire (TMA) et Filtre SuperSmoother (SSMA).

La stratégie permet de configurer deux moyennes mobiles - une plus rapide et une plus lente, toutes deux sélectionnées parmi les 11 options. Les signaux longs sont générés lorsque le MA plus rapide traverse le MA plus lent. Les signaux courts se produisent lorsque le MA plus rapide traverse le MA plus lent.

Les caractéristiques supplémentaires comprennent les paramètres pyramidaux, les niveaux de prise de profit et de stop-loss.

La logique de la stratégie

La logique de la stratégie de base repose sur des croisements entre deux moyennes mobiles pour déterminer les entrées et les sorties.

Les conditions d'entrée sont les suivantes:

Entrée longue: MA rapide > MA lente Entrée courte: MA rapide < MA lente

Les sorties sont déterminées par l'un des trois critères suivants:

  1. Niveau de bénéfice réalisé
  2. Niveau de stop-loss atteint
  3. Signal opposé généré (crossover MA dans la direction opposée)

La stratégie permet de configurer des paramètres clés tels que le type et la longueur de l'AM, les paramètres pyramidaux, les pourcentages de prise de profit et de stop-loss.

Les avantages

  • Combine 11 types de MA différents pour des signaux robustes
  • Configuration flexible des paramètres clés
  • Les fonctionnalités de prise de profit et de stop loss protègent les bénéfices et limitent les pertes
  • La pyramide permet d'augmenter la taille de la position pour des tendances fortes

Les risques

  • Comme pour tout indicateur technique, les croisements MA peuvent générer de faux signaux
  • Une optimisation excessive pour les conditions actuelles du marché peut entraîner une dégradation des performances futures
  • Les sorties de stop loss difficiles peuvent conduire à une sortie précoce de bonnes transactions sur les marchés volatils.

La gestion des risques peut être améliorée en utilisant la confirmation de l'action des prix pour les signaux d'entrée, en utilisant des arrêts de trailing au lieu d'arrêts durs et en évitant une sur-optimisation.

Des possibilités d'amélioration

Il existe plusieurs façons d'améliorer cette stratégie:

  1. Incorporer des filtres supplémentaires avant l'entrée, tels que des contrôles de volume et d'action des prix
  2. Les performances des différents types d'AM doivent être testées systématiquement et l'optimum 1 ou 2 sélectionné.
  3. Optimiser les longueurs de MA spécifiquement pour les instruments de négociation et les délais
  4. Utilisez des arrêts de traction au lieu d'arrêts durs
  5. Ajouter des bénéfices à des niveaux progressifs au fur et à mesure que la tendance s'étend

Conclusion

La stratégie de croisement des onze moyennes mobiles fournit une approche systématique des croisements commerciaux. En combinant des signaux à travers plusieurs indicateurs MA et en permettant la configuration de paramètres clés, elle fournit un cadre de trading robuste mais flexible. Le réglage fin et la gestion des risques joueront un rôle clé dans l'optimisation des performances. La stratégie a un fort potentiel pour le trading basé sur la dynamique, mais devrait être adaptée à différents environnements de marché.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3

strategy(title = "[STRATEGY] MA Cross Eleven", overlay = true)

// MA - type, source, length

//  MA - type, source, length
//  SMA --> Simple
//  EMA --> Exponential
//  WMA --> Weighted
//  VWMA --> Volume Weighted
//  SMMA --> Smoothed
//  DEMA --> Double Exponential
//  TEMA --> Triple Exponential
//  HMA --> Hull
//  TMA --> Triangular
//  SSMA --> SuperSmoother filter
//  ZEMA --> Zero Lag Exponential

type = input(defval="ZEMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"])
len1 = input(defval=8, title="Fast MA Length", minval=1)
srcclose1 = input(close, "Fast MA Source")
len2 = input(defval=21, title="Slow MA Length", minval=1)
srcclose2 = input(close, "Slow MA Source")

// Returns MA input selection variant, default to SMA if blank or typo.

variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = 0.0
    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
    v11 = sma(sma(src,len),len)                                         // Triangular
    // 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
    v9 = 0.0
    v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
    // Zero Lag Exponential
    e = ema(v2, len)
    v10 = v2+(v2-e)
    // 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=="SSMA"?v9 : type=="ZEMA"?v10 : type=="TMA"? v11: v1

ma_1 = variant(type, srcclose1, len1)
ma_2 = variant(type, srcclose2, len2)

plot(ma_1, title="Fast MA", color = green, linewidth=2, transp=0)
plot(ma_2, title="Slow MA", color = red, linewidth=2, transp=0)

longCond = na
shortCond = na
longCond := crossover(ma_1, ma_2)
shortCond := crossunder(ma_1, ma_2)

// Count your long short conditions for more control with Pyramiding

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if longCond
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if shortCond
    sectionLongs := 0
    sectionShorts := sectionShorts + 1
    
// Pyramiding Inputs

pyrl = input(1, "Pyramiding")

// These check to see your signal and cross references it against the pyramiding settings above

longCondition = longCond and sectionLongs <= pyrl 
shortCondition = shortCond and sectionShorts <= pyrl 

// Get the price of the last opened long or short

last_open_longCondition = na
last_open_shortCondition = na
last_open_longCondition := longCondition ? high[1] : nz(last_open_longCondition[1])
last_open_shortCondition := shortCondition ? low[1] : nz(last_open_shortCondition[1])

// Check if your last postion was a long or a short

last_longCondition = na
last_shortCondition = na
last_longCondition := longCondition ? time : nz(last_longCondition[1])
last_shortCondition := shortCondition ? time : nz(last_shortCondition[1])

in_longCondition = last_longCondition > last_shortCondition
in_shortCondition = last_shortCondition > last_longCondition

// Take profit

isTPl = input(false, "Take Profit Long")
isTPs = input(false, "Take Profit Short")
tpl = input(3, "Take Profit Long %", type=float)
tps = input(30, "Take Profit Short %", type=float)
long_tp = isTPl and crossover(high, (1+(tpl/100))*last_open_longCondition) and in_longCondition  == 1
short_tp = isTPs and crossunder(low, (1-(tps/100))*last_open_shortCondition) and in_shortCondition == 1 

// Stop Loss

isSLl = input(false, "Stop Loss Long")
isSLs = input(false, "Stop Loss Short")
sl= 0.0
sl := input(3, "Stop Loss %", type=float)
long_sl = isSLl and crossunder(low, (1-(sl/100))*last_open_longCondition) and longCondition == 0 and in_longCondition == 1
short_sl = isSLs and crossover(high, (1+(sl/100))*last_open_shortCondition) and shortCondition == 0 and in_shortCondition == 1

// Create a single close for all the different closing conditions.

long_close = long_tp or long_sl ? 1 : 0
short_close = short_tp or short_sl ? 1 : 0

// Get the time of the last close

last_long_close = na
last_short_close = na
last_long_close := long_close ? time : nz(last_long_close[1])
last_short_close := short_close ? time : nz(last_short_close[1])

// Strategy entries

strategy.entry("long", strategy.long, when=longCondition == true, stop = open[1])
strategy.entry("short", strategy.short, when=shortCondition == true)
strategy.close("long", when = long_sl or long_tp)
strategy.close("short", when = short_sl or short_tp)

Plus de