Estrategia de cruce de medias móviles exponenciales de períodos múltiples

EMA SL TP TF
Fecha de creación: 2024-07-30 12:02:23 Última modificación: 2024-07-30 12:02:23
Copiar: 3 Número de Visitas: 618
1
Seguir
1617
Seguidores

Estrategia de cruce de medias móviles exponenciales de períodos múltiples

Descripción general

Esta estrategia de cruce de medias móviles de índices de varios períodos de tiempo es un sistema de negociación automatizado basado en señales de cruce de EMA. Utiliza EMAs de diferentes períodos de tiempo para generar señales de negociación y combina mecanismos de stop loss y profit close para administrar el riesgo. La estrategia se basa principalmente en el cruce entre EMAs rápidas y lentas y en EMAs de períodos de tiempo más altos para identificar posibles oportunidades de negociación.

Principio de estrategia

El principio central de esta estrategia es el uso de promedios móviles indexados (EMA) de varios períodos de tiempo para identificar tendencias en el mercado y generar señales de negociación. En concreto:

  1. Utiliza un EMA de 9 ciclos como línea rápida, un EMA de 50 ciclos como línea lenta, y un EMA de 100 ciclos en un período de tiempo de 15 minutos como línea de referencia de un período de tiempo más alto.

  2. Condiciones para comprar la señal:

    • El EMA rápido cruza el EMA lento, y el EMA rápido está sobre el EMA de un período de tiempo más alto; o
    • El EMA rápido lleva un período de tiempo más alto.
  3. Las condiciones de venta de la señal:

    • El EMA rápido está debajo del EMA lento, y el EMA rápido está debajo del EMA de un período de tiempo más alto; o
    • El EMA rápido atraviesa un período de tiempo más alto bajo el EMA.
  4. Administración de operaciones:

    • Establezca objetivos fijos de stop loss (SL) y de ganancias (TP).
    • Cuando el precio alcanza el primer objetivo de ganancias (TP1), se elimina la posición del 25% y el stop loss se mueve a la posición de garantía.
    • Las posiciones restantes continúan funcionando hasta el segundo objetivo de ganancias ((TP2) o stop loss)).
  5. Control de tiempo de transacción:

    • Se puede configurar un período de tiempo y un día de transacción específicos.

Ventajas estratégicas

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

  2. Seguimiento de tendencias: Captura eficaz de las tendencias del mercado a través de las relaciones de cruce y posición de las EMA.

  3. Gestión de riesgos: La adopción de estrategias de stop loss fijas y de recaudación de ganancias por etapas limita las pérdidas potenciales y permite que los beneficios sigan creciendo.

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

  5. Automatización: Las estrategias pueden realizar operaciones totalmente automatizadas a través de la plataforma TradingView y PineConnector.

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

Riesgo estratégico

  1. Retraso: El EMA es un indicador retrasado en su naturaleza, y puede no reaccionar a tiempo en un mercado con fuertes fluctuaciones.

  2. Falsa señal: En el mercado horizontal, los cruces de EMA pueden generar frecuentes falsas señales, lo que lleva a un exceso de operaciones.

  3. Detención fija: el uso de puntos fijos puede no ser adecuado para todas las condiciones del mercado, y a veces puede ser demasiado grande o demasiado pequeño.

  4. Depende de los datos históricos: la eficacia de la estrategia depende en gran medida de la conducta del mercado durante el período de retrospectiva, y el rendimiento futuro puede variar.

  5. Adaptabilidad al mercado: la estrategia funciona bien en algunos pares de divisas, pero puede no funcionar bien en otros.

Dirección de optimización de la estrategia

  1. Ajuste de parámetros dinámicos: Considere la posibilidad de ajustar el ciclo EMA, los niveles de stop loss y de ganancias en función de la dinámica de la volatilidad del mercado.

  2. Aumentar las condiciones de filtración: introducir indicadores técnicos adicionales o indicadores de sentimiento del mercado para filtrar las señales de negociación y reducir las falsas señales.

  3. Mejorar las estrategias de stop loss: implementar stop loss de seguimiento o stop loss dinámico basado en ATR para adaptarse mejor a las fluctuaciones del mercado.

  4. Optimización de los horarios de transacción: realizar un análisis de tiempo más detallado para encontrar los mejores horarios y fechas de transacción.

  5. Aumentar la gestión del volumen de operaciones: ajustar el tamaño de la posición en función de la volatilidad del mercado y el riesgo de la cuenta.

  6. Análisis de correlación entre monedas: considera la correlación entre varios pares de monedas y evita la exposición excesiva a riesgos de mercado similares.

  7. Integración de aprendizaje automático: optimización de la selección de parámetros y el proceso de generación de señales utilizando algoritmos de aprendizaje automático.

Resumir

La estrategia de cruce de medias móviles de índices de múltiples períodos de tiempo es un sistema de negociación automatizado que combina el seguimiento de tendencias y la gestión de riesgos. La estrategia tiene como objetivo capturar las tendencias del mercado y negociar en el momento adecuado mediante el aprovechamiento de las señales de cruce de EMA de diferentes períodos de tiempo. Aunque la estrategia funciona bien en ciertas condiciones de mercado, existen algunos riesgos y limitaciones inherentes.

Código Fuente de la Estrategia
/*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