Stratégie de croisement des moyennes mobiles

Auteur:ChaoZhang est là., Date: le 21 septembre 2023
Les étiquettes:

Résumé

Cette stratégie utilise les principes de croisement entre les moyennes mobiles rapides et lentes pour déterminer les tendances du marché et générer des signaux d'achat et de vente.

La logique de la stratégie

La stratégie utilise deux moyennes mobiles, une ligne rapide et une ligne lente. La ligne rapide utilise l'EMA de 3 jours et la ligne lente utilise l'EMA de 15 jours. Lorsque la ligne rapide traverse au-dessus de la ligne lente depuis le bas, elle indique une tendance à la hausse et donne un signal d'achat. Au contraire, lorsque la ligne rapide traverse en dessous de la ligne lente depuis le haut, elle indique une tendance à la baisse et donne un signal de vente.

La stratégie définit également une EMA de 3 jours plus rapide comme la ligne de sortie rapide. Lorsque le prix se déplace en dessous de cette ligne de sortie rapide, elle juge que la tendance s'est inversée et devrait quitter la position longue existante. De même, lorsque le prix se déplace au-dessus de la ligne de sortie, elle indique une tendance haussière renouvelée et donne un signal pour réentrer en long.

Les signaux de fonctionnement spécifiques sont définis comme suit:

  1. La ligne rapide traverse au-dessus de la ligne lente depuis le bas, va long

  2. La ligne rapide traverse en dessous la ligne lente d'en haut, va court

  3. Fracture des prix en dessous de la ligne de sortie rapide, clôture de position longue

  4. Le prix se déplace au-dessus de la ligne de sortie rapide, rentre long

Les avantages

  • Simple à utiliser, il suffit de configurer deux paramètres de moyenne mobile, facile à mettre en œuvre

  • Données de backtesting suffisantes, utilisant des indicateurs communs pour évaluer la viabilité

  • Plusieurs paramètres configurables pour l'optimisation

  • Adopte une ligne de sortie rapide comme stop loss pour mieux contrôler le risque

  • Logique de stratégie claire, signaux d'achat et de vente explicites

  • Fréquence d'opération appropriée, évitement de la survente

Les risques

  • Prédisposé à plus de faux signaux lorsque la tendance n'est pas claire que la tendance suivant la stratégie

  • Les moyennes mobiles ont un caractère retardé, peuvent manquer des points de virage

  • Les paramètres fixes ne peuvent pas s'adapter aux changements du marché et doivent être optimisés

  • Le stop loss peut être trop faible, incapable d'arrêter la perte à temps

  • Les signaux fréquents peuvent entraîner des coûts de négociation plus élevés

  • Les signaux peuvent diverger et doivent être confirmés par d'autres indicateurs

Les risques peuvent être gérés par l'optimisation des paramètres, l'ajout de filtres, le relâchement du stop loss, la mise à jour des paramètres en temps opportun, etc.

Amélioration

  • Test et optimisation des paramètres pour mieux s'adapter aux conditions du marché

  • Introduction de plus d'indicateurs pour former un système robuste

  • Créer des paramètres adaptatifs basés sur le marché en temps réel

  • Appliquer des modèles d'apprentissage automatique pour une optimisation plus intelligente

  • Définir un stop-loss dynamique ou de suivi pour un meilleur contrôle des risques

  • Combiner les indicateurs de volume pour éviter les divergences

Conclusion

C'est une stratégie de croisement de moyenne mobile double relativement simple. Elle détermine la tendance du marché et les signaux de trading basés sur l'interaction entre les moyennes mobiles rapides et lentes. La stratégie est facile à mettre en œuvre et peut être adaptée par optimisation. Mais elle comporte également certains risques. Plus de filtres sont nécessaires pour confirmer les signaux et gérer les risques. Lorsqu'elle est correctement optimisée et appliquée au trading à moyen terme, elle peut devenir un système de trading quantitatif très pratique.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ehaarjee, ECHKAY, JackBauer007

//@version=4
//study(title="Tale_indicators", overlay=true)
strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1)

len_fast = input(3, minval=1, title="FAST EMA")
src_fast = input(close, title="Source for Fast")
fastMA = ema(src_fast, len_fast)
plot(fastMA, title="Slow EMA", color=color.orange)

len_slow = input(15, minval=1, title="SLOW EMA")
src_slow = input(close, title="Source for Slow")
slowMA = ema(src_slow, len_slow)
plot(slowMA, title="Fast EMA", color=color.blue)

len_fast_exit = input(3, minval=1, title="FAST EMA Exit")
src_fast_exit = input(close, title="Source for Fast Exit")
fastMAE = ema(src_fast_exit, len_fast_exit)
plot(fastMAE, title="Fast EMA Ex", color=color.red)


src_slow_enter_short = input(low, title="Source for Short Entry")
slowMASEn = ema(src_slow_enter_short, len_slow)

src_slow_enter_long = input(high, title="Source for Long Entry")
slowMALEn = ema(src_slow_enter_long, len_slow)

src_slow_exit_short = input(low, title="Source for Short Exit")
slowMASEx = ema(src_slow_enter_short, len_slow)

src_slow_exit_long = input(high, title="Source for Long Exit")
slowMALEx = ema(src_slow_enter_long, len_slow)

enter_long = crossover(fastMA, slowMALEn)
enter_short = crossunder(fastMA, slowMASEn)
exit_long = crossunder(fastMAE, slowMALEx)
exit_short = crossover(fastMAE, slowMALEx)

out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0))
plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30)

bull = fastMA > slowMALEn
bear = fastMA < slowMASEn

c = bull ? color.green : bear ? color.red  : color.white
bgcolor(c)

exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA")

bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high))
bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE))

bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE))
bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high))

bull_re = (bull and (low<slowMALEn)) and not(enter_long)
bear_re = (bear and (high>slowMASEn)) and not(enter_short)

bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) 
bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1])))

bull_reenter =  (bull_r) and not(enter_long)
bear_reenter =  (bear_r) and not(enter_short)

plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar)
plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar)

plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar)
plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar)

run_strategy = input(true, title="Run Strategy")
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 2000)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2100, title = "Thru Year",       type = input.integer, minval = 2000)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

var long_position_open = false
var short_position_open = false


if (enter_long and not(bull_exit) and not(long_position_open))
//    strategy.entry("LO", strategy.long, qty=4)
    long_position_open := true
    if (short_position_open)
//        strategy.close("SO")
        short_position_open := false

if (bull_reenter and not(long_position_open))  
//    strategy.entry("LO", strategy.long, qty=1)
    long_position_open := true

if (bull_exit and long_position_open)
//  strategy.close("LO")
    long_position_open := false
    
if (enter_short and not(bear_exit) and not(short_position_open))
//    strategy.entry("SO", strategy.short, qty=4)
    short_position_open := true
    if(long_position_open)
//        strategy.close("LO")
        long_position_open := false

if (bear_reenter and not(short_position_open))  
//    strategy.entry("SO", strategy.long, qty=1)
    long_position_open := true

if (bear_exit and short_position_open)
//    strategy.close("SO")
    short_position_open := false

if(run_strategy)
    strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4)
    strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1)
    strategy.close("LO", when=(window() and bull_exit and long_position_open))
    strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4)
    strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1)
    strategy.close("SO", when=(window() and bear_exit and short_position_open))


Plus de