Handelsstrategie für den gleitenden Durchschnitt von McGinley

Schriftsteller:ChaoZhang, Datum: 14.11.2023
Tags:

img

Übersicht

Der McGinley MA-Indikator ist eine verbesserte Version von gleitenden Durchschnitten, die die Preisentwicklung besser verfolgen kann.

Strategie Logik

Die Strategie verwendet hauptsächlich zwei gleitende Durchschnitte, einen 21-Perioden-EMA und einen 42-Perioden-EMA. Wenn der kürzere MA über den längeren MA überschreitet, gilt er als Kaufsignal. Wenn der kürzere MA unter den längeren MA überschreitet, gilt er als Verkaufssignal.

Darüber hinaus erfordert die Strategie auch, dass der Preis über dem McGinley Dynamic MA liegt und über dem kürzeren MA bricht, um ein Kaufsignal zu generieren. Für das Verkaufssignal muss der Preis auch unter dem McGinley MA liegen und unter dem kürzeren MA bricht.

Insbesondere wird das Kaufsignal ausgelöst, wenn: der kürzere MA über den längeren MA überschreitet, der Schlusskurs über den McGinley MA, der Schlusskurs unter den kürzeren MA fällt. Das Verkaufssignal wird ausgelöst, wenn: der kürzere MA unter den längeren MA überschreitet, der Schlusskurs unter dem McGinley MA, der Schlusskurs über den kürzeren MA fällt.

Der McGinley MA wird berechnet als: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Periode * (Close / MDIt-1) ^ 4, 1). Wo MDIt der aktuelle Wert ist, MDIt-1 der vorherige Wert, Close der Schlusskurs, k die Glättungskonstante und Periode der Berechnungszeitraum. Diese Formel ermöglicht es dem MA, Preisänderungen in Echtzeit zu verfolgen.

Vorteile

  1. McGinley MA verbessert die Verzögerung der traditionellen MA und kann schnell Trendveränderungen erfassen.

  2. Die Verwendung von doppelten MAs zur Erzeugung von Signalen kann falsche Ausbrüche effektiv filtern.

  3. Durch das Hinzufügen eines Preises über/unter der McGinley MA wird ein übermäßiger Handel auf den Märkten mit Bandbreiten vermieden.

  4. Die Verwendung der EMA macht die MA empfindlicher auf die jüngsten Preisänderungen.

Risiken

  1. Whipsaws können in seitlichen Märkten falsche Signale erzeugen, was zu Verlusten führt.

  2. Es kann vorkommen, dass durch die Öffnung der Lücken nicht rechtzeitig die Einreise möglich ist.

  3. Eine unzureichende Einstellung der Parameter kann die Strategieleistung beeinträchtigen.

  4. Lange Haltezeiten bergen systemische Risiken.

Verbesserungen

  1. Versuche verschiedene MA-Längen, um optimale Kombinationen zu finden.

  2. Hinzufügen anderer Indikatoren wie KD, MACD zur Verbesserung der Ein-/Ausfahrtszeit.

  3. Anpassung des k-Wertes anhand verschiedener Produkte und Märkte zur Optimierung der McGinley MA-Berechnung.

  4. Einbeziehung von Volatilitätsmaßnahmen für die dynamische Positionsgröße und Risikokontrolle.

  5. Setzen Sie einen Stop-Loss, um Verluste zu kontrollieren.

Schlussfolgerung

Diese Strategie nutzt die Schnellverfolgungsfähigkeit von McGinley MA in Kombination mit Preis-Breakout-Signalen, um Trends effektiv zu verfolgen und Positionen zu wechseln, wenn sich der Trend umkehrt. Im Vergleich zu traditionellen Dual-MA-Strategien kann sie Trendänderungen schneller erfassen.


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




Mehr