Der Trend der doppelten EMA-Kreuzung folgt der Strategie mit ATR- und ADX-Filtern

Schriftsteller:ChaoZhang, Datum: 15.11.2023
Tags:

img

Übersicht

Diese Strategie verwendet das klassische Doppel-EMA-Crossover-System zur Trendverfolgung mit zusätzlichen Filtern aus den Indikatoren ATR und ADX, um starke Trends zu verfolgen und das Risiko während der Konsolidierung zu kontrollieren.

Strategie Logik

Die Strategie beruht hauptsächlich auf folgenden Grundsätzen:

  1. Verwenden Sie einen schnelleren 8-Perioden-EMA und einen langsameren 20-Perioden-EMA, um Crossover-Signale zu generieren.

  2. Der ATR-Indikator spiegelt die jüngste Volatilität wider. Die Normalisierung des ATR ermöglicht eine dynamische Anpassung der EMA-Crossover-Filterbedingungen, Senkung der Anforderungen bei starken Trends und Erhöhung bei Konsolidierungen zur Risikokontrolle.

  3. Der ADX-Indikator bestimmt die Trendstärke. Ein ADX-Spiegel über 30 deutet auf einen starken Trend hin und führt zu einem zeitnahen Stop-Loss.

  4. Verknüpfen Sie sich mit Bullen-/Bärentrends, um den Zeitpunkt des Long/Short-Eintritts zu bestimmen.

  5. Volumenfilter, der eingegeben wird, wenn sich das Volumen erweitert.

  6. Verwenden Sie einen einfachen USD-Index, um die Stärke des USD zu bestimmen, um die Stop- und Take-Profit-Range während eines starken USD zu erweitern.

  7. Verwenden Sie den SuperTrend-Indikator, um die allgemeine Marktrichtung für zusätzliche langfristige/kurzfristige Beihilfen zu bestimmen.

Die Strategie kombiniert Trend- und Oszillationsindikatoren, um die Parameter dynamisch anzupassen, Trends zu verfolgen und das Risiko zu kontrollieren.

Vorteile der Strategie

  1. Das duale EMA-System ermöglicht die Trendbestimmung, wobei die EMA-Glattheit Fehlausbrüche filtert.

  2. ATR-normalisierte Filter ermöglichen Flexibilität für verschiedene Marktumgebungen.

  3. ADX und Volumen stellen zusätzliche Kontrollen zur Verfügung, um Störungen bei Konsolidierungen zu vermeiden.

  4. Die Berücksichtigung von USD und SuperTrend verbessert die Entscheidungsgenauigkeit des Makrotrends.

  5. Das Risikomanagement passt sich automatisch an die Stärke des USD an.

  6. Einfache goldene/tote Kreuzsignale und Stop/Take-Profit-Logik machen es einfach zu implementieren und zu testen.

Risiken der Strategie

  1. Bei der Erkennung von Trendwendepunkten sind die doppelten EMAs nachlässig.

  2. Eine schlechte Auswahl der ATR-Parameter kann zu aggressiv oder konservativ sein.

  3. Die ADX-Parameter müssen optimiert werden, unpassend eingestellte Höhen können Trends verpassen.

  4. Die Trendbestimmung für USD und SuperTrend könnte ungenau sein.

  5. Ein zu enges Stop-Loss erhöht die Verluste, ein zu breites Risiko schlägt.

Verbesserungsvorschläge

  1. Erwägen Sie, Indikatoren wie MACD hinzuzufügen, um den Umschlagpunkt besser zu erkennen.

  2. Optimieren Sie die ATR-Parameter gegenüber historischen Daten.

  3. Verschiedene ADX-Parameter testen und Höchstwerte optimieren.

  4. Hinzufügen von mehr Variablen für die USD- und Markttrendanalyse.

  5. Berechnen Sie den optimalen Stop-Loss-Prozentsatz anhand von Backtest-Statistiken.

  6. Experimentieren Sie mit Rückfahr- oder Kronleuchterstationen.

  7. Weiterhin die Größe des Eingangs und die Aufbewahrungsdauer optimieren.

Schlussfolgerung

