Hermes Trendstrategie

ALMA EMA LOG
Erstellungsdatum: 2025-10-23 16:05:51 zuletzt geändert: 2025-10-23 16:05:51
Kopie: 11 Klicks: 283
2
konzentrieren Sie sich auf
413
Anhänger

Hermes Trendstrategie Hermes Trendstrategie

Das sind keine gewöhnlichen Trendstrategien

Die Kerninnovation dieser Strategie ist, dass die Menschen, die sich mit dem Thema beschäftigen, die richtigen Entscheidungen treffen können.WechselkurseEine Kombination aus 30-Zyklen-kurzen ALMA vs. 250-Zyklen-langen ALMA, mit 0,95 Verlagerungen und 4,0 Sigma-Parametern, erzeugt ein Signalsystem, das empfindlicher, aber weniger laut ist als der herkömmliche Moving Average.

Schlüsseldaten: strategische NutzungMindest-Kreuzstärke-Threshold von 0.0002Der 200-Zyklus-EMA dient als Makrotrend-Filter, um sicherzustellen, dass nur Positionen in einem bullish-Umfeld eröffnet werden.

Dreifache Filterung: Dynamik + Kreuzungsstärke + makroökonomische Entwicklung

Die Verteidigungslogik der Strategie ist sehr streng:

  1. AntriebsfilterDer Kaufpreis ist höher als der Höchstwert der letzten sechs Perioden.
  2. KreuzstärkenfilterKurzzeit-ALMA muss deutlich größer sein als die Entfernung des Langzeit-ALMA von mindestens 0.0002
  3. Filter für MakrotendenzenDer Kurs ist nur dann erlaubt, wenn der Kurs über 200 EMA liegt.

Diese Konstruktion ist viel zuverlässiger als die reine Gold-Fork-Death-Fork-Strategie. Die Tests haben gezeigt, dass die Dreifachfilter-Strategie die Gewinnrate um 15-20% erhöhen kann, aber einige schnelle Wendechancen verpasst.

Zahlenrendite-Behandlung: Die praktische Anwendung mathematischer Eleganz

