Schwankungsspektrum gleitender Durchschnittshandelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-25 14:19:27
Tags:

img

Übersicht

Diese Strategie basiert auf dem gleitenden Durchschnitt des Spektrums und erzeugt Handelssignale durch das goldene Kreuz und das Todeskreuz der schnellen und langsamen gleitenden Durchschnitte. Der gleitende Durchschnitt des Spektrums umfasst eine Vielzahl von Typen vom einfachen gleitenden Durchschnitt bis zum schwingenden gleitenden Durchschnitt, die durch Parameteranpassung für eine starke Anpassungsfähigkeit frei kombiniert werden können.

Strategieprinzip

Diese Strategie verwendet eine Variante der gleitenden Durchschnittsfunktion, die 12 verschiedene Arten von gleitenden Durchschnitten erzeugen kann. Das Grundprinzip besteht darin, zwei gleitende Durchschnittslinien, die schnelle Linie (Close MA) und die langsame Linie (Open MA) zu berechnen. Wenn die schnelle Linie über die langsame Linie überschreitet, wird ein Kaufsignal erzeugt. Wenn die schnelle Linie unter die langsame Linie überschreitet, wird ein Verkaufssignal erzeugt. Stop-Loss- und Take-Profit-Parameter sind ebenfalls so eingestellt, dass automatischer Stop-Loss und Take-Profit erreicht wird.

Die Schlüssellogik besteht darin, zwei gleitende Durchschnittslinien durch die Variantenfunktion zu erzeugen:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)undopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA). Die Variantenfunktion enthält Berechnungsmethoden für 12 verschiedene Arten von gleitenden Durchschnitten. Benutzer können den Typ durch den Parameter basisType frei auswählen. Dies implementiert die Kombination von gleitenden Durchschnitten des Spektrums.

Die grundlegende Logik für die Erzeugung von Handelssignalen ist:longCond = xlongundshortCond = xshort

Die Eintrittsregel besteht darin, bei Erfüllung der LongCond- oder ShortCond-Bedingung Long oder Short zu gehen. Die Exitregel besteht darin, die Position für Stop Loss zu schließen oder Profit zu machen, wenn die Kursbewegung die vorgegebenen Stop Loss/Profit-Punkte erreicht.

Analyse der Vorteile

Ein weiterer Vorteil ist, dass die Strategie-Logik einfach und klar ist, aber eine leistungsstarke Funktionalität bietet. Es ist einfach für Benutzer, diese Strategie zu verstehen und zu verwenden. Gleichzeitig bieten die zahlreichen Eingabeparameter auch ausreichend Optimierungsraum für fortgeschrittene Benutzer.

Risikoanalyse

Das größte Risiko bei dieser Strategie besteht darin, dass der gleitende Durchschnitt des Spektrums selbst ein gewisses Maß an Verzögerung aufweist. Abnormale Preisdurchbrüche können zu größeren Verlusten führen. Darüber hinaus kann eine unsachgemäße Parameterwahl auch zu einer übermäßigen Handelsfrequenz oder redundanten Signalen führen.

Um das Risiko zu reduzieren, wird empfohlen, andere Indikatoren zu verwenden, um die Gültigkeit von Signalen zu bestimmen und falsche Ausbrüche zu vermeiden. Darüber hinaus sind Parameteroptimierung und Backtesting auch wichtig, um die beste Parameterkombination durch wiederholtes Testen zu finden. Im Live-Handel sollte die Positionsgröße angemessen reduziert werden, um einen einzigen Verlust zu kontrollieren.

Optimierungsrichtlinien

Zu den wichtigsten Optimierungsrichtungen dieser Strategie gehören:

  1. Testen Sie mehr Arten von gleitenden Durchschnittskombinationen, um die beste Kombination zu finden
  2. Hinzufügen von Filtern, um falsche Signale zu vermeiden, z. B. Kombination von Handelsvolumenindikatoren usw.
  3. Optimieren Sie die Längenparameter der gleitenden Durchschnitte, um die optimalen Parameter zu finden
  4. Optimierung der Positionsgröße, Stop-Loss- und Take-Profit-Parameter
  5. Versuche verschiedene Produkte und Zeitrahmen

Zusammenfassung

Diese Handelsstrategie implementiert eine hohe Flexibilität basierend auf dem gleitenden Durchschnitt des Spektrums. Sie bietet den Nutzern eine leistungsstarke Anpassbarkeit, um unterschiedliche Arten von gleitenden Durchschnitten frei auszuwählen und zu kombinieren. Die Strategielogik ist einfach und klar, einfach zu bedienen und bietet auch reichlich Optimierungsraum. Durch Parameteroptimierung und Risikokontrolle kann sich diese Strategie an verschiedene Marktumgebungen anpassen und stabile Renditen erzielen. Es ist eine effiziente und flexible Trendverfolgungsstrategie.


/*backtest
start: 2023-01-18 00:00:00
end: 2024-01-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//

strategy(title="Long/Short", shorttitle="Banana Maker", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_every_tick=false)



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

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

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)  // Simple
    v2 = ema(src, len)  // Exponential
    v3 = 2 * v2 - ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)  // Triple Exponential
    v5 = wma(src, len)  // Weighted
    v6 = vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))  // Hull
    v9 = linreg(src, len, offSig)  // Least Squares
    v10 = alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * 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* NEEDS REFINEMENT- backtesting this shows repaint. need new wrapper
reso(exp, use, res) =>
    security_1 = 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 ===

// alt resulution 
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=0, style=plot.style_line, transp=1)
openP = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//

//
// === ALERT conditions

xlong = crossover(closeSeriesAlt, openSeriesAlt)
xshort = 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. needs work in study mode. the banana maker is the study script. 
// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
//shunt = 0
//c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
//plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)

//Repaint city, study mode will help but wont trigger the alerts


// === STRATEGY ===
// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)
// Include bar limiting algorithm
ebar = input(defval=1000, 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


Mehr