Diese Strategie integriert das klassische Doppel-EMA-System mit mehreren Hilfsindikatoren und verwendet eine parametrierte Optimierung für einen ziemlich robusten Trendfolgenabsatz. Es passt sich flexibel an veränderte Marktumgebungen an, verfolgt Trends und kontrolliert gleichzeitig das Risiko. Weitere Tests und Optimierungen von Stops und Indikatorparametern würden die Ergebnisse verbessern. Die Konzepte sind es wert, daraus gelernt und verbessert zu werden.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Refactored Advanced EMA Cross with Normalized ATR Filter, Controlling ADX", shorttitle="ALP V5", overlay=true)

// Initialize variables to track if a buy order has been placed and number of periods since the last buy
var bool hasBought = false
var int barCountSinceBuy = 0

// Define EMA periods
emaShort = ta.ema(close, 8)
emaLong = ta.ema(close, 20)

// Define ATR period and normalization
atrLength = 14
atrValue = ta.atr(atrLength)
maxHistoricalATR = ta.highest(atrValue, 20)
minHistoricalATR = ta.lowest(atrValue, 20)
normalizedATR = (atrValue - minHistoricalATR) / (maxHistoricalATR - minHistoricalATR)

// Define ADX parameters
adxValue = ta.rma(close, 14)
adxHighLevel = 30
isADXHigh = adxValue > adxHighLevel

// Initialize risk management variables
var float stopLossPercent = na
var float takeProfitPercent = na
var float trailingStop = na

// Calculate USD strength (simplified)
usd_strength = close / ta.ema(close, 50) - 1

// Adjust risk parameters based on USD strength
if (usd_strength > 0)
    stopLossPercent := 3
    takeProfitPercent := 6
else
    stopLossPercent := 4
    takeProfitPercent := 8

// Initialize position variable
var float positionPrice = na

// Volume filter
minVolume = ta.sma(volume, 14) * 1.5
isVolumeHigh = volume > minVolume



// Piyasa yönü için süper trend göstergesi
[supertrendValue, supertrendDirection] = ta.supertrend(4, 14)  // Use a factor of 3 and ATR period of 10
bool isBullMarket = supertrendDirection < 0
bool isBearMarket = supertrendDirection > 0

// Yükselen piyasa için alım koşulu
buyConditionBull = isBullMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.2
// Düşen piyasa için alım koşulu
buyConditionBear = isBearMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.5
// Genel alım koşulu
buyCondition = buyConditionBull or buyConditionBear

// Yükselen ve düşen piyasalar için farklı satış koşulları
sellConditionBull = isBullMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
sellConditionBear = isBearMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
// Genel satış koşulu
sellCondition = sellConditionBull or sellConditionBear


// Buy condition
if (buyCondition)
    strategy.entry("Buy", strategy.long)
    positionPrice := close
    hasBought := true // Set the flag to true when a buy order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is placed

// Increase the bar counter if a buy has been executed
if (hasBought)
    barCountSinceBuy := barCountSinceBuy + 1

// Calculate stop-loss and take-profit levels
longStopLoss = positionPrice * (1 - stopLossPercent / 100)
longTakeProfit = positionPrice * (1 + takeProfitPercent / 100)


// Final Sell condition, now also checks if a buy has occurred before and if at least 5 periods have passed
finalSellCondition = sellCondition and hasBought and barCountSinceBuy >= 3 and isVolumeHigh

if (finalSellCondition)
    strategy.close("Buy")
    positionPrice := na
    hasBought := false // Reset the flag when a sell order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is closed

// Implement stop-loss, take-profit, and trailing stop
strategy.exit("Stop Loss", "Buy", stop=longStopLoss)
strategy.exit("Take Profit", "Buy", limit=longTakeProfit)
//strategy.exit("Trailing Stop", "Buy", trail_price=close, trail_offset=trailingStop * close / 100)


var label l = na

if (buyCondition)
    l := label.new(bar_index, high, text="buy triggered " + str.tostring(usd_strength))
    label.delete(l[1])

if (finalSellCondition)
    l := label.new(bar_index, high, text="sell triggered " + str.tostring(usd_strength))
    label.delete(l[1])

// Plot signals
plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=finalSellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")


Mehr