Estrategia de negociación basada en zonas de oferta y demanda con EMA y Trailing Stop

El autor:¿ Qué pasa?, Fecha: 2024-01-18 16:41:16
Las etiquetas:

img

Resumen general

La estrategia utiliza zonas de oferta y demanda, promedio móvil exponencial (EMA) y rango verdadero promedio (ATR) para señales comerciales. Los usuarios pueden ajustar la configuración de la EMA y la visibilidad de la señal. La estrategia marca zonas de alto más alto (HH), bajo más bajo (LL), bajo más alto (LH) y bajo más alto (HL). Las señales se muestran después de la tercera vela, adecuadas para backtesting.

Estrategia lógica

Cálculos de los indicadores

La media móvil exponencial (EMA):

  • El EMA se calcula a partir de los precios de cierre durante un período (default: 200).
  • Fórmula: EMA = (Precio_t x α) + (EMA_t-1 x (1 - α)), donde α = 2/(longitud + 1)

Rango verdadero medio (ATR):

  • El ATR mide la volatilidad del mercado a partir del rango real de precios.
  • El rango verdadero es el mayor de:
    • Corriente alta menos corriente baja
    • Valor absoluto del máximo actual menos el cierre anterior
    • Valor absoluto del mínimo actual menos el cierre anterior
  • ATR utiliza típicamente 14 períodos.

Se utiliza para determinar la EMA para la tendencia y la ATR para la parada posterior basada en la volatilidad.

Identificación de las zonas de oferta y demanda

Identifica los patrones HH (Alto más alto), LL (Bajo más bajo), HL (Bajo más alto) y LH (Bajo más alto):

  1. Más alto más alto (HH): Pico actual > pico anterior, impulso al alza.

  2. Bajo Bajo (LL): Bajo corriente < bajo anterior, impulso descendente.

  3. Alto Bajo (HL): Bajo actual > Bajo anterior, continuación ascendente.

  4. Alto bajo (LH): Pico actual < pico anterior, continuación a la baja.

Se usa con tendencias para identificar reversiones o continuidades.

Entrada y salida

Señales de entrada: Compra/venta en el tercer cierre de vela por encima/por debajo del máximo/mínimo anterior.

Salida: Stop loss trasero basado en ATR.

Ventajas

  1. Combina tendencias, reversiones, volatilidad para señales sólidas.
  2. Las zonas de demanda/oferta identifican las S/R clave.
  3. El ATR dinámico se ajusta a la volatilidad.
  4. Parámetros personalizables.
  5. Reglas de entrada sencillas.

Riesgos y mejoras

  1. Falsas señales: Optimice la longitud de la EMA.
  2. Los riesgos de un elevado multiplicador ATR son perseguir tendencias.
  3. Considere filtros adicionales en las entradas.
  4. Prueba enfoque centrado en la tendencia.

Conclusión

Combina múltiples técnicas para backtests decentes. El mundo real es complejo, la optimización es clave. La estrategia básica permite extensiones y combinaciones.


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

//@version=5
strategy("Supply and Demand Zones with EMA and Trailing Stop", shorttitle="SD Zones", overlay=true)

showBuySignals = input(true, title="Show Buy Signals", group="Signals")
showSellSignals = input(true, title="Show Sell Signals", group="Signals")
showHLZone = input(true, title="Show HL Zone", group="Zones")
showLHZone = input(true, title="Show LH Zone", group="Zones")
showHHZone = input(true, title="Show HH Zone", group="Zones")
showLLZone = input(true, title="Show LL Zone", group="Zones")

emaLength = input(200, title="EMA Length", group="EMA Settings")
atrLength = input(14, title="ATR Length", group="Trailing Stop")
atrMultiplier = input(2, title="ATR Multiplier", group="Trailing Stop")

// Function to identify supply and demand zones
getZones(src, len, mult) =>
    base = request.security(syminfo.tickerid, "D", close)
    upper = request.security(syminfo.tickerid, "D", high)
    lower = request.security(syminfo.tickerid, "D", low)
    multiplier = request.security(syminfo.tickerid, "D", mult)
    zonetype = base + multiplier * len
    zone = src >= zonetype
    [zone, upper, lower]

// Identify supply and demand zones
[supplyZone, _, _] = getZones(close, high[1] - low[1], 1)
[demandZone, _, _] = getZones(close, high[1] - low[1], -1)

// Plot supply and demand zones
bgcolor(supplyZone ? color.new(color.red, 80) : na)
bgcolor(demandZone ? color.new(color.green, 80) : na)

// EMA with Linear Weighted method
ema = ta.ema(close, emaLength)

// Color code EMA based on its relation to candles
emaColor = close > ema ? color.new(color.green, 0) : close < ema ? color.new(color.red, 0) : color.new(color.yellow, 0)

// Plot EMA
plot(ema, color=emaColor, title="EMA")

// Entry Signal Conditions after the third candle
longCondition = ta.crossover(close, high[1]) and bar_index >= 2
shortCondition = ta.crossunder(close, low[1]) and bar_index >= 2

// Trailing Stop using ATR
atrValue = ta.atr(atrLength)
trailStop = close - atrMultiplier * atrValue

// Strategy Entry and Exit
if (longCondition)
    strategy.entry("Buy", strategy.long)
    strategy.exit("TrailStop", from_entry="Buy", loss=trailStop)

if (shortCondition)
    strategy.entry("Sell", strategy.short)
    strategy.exit("TrailStop", from_entry="Sell", loss=trailStop)

// Plot Entry Signals
plotshape(series=showBuySignals ? longCondition : na, title="Buy Signal", color=color.new(color.green, 0), style=shape.triangleup, location=location.belowbar)
plotshape(series=showSellSignals ? shortCondition : na, title="Sell Signal", color=color.new(color.red, 0), style=shape.triangledown, location=location.abovebar)

// Plot Trailing Stop
plot(trailStop, color=color.new(color.red, 0), title="Trailing Stop")

// Plot HH, LL, LH, and HL zones
plotshape(series=showHHZone and ta.highest(high, 2)[1] and ta.highest(high, 2)[2] ? 1 : na, title="HH Zone", color=color.new(color.blue, 80), style=shape.triangleup, location=location.abovebar)
plotshape(series=showLLZone and ta.lowest(low, 2)[1] and ta.lowest(low, 2)[2] ? 1 : na, title="LL Zone", color=color.new(color.blue, 80), style=shape.triangledown, location=location.belowbar)
plotshape(series=showLHZone and ta.highest(high, 2)[1] and ta.lowest(low, 2)[2] ? 1 : na, title="LH Zone", color=color.new(color.orange, 80), style=shape.triangleup, location=location.abovebar)
plotshape(series=showHLZone and ta.lowest(low, 2)[1] and ta.highest(high, 2)[2] ? 1 : na, title="HL Zone", color=color.new(color.orange, 80), style=shape.triangledown, location=location.belowbar)


Más.