Strategie zur Umkehrung des doppelten gleitenden Durchschnitts


Erstellungsdatum: 2023-12-25 13:24:14 zuletzt geändert: 2023-12-25 13:24:14
Kopie: 1 Klicks: 575
1
konzentrieren Sie sich auf
1621
Anhänger

Strategie zur Umkehrung des doppelten gleitenden Durchschnitts

Überblick

Die Dual Moving Average Reversal Strategy ist eine quantitative Trading-Strategie, die sowohl kurz- als auch langfristige Trends anhand von zwei Moving Averages identifiziert. Die Strategie kombiniert einen 10-Tage-Simple Moving Average mit einem 200-Tage-Simple Moving Average, um kurzfristige Rückkauf- und Kaufmöglichkeiten bei einem langfristigen bullishem Trend zu erfassen. Die Strategie verfügt außerdem über eine gewisse Trendverfolgung und Verlustkontrolle.

Strategieprinzip

Die Doppel-Moving-Average-Umkehrung basiert hauptsächlich auf folgenden Annahmen:

  1. Der 200-Tage-Simple Moving Average kann die langfristige Trendrichtung des Marktes erkennen. Wenn der Preis über der 200-Tage-Linie liegt, steht die Großbörse für eine langfristige Beobachtung.

  2. Ein 10-Tage-Simple Moving Average kann einen kurzfristigen Rückschritt des Marktes erkennen. Wenn der Preis unter der 10-Tage-Linie liegt, bedeutet dies, dass ein Rückschritt in kurzer Zeit stattfindet.

  3. Bei einer langfristigen Trendbullishness kann jeder kurzfristige Rückschlag als eine niedrige Sauggelegenheit betrachtet werden, die effizient gefangen werden kann.

Basierend auf den oben genannten Annahmen ist die Logik der Handelssignalgenerierung für diese Strategie:

  1. Wenn der Schlusskurs die 200-Tage-Linie überschreitet und gleichzeitig die 10-Tage-Linie überschreitet, wird ein langfristiger Trendbüge und ein kurzfristiger Rückschlag erzeugt, der ein Kaufsignal erzeugt.

  2. Wenn die Position gehalten wird, sollte der Stop-Loss-Bereich sofort beendet werden, wenn der Schlusskurs die 10-Tage-Linie erneut überschreitet, was eine Umkehrung des kurzfristigen Trends bedeutet. Darüber hinaus wird der Stop-Loss-Bereich aktiviert, wenn der Aktienpreis einen erheblichen Rückgang aufweist, der dazu führt, dass der Verlust die vorab festgelegte Stop-Loss-Linie erreicht.

  3. Wenn die Börse insgesamt stark sinkt, kann der Kauf als Gelegenheit zum Absaugen bewertet werden, indem der vorher festgelegte Fallschwellenwert verwendet wird.

Mit dieser Konstruktion kann man bei einer langfristigen bullish Trend effektiv eine niedrige Absorptions-Rückholung durchführen und Stop-Losses setzen, um das Risiko zu kontrollieren.

Strategische Vorteile

Die Doppel-Moving-Average-Umkehrstrategie hat folgende Vorteile:

  1. Die Strategie ist klar und einfach, leicht zu verstehen und umzusetzen.
  2. Mit einem Dual-Moving-Average-Filter kann die langfristige Entwicklung sowohl der Massen- als auch der Einzelaktien effektiv erkannt werden.
  3. Durch die Erfassung von kurzfristigen Umkehrungen kann eine höhere Effizienz bei der Verwendung von Geldern erzielt werden.
  4. Ein eingebauter Stop-Loss-Mechanismus, der den Verlust einzelner Positionen gut kontrollieren kann.
  5. Die Parameter können flexibel eingestellt werden und gelten für Großindizes und beliebte Einzelaktien.

Strategisches Risiko

Obwohl die Vorteile einer Umkehrung der Doppel-Moving-Average-Strategie offensichtlich sind, gibt es auch einige Risiken:

  1. Wenn die große Scheibe in der langen Kurve ist, kann es zu Fehlsignalen kommen, die die Strategie beeinträchtigen. Die Strategie muss auf Eis gelegt werden, bis ein klarer Trend aktiviert ist.
  2. Wenn Sie sich nur auf die Bewegung des Durchschnitts verlassen, um Trends zu beurteilen und Signale zu erzeugen, können Sie andere effektive Merkmale übersehen. Es kann in Betracht gezogen werden, mehr Indikatoren für die Kombinationsoptimierung einzuführen.
  3. Eine einzelne Stop-Loss-Methode kann zu starr sein, um verschiedene Arten von Stop-Loss-Mechanismen zu testen.
  4. Strategieparameter müssen für verschiedene Standards optimiert werden, da dies die Stabilität beeinträchtigt.

Richtung der Strategieoptimierung

Die Umkehrung der doppelten gleitenden Durchschnitte kann in folgende Richtungen optimiert werden:

  1. Testen von Kombinationen von Moving Averages unterschiedlicher Länge, um optimale Parameter zu finden.
  2. Zusätzliche Hilfsindikatoren werden hinzugefügt, um ein stabileres Signal zu erzeugen, wie z. B. Verkehr, Schwingungsindikatoren usw.
  3. Verschiedene Arten von Stopps werden getestet, z. B. Tracking-Stopps, Zeit-Stopps usw.
  4. Optimierung von Kauf- und Stop-Loss-Parametern, um sich an veränderte Marktbedingungen anzupassen.
  5. Die Einführung von Machine Learning-Algorithmen zur Optimierung der Parameter mit mehr historischen Daten.

