Die Double Moving Average Crossover Strategie ist eine Trend-folgende Strategie, die das Crossover von zwei gleitenden Durchschnitten unterschiedlicher Perioden als Handelssignale verwendet. Sie tritt in Long- oder Short-Positionen ein, wenn der schnelle MA über oder unter dem langsamen MA überschreitet und die Trendrichtung nach dem Crossover bestimmt. Sie kann mittelfristige Trends erfassen und gleichzeitig unnötige Handelsfrequenz durch übermäßige Schwankungen reduzieren.
Die Strategie verwendet zwei gleitende Durchschnitte: einen schnellen MA mit einem kürzeren Zeitraum (z. B. 15 Perioden) zur Erfassung kurzfristiger Kursbewegungen und einen langsamen MA mit einem längeren Zeitraum (z. B. 21 Perioden) zur Identifizierung der Haupttrendrichtung.
Durch die Anpassung der MA-Periodenkombinationen kann die Strategie den Zeitrahmen der Trends anpassen, um Trends zu erfassen.
Die Strategie umfasst auch Risikomanagement-Module wie Take Profit, Stop Loss und Trailing Stop Loss, die dazu beitragen, den maximalen Gewinn/Verlust einzelner Trades zu begrenzen und das Gesamtrisiko zu enthalten.
Die Strategie der doppelten Vermarktungsbeihilfe hat folgende Vorteile:
Es gibt auch einige Risiken, die zu berücksichtigen sind:
Diese Schwächen können durch Optimierungen wie Filtersignale, Trailing Stop Loss usw. gelindert werden.
Die Strategie kann in folgenden Aspekten verbessert werden:
Diese Erhöhungen erwarten eine deutliche Erhöhung der Gewinnquote und risikoadjustierte Renditen.
Insgesamt bietet die doppelte gleitende Durchschnitts-Crossover-Strategie Einfachheit, Flexibilität und kontrollierbare Risiken.
/*backtest start: 2022-12-10 00:00:00 end: 2023-06-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true) maFastSource = input(defval = ohlc4, title = "Fast MA Source") maFastLength = input(defval = 15, title = "Fast MA Period", minval = 1) maSlowSource = input(defval = ohlc4, title = "Slow MA Source") maSlowLength = input(defval = 21, title = "Slow MA Period", minval = 1) tradeInvert = input(defval = false, title = "Invert Trade Direction?") inpTakeProfit = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0) inpStopLoss = input(defval = 100, title = "Stop Loss", minval = 0) inpTrailStop = input(defval = 0, title = "Trailing Stop Loss", minval = 0) inpTrailOffset = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0) useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na useTimeLimit = input(defval = true, title = "Use Start Time Limiter?") startYear = input(defval = 2018, title = "Start From Year", minval = 0, step = 1) startMonth = input(defval = 05, title = "Start From Month", minval = 0,step = 1) startDay = input(defval = 01, title = "Start From Day", minval = 0,step = 1) startHour = input(defval = 00, title = "Start From Hour", minval = 0,step = 1) startMinute = input(defval = 00, title = "Start From Minute", minval = 0,step = 1) startTimeOk() => inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute) timeOk = time > inputTime ? true : false r = (useTimeLimit and timeOk) or not useTimeLimit maFast = ema(maFastSource, maFastLength) maSlow = sma(maSlowSource, maSlowLength) fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50) slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50) aboveBelow = maFast >= maSlow ? true : false tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false if( startTimeOk() ) enterLong = not tradeDirection[1] and tradeDirection exitLong = tradeDirection[1] and not tradeDirection strategy.entry( id = "Long", long = true, when = enterLong ) //strategy.close( id = "Long", when = exitLong ) enterShort = tradeDirection[1] and not tradeDirection exitShort = not tradeDirection[1] and tradeDirection strategy.entry( id = "Short", long = false, when = enterShort ) //strategy.close( id = "Short", when = exitShort ) strategy.exit("Exit Long", from_entry = "Long", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick) strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)