Diese Strategie verwendet eine Kombination aus drei verschiedenen technischen Indikatoren, um eine zyklusübergreifende Arbitrage-Strategie zu entwickeln, die die Preisentwicklung in verschiedenen Zeitrahmen erfasst, um übermäßige Renditen mit geringem Risiko zu erzielen.
Die drei technischen Indikatoren, die in dieser Strategie verwendet werden, sind Keltner Channel (KC), Volatility Stop (Vstop) und Williams Alligator (WAE). Der Keltner Channel wird verwendet, um festzustellen, ob die Preise außerhalb des Kanalbereichs liegen und somit Handelssignale generieren. Der Volatility Stop wird verwendet, um Stop-Loss-Positionen dynamisch anzupassen, um Stop-Loss zu gewährleisten und dabei unnötigen Stop-Loss zu reduzieren. Der Williams Alligator-Indikator wird verwendet, um festzustellen, ob die Preise einen starken Trend haben.
Wenn der Preis über der oberen Keltner-Kanal-Reihe liegt, gilt er als Aufwärtssignal.
Es kann sich dynamisch anpassen, um einen Stop-Loss zu gewährleisten und gleichzeitig übermäßig konservative Stop-Loss-Positionen zu vermeiden.
Der Williams Alligator-Indikator beurteilt, ob sich die Preise in einem starken Auf- oder Abwärtstrend befinden, indem er die MACD- und Bollinger-Band-Kanalbreite berechnet.
Durch die Kombination dieser drei Indikatoren werden Signale über verschiedene Zeitrahmen hinweg validiert, wodurch die Wahrscheinlichkeit von Fehleinschätzungen verringert und eine optimierte Strategie-Logik aufgebaut wird.
Der größte Vorteil dieser Strategie ist die präzise Handelssignale, die durch die Kombination mehrerer Indikatoren gebracht werden. Die drei Indikatoren arbeiten in verschiedenen Zeitrahmen und validieren sich gegenseitig, was die Wahrscheinlichkeit von Fehleinschätzungen effektiv reduzieren und die Genauigkeit der Signale verbessern kann. Darüber hinaus ist die Volatility Stop-Einstellung dynamisch und kann die Stop-Loss-Position entsprechend der Echtzeitvolatilität anpassen, um Risiken weiter zu kontrollieren.
Im Vergleich zu Einzelindikatorstrategien kann diese kombinierte Strategie genauere und effizientere Handelssignale liefern. Gleichzeitig arbeiten die drei Indikatoren zusammen, um Handelsurteile innerhalb mehrerer Zeitrahmen zu bilden, was ein sehr wissenschaftliches und vernünftiges Logikdesign ist, von dem es sich zu lernen lohnt.
Das Hauptrisiko dieser Strategie besteht darin, dass unsachgemäße Parameter-Einstellungen zu einer Überanpassung führen können. Die drei Indikatoren haben insgesamt 8 Parameter. unsachgemäße Einstellungen können sich negativ auf die Strategie auswirken. Darüber hinaus muss auch das Gewichtsverhältnis zwischen den Indikatoren richtig konfiguriert werden, da sich die Signale sonst gegenseitig neutralisieren und ungültig werden können.
Um diese Risiken zu reduzieren, sollte die Anpassungsfähigkeit an verschiedene Marktumgebungen während der Parameter-Einstellung vollständig berücksichtigt werden, und die optimale Parameterkombination sollte durch Backtesting-Analyse angepasst werden. Darüber hinaus sollten die Gewichte zwischen den Indikatoren angemessen angepasst werden, um sicherzustellen, dass Handelssignale effektiv ausgelöst werden können. Wenn aufeinanderfolgende Verluste auftreten, sollten Sie die Positionsgröße reduzieren, um Verluste zu kontrollieren.
Der Optimierungsbereich dieser Strategie konzentriert sich hauptsächlich auf zwei Aspekte: Parameter-Tuning und Verbesserung von Stop-Loss-Strategien.
Algorithmen können verwendet werden, um die optimalen Parameter mit den Zielen wie Ertragsmaximierung und Risikominimierung zu finden.
Verbessern Sie die Stop-Loss-Strategie, um unnötigen Stop-Loss weiter zu reduzieren und gleichzeitig einen Stop-Loss zu gewährleisten, wodurch die Gewinnrate verbessert wird.
Optimieren Sie die Gewichte zwischen Indikatoren und Logik der Handelssignalurteile, um die Fehlerquote zu reduzieren.
Versuchen Sie, maschinelle Lernmodelle einzuführen, um eine automatische Parameteroptimierung zu erreichen, oder verwenden Sie eine tiefe Verstärkungs-Lernprogrammierung zur Strategiebewertung und -verbesserung.
Diese Strategie baut durch die Kombination von Keltner Channel, Volatility Stop und Williams Alligator ein Querschnittszyklus-Arbitrage-System auf. Die Kombination aus mehreren Indikatoren verbessert die Signalgenauigkeit und steuert die Risiken dynamischer Stop-Loss. Aber es gibt Raum für Verbesserungen bei der Einstellung und Optimierung von Parametern. Insgesamt hat diese Strategie eine starke Wissenschaftlichkeit und ist eine weitere Forschung und Anwendung wert.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("QuarryLake", overlay=true) ///Ultilized modified full kelly for this strategy = 36% ///Keltner channel/// nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1) Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1) xPrice = ema(hlc3, nPeriod) xMove = ema(high - low, nPeriod) xMoveMult = xMove * Mult xUpper = xPrice + xMoveMult xLower = xPrice - xMoveMult // plot(xPrice, color=red, title="KSmid") p1 = plot(xUpper, color=color.white, title="KSup") p2 = plot(xLower, color=color.white, title="KSdn") fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white) kclongcondition = close > xUpper kcshortcondition = close < xLower kccloselongcondition = crossunder(close, xUpper) kccloseshortcondition = crossover(close, xLower) ///Volatility Stop/// length = input(title="Vstop length", type=input.integer, defval=3, minval=1) mult1 = 1.5 atr_ = atr(length) max1 = 0.0 min1 = 0.0 is_uptrend_prev = false stop = 0.0 vstop_prev = 0.0 vstop1 = 0.0 is_uptrend = false is_trend_changed = false max_ = 0.0 min_ = 0.0 vstop = 0.0 max1 := max(nz(max_[1]), close) min1 := min(nz(min_[1]), close) is_uptrend_prev := nz(is_uptrend[1], true) stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_ vstop_prev := nz(vstop[1]) vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend := close - vstop1 >= 0 is_trend_changed := is_uptrend != is_uptrend_prev max_ := is_trend_changed ? close : max1 min_ := is_trend_changed ? close : min1 vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : vstop1 plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1) vstoplongcondition = close > vstop vstoplongclosecondition = crossunder(close, vstop) vstopshortcondition = close < vstop vstopshortclosecondition = crossover(close, vstop) ///Waddah Attar Explosion/// sensitivity = input(150, title="Sensitivity") fastLength = input(20, title="FastEMA Length") slowLength = input(40, title="SlowEMA Length") channelLength = input(20, title="BB Channel Length") mult = input(2.0, title="BB Stdev Multiplier") DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7 calc_macd(source, fastLength, slowLength) => fastMA = ema(source, fastLength) slowMA = ema(source, slowLength) fastMA - slowMA calc_BBUpper(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis + dev calc_BBLower(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis - dev t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity t2 = (calc_macd(close[2], fastLength, slowLength) - calc_macd(close[3], fastLength, slowLength)) * sensitivity e1 = calc_BBUpper(close, channelLength, mult) - calc_BBLower(close, channelLength, mult) trendUp = t1 >= 0 ? t1 : 0 trendDown = t1 < 0 ? -1 * t1 : 0 waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1 waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1 ///Long Entry/// longcondition = kclongcondition and vstoplongcondition and waelongcondition if longcondition strategy.entry("Long", strategy.long) ///Long exit/// closeconditionlong = kccloselongcondition or vstoplongclosecondition if closeconditionlong strategy.close("Long") ///Short Entry/// shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition if shortcondition strategy.entry("Short", strategy.short) ///Short exit/// closeconditionshort = kccloseshortcondition or vstopshortclosecondition if closeconditionshort strategy.close("Short") ///Free Hong Kong, the revolution of our time///