Momentum Stochastic Smoothed Moving Average Strategie


Erstellungsdatum: 2023-12-19 11:41:40 zuletzt geändert: 2023-12-19 11:41:40
Kopie: 0 Klicks: 661
1
konzentrieren Sie sich auf
1621
Anhänger

Momentum Stochastic Smoothed Moving Average Strategie

Überblick

Die Strategie kombiniert den Index-Moving-Average (EMA) mit dem Stochastic Oscillator (Random) und verwendet Trend-Following- und Continuity-Methoden. Die Strategie hat einige coole Funktionen. Ich habe sie speziell für den Handel mit Alternativen entwickelt, aber sie ist auch für Bitcoin selbst und einige Forex-Handelspaare geeignet.

Strategieprinzip

Die Strategie hat vier Voraussetzungen für die Eröffnung eines Handelssignals:

  • Schnelle EMA höher als langsame EMA
  • Zufällige K-Linien sind in Überkaufszonen.
  • Zufällige K-Linie über Zufällige D-Linie nach oben
  • Der Kurs schließt zwischen einem langsamen EMA und einem schnellen EMA

Wenn alle Bedingungen wahr sind, wird die Position bei der nächsten K-Linie eröffnet.

Analyse der Stärken

Die Strategie kombiniert die Vorteile von EMAs und Zufallsindikatoren, um den Beginn und die Fortsetzung von Trends effektiv zu erfassen und ist für den mittleren und langen Trend geeignet. Die Strategie bietet außerdem eine Vielzahl an anpassbaren Parametern, die der Benutzer an seine eigenen Handelsstile und Marktmerkmale anpassen kann.

Die Strategie hat folgende Vorteile:

  1. Die EMA-Kreuzung beurteilt die Trendrichtung und erhöht die Stabilität und Zuverlässigkeit der Signale
  2. Randomisierte Indikatoren überkaufen und verkaufen und suchen nach Möglichkeiten, umzukehren
  3. Die beiden Indikatoren kombinieren Trend- und Rückschritt-Trading
  4. ATR berechnet automatisch die Stop-Loss-Distanz, wobei die Stop-Loss-Distanz an die Marktvolatilität angepasst wird
  5. Benutzerdefinierbare RRR, die den Bedürfnissen verschiedener Benutzer gerecht werden
  6. Anpassung der Parameter an den jeweiligen Markt

Risikoanalyse

Die Hauptrisiken dieser Strategie stammen aus:

  1. Bei EMA-Kreuzungen kann es zu Falsebreaks kommen, die zu falschen Signalen führen.
  2. Der Zufallsindikator selbst ist nachlässig und kann den optimalen Zeitpunkt für eine Preisumkehr verpassen
  3. Eine einzelne Strategie kann sich nicht vollständig an die wechselnden Marktbedingungen anpassen.

Um diese Risiken zu verringern, können folgende Maßnahmen ergriffen werden:

  1. Anpassung der EMA-Zyklusparameter, um zu viele Falses zu vermeiden
  2. Mehr Indikatoren für Trends und Unterstützungen, um die Zuverlässigkeit von Handelssignalen zu gewährleisten
  3. Einführung einer klaren Geldmanagementstrategie, um die Risikobereitschaft für jede Transaktion zu kontrollieren
  4. Verschiedene Strategien können sich gegenseitig verifizieren und die Stabilität verbessern.

Optimierungsrichtung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Erhöhung des Moduls für die Anpassung der Positionshaltung an die Volatilität. Bei starker Marktfluktuation wird die Position entsprechend verkleinert; bei schwächerer Volatilität kann die Position erhöht werden.
  2. Erhöhung der Beurteilung von Trends auf der großen Ebene und Vermeidung von Gegenoperationen. Zum Beispiel die Beurteilung der Trendrichtung in Kombination mit einer täglichen oder wöchentlichen K-Linie.
  3. Die Zugabe von maschinellen Lernmodellen zur Bestimmung von Kauf- und Verkaufssignalen. Klassifizierungsmodelle, die auf historische Daten trainiert werden, können zur Erzeugung von Handelssignalen beitragen.
  4. Optimierung des Fondsmanagement-Strategie-Moduls, um Stop Loss und Position Size intelligenter zu machen.

Zusammenfassen

Die Strategie, die die Vorteile von Trendfollowing und Reverse Trading integriert, berücksichtigt sowohl das große Marktumfeld als auch das aktuelle Preisverhalten und ist eine effektive Strategie, die es wert ist, die reale Börse langfristig zu verfolgen. Durch die kontinuierliche Optimierung der Parameter-Einstellungen und die Erhöhung der Module zur Trendbeurteilung hat die Strategie viel Raum für eine Verbesserung der Leistung und ist es wert, mehr Forschung und Entwicklung zu investieren.

Strategiequellcode
/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 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/
// © LucasVivien

// Since this Strategy may have its stop loss hit within the opening candle, consider turning on 'Recalculate : After Order is filled' in the strategy settings, in the "Properties" tabs