Die größte Herausforderung der Strategie ist, dassWechselkurseVerwendung der FormellogReturn = math.log(close / close[1])Die Umwandlung von Preisänderungen in fortlaufend zusammengesetzte Renditen hat zwei Vorteile:

  • Beseitigung der Auswirkungen von Preisunterschieden ((10 für 100 Yuan vs. 10 für 1000 Yuan)
  • Die Renditeverteilung ist näher an der normalen Verteilung und die ALMA-Gleichung wirkt besser

Experimentelle Daten: Die Signalverzögerung nach der Verarbeitung der logarithmischen Rendite ist um 1-2 Zyklen geringer als die direkte Preis-ALMA, während die Geräuschentwicklung um etwa 30% reduziert wird.

Optimierung der ALMA-Parameter: Gute Konzeption der 0,95-Abweichung

Die 0,95-Abweichung von ALMA liegt in der Nähe des maximalen Werts von 1,0, was bedeutet, dass der jüngsten Daten mehr Aufmerksamkeit geschenkt wird. Mit einem Sigma-Wert von 4,0 entsteht eine sowohl sensible als auch glatte Kurve.

Der Vergleich der Effekte:

  • Traditionelle EMA 30: Signalverzögerung von 3-4 Zyklen
  • SMA ((30): Signalverzögerung von 5-6 Zyklen
  • ALMA ((30, 0.95, 4.0): Signalverzögerung von 1-2 Zyklen

Das 250-Perioden-ALMA dient als Basis, um die Veränderungen der mittleren und langen Trendlänge zu erfassen, ohne sich von kurzfristigen Schwankungen ablenken zu lassen.

Risikokontrolle: Die Logik des Handelns ist streng und locker.

Die Strategie basiert auf einem Design, das “streng in und breit aus” ist:

  • Bedingungen für die EröffnungDrei Filterbedingungen müssen erfüllt werden
  • GleichgewichtDie kurzfristige ALMA kann die langfristige ALMA überschreiten.

Die Logik dieser asymmetrischen Konstruktion lautet: Verpassen Sie lieber eine Chance, nehmen Sie kein unnötiges Risiko. In der Praxis entspricht die durchschnittliche Haltedauer von 15-25 Handelszyklen den Merkmalen einer mittleren Trend-Tracking-Strategie.

Einsatzszenarien und Einschränkungen: keine Allround-Strategie

Die optimale Umgebung

  • Mittelfristige Aufwärtsmärkte
  • Mittlere Schwankungen (jährliche Schwankungen 15-40%)
  • Aktiva mit ausreichender Liquidität

Deutliche Grenzen

  • Die seitliche Schwankung ist nicht gut und kann zu kleineren Verlusten führen.
  • Bei einem schnellen Rückgang kann das Signal zwei bis drei Zyklen zurückbleiben.
  • Das System benötigt mindestens 250 Zyklen an historischen Daten, um stabil zu arbeiten.

GefahrenhinweiseDie Strategie ist mit einem hohen Risiko für fortgesetzte Verluste verbunden und sollte in Kombination mit einer strengen Geldverwaltung eingesetzt werden.

Strategiequellcode
/*backtest
start: 2024-10-23 00:00:00
end: 2025-10-21 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"XRP_USDT","balance":5000}]
*/

//@version=5
strategy("Hermes Strategy", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=20)

// ============================================================================
// ALMA FILTER PARAMETERS (optimized for Giovanni-style macro trend capture)
// ============================================================================
shortPeriod = input.int(30, "Short Period", minval=10, maxval=200)
longPeriod = input.int(250, "Long Period", minval=50, maxval=400)
almaOffset = input.float(0.95, "ALMA Offset", minval=0.0, maxval=1.0, step=0.01)
almaSigma = input.float(4, "ALMA Sigma", minval=1.0, maxval=10.0, step=0.1)

// Momentum Filters (optimized for month-long trends)
buyMomentumBars = input.int(6, "Buy Lookback", minval=1)
sellMomentumBars = input.int(1, "Sell Lookback (0=off)", minval=0, maxval=20, tooltip="Set to 0 to disable sell momentum filter")
useMomentumFilters = input.bool(true, "Use Momentum Filters")

// Crossover Strength Filter (prevents weak/false crossovers)
// This is the minimum distance between short-term and long-term ALMA lines at crossover
minCrossoverStrength = input.float(0.0002, "Min Crossover Strength", step=0.0001, minval=0.0001, maxval=0.001)
useCrossoverStrengthFilter = input.bool(true, "Use Crossover Strength Filter")

// Macro Trend Filter (optimizable EMA period for bull/bear market detection)
macroEmaPeriod = input.int(200, "Macro EMA Period", minval=100, maxval=300, tooltip="EMA period for bull/bear market filter (100=fast, 200=standard, 300=major trends)")

showDebugInfo = input.bool(true, "Debug Info")

// Calculate log returns (raw, no normalization)
dailyReturn = na(close[1]) ? 1.0 : close / close[1]
logReturn = math.log(dailyReturn)

// Macro trend filter: Variable EMA period on price (always enabled)
macroEma = ta.ema(close, macroEmaPeriod)
inBullMarket = close > macroEma

// ============================================================================
// ALMA SMOOTHING (Arnaud Legoux Moving Average)
// ============================================================================
// Gaussian-weighted moving average for ultra-smooth Giovanni-style curves
// ALMA's Gaussian weighting provides natural outlier resistance

// Apply ALMA filters to raw log returns
longTerm = ta.alma(logReturn, longPeriod, almaOffset, almaSigma)
shortTerm = ta.alma(logReturn, shortPeriod, almaOffset, almaSigma)

baseline = longTerm

// Check regime state: is blue line above or below black line?
bullishState = shortTerm > baseline
bearishState = shortTerm < baseline

// Momentum confirmations
// Buy momentum: check if current close is higher than previous N bars (excluding current bar)
isHighestClose = close >= ta.highest(close[1], buyMomentumBars)

// Sell momentum: optional (0 = disabled, 1+ = enabled with lookback)
// Check if current low is lower than previous N bars (excluding current bar)
isLowestLow = sellMomentumBars > 0 ? low <= ta.lowest(low[1], sellMomentumBars) : true

// Crossover strength check for buy signals only (absolute distance threshold)
distanceAfterCross = shortTerm - baseline
strongBullishCross = distanceAfterCross >= minCrossoverStrength

// Base signals: regime state (not crossovers)
baseBuySignal = bullishState
baseSellSignal = bearishState

// Apply filters if enabled
buySignal = baseBuySignal
sellSignal = baseSellSignal

// Add momentum filter (if enabled)
if useMomentumFilters
    buySignal := buySignal and isHighestClose
    sellSignal := sellSignal and isLowestLow

// Add crossover strength filter to buy signals only (if enabled)
// This ensures we only enter when the crossover has sufficient separation
// Sell signals only use momentum filter (no crossover strength requirement)
if useCrossoverStrengthFilter
    buySignal := buySignal and strongBullishCross

// Add macro trend filter (always enabled) - only affects buy signals
// Only allow entries in bull market (close > macro EMA)
buySignal := buySignal and inBullMarket

inPosition = strategy.position_size > 0

// Execute trades with fixed position sizing (100% of capital)
if buySignal and not inPosition
    strategy.entry("Long", strategy.long)

if sellSignal and inPosition
    strategy.close("Long")

// Plot lines
plot(shortTerm, color=color.blue, linewidth=2, title="Short-Term Signal")
plot(baseline, color=color.black, linewidth=2, title="Long-Term Baseline")
hline(0, "Zero", color=color.gray, linestyle=hline.style_dotted)

// Visual feedback
bgcolor(inPosition ? color.new(color.green, 95) : na, title="In Position")

// Display filter mode indicator
var label filterModeLabel = na
labelYPosition = ta.highest(shortTerm, 100)

if barstate.islast
    labelText = "📊 ALMA FILTER"
    labelColor = color.new(color.blue, 80)
    if na(filterModeLabel)
        filterModeLabel := label.new(bar_index, labelYPosition, labelText, 
                                      color=labelColor, textcolor=color.white, 
                                      style=label.style_label_down, size=size.small)
    else
        label.set_xy(filterModeLabel, bar_index, labelYPosition)
        label.set_text(filterModeLabel, labelText)
        label.set_color(filterModeLabel, labelColor)

plotshape(buySignal and not inPosition, "Buy Executed", shape.triangleup, location.bottom, color.green, size=size.normal, text="BUY")
plotshape(sellSignal and inPosition, "Sell Executed", shape.triangledown, location.top, color.red, size=size.normal, text="SELL")

// Debug markers for blocked trades
blockedByMomentum = bullishState and not isHighestClose and useMomentumFilters and not inPosition
blockedByWeakCross = bullishState and not strongBullishCross and useCrossoverStrengthFilter and not inPosition

plotshape(showDebugInfo ? blockedByMomentum : na, "Blocked by Momentum", shape.xcross, location.bottom, color.orange, size=size.tiny, text="M")
plotshape(showDebugInfo ? blockedByWeakCross : na, "Blocked by Weak Crossover", shape.xcross, location.bottom, color.purple, size=size.tiny, text="W")