
Die Ehrersche Zufalls-Zyklus-Strategie ist eine quantitative Handelsstrategie, die Ehrersche Zufalls-Zyklus-Indikatoren verwendet, um Handelssignale zu erzeugen. Die Strategie kombiniert die Vorteile von Zufalls- und Zyklus-Indikatoren und zielt darauf ab, die periodischen Chancen in den Märkten zu nutzen.
Die Strategie baut zunächst einen Smoothed-Zyklus-Indikator auf und baut dann einen Zufallsindikator auf dessen Basis auf. Die Erzeugung eines Handelssignals wird durch die Kreuzung eines Moving Averages dieses Zufallsindikator-Wertes bestimmt.
Die Berechnungsmethode für den Smoothed-Zyklus-Indikator ist:
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
Der src ist die Eingabe von Preisdaten, wie z. B. der Schlusskurs. Der Indikator kombiniert den aktuellen Preis mit den Preisen der letzten 3 Zeiträume, um ein glattes Zyklussignal zu erstellen.
Basierend auf diesem Smoothed-Index kann dann der Zufallsindex-Zyklus berechnet werden:
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) *
(smooth - 2 * smooth[1] + smooth[2]) +
2 * (1 - alpha) * cycle[1] -
(1 - alpha) * (1 - alpha) * cycle[2]
Die Berechnungsformel enthält die Differentialdifferenz der Zwei-Phasen-Signale nach der Glättung und die Werte der beiden vorherigen Zyklen. α ist der Glättungsfaktor, der die Gewichtung der neuen und alten Zyklen regelt.
Schließlich wird ein Zufallswert von 0-100 (value1) aus diesem Zyklus berechnet und ein Signalwert auf Basis des 10-Tage-Moving Averages von value1 erstellt. Das Signal wird ausgegeben, wenn das Signal über oder unter dem Moving Average liegt.
Die Strategie kombiniert die Vorteile von Randomisierungs- und Periodisierungsindikatoren. Im Vergleich zu einfachen Trendstrategien wie Moving Averages kann die Strategie die periodischen Chancen besser erfassen und so bessere Ergebnisse erzielen.
Die wichtigsten Vorteile sind:
Diese Strategie birgt folgende Risiken:
Die Risiken können durch Optimierung der Parameter-Einstellungen, die Einstellung von Stop-Loss-Punkten und in Kombination mit anderen Filterindikatoren kontrolliert werden.
Die Strategie kann auch in folgenden Richtungen optimiert werden:
Die Ehrers Random Cycle Strategy nutzt die Vorteile von Random Indicators und Periodic Indicators, um Risiken durch eine Dual-Signal-Design effektiv zu steuern und bessere Erträge in stärker periodischen Märkten zu erzielen. Durch weitere Optimierung kann die Strategie zu einer empfehlenswerten quantitativen Handelsstrategie werden.
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Stochastic Cyber Cycle Strategy",overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
src = input(hl2, title = "Source")
alpha = input(.07, title = "Alpha")
lag = input(9, title = "Lag")
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
len = input(8, title = "Stochastic len")
cycle = na
if na(cycle[7])
cycle := (src - 2 * src[1] + src[2]) / 4
else
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * (smooth - 2 * smooth[1] + smooth[2]) + 2 * (1 - alpha) * cycle[1] - (1 - alpha) * (1 - alpha) * cycle[2]
value1 = stoch(cycle, cycle, cycle, len) / 100
value2 = 2 * ((4 * value1 + 3 * value1[1] + 2 * value1[2] + value1[3]) / 10 - 0.5)
signal = value2
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
barsSinceEntry := 0
if (crossover(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossunder(signal, signal[1]))
strategy.entry("Long", strategy.long)
barsSinceEntry := 0
if (crossunder(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossover(signal, signal[1]))
strategy.entry("Short", strategy.short)
barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
strategy.close_all()
barsSinceEntry := 0
plot(0, title="ZeroLine", color=gray)
plotSrc = signal
cyclePlot = plot(plotSrc, title = "CyberCycle", color = blue)
triggerPlot = plot(plotSrc[1], title = "Trigger", color = green)
fill(cyclePlot, triggerPlot, color = plotSrc < plotSrc[1] ? red : lime, transp = 50)