Cette stratégie est basée sur l'indicateur de moyenne mobile dynamique de McGinley. L'indicateur McGinley MA est une version améliorée des moyennes mobiles qui peut mieux suivre les tendances des prix.
La stratégie utilise principalement deux moyennes mobiles, une EMA de 21 périodes et une EMA de 42 périodes. Lorsque le MA plus court franchit le niveau du MA plus long, il est considéré comme un signal d'achat. Lorsque le MA plus court franchit le niveau du MA plus long, il est considéré comme un signal de vente.
En outre, la stratégie exige également que le prix soit au-dessus de la MA dynamique de McGinley et qu'il dépasse la MA plus courte pour générer un signal d'achat.
Plus précisément, le signal d'achat est déclenché lorsque: une MA plus courte traverse une MA plus longue, un prix de clôture au-dessus d'une MA de McGinley, un prix de clôture dépasse une MA plus courte. Le signal de vente est déclenché lorsque: une MA plus courte traverse une MA plus longue, un prix de clôture au-dessous d'une MA de McGinley, un prix de clôture dépasse une MA plus courte.
Le MA de McGinley est calculé comme suit: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Période * (Close / MDIt-1) ^ 4, 1).
McGinley MA améliore l'émission en retard des MA traditionnels et peut rapidement capturer les changements de tendance.
L'utilisation de doubles MA pour générer des signaux peut filtrer efficacement les fausses fuites.
L'ajout de prix supérieur/inférieur à McGinley MA évite une négociation excessive sur les marchés à fourchette.
L'utilisation de l'EMA rend l'AM plus sensible aux variations de prix récentes.
Les Whipsaws peuvent générer de faux signaux sur les marchés latéraux, causant des pertes.
Les ouvertures d'écart peuvent ne pas déclencher l'entrée à temps.
Un réglage inadéquat des paramètres peut avoir un impact sur les performances de la stratégie.
Les périodes de détention prolongées entraînent des risques systémiques.
Testez différentes longueurs MA pour trouver des combinaisons optimales.
Ajoutez d'autres indicateurs tels que KD, MACD pour améliorer le timing d'entrée/sortie.
Ajustez la valeur de k en fonction des différents produits et marchés pour optimiser le calcul de la MA de McGinley.
Incorporer des mesures de volatilité pour la dimensionnement dynamique des positions et le contrôle des risques.
Un stop-loss peut également être testé pour verrouiller les bénéfices.
Cette stratégie utilise la capacité de suivi rapide de McGinley MA combinée à des signaux de rupture de prix pour suivre efficacement les tendances et changer de position lorsque la tendance s'inverse.
/*backtest start: 2022-11-07 00:00:00 end: 2023-11-13 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/ // © LucasZancheta //@version=4 strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true) //Médias móveis MA1Period=input(21, title="MA1") MA2Period=input(42, title="MA2") MA1 = ema(close, MA1Period) MA2 = ema(close, MA2Period) aboveAverage = MA1 >= MA2 hunderAverage = MA2 >= MA1 //Período do backtest startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31) startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12) startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100) endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31) endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12) endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100) //Verifica se o candle está dentro do período do backtest inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0)) //Número de periodos da média móvel period = input(title="Períodos", type=input.integer, defval=20) //Constante K (0.6) k = input(title="Constante K", type=input.float, defval=0.6) //Preço de fechamento closePrice = input(title="Preço", type=input.source, defval=close) mdi = 0.0 //Fórmula de McGinley mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1) //Regra de coloração mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black //Inserindo as informações no gráfico plot(MA1, color=color.blue, linewidth=2) plot(MA2, color=color.purple, linewidth=2) barcolor(mdiColor) //Estratégia buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1 buyLoss = closePrice < mdi and close < MA1 and close < MA2 if (inDateRange) strategy.entry("Compra", strategy.long, qty=1, when= buySignal) strategy.exit("Gain da compra", "Compra", qty=1, profit=20) strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação") sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1 sellLoss = closePrice > mdi and close > MA1 and close > MA2 if (inDateRange) strategy.entry("Venda", strategy.short, qty=1, when= sellSignal) strategy.exit("Gain da venda", "Venda", qty=1, profit=20) strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação") if (not inDateRange) strategy.close_all()