Negociación de impulso con doble estrategia de cruce de medias móviles

El autor:¿ Qué pasa?, Fecha: 2024-04-01 11:53:14
Las etiquetas:

img

Resumen general

Esta estrategia emplea los promedios móviles exponenciales (EMA) de 8 períodos y 21 períodos para identificar cambios en las tendencias del mercado. Una señal de compra se genera cuando la EMA a corto plazo cruza por encima de la EMA a largo plazo desde abajo, mientras que una señal de venta se genera cuando la EMA a corto plazo cruza por debajo de la EMA a largo plazo desde arriba. La estrategia también incorpora tres mínimos altos consecutivos (HL) y tres máximos bajos consecutivos (LH) como confirmación adicional de las reversiones de tendencia. Además, los niveles de stop-loss y take-profit se establecen para gestionar el riesgo y bloquear las ganancias.

Principios de estrategia

  1. Calcular las EMA de 8 y 21 períodos para identificar la dirección de tendencia principal.
  2. Identificar tres mínimos superiores consecutivos (HL) y tres máximos inferiores consecutivos (LH) como señales tempranas de posibles inversiones de tendencia.
  3. Generar una señal de compra cuando la EMA de 8 períodos cruce por encima de la EMA de 21 períodos y se produce una ruptura HL; generar una señal de venta cuando la EMA de 8 períodos cruza por debajo de la EMA de 21 períodos y se produce una ruptura LH.
  4. Establecer el nivel de stop-loss en el 5% del precio de entrada y el nivel de take-profit en el 16% del precio de entrada para gestionar el riesgo y fijar los beneficios.
  5. Cierre la posición y abra una posición inversa cuando aparezca una señal opuesta.

Ventajas estratégicas

  1. Combina las EMA y los patrones de acción de precios (HL y LH) para confirmar las tendencias, mejorando la fiabilidad de la señal.
  2. Establece niveles claros de stop-loss y take-profit, ayudando a gestionar el riesgo y bloquear las ganancias.
  3. Aplicable a múltiples plazos y mercados diferentes, ofreciendo cierto nivel de versatilidad.
  4. Lógica clara, fácil de entender e implementar.

Riesgos estratégicos

  1. En los mercados agitados, los cruces frecuentes pueden dar lugar a múltiples señales falsas, lo que resulta en pérdidas.
  2. Los niveles fijos de stop-loss y take-profit pueden no adaptarse bien a las diferentes condiciones del mercado, lo que puede dar lugar a costes de oportunidad potenciales o a pérdidas mayores.
  3. La estrategia se basa en datos históricos y puede no adaptarse bien a eventos repentinos o cambios fundamentales.

Direcciones para la optimización de la estrategia

  1. Introducir mecanismos de stop-loss y take-profit adaptativos, como el ajuste de los niveles basados en la volatilidad (por ejemplo, ATR), para adaptarse mejor a las diferentes condiciones del mercado.
  2. Incorporar otros indicadores o factores, como el volumen, el índice de resistencia relativa (RSI, por sus siglas en inglés), etc., para filtrar aún más las señales y mejorar la confiabilidad.
  3. Optimizar los parámetros (por ejemplo, períodos de EMA, porcentajes de stop-loss y take-profit) para encontrar la combinación de mejor rendimiento para mercados o instrumentos específicos.
  4. Considerar la introducción de medidas de gestión de riesgos, como el tamaño de las posiciones, para controlar la exposición al riesgo de las operaciones individuales.

Resumen de las actividades

Esta estrategia utiliza el cruce de EMAs de 8 períodos y 21 períodos, combinados con patrones de precios HL y LH, para identificar reversiones de tendencia y generar señales de negociación. Reglas claras de stop-loss y take-profit ayudan a gestionar el riesgo y bloquear las ganancias. Sin embargo, la estrategia puede generar señales falsas en mercados agitados, y los niveles fijos de stop-loss y take-profit pueden no adaptarse bien a diferentes condiciones de mercado. Para mejorar aún más, considere introducir stop-loss y take-profit adaptativos, incorporar otros indicadores, optimizar parámetros e introducir medidas de gestión de riesgos. En general, la estrategia proporciona un marco para el impulso y el comercio de seguimiento de tendencias, pero requiere ajustes y optimizaciones basados en mercados específicos y preferencias individuales.


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

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range") 


Más.