En la carga de los recursos... Cargando...

Estrategia de cruce de la media móvil exponencial de varios plazos

El autor:¿ Qué pasa?, Fecha: 2024-07-30 12:02:23
Las etiquetas:El EMASLTPTC

img

Resumen general

Esta estrategia de cruce de promedios móviles exponenciales es un sistema de negociación automatizado basado en señales de cruce de EMA. Utiliza EMA de diferentes marcos de tiempo para generar señales de negociación e incorpora mecanismos de stop-loss y take-profit para la gestión de riesgos.

Principios de estrategia

El principio básico de esta estrategia es utilizar promedios móviles exponenciales (EMA) de múltiples marcos de tiempo para identificar las tendencias del mercado y generar señales comerciales.

  1. Utiliza una EMA de 9 períodos como línea rápida, una EMA de 50 períodos como línea lenta y una EMA de 100 períodos en un marco de tiempo de 15 minutos como referencia del marco de tiempo superior.

  2. Condiciones de la señal de compra:

    • la EMA rápida se cruza por encima de la EMA lenta, y la EMA rápida está por encima de la EMA del marco de tiempo superior; o
    • La EMA rápida se cruza por encima de la EMA del marco de tiempo más alto.
  3. Condiciones de la señal de venta:

    • La EMA rápida se cruza por debajo de la EMA lenta, y la EMA rápida está por debajo de la EMA del marco de tiempo superior; o
    • La EMA rápida se cruza por debajo de la EMA del marco de tiempo más alto.
  4. Gestión del comercio:

    • Se establece un nivel fijo de stop-loss (SL) y de take-profit (TP).
    • Cuando el precio alcanza el primer nivel de take-profit (TP1), cierra el 25% de la posición y mueve el stop-loss al punto de equilibrio.
    • La posición restante continúa funcionando hasta que se alcanza el segundo nivel de toma de ganancias (TP2) o stop-loss.
  5. Control del tiempo de negociación:

    • Permite establecer horas y días de negociación específicos.

Ventajas estratégicas

  1. Análisis de marcos de tiempo múltiples: La combinación de EMA de diferentes marcos de tiempo ayuda a reducir las señales falsas y a mejorar la calidad de las operaciones.

  2. Seguimiento de tendencias: Captura eficazmente las tendencias del mercado a través de los cruces de la EMA y las posiciones relativas.

  3. Gestión de riesgos: emplea una estrategia de stop-loss fija y de toma de ganancias gradual, limitando las pérdidas potenciales mientras permite que las ganancias se ejecuten.

  4. Flexibilidad: los parámetros de la EMA, los niveles de stop-loss y take-profit se pueden ajustar para diferentes mercados y estilos de negociación.

  5. Automatización: La estrategia puede automatizarse completamente utilizando la plataforma TradingView y PineConnector.

  6. Gestión del tiempo: capacidad de establecer horas y días de negociación específicos para evitar negociación en condiciones de mercado desfavorables.

Riesgos estratégicos

  1. Retraso: Las EMA son indicadores inherentemente retrasados y pueden no reaccionar lo suficientemente rápidamente en mercados volátiles.

  2. En los mercados de los rangos, los cruces de la EMA pueden producir frecuentes señales falsas, lo que conduce a un exceso de negociación.

  3. Las pérdidas fijas: el uso de pérdidas fijas puede no ser adecuado para todas las condiciones de mercado, a veces siendo demasiado grande o demasiado pequeño.

  4. Dependencia de los datos históricos: La eficacia de la estrategia depende en gran medida del comportamiento del mercado durante el período de backtesting, que puede diferir en el futuro.

  5. Adaptabilidad del mercado: si bien la estrategia funciona bien en algunos pares de divisas, puede no ser tan efectiva en otros.

Direcciones para la optimización de la estrategia

  1. Ajuste dinámico de parámetros: Considere ajustar dinámicamente los períodos de EMA, los niveles de stop-loss y take-profit en función de la volatilidad del mercado.

  2. Condiciones adicionales de filtrado: introducir indicadores técnicos o de sentimiento adicionales para filtrar las señales comerciales y reducir los falsos positivos.

  3. Estrategia de stop-loss mejorada: poner en práctica los trailing stops o los stop-loss dinámicos basados en ATR para adaptarse mejor a la volatilidad del mercado.

  4. Optimizar los horarios de negociación: realizar un análisis del tiempo más detallado para encontrar las mejores horas y fechas de negociación.

  5. Mejora del tamaño de las posiciones: ajustar el tamaño de las posiciones en función de la volatilidad del mercado y del riesgo de la cuenta.

  6. Análisis de correlación entre monedas: considerar las correlaciones entre múltiples pares de monedas para evitar una sobreexposición a riesgos de mercado similares.

  7. Integración de aprendizaje automático: Utilice algoritmos de aprendizaje automático para optimizar los procesos de selección de parámetros y generación de señales.

Conclusión

La estrategia de cruce de promedios móviles exponenciales de varios plazos es un sistema de negociación automatizado que combina el seguimiento de tendencias con la gestión de riesgos. Al aprovechar las señales de cruce de EMA de diferentes plazos, la estrategia tiene como objetivo capturar las tendencias del mercado y ejecutar operaciones en los momentos apropiados. Aunque la estrategia tiene un buen rendimiento en ciertas condiciones del mercado, todavía tiene riesgos y limitaciones inherentes. Para mejorar aún más la robustez y adaptabilidad de la estrategia, se pueden considerar la introducción de ajustes dinámicos de parámetros, condiciones de filtrado adicionales y técnicas de gestión de riesgos más sofisticadas. En general, esta estrategia proporciona un punto de partida sólido para los operadores cuantitativos, que pueden optimizarse y personalizarse aún más de acuerdo con las necesidades individuales y las características del mercado.


/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

Relacionados

Más.