//@version=5
strategy("Stochastic Moving Average", shorttitle="Stoch. EMA", overlay=true, default_qty_type= strategy.cash, initial_capital=10000, default_qty_value=100)

//==============================================================================
//==============================   USER INPUT   ================================
//==============================================================================

var g_tradeSetup = "     Trade Setup"
activateLongs  = input.bool (title="Long Trades"        , defval=true                                       , inline="A1", group=g_tradeSetup, tooltip="")
activateShorts = input.bool (title="Short Trades"       , defval=true                                       , inline="A1", group=g_tradeSetup, tooltip="")
rr             = input.float(title="Risk : Reward"      , defval=1   , minval=0, maxval=100       , step=0.1, inline=""  , group=g_tradeSetup, tooltip="")
RiskEquity     = input.bool (title="Risk = % Equity    ", defval=false                                      , inline="A2", group=g_tradeSetup, tooltip="Set stop loss size as a percentage of 'Initial Capital' -> Strategy Parameter -> Properties tab (Low liquidity markets will affect will prevent to get an exact amount du to gaps)")
riskPrctEqui   = input.float(title=""                   , defval=1   , minval=0, maxval=100       , step=0.1, inline="A2", group=g_tradeSetup, tooltip="")
RiskUSD        = input.bool (title="Risk = $ Amount   " , defval=false                                      , inline="A3", group=g_tradeSetup, tooltip="Set stop loss size as a fixed Base currency amount (Low liquidity markets will affect will prevent to get an exact amount du to gaps)")
riskUSD        = input.float(title=""                   , defval=1000, minval=0, maxval=1000000000, step=100, inline="A3", group=g_tradeSetup, tooltip="")

var g_stopLoss = "     Stop Loss"
atrMult = input.float(title="ATR Multiplier", defval=1 , minval=0, maxval=100 , step=0.1, tooltip="", inline="", group=g_stopLoss)
atrLen  = input.int  (title="ATR Lookback"  , defval=14, minval=0, maxval=1000, step=1  , tooltip="", inline="", group=g_stopLoss)

