Stratégie de négociation des moyennes mobiles de McGinley

Auteur:ChaoZhang est là., Date: 2023-11-14 15:48:46 Je vous en prie.
Les étiquettes:

img

Résumé

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 logique de la stratégie

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).

Les avantages

  1. McGinley MA améliore l'émission en retard des MA traditionnels et peut rapidement capturer les changements de tendance.

  2. L'utilisation de doubles MA pour générer des signaux peut filtrer efficacement les fausses fuites.

  3. L'ajout de prix supérieur/inférieur à McGinley MA évite une négociation excessive sur les marchés à fourchette.

  4. L'utilisation de l'EMA rend l'AM plus sensible aux variations de prix récentes.

Les risques

  1. Les Whipsaws peuvent générer de faux signaux sur les marchés latéraux, causant des pertes.

  2. Les ouvertures d'écart peuvent ne pas déclencher l'entrée à temps.

  3. Un réglage inadéquat des paramètres peut avoir un impact sur les performances de la stratégie.

  4. Les périodes de détention prolongées entraînent des risques systémiques.

Améliorations

  1. Testez différentes longueurs MA pour trouver des combinaisons optimales.

  2. Ajoutez d'autres indicateurs tels que KD, MACD pour améliorer le timing d'entrée/sortie.

  3. Ajustez la valeur de k en fonction des différents produits et marchés pour optimiser le calcul de la MA de McGinley.

  4. Incorporer des mesures de volatilité pour la dimensionnement dynamique des positions et le contrôle des risques.

  5. Un stop-loss peut également être testé pour verrouiller les bénéfices.

Conclusion

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()




Plus de