Tendencia de cruce de doble EMA siguiendo la estrategia con filtros ATR y ADX

El autor:¿ Qué pasa?, Fecha: 2023-11-15 15:53:57
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el clásico sistema dual de cruce de la EMA para el seguimiento de tendencias, con filtros adicionales de los indicadores ATR y ADX, para rastrear tendencias fuertes y controlar el riesgo durante las consolidaciones.

Estrategia lógica

La estrategia se basa principalmente en lo siguiente:

  1. Utilice una EMA de 8 períodos más rápida y una EMA de 20 períodos más lenta para generar señales cruzadas.

  2. El indicador ATR refleja la volatilidad reciente. La normalización del ATR permite el ajuste dinámico de las condiciones del filtro cruzado de la EMA, reduciendo los requisitos durante tendencias fuertes y aumentando durante las consolidaciones para controlar el riesgo.

  3. El indicador ADX determina la fuerza de la tendencia. Una lectura de ADX por encima de 30 sugiere una tendencia fuerte, lo que provoca un stop loss oportuno.

  4. Combine con las tendencias alcista/osca para determinar el tiempo de entrada largo/cortísimo.

  5. Filtro de volumen para entrar cuando el volumen se expande.

  6. Utilice un índice de USD simple para determinar la fortaleza del USD, la expansión del intervalo de stop y take profit durante el USD fuerte.

  7. Utilice el indicador SuperTendencia para determinar la dirección general del mercado para ayudas adicionales a largo/corto plazo.

La estrategia combina indicadores de tendencia y oscilación para ajustar dinámicamente los parámetros, rastreando las tendencias y controlando el riesgo.

Ventajas de la estrategia

  1. El sistema EMA dual proporciona la determinación de tendencia, con la suavidad EMA filtrando las roturas falsas.

  2. Los filtros normalizados con ATR permiten flexibilidad para diferentes entornos de mercado.

  3. ADX y volumen proporcionan controles adicionales para evitar problemas durante las consolidaciones.

  4. Considerando USD y SuperTrend mejora la precisión de la decisión sobre la tendencia macro.

  5. La gestión del riesgo se adapta automáticamente en función de la fortaleza del USD.

  6. Las sencillas señales cruzadas doradas/muertas y la lógica stop/take profit hacen que sea fácil de implementar y backtest.

Riesgos de la estrategia

  1. Las EMA dobles tardan en detectar los puntos de inflexión de la tendencia.

  2. La selección de los parámetros de ATR puede ser demasiado agresiva o conservadora.

  3. Los parámetros de ADX necesitan optimización, los puntos altos establecidos incorrectamente podrían perder tendencias.

  4. La determinación de la tendencia del USD y de la SuperTendencia podría ser inexacta.

  5. El stop loss demasiado apretado aumenta las pérdidas, los riesgos demasiado amplios, los golpes.

Ideas para mejorar

  1. Considere agregar indicadores como el MACD para una mejor detección del punto de rotación.

  2. Optimice los parámetros de ATR sobre más datos históricos.

  3. Prueba diferentes parámetros ADX y optimiza los umbrales de puntos altos.

  4. Añadir más variables para el análisis de la tendencia del USD y del mercado.

  5. Calcular el porcentaje óptimo de pérdida de parada de las estadísticas de backtest.

  6. Experimenta con paradas de rastreo o de lámpara de araña.

  7. Continuar optimizando el tamaño de entrada y el período de retención.

Conclusión

Esta estrategia integra el clásico sistema dual EMA con múltiples indicadores auxiliares, utilizando la optimización parametrizada para un enfoque de seguimiento de tendencias bastante robusto. Se adapta de manera flexible a los entornos cambiantes del mercado, rastreando las tendencias y controlando el riesgo.


/*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")


Más.