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 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:
La ligne rapide traverse au-dessus de la ligne lente depuis le bas, va long
La ligne rapide traverse en dessous la ligne lente d'en haut, va court
Fracture des prix en dessous de la ligne de sortie rapide, clôture de position longue
Le prix se déplace au-dessus de la ligne de sortie rapide, rentre long
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
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.
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
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))