Quantitative Handelsstrategie mit gleitendem Durchschnitt und Trendvektor

SMMA MA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA SL TP
Erstellungsdatum: 2025-02-20 10:59:37 zuletzt geändert: 2025-02-27 17:49:25
Kopie: 2 Klicks: 383
2
konzentrieren Sie sich auf
319
Anhänger

Quantitative Handelsstrategie mit gleitendem Durchschnitt und Trendvektor Quantitative Handelsstrategie mit gleitendem Durchschnitt und Trendvektor

Überblick

Es handelt sich um eine quantitative Trading-Strategie, die auf mehreren Moving Average-Cross-Signalen basiert. Die Strategie verwendet eine Moving Average-Cross-Signal von Eröffnungs- und Schlusskurs als Handelssignal und unterstützt verschiedene Moving Average-Typen, darunter SMMA, EMA, DEMA usw. Die Strategie ist hochgradig konfigurierbar und kann entsprechend der verschiedenen Marktumgebungen und Handelsanforderungen optimiert werden.

Strategieprinzip

Der Kern der Strategie ist die Identifizierung von Markttrends durch die Überwachung der Kreuzung der offenen und abschließenden Moving Average. Wenn die offenen und abschließenden Moving Average über die offenen und abschließenden Moving Average überschritten werden, werden mehrere Signale erzeugt. Wenn die offenen und abschließenden Moving Average unter der offenen und abschließenden Moving Average überschritten werden, werden mehrere Signale erzeugt.

Strategische Vorteile

  1. Flexible Auswahl der Durchschnittswerte: Unterstützung von 11 verschiedenen Arten von mobilen Durchschnittswerten, wobei die am besten geeignete Durchschnittswertart je nach Markteigenschaften ausgewählt werden kann.
  2. Gute Risikomanagement: Ein integriertes Stop-Loss-System, das das Risiko für jeden Handel effektiv kontrolliert.
  3. Multi-Zyklus-Anpassung: Unterstützung für mehrere Zeitspannen von Minuten bis Monaten und Optimierung der Zyklusmengen durch Parameteranpassung.
  4. Visuelle Unterstützung: Die Farbmarkierung von Trends ermöglicht eine intuitive Wahrnehmung der Marktentwicklung.

Strategisches Risiko

  1. Rückstandsrisiko: Die Moving Average ist ein Rückstandsindikator und kann in stark schwankenden Märkten Rückstandssignale erzeugen.
  2. Das Risiko von Marktschwankungen: Häufige Kreuzungen können zu Überhändlungen führen.
  3. Parameterabhängigkeit: Die Effektivität einer Strategie hängt stark von der Auswahl der Parameter ab, die in verschiedenen Marktumgebungen unterschiedliche Kombinationen erfordern können.

Richtung der Strategieoptimierung

  1. Signalfilter: Zusätzliche Kennzahlen wie Verkehrsvolumen und Schwankungen können hinzugefügt werden, um falsche Signale zu filtern.
  2. Dynamische Parameter: Einführung eines Anpassungsparametermechanismus, der die Durchschnittszyklus- und -typen entsprechend der dynamischen Marktlage anpasst.
  3. Positionsmanagement: Optimierung des Positionsmanagementsystems, um die Positionsquote dynamisch an die Marktvolatilität und die Trendstärke anzupassen.

Zusammenfassen

Die Strategie erfasst Wendepunkte in Markttrends durch die Kreuzung von mehreren beweglichen Mittellinien und verfügt über eine starke Konfigurations- und Risikomanagementfähigkeit. Durch eine vernünftige Parameteroptimierung und Signalfilterung kann eine stabile Performance in verschiedenen Marktumgebungen gewährleistet werden. Der Schlüssel zum Erfolg der Strategie liegt in der Auswahl des richtigen Mittellinientyps und der richtigen Kombination von Parametern sowie der Einrichtung eines wirksamen Risikokontrollmechanismus.

