Stratégie de croisement de combinaisons à onze moyennes mobiles


Date de création: 2024-01-15 13:57:53 Dernière modification: 2024-01-15 13:57:53
Copier: 3 Nombre de clics: 710
1
Suivre
1617
Abonnés

Stratégie de croisement de combinaisons à onze moyennes mobiles

Aperçu

La combinaison de stratégies utilise des croisements de 11 types différents de moyennes mobiles pour faire des gains et des pertes. Les 11 moyennes mobiles utilisées sont les suivantes: moyenne mobile simple (SMA), moyenne mobile indicielle (EMA), moyenne mobile pondérée (WMA), moyenne mobile pondérée en masse (VWMA), moyenne mobile plane (SMMA), moyenne mobile bilatérale (DEMA), moyenne mobile triangulaire (TEMA), moyenne mobile de Hull (HMA), moyenne mobile à retardement zéro (EMAZ), moyenne mobile triangulaire (TMA) et surplan de glissement (SSMA).

Cette stratégie permet de configurer deux moyennes mobiles, une plus rapide et une plus lente, choisissant parmi 11 options. Un signal de commutation est généré lorsque la MA plus rapide est supérieure à la MA plus lente. Un signal de commutation est généré lorsque la MA plus rapide est inférieure à la MA plus lente.

Les fonctionnalités supplémentaires incluent le réglage de la grille, l’arrêt et le niveau d’arrêt.

Logique de stratégie

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

Les conditions d’entrée sont les suivantes:

Je fais plusieurs entrées: MA rapide > MA lent
Entrée à l’air libre: MA rapide < MA lente

La sortie est déterminée par l’un des trois critères suivants:

  1. Le niveau d’arrêt atteint
  2. Le niveau de stop loss est atteint
  3. générer un signal inverse ((la moyenne mobile est croisée dans le sens inverse))

La stratégie permet de configurer des paramètres clés tels que le type et la longueur de la MA, les réglages de la gradiente, le stop-loss et le pourcentage de stop-loss. Cela offre une flexibilité pour optimiser la stratégie en fonction des différentes conditions de marché et des préférences de risque.

Les avantages

  • Combinaison de 11 types différents de MA pour un signal puissant
  • Flexibilité dans la configuration des paramètres principaux
  • Les fonctionnalités de blocage et d’arrêt des pertes protègent les bénéfices et limitent les pertes
  • La dégradation permet d’accroître la position dans une tendance forte

Les risques

  • Comme pour tout indicateur technique, le croisement MA peut générer un faux signal.
  • La sur-optimisation des conditions actuelles du marché pourrait réduire les performances futures
  • Le hard-stop s’est retiré trop tôt de la bonne transaction avec des fluctuations importantes

Il est possible de renforcer la gestion des risques en confirmant les prix utilisés pour les signaux d’entrée, en utilisant des arrêts de suivi plutôt que des arrêts d’arrêt et en évitant une optimisation excessive.

Optimisation de l’espace

Il y a plusieurs façons d’améliorer cette stratégie:

  1. Ajout de filtres supplémentaires avant l’entrée, tels que les vérifications de volume et de prix
  2. Tester systématiquement les performances des différents types de MA, en sélectionnant les 1 ou 2 qui sont les meilleurs
  3. Optimisation de la longueur de l’AM pour un type de transaction et une période de temps spécifiques
  4. Stop-loss avec traceur au lieu de stop-loss
  5. La tendance s’allonge avec l’ajout de phases de stop.

Résumer

La stratégie de croisement des moyennes mobiles offre une méthode de croisement des transactions systématisées. En combinant des signaux à travers plusieurs indicateurs de MA et en permettant de configurer des paramètres clés, elle offre un cadre de négociation puissant et flexible. L’optimisation et la gestion des risques joueront un rôle clé pour optimiser la performance.

Code source de la stratégie
/*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)