Diese Strategie kombiniert den exponentiellen gleitenden Durchschnitt (EMA) mit dem stochastischen Oszillator in einer Trendfolgungs- und Fortsetzungsweise, zusammen mit einigen coolen Funktionalitäten.
Die Strategie hat 4 obligatorische Bedingungen, um ein Handelssignal freizuschalten.
Die Strategie kombiniert die Vorteile von EMA und Stochastic, um den Beginn und die Fortsetzung von Trends effektiv zu erfassen, die für mittelfristige und langfristige Operationen geeignet sind.
Zu den Vorteilen der Strategie gehören insbesondere:
Die wichtigsten Risiken dieser Strategie sind folgende:
Um die oben genannten Risiken zu mindern, können wir folgende Maßnahmen ergreifen:
Die Strategie kann in folgenden Aspekten weiter optimiert werden:
Diese Strategie integriert die Vorteile sowohl des Trendfolgens als auch der mittleren Umkehrung unter Berücksichtigung sowohl höherer Zeitrahmenmarktumgebungen als auch des aktuellen Preisverhaltens. Es ist eine effektive Strategie, die es wert ist, in Echtzeit verfolgt und getestet zu werden.
/*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)