Strategie für eine doppelte Kreuzung von gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 2023-11-16 17:50:52
Tags:

img

Übersicht

Die Dual Moving Average Crossover Strategie beurteilt die Kursentwicklungsrichtung durch Berechnung von gleitenden Durchschnitten verschiedener Perioden und realisiert Trendfolgen. Sie geht lang, wenn der kurzfristige MA über den langfristigen MA überschreitet, und kurz, wenn der kurzfristige MA unter den langfristigen MA überschreitet.

Strategie Logik

Diese Strategie basiert auf den exponentiellen gleitenden Durchschnitten (EMA) für die Perioden 9, 21 und 50. Die EMA für die Periode 9 stellt den kurzfristigen Trend, die EMA für die Periode 21 den mittelfristigen Trend und die EMA für die Periode 50 den langfristigen Trend dar.

Wenn die 9-Periode-EMA über die 21-Periode-EMA überschreitet, signalisiert sie einen Aufwärtstrend auf kurze Sicht und geht somit lang.

Die Logik für Long/Short Entry, Take Profit und Stop Loss wird konfiguriert. Die Einstiegsbedingung ist die Überschneidung der MA. Long Take Profit ist der Einstiegspreis * (1 + Input Take Profit Ratio), Short Take Profit ist der Einstiegspreis * (1 - Input Take Profit Ratio). Long Stop Loss ist der Einstiegspreis * (1 - Input Stop Loss Ratio), Short Stop Loss ist der Einstiegspreis * (1 + Input Stop Loss Ratio).

Einige Filter werden auch hinzugefügt, wie der Trendfilter, um Seitenveränderungen zu vermeiden, und der Aktienfilter, um den Handel zu vermeiden, wenn das Strategie-Aktienkapital zu niedrig ist.

Zusammenfassend lässt sich sagen, dass diese Strategie doppelte EMA-Kreuzungen verwendet, um die Kursentwicklungsrichtung zu bestimmen, mit einer angemessenen Take-Profit- und Stop-Loss-Logik, die mittelfristige bis langfristige Trends erfassen kann.

Analyse der Vorteile

  • Mit doppelten MA-Kreuzungen zur Bestimmung der Trendrichtung ist die Logik einfach und leicht verständlich.

  • Durch die Annahme von EMAs für verschiedene Zeiträume können kurz- und langfristige Trends beurteilt werden.

  • Gewinn- und Stop-Loss-Logik schließt sich dem Gewinn an und kontrolliert das Risiko.

  • Filter helfen, einige falsche Signale bis zu einem gewissen Grad zu vermeiden.

  • Parameter können frei konfiguriert werden, Perioden können für verschiedene Marktumgebungen optimiert werden.

Risikoanalyse

  • Als Einzelfaktorstrategie sind Handelssignale möglicherweise nicht stabil genug.

  • Wenn ein Crossover stattfindet, kann der Preis bereits eine Strecke hoch/niedrig gelaufen sein, wobei das Risiko besteht, hoch zu kaufen und niedrig zu verkaufen.

  • Die Handelskosten werden nicht berücksichtigt, die tatsächlichen Renditen könnten niedriger sein.

  • Es gibt keinen Stop Loss, es besteht ein unbegrenztes Verlustrisiko bei extremen Marktbedingungen.

Lösungen:

  1. Optimieren Sie die MA-Perioden für stabilere Signale.

  2. Hinzufügen anderer Indikatoren zu Filtersignalen.

  3. Erhöhung der Handelsgröße zur Verringerung der Kosten.

  4. Setzen Sie den richtigen Stop-Loss, um den maximalen Verlust zu begrenzen.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Optimieren Sie MA-Perioden, um die besten Kombinationen zu finden, oder verwenden Sie adaptive Optimierung, um die besten Perioden dynamisch auszuwählen.

  2. Fügen Sie andere technische Indikatoren wie MACD, KD usw. hinzu, um Signale zu filtern und die Qualität zu verbessern, oder verwenden Sie maschinelles Lernen, um Signale zu punkten und falsche zu filtern.

  3. Verwenden Sie eine Lautstärkanalyse, und nehmen Sie kein Signal auf, wenn die Lautstärke bei der MA-Übertragung nicht ausreicht.

  4. Überprüfen Sie die Preisschwankungen, bevor ein Crossover stattfindet.

  5. Es sollten dynamische Stop-Loss-Mechanismen wie Trailing Stop-Loss, Chandelier Exit usw. aufgebaut werden, um die Stop-Loss-Distanz zu reduzieren, aber effektiv zu halten.

  6. Optimierung der Positionsgröße wie fest / dynamisch / mit Hebelwirkung, um vernünftigere Gewinn-Verlust-Verhältnisse zu erzielen.

  7. Überlegen Sie umfassend die Handelskosten, den Slippage und optimieren Sie die Gewinn-/Stop-Loss-Verhältnisse, um die Rentabilität im Live-Handel zu gewährleisten.

Schlussfolgerung

Die Gesamtstruktur dieser Strategie ist solide, mit einer einfachen Logik des doppelten EMA-Crossovers, um die Trendrichtung zu bestimmen, gepaart mit einer Gewinn- und Stop-Loss-Logik, um Trends zu erfassen. Als eine Einzelfaktorstrategie kann sie auf Parameter, Signalfilter usw. weiter optimiert werden, um sie robuster zu machen. Mit einem richtigen Stop-Loss und einer korrekten Positionsgröße können Risiken weiter reduziert werden. Insgesamt bietet sie einen soliden Trend nach dem Strategierahmen, der nach Optimierungen und Anpassungen konsistente Gewinne erzielen kann.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

Mehr