Doppelte gleitende Durchschnitts-Crossover-Strategie


Erstellungsdatum: 2023-12-13 15:51:13 zuletzt geändert: 2023-12-13 15:51:13
Kopie: 0 Klicks: 1316
1
konzentrieren Sie sich auf
1621
Anhänger

Doppelte gleitende Durchschnitts-Crossover-Strategie

Überblick

Die Doppel-Gleichgewichts-Kreuz-Punkt-Strategie ist eine quantitative Handelsstrategie, die auf einem gleitenden Durchschnitt basiert. Sie ermittelt die Preisentwicklung durch Berechnung der Kreuzung der schnellen und langsamen Linie und sendet ein Kauf- und Verkaufssignal an den Kreuzungen. Die Strategie verwendet die Hull-Gleichgewichtslinie als Schnelle und den Super-Smoother-Filter als langsame Linie.

Strategieprinzip

Die Berechnungsformel für die Doppel-Einheits-Kreuzungspunkt-Strategie lautet wie folgt: Schnelle Linie ((Hull-Mittellinie): WMA ((2 * WMA ((wert,n/2) - WMA ((wert,n),SQRT ((n))
Super Smoother: Dreifache Filter mit Wert

Der WMA steht für den gewichteten Moving Average, der SQRT für die offene Quadratwurzel und der Filter enthält einen Ein-Phasen-Rückstand und zwei Zweit-Phasen-Rückstand.

Die Strategie beurteilt die Querbeziehung zwischen den beiden Linien durch Berechnung von Fast- und Slow-Line-Werten, wobei:
Überschneidung der Schnellleine als Kaufsignal Das ist ein Signal, das man verkaufen kann, wenn man unter der schnellen Leitung durch die langsame Leitung geht.

Analyse der Stärken

Die Binary Equilibrium Cross Point Strategie kombiniert die Vorteile von Binary Equilibrium Judgment und Point Trading, um Trendwendepunkte genau zu erfassen und rechtzeitig ein- und auszutreten. Im Vergleich zu einer einzigen Equilibrium-Strategie hat sie folgende Vorteile:

  1. Die Kombination aus zwei Gleichlinien beseitigt die falschen Signale. Die schnelle Linie bestimmt die Richtung und die Stärke des Trends, die langsame Linie filtert die Erschütterungen und macht das Signal zuverlässiger.
  2. Die Super Smoother Filter haben eine starke Daten-Fittings-Fähigkeit, um die Preisentwicklung effektiv zu extrahieren.
  3. Die Hull Meanline ist sehr sensibel für Preisänderungen und kann Umschwünge rechtzeitig erfassen.

Risikoanalyse

Die Strategie der doppelten Gleichgewichts-Kreuzung von Punkten birgt auch Risiken:

  1. Bei Erschütterungen kann es zu einem erhöhten Whipsaw-Signal kommen. Die Durchschnittslinie kann entsprechend erweitert werden, um falsche Signale zu reduzieren.
  2. Eine Überweiterung der Doppel-Einheit-Linien-Distanz verpasst einige Möglichkeiten. Es muss eine Abwägung zwischen der Anzahl und der Qualität des erfassten Signals vorgenommen werden.
  3. Diese Strategie ist besser geeignet für Trends mit klareren Varianten und sollte nicht für Produkte mit hoher Volatilität angewendet werden.

Optimierungsrichtung

Die Doppel-Even-Linien-Cross-Point-Strategie kann in folgenden Dimensionen optimiert werden:

  1. Anpassung der Durchschnittsparameter an die Varianten mit unterschiedlichen Perioden und Schwankungen.
  2. Hinzufügen von zusätzlichen Indikatoren oder Filtern, um die Qualität der Trends zu beurteilen, um die Whipsaw zu reduzieren.
  3. Optimierung des Positionsanteils in Kombination mit Trendindikatoren.

Zusammenfassen

Die Binär-Linien-Kreuz-Punkt-Strategie erbt die Vorzüge der Binär-Linien-Strategie und erweitert die Anwendung von Binär-Linien-Urteilen und Punkt-Trading-Methoden, um ein fortschrittlicheres und zuverlässiges quantitatives Handelsprogramm zu bilden. Es hat einzigartige Vorteile bei der Auswahl des Handelszeitpunkts.

Strategiequellcode
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//

strategy(title='Open Close Cross Strategy ', shorttitle='sacinvesting', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes = input(defval=true, title='Use Alternate Resolution?')
intRes = input(defval=3, title='Multiplier for Alernate Resolution')
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') : timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') : timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') : timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') : '60'
basisType = input.string(defval='SMMA', title='MA Type: ', options=['SMA', 'EMA', 'DEMA', 'TEMA', 'WMA', 'VWMA', 'SMMA', 'HullMA', 'LSMA', 'ALMA', 'SSMA', 'TMA'])
basisLen = input.int(defval=8, title='MA Period', minval=1)
offsetSigma = input.int(defval=6, title='Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(defval=0.85, title='Offset for ALMA', minval=0, step=0.01)
scolor = input(false, title='Show coloured Bars to indicate Trend?')
delayOffset = input.int(defval=0, title='Delay Open/Close MA (Forces Non-Repainting)', minval=0, step=1)
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #00FF00FF
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = ta.sma(src, len)  // Simple
    v2 = ta.ema(src, len)  // Exponential
    v3 = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5 = ta.wma(src, len)  // Weighted
    v6 = ta.vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9 = ta.linreg(src, len, offSig)  // Least Squares
    v10 = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = ta.sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // ©️ 2013 John F. Ehlers
    a1 = math.exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    type == 'EMA' ? v2 : type == 'DEMA' ? v3 : type == 'TEMA' ? v4 : type == 'WMA' ? v5 : type == 'VWMA' ? v6 : type == 'SMMA' ? v7 : type == 'HullMA' ? v8 : type == 'LSMA' ? v9 : type == 'ALMA' ? v10 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp

// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title='Bar Colours')
closeP = plot(closeSeriesAlt, title='Close Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
openP = plot(openSeriesAlt, title='Open Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions.

// === STRATEGY ===
// stop loss
slPoints = input.int(defval=0, title='Initial Stop Loss Points (zero to disable)', minval=0)
tpPoints = input.int(defval=0, title='Initial Target Profit Points (zero for disable)', minval=0)
// Include bar limiting algorithm
ebar = input.int(defval=10000, title='Number of Bars for Back Testing', minval=0)
dummy = input(false, title='- SET to ZERO for Daily or Longer Timeframes')
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != 'NONE'
    strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT')
    strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG')
    strategy.close('long', when=shortCond == true and tradeType == 'LONG')
    strategy.close('short', when=longCond == true and tradeType == 'SHORT')
    strategy.exit('XL', from_entry='long', profit=TP, loss=SL)
    strategy.exit('XS', from_entry='short', profit=TP, loss=SL)

// === /STRATEGY ===
// eof