Strategiequellcode
/*backtest
start: 2024-08-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Open Close Cross Strategy v6", 
     overlay=true, 
     pyramiding=0, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=10,
     calc_on_every_tick=false)

// === INPUTS ===
var bool useRes = input.bool(true, "Use Alternate Resolution?")
var int intRes = input.int(3, "Multiplier for Alternate Resolution")
var string basisType = input.string("SMMA", "MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
var int basisLen = input.int(8, "MA Period", minval=1)
var int offsetSigma = input.int(6, "Offset for LSMA / Sigma for ALMA", minval=0)
var float offsetALMA = input.float(0.85, "Offset for ALMA", minval=0, step=0.01)
var bool scolor = input.bool(false, "Show coloured Bars to indicate Trend?")
var int delayOffset = input.int(0, "Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
var string tradeType = input.string("BOTH", "What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
var float slPoints = input.float(0, "Initial Stop Loss Points (zero to disable)", minval=0)
var float tpPoints = input.float(0, "Initial Target Profit Points (zero for disable)", minval=0)
var int ebar = input.int(10000, "Number of Bars for Back Testing", minval=0)
var bool dummy = input.bool(false, "- SET to ZERO for Daily or Longer Timeframes")

// Определение таймфрейма для alternate resolution
getAlternateResolution() =>
    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"

stratRes = getAlternateResolution()

// === MA Functions ===
variant(type, src, len, offSig, offALMA) =>
    float result = switch type
        "EMA" => ta.ema(src, len)
        "DEMA" => 2 * ta.ema(src, len) - ta.ema(ta.ema(src, len), len)
        "TEMA" => 3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
        "WMA" => ta.wma(src, len)
        "VWMA" => ta.vwma(src, len)
        "SMMA" => ta.sma(src, len)  // Упрощенная версия SMMA
        "HullMA" => ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
        "LSMA" => ta.linreg(src, len, offSig)
        "ALMA" => ta.alma(src, len, offALMA, offSig)
        "TMA" => ta.sma(ta.sma(src, len), len)
        "SSMA" => 
            a1 = math.exp(-1.414 * math.pi / len)
            b1 = 2 * a1 * math.cos(1.414 * math.pi / len)
            c2 = b1
            c3 = -a1 * a1
            c1 = 1 - c2 - c3
            c1 * (src + nz(src[1])) / 2 + c2 * nz(ta.sma(src, len)[1]) + c3 * nz(ta.sma(src, len)[2])
        => ta.sma(src, len)

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

// Get Alternate resolution Series
closeSeriesAlt = useRes ? request.security(syminfo.tickerid, stratRes, closeSeries, barmerge.gaps_off, barmerge.lookahead_on) : closeSeries
openSeriesAlt = useRes ? request.security(syminfo.tickerid, stratRes, openSeries, barmerge.gaps_off, barmerge.lookahead_on) : openSeries

// === Plotting ===
color trendColor = closeSeriesAlt > openSeriesAlt ? color.green : color.red
color barColor = closeSeries > openSeriesAlt ? color.new(color.lime, 0) : color.new(color.red, 0)

// Перемещаем barcolor в глобальную область видимости
barcolor(scolor ? barColor : na)

var closePlot = plot(closeSeriesAlt, "Close Series", trendColor, 2, plot.style_line)
var openPlot = plot(openSeriesAlt, "Open Series", trendColor, 2, plot.style_line)
fill(closePlot, openPlot, color=trendColor)

// === Trade Conditions ===
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong
shortCond = xshort

// === Strategy Logic ===
float tp = tpPoints > 0 ? tpPoints : na
float sl = slPoints > 0 ? slPoints : na

var int lastPositionType = 0  // 1 для long, -1 для short, 0 для нет позиции

if ebar == 0 or (timenow - time) / (timeframe.multiplier * 60000) <= ebar and tradeType != "NONE"
    // Закрытие позиций
    if lastPositionType == 1 and shortCond
        strategy.close("long")
        lastPositionType := 0
        label.new(bar_index, high, "Exit Long", color=color.red, style=label.style_label_down, textcolor=color.white)
    
    if lastPositionType == -1 and longCond
        strategy.close("short")
        lastPositionType := 0
        label.new(bar_index, low, "Exit Short", color=color.green, style=label.style_label_up, textcolor=color.white)
    
    // Открытие новых позиций
    if longCond and tradeType != "SHORT" and lastPositionType == 0
        strategy.entry("long", strategy.long)
        lastPositionType := 1
        label.new(bar_index, low, "Long", color=color.green, style=label.style_label_up, textcolor=color.white)
    
    if shortCond and tradeType != "LONG" and lastPositionType == 0
        strategy.entry("short", strategy.short)
        lastPositionType := -1
        label.new(bar_index, high, "Short", color=color.red, style=label.style_label_down, textcolor=color.white)
    
    // Take Profit и Stop Loss
    if lastPositionType != 0
        strategy.exit("TP/SL", profit=tp, loss=sl)