
Die Strategie basiert auf einem breit gefächerten Moving Average, bei dem ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold- und ein Gold-
Die Strategie verwendet eine variable Moving-Average-Funktion, die 12 verschiedene Arten von Moving-Averages erzeugt. Die Grundprinzipien sind die Berechnung zweier Moving-Averagen, die ein Kaufsignal erzeugen, wenn die schnelle Linie die langsame Linie durchläuft, und ein Verkaufssignal, wenn die schnelle Linie die langsame Linie durchläuft. Gleichzeitig können die Stop-Loss-Stop-Parameter gesetzt werden, um eine automatische Stop-Loss-Stop zu erreichen.
Die Schlüssellogik besteht darin, zwei Moving Averages durch die Variantfunktion zu erzeugen:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)UndopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)Die Variant-Funktion beinhaltet 12 verschiedene Arten von Mittelwert-Berechnungsmethoden, die über die BasisType-Parameter frei gewählt werden können. So wird eine Kombination aus Breitband- und Gleitenden Mittelwerten realisiert.
Die grundlegende Logik für die Erzeugung von Handelssignalen ist:longCond = xlong Und shortCond = xshortDas heißt, wenn man die schnelle Linie durchläuft, macht man mehr, wenn man die langsame Linie unterhalb der schnellen Linie durchläuft, macht man nichts.
Die Strategie-Eintritts-Regel ist, wenn die Long-Cond- oder Short-Cond-Bedingungen erfüllt sind, um mehr zu machen. Die Stop-Loss-Regel ist, wenn der Preis bewegt, um die voreingestellte Anzahl von Stop-Loss-Stopps zu erreichen.
Der größte Vorteil dieser Strategie besteht darin, dass es möglich ist, verschiedene Arten von Moving Averages frei zu kombinieren. In verschiedenen Märkten gibt es unterschiedliche Perioden, in denen nicht sicher ist, welcher Moving Average am besten geeignet ist. Die Strategie bietet eine starke Anpassungsfähigkeit.
Ein weiterer Vorteil ist, dass die Strategie-Logik einfach und klar ist, aber dennoch eine starke Funktionalität bietet. Die Benutzer können die Strategie leicht verstehen und verwenden. Die reichhaltigen Eingabeparameter bieten auch für fortgeschrittene Benutzer genügend Optimierungsmöglichkeiten.
Das größte Risiko dieser Strategie besteht darin, dass der Breitband-Moving-Average selbst ein gewisses Rückstand aufweist. Wenn ein außergewöhnlicher Preisbruch auftritt, kann dies zu erheblichen Verlusten führen. Darüber hinaus kann es zu einer zu hohen Handelsfrequenz oder zu überschüssigen Signalen führen, wenn die Parameter nicht richtig gewählt werden.
Um das Risiko zu verringern, empfiehlt es sich, die Wirksamkeit der Signale in Kombination mit anderen Indikatoren zu beurteilen, um falsche Durchbrüche zu vermeiden. Darüber hinaus ist die Optimierung und Rückmessung der Parameter sehr notwendig, um die optimale Kombination von Parametern zu finden.
Die wichtigsten Optimierungsmöglichkeiten der Strategie sind:
Durch die Optimierung in den oben genannten Bereichen kann die reale Performance der Strategie kontinuierlich verbessert werden.
Die Handelsstrategie basiert auf Breitband-Moving Averages und ermöglicht eine hohe Flexibilität. Sie bietet eine starke Anpassungsmöglichkeit, bei der der Benutzer frei wählen und verschiedene Arten von Durchschnittswerten kombinieren kann. Die Strategie-Logik ist einfach und klar, die Benutzerfreundlichkeit ist groß, aber auch der Optimierungsraum ist groß. Durch Parameteroptimierung und Risikokontrolle kann die Strategie an verschiedene Marktumgebungen angepasst werden 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