Die Strategie für die Wellenbreite des gleitenden Durchschnitts

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

震荡型广谱移动平均线交易策略

Übersicht

Die Strategie basiert auf einer breiten Spektral-Bewegungs-Durchschnittslinie, die sich durch die Verformung von Handelssignalen aus Goldforks aus langsamen Bewegungs-Durchschnitten ergeben. Die breiten Spektral-Bewegungs-Durchschnittslinie umfasst verschiedene Typen von einfachen Bewegungs-Durchschnittslinien bis hin zu vibrierenden Bewegungs-Durchschnittslinien und kann durch Parameter freigestellt werden. Sie bietet eine starke Anpassungsfähigkeit.

Die Strategie

Die Strategie verwendet eine variable gleitende Mittelwertfunktion, die zwölf verschiedene Arten von gleitenden Mitteln erzeugt. Das Grundprinzip ist, zwei gleitende Mittelwerte zu berechnen, eine schnelle (Close MA) und eine langsame (Open MA), die ein Kaufsignal erzeugen, wenn die schnelle Linie die langsame Linie durchläuft, und ein Verkaufsignal, wenn die schnelle Linie die langsame Linie durchläuft.

Die entscheidende Logik ist, zwei gleitende Mittelwerte durch Variantenfunktionen zu erzeugen:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)undopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)Die Variant-Funktion umfasst 12 verschiedene Arten von Mittelwertberechnungen, die über die BasisType-Parameter frei zu wählen sind.

Die grundlegende Logik der Handelssignalgenerierung ist:longCond = xlongundshortCond = xshortDas bedeutet, dass man auf der schnellen Linie mehr langsamer fährt, während man auf der schnellen Linie weniger langsam fährt.

Die Eintrittsregel der Strategie ist, wenn die Long-Cond- oder Short-Cond-Bedingungen erfüllt sind, mehr zu machen. Die Stop-Loss-Stopp-Regel ist, wenn die Preisbewegung die vorgegebene Anzahl an Stop-Loss-Stopp-Punkten erreicht.

Stärkenanalyse

Der größte Vorteil der Strategie besteht darin, dass man verschiedene Arten von gleitenden Durchschnitten frei kombinieren kann. Bei unterschiedlichen Marktzyklen ist unklar, welcher gleitende Durchschnittswert am besten geeignet ist. Die Strategie bietet eine starke Anpassungsfähigkeit.

Ein weiterer Vorteil ist, dass die Strategie-Logik einfach und klar ist, aber eine starke Funktionalität bietet. Die Strategie ist für den Benutzer leicht zu verstehen und zu verwenden. Gleichzeitig bietet der reichhaltige Eingabeparameter für fortgeschrittene Benutzer genügend Optimierungsmöglichkeiten.

Risikoanalyse

Das größte Risiko dieser Strategie besteht darin, dass die Breitspektral-Moving Average selbst ein gewisses Maß an Verzögerung aufweist. Es kann zu größeren Verlusten führen, wenn ein außergewöhnlicher Preisbruch auftritt. Außerdem kann es zu einer zu hohen Handelsfrequenz oder zu einem Überfluß von Signalen kommen, wenn die Parameter falsch gewählt werden.

Um das Risiko zu reduzieren, wird empfohlen, die Wirksamkeit der Signale in Kombination mit anderen Indikatoren zu beurteilen, um falsche Durchbrüche zu vermeiden. Darüber hinaus sind Parameteroptimierung und Rückmessung notwendig, um die beste Kombination von Parametern zu finden.

Optimierung

Die Strategie beinhaltet folgende Optimierungsrichtungen:

  1. Test mehr Arten von Kombinationen von gleitenden Durchschnitten, um die besten Kombinationen zu finden
  2. Zusätzliche Filter, um falsche Signale zu vermeiden, z. B. in Verbindung mit Handelsvolumenindikatoren
  3. Optimieren Sie die Längenparameter der gleitenden Mittelwerte und finden Sie die besten Parameter
  4. Optimierung der Positionsgröße und der Stop-Loss-Parameter
  5. Versuche verschiedene Sorten und Zyklen

Durch die Optimierung der oben genannten Richtungen kann die Echtzeit-Performance der Strategie kontinuierlich verbessert werden.

Zusammenfassung

Die Handelsstrategie ist sehr flexibel und basiert auf einer breiten Spektral-Moving Average. Sie bietet starke Anpassungsfunktionen, die es dem Benutzer erlauben, frei auszuwählen und verschiedene Arten von Durchschnitten zu kombinieren. Die Strategielogik ist einfach und einfach zu bedienen, aber bietet auch viel Optimierungsraum. Durch Parameteroptimierung und Risikokontrolle kann die Strategie sich an verschiedene Marktumgebungen anpassen und stabile Erträge erzielen.


/*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


Weitere Informationen