Trading con momentum: estrategia de cruce de medias móviles dobles


Fecha de creación: 2024-04-01 11:53:14 Última modificación: 2024-04-01 11:53:14
Copiar: 4 Número de Visitas: 597
1
Seguir
1617
Seguidores

Trading con momentum: estrategia de cruce de medias móviles dobles

Descripción general

La estrategia utiliza un promedio móvil de índice de 8 y 21 períodos (EMA) para identificar cambios en la tendencia del mercado. Cuando el EMA de menor período atraviesa el EMA de mayor período desde abajo, se genera una señal de compra; y, a la inversa, cuando el EMA de menor período atraviesa el EMA de mayor período desde arriba, se genera una señal de venta. La estrategia también combina tres mínimos consecutivos más altos (HLL) y tres máximos consecutivos más bajos (LLH) como señales de reversión de tendencia.

Principio de estrategia

  1. Calcula el EMA de 8 y 21 ciclos para identificar las principales tendencias.
  2. Identificar tres bajas consecutivas más altas (HLL) y tres altas consecutivas más bajas (LLH), como una señal temprana de cambio de tendencia.
  3. Cuando el EMA de 8 ciclos cruza el EMA de 21 ciclos desde abajo y se produce una ruptura de HLL, se genera una señal de compra; cuando el EMA de 8 ciclos cruza el EMA de 21 ciclos desde arriba y se produce una ruptura de LLH, se genera una señal de venta.
  4. Establezca un nivel de stop loss del 5% del precio de entrada y un nivel de stop loss del 16% del precio de entrada para controlar el riesgo y bloquear los beneficios.
  5. Cuando aparezca una señal de reversión, cierre la posición y vuelva a abrirla.

Ventajas estratégicas

  1. La combinación de la EMA y los patrones de comportamiento de los precios ((HLL y LLH) para confirmar la tendencia y mejorar la fiabilidad de la señal.
  2. Establecer niveles claros de stop loss y stop loss ayuda a controlar el riesgo y bloquear las ganancias.
  3. Aplicable en varios marcos de tiempo y diferentes mercados, con cierta universalidad.
  4. La lógica es clara, fácil de entender y de implementar.

Riesgo estratégico

  1. En un mercado convulso, el cruce frecuente puede dar lugar a múltiples señales falsas, lo que genera pérdidas.
  2. Los niveles fijos de stop-loss y stop-loss pueden no adaptarse a diferentes condiciones de mercado, lo que puede ocasionar costos de oportunidad o mayores pérdidas.
  3. Las estrategias dependen de datos históricos y pueden ser menos adaptadas a eventos repentinos o cambios fundamentales.

Dirección de optimización de la estrategia

  1. Introducir mecanismos de stop loss y stop adjustment, como los basados en la volatilidad (como ATR) para ajustar los niveles de stop loss y stop stop para adaptarse mejor a las diferentes condiciones del mercado.
  2. En combinación con otros indicadores o factores, como el volumen de transacciones, el índice de fuerza relativa (RSI) y otros, para filtrar aún más las señales y mejorar la fiabilidad.
  3. Optimización de los parámetros (por ejemplo, el ciclo de EMA, el índice de stop loss, etc.) para encontrar la combinación de parámetros que mejor funcionen en un mercado o indicador en particular.
  4. Considerar la introducción de medidas de gestión de riesgos, como el dimensionamiento de posiciones, para controlar la brecha de riesgo de una sola transacción.

Resumir

La estrategia utiliza el cruce de los EMA de 8 y 21 ciclos, en combinación con los modelos de precios HLL y LLH, para identificar la reversión de la tendencia y generar señales de negociación. Una regla de stop loss clara ayuda a controlar el riesgo y bloquear las ganancias. Sin embargo, la estrategia puede generar señales falsas en mercados convulsos y los niveles de stop loss fijos pueden no adaptarse a diferentes entornos de mercado.

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