var g_stochastic = "     Stochastic"
Klen            = input.int  (title="K%"                   , defval=14, minval=0, maxval=1000, step=1, inline="S2", group=g_stochastic, tooltip="")
Dlen            = input.int  (title=" D%"                  , defval=3 , minval=0, maxval=1000, step=1, inline="S2", group=g_stochastic, tooltip="")
OBstochLvl      = input.int  (title="OB"                   , defval=80, minval=0, maxval=100 , step=1, inline="S1", group=g_stochastic, tooltip="")
OSstochLvl      = input.int  (title=" OS"                  , defval=20, minval=0, maxval=100 , step=1, inline="S1", group=g_stochastic, tooltip="")
OBOSlookback    = input.int  (title="Stoch. OB/OS lookback", defval=0 , minval=0, maxval=100 , step=1, inline=""  , group=g_stochastic, tooltip="This option allow to look 'x' bars back for a value of the Stochastic K line to be overbought or oversold when detecting an entry signal (if 0, looks only at current bar. if 1, looks at current and previous and so on)")
OBOSlookbackAll = input.bool (title="All must be OB/OS"    , defval=false                            , inline=""  , group=g_stochastic, tooltip="If turned on, all bars within the Stochastic K line lookback period must be overbought or oversold to return a true signal")
entryColor      = input.color(title="   "                  , defval=#00ffff                          , inline="S3", group=g_stochastic, tooltip="")
baseColor       = input.color(title="  "                   , defval=#333333                          , inline="S3", group=g_stochastic, tooltip="Will trun to designated color when stochastic gets to opposite extrem zone of current trend / Number = transparency")
transp          = input.int  (title="   "                  , defval=50, minval=0, maxval=100, step=10, inline="S3", group=g_stochastic, tooltip="")

var g_ema = "     Exp. Moving Average"
ema1len = input.int  (title="Fast EMA     ", defval=21, minval=0, maxval=1000, step=1, inline="E1", group=g_ema, tooltip="")
ema2len = input.int  (title="Slow EMA     ", defval=50, minval=0, maxval=1000, step=1, inline="E2", group=g_ema, tooltip="")
ema1col = input.color(title="     "        , defval=#0066ff                          , inline="E1", group=g_ema, tooltip="")
ema2col = input.color(title="     "        , defval=#0000ff                          , inline="E2", group=g_ema, tooltip="")

var g_referenceMarket ="     Reference Market"
refMfilter = input.bool     (title="Reference Market Filter", defval=false            , inline="", group=g_referenceMarket)
market     = input   (title="Market"                 , defval="BTC_USDT:swap", inline="", group=g_referenceMarket)
res        = input.timeframe(title="Timeframe"              , defval="30"             , inline="", group=g_referenceMarket)
len        = input.int      (title="EMA Length"             , defval=50               , inline="", group=g_referenceMarket)


//==============================================================================
//==========================   FILTERS & SIGNALS   =============================
//==============================================================================

//------------------------------   Stochastic   --------------------------------
K = ta.stoch(close, high, low, Klen)
D = ta.sma(K, Dlen)
stochBullCross = ta.crossover(K, D)
stochBearCross = ta.crossover(D, K)
OSstoch = false
OBstoch = false
for i = 0 to OBOSlookback
    if K[i] < OSstochLvl
        OSstoch := true
    else 
        if OBOSlookbackAll
            OSstoch := false
for i = 0 to OBOSlookback
    if K[i] > OBstochLvl
        OBstoch := true
    else 
        if OBOSlookbackAll
            OBstoch := false

//----------------------------   Moving Averages   -----------------------------
ema1 = ta.ema(close, ema1len)
ema2 = ta.ema(close, ema2len)
emaBull = ema1 > ema2
emaBear = ema1 < ema2

//----------------------------   Price source   --------------------------------
bullRetraceZone = (close < ema1 and close >= ema2) 
bearRetraceZone = (close > ema1 and close <= ema2)

//---------------------------   Reference market   -----------------------------
ema      = ta.ema(close, len)
emaHTF   = request.security(market, res, ema  [barstate.isconfirmed ? 0 : 1])
closeHTF = request.security(market, res, close[barstate.isconfirmed ? 0 : 1])

bullRefMarket = (closeHTF > emaHTF or closeHTF[1] > emaHTF[1])
bearRefMarket = (closeHTF < emaHTF or closeHTF[1] < emaHTF[1])

//--------------------------   SIGNAL VALIDATION   -----------------------------
validLong  = stochBullCross and OSstoch and emaBull and bullRetraceZone 
 and activateLongs  and (refMfilter ? bullRefMarket : true) and strategy.position_size == 0
validShort = stochBearCross and OBstoch and emaBear and bearRetraceZone 
 and activateShorts and (refMfilter ? bearRefMarket : true) and strategy.position_size == 0


//==============================================================================
//===========================   STOPS & TARGETS   ==============================
//==============================================================================

SLdist      = ta.atr(atrLen) * atrMult
longSL      = close - SLdist
longSLDist  = close - longSL
longTP      = close + (longSLDist * rr)
shortSL     = close + SLdist
shortSLDist = shortSL - close
shortTP     = close - (shortSLDist * rr)
var SLsaved = 0.0
var TPsaved = 0.0
if validLong or validShort
    SLsaved := validLong ? longSL : validShort ? shortSL : na
    TPsaved := validLong ? longTP : validShort ? shortTP : na


//==============================================================================
//==========================   STRATEGY COMMANDS   =============================
//==============================================================================
 
if validLong 
    strategy.entry("Long", strategy.long, 
     qty = RiskEquity ? ((riskPrctEqui/100)*strategy.equity)/longSLDist : RiskUSD ? riskUSD/longSLDist : na)
if validShort 
    strategy.entry("Short", strategy.short, 
     qty = RiskEquity ? ((riskPrctEqui/100)*strategy.equity)/shortSLDist  : RiskUSD ? riskUSD/shortSLDist : na)

strategy.exit(id="Long Exit" , from_entry="Long" , limit=TPsaved, stop=SLsaved, when=strategy.position_size > 0)
strategy.exit(id="Short Exit", from_entry="Short", limit=TPsaved, stop=SLsaved, when=strategy.position_size < 0)


//==============================================================================
//=============================   CHART PLOTS   ================================
//==============================================================================
    
//----------------------------   Stops & Targets   -----------------------------
plot(strategy.position_size != 0 or (strategy.position_size[1] != 0 and strategy.position_size == 0) ? SLsaved : na,
 color=color.red  , style=plot.style_linebr)
plot(strategy.position_size != 0 or (strategy.position_size[1] != 0 and strategy.position_size == 0) ? TPsaved : na,
 color=color.green, style=plot.style_linebr) 

//---------------------------------   EMAs   -----------------------------------
l1 = plot(ema1, color=#0066ff, linewidth=2)
l2 = plot(ema2, color=#0000ff, linewidth=2)

//--------------------------   Stochastic gradient   ---------------------------
// fill(l1, l2, color.new(color.from_gradient(K, OSstochLvl, OBstochLvl,
//  emaBull ? entryColor : emaBear ? baseColor : na, 
//  emaBull ? baseColor  : emaBear ? entryColor : na), transp))
    
//----------------------------   Trading Signals   -----------------------------
plotshape(validLong, color=color.green, location=location.belowbar, style=shape.xcross, size=size.small)
plotshape(validShort, color=color.red , location=location.abovebar, style=shape.xcross, size=size.small)

//----------------------------   Reference Market   ----------------------------
bgcolor(bullRefMarket and refMfilter ? color.new(color.green,90) : na)
bgcolor(bearRefMarket and refMfilter ? color.new(color.red  ,90) : na)