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 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 = xlong
undshortCond = xshort
Das 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.
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.
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.
Die Strategie beinhaltet folgende Optimierungsrichtungen:
Durch die Optimierung der oben genannten Richtungen kann die Echtzeit-Performance der Strategie kontinuierlich verbessert werden.
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