Zusammenfassen

Die Doppel-Moving-Average-Umkehrstrategie ist insgesamt eine sehr praktische quantitative Strategie. Sie nutzt die Vorzüge des Moving-Averages, um bei langen, mehrköpfigen Trades mit niedrigen Absorptions- und Stop-Loss-Werten eine höhere Ein-Runde-Rendite zu erzielen. Gleichzeitig verfügt sie über eine gewisse Fähigkeit zur Identifizierung großer Werte und zur Risikokontrolle. Durch kontinuierliche Tests und Optimierungen ist zuversichtlich, dass die Strategie noch besser funktionieren wird.

Strategiequellcode
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 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/
// © Gold_D_Roger
//note: spreading 1 statement over multiple lines needs 1 apce + 1 tab | multi line function is 1 tab
//Recommended tickers: SPY (D), QQQ (D) and big indexes, AAPL (4H)

//@version=5
strategy("Davin's 10/200MA Pullback on SPY Strategy v2.0",
     overlay=true,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10, // 10% of equity on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.1) //Insert your broker's rate, IB is 0.005USD or tiered

//Best parameters
// SPY D
// Stop loss 0.15
// commission of 0.005 USD using Interactive brokers
// Exit on lower close 
// Buy more when x% down --> 14%
// DO NOT include stop condition using MA crossover

// Get User Input
i_ma1           = input.int(title="MA Length 1", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA 200")
i_ma2           = input.int(title="MA Length 2", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA 10")
i_ma3           = input.int(title="MA Length 3", defval=50, step=1, group="Strategy Parameters", tooltip="MA for crossover signals`")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.15, step=0.01, group="Strategy Parameters", tooltip="Hard stop loss of 10%")
i_startTime     = input(title="Start filter", defval=timestamp("01 Jan 2013 13:30 +0000"), group="Time filter", tooltip="Start date and time to begin")
i_endTime       = input(title="End filter", defval=timestamp("01 Jan 2099 19:30 +0000"), group="Time filter", tooltip="End date and time to stop")
i_lowerClose    = input.bool(title="Exit on lower close", defval=true, group="Strategy Parameters", tooltip="Wait for lower close after above 10SMA before exiting") // optimise exit strat, boolean type creates tickbox type inputs
i_contrarianBuyTheDip = input.bool(title="Buy whenever more than x% drawdown", defval=true, group="Strategy Parameters", tooltip="Buy the dip! Whenever x% or more drawdown on SPY")
i_contrarianTrigger = input.int(title="Trigger % drop to buy the dip", defval=14, step=1, group="Strategy Parameters", tooltip="% drop to trigger contrarian Buy the Dip!") 
//14% to be best for SPY 1D
//20% best for AMZN 1D
i_stopByCrossover_MA2_3 = input.bool(title="Include stop condition using MA crossover", defval=false, group="Strategy Parameters", tooltip="Sell when crossover of MA2/1 happens")

// Get indicator values
ma1 = ta.sma(close,i_ma1) //param 1
ma2 = ta.sma(close,i_ma2) //param 2
ma3 = ta.sma(close,i_ma3) //param 3
ma_9 = ta.ema(close,9) //param 2
ma_20 = ta.ema(close,20) //param 3

// Check filter(s)
f_dateFilter = true //make sure date entries are within acceptable range

// Highest price of the prev 52 days: https://www.tradingcode.net/tradingview/largest-maximum-value/#:~:text=()%20versus%20ta.-,highest(),max()%20and%20ta.
highest52 = ta.highest(high,52)
overall_change = ((highest52 - close[0]) / highest52) * 100

// Check buy/sell conditions
var float buyPrice = 0 //intialise buyPrice, this will change when we enter a trade ; float = decimal number data type 0.0
buyCondition  = (close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter) or (strategy.position_size == 0 and i_contrarianBuyTheDip==true and overall_change > i_contrarianTrigger and f_dateFilter) // higher than 200sma, lower than short term ma (pullback) + avoid pyramiding positions
sellCondition = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])  //check if we already in trade + close above 10MA; 
// third condition: EITHER i_lowerClose not turned on OR closing price has to be < previous candle's LOW [1]

stopDistance  = strategy.position_size > 0 ? ((buyPrice - close)/close) : na // check if in trade > calc % drop dist from entry, if not na
stopPrice     = strategy.position_size > 0 ? (buyPrice - (buyPrice * i_stopPercent)) : na // calc SL price if in trade, if not, na
stopCondition = (strategy.position_size > 0 and stopDistance > i_stopPercent) or (strategy.position_size > 0 and (i_stopByCrossover_MA2_3==true and ma3 < ma1))


// Enter positions
if buyCondition 
    strategy.entry(id="Long", direction=strategy.long) //long only

    
if buyCondition[1] // if buyCondition is true prev candle
    buyPrice := open // entry price = current bar opening price

// Exit position
if sellCondition or stopCondition 
    strategy.close(id="Long", comment = "Exit" + (stopCondition ? "Stop loss=true" : "")) // if condition? "Value for true" : "value for false"
    buyPrice := na //reset buyPrice

// Plot
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset = -1)
plot(ma1, color=color.blue) //defval=200
plot(ma2, color=color.white) //defval=10
plot(ma3, color=color.yellow) // defval=50