Estrategia de impulso basada en el cruce entre DEMA y EMA con filtro de volatilidad ATR

El autor:¿ Qué pasa?, Fecha: 2024-01-08 14:14:57
Las etiquetas:

img

I. Resumen de la estrategia

Esta estrategia se llama Momentum Strategy Based on DEMA and EMA Crossover with ATR Volatility Filter. Genera señales comerciales a corto plazo al detectar los cruces de DEMA y EMA combinados con el índice de volatilidad ATR. Cuando DEMA cruza por debajo de EMA mientras ATR sube, corta la seguridad. Cuando DEMA vuelve a cruzar por encima de EMA, cierra la posición.

II. Lógica de la estrategia

  1. Calcular el indicador DEMA. DEMA es el promedio móvil exponencial doble usando EMAs duales, que pueden filtrar el ruido del mercado a corto plazo y mejorar la precisión de la señal.

  2. El EMA es el promedio móvil exponencial que reacciona más rápido a los cambios de precios.

  3. Calcular el índice de volatilidad ATR. ATR mide la volatilidad del mercado y los niveles de riesgo.

  4. Cuando DEMA cruza por debajo de EMA y ATR se eleva por encima del umbral, indica el comienzo de una tendencia a la baja a corto plazo y un mayor riesgo de mercado.

  5. Cuando la DEMA vuelve a cruzar por encima de la EMA, señala un soporte de precios y un rebote al alza.

III. Ventajas

  1. La combinación de dos EMA y EMA puede mejorar efectivamente la precisión de la señal.

  2. El filtro de volatilidad ATR elimina las operaciones de baja tasa de riesgo.

  3. El período de retención corto se ajusta al seguimiento del impulso a corto plazo y evita una cobertura prolongada.

  4. Lógica simple y clara, fácil de entender e implementar.

IV. Riesgos

  1. Los parámetros ATR incorrectos pueden hacer que se pierdan oportunidades comerciales.

  2. Necesidad de monitorear las señales largas y cortas simultáneamente, aumentando la dificultad de operación.

  3. Afectado por la volatilidad del mercado a corto plazo.

Soluciones: optimización de parámetros a través de backtesting. Simplificar la lógica para centrarse en un lado. Relajar los niveles de stop loss apropiadamente.

V. Direcciones de optimización

  1. Optimice los parámetros para DEMA y EMA para encontrar las mejores combinaciones.

  2. Optimizar el período de revisión del ATR para determinar el valor de referencia de volatilidad óptimo.

  3. Añadir otros indicadores como bandas BOLL para mejorar la precisión de la señal.

  4. Introduzca las reglas de stop loss y take profit para obtener ganancias más consistentes.

VI. Conclusión

Esta estrategia construye un sistema de negociación a corto plazo simple pero eficaz utilizando DEMA, cruces EMA y el índice de volatilidad ATR. La lógica limpia y la facilidad de operación lo hacen adecuado para el comercio de impulso de alta frecuencia.


/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf

//@version=4
strategy("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)

// get ATR VALUE
atr = atr(14)

//ATRP (Average True Price in precentage)

// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)

// ATR Logic
// atrValue = atr(atrLookback)
// atrp = (atrValue/close)*100
// plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))


// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry

//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and  crossover(dema1, ema1)


// === INPUT BACKTEST RANGE ===
//FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
//ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

//Invert trade direction & flipping 
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")

// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)

// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
    shortStopSaved := slType ? shortStop : shortStopPercent
    enterShort:= true
    entry := close


// long conditions 
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)

//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")

//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
 from_entry="short",
 limit=exitSignal ? close : na,
 stop=shortStopSaved,
 when=strategy.position_size > 0,
 comment="end short")
 

//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1) 
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())


Más.