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

Estrategia de negociación cruzada de promedio móvil de impulso

El autor:¿ Qué pasa?, Fecha: 2024-01-24 11:09:58
Las etiquetas:

img

Resumen general

Esta estrategia genera señales comerciales basadas en el cruce entre las líneas de media móvil rápida y lenta para determinar las tendencias y puntos de entrada del mercado. Cuando la EMA rápida cruza por encima de la EMA lenta, se juzga que el mercado está en una tendencia al alza y se genera una señal de compra. Cuando la EMA rápida cruza por debajo de la EMA lenta, se juzga que el mercado está en una tendencia a la baja y se genera una señal de venta. La estrategia también establece precios de stop loss y take profit para gestionar los riesgos.

Estrategia lógica

La estrategia utiliza el cruce entre una EMA rápida (8 días) y una EMA lenta (21 días) para determinar la tendencia del mercado.

  1. Calcular la EMA de 8 días y la EMA de 21 días
  2. Cuando la EMA de 8 días se cruza por encima de la EMA de 21 días, se determina que la tendencia del mercado se ha invertido y se ha iniciado una tendencia al alza.
  3. Cuando la EMA de 8 días se cruza por debajo de la EMA de 21 días, se determina que la tendencia del mercado se ha invertido y se ha iniciado una tendencia a la baja.
  4. Durante una tendencia alcista, se genera una señal de compra.
  5. Establecer los precios de stop loss y take profit para gestionar los riesgos de cada posición

La estrategia combina indicadores de impulso y análisis de tendencias para capturar efectivamente la dirección del mercado y los puntos de reversión.

Análisis de ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. Los cruces rápidos y lentos de la EMA pueden determinar eficazmente las tendencias del mercado y las señales comerciales
  2. Gran espacio de optimización para los parámetros de estrategia en los que los períodos de EMA pueden ajustarse aún más
  3. Las señales de ruido pueden filtrarse de manera efectiva mediante la incorporación de indicadores de momento
  4. Control activo del riesgo mediante la configuración de la lógica de stop loss y take profit

En resumen, la estrategia combina indicadores de tendencia e impulso. A través de la puesta a punto de parámetros, puede adaptarse a diferentes entornos de mercado y es una estrategia de negociación a corto plazo relativamente flexible.

Análisis de riesgos

También hay algunos riesgos con esta estrategia:

  1. En los mercados de los rangos, las señales de cruce frecuentes de la EMA pueden generar más operaciones falsas
  2. No se gestiona eficazmente el riesgo de brecha
  3. No se considera la dirección de la tendencia a largo plazo

Para hacer frente a estos riesgos, se pueden realizar algunas optimizaciones:

  1. Añadir otros filtros como bandas de Bollinger, KDJ para reducir las señales falsas
  2. Incorporar indicadores de plazo más largo para determinar la tendencia a largo plazo
  3. Optimizar parámetros como las longitudes de la EMA para adaptarse a los diferentes mercados
  4. Intervención manual para evitar grandes pérdidas por deslizamiento por las lagunas

Direcciones de optimización

Todavía hay mucho espacio para optimizar esta estrategia:

  1. Optimizar los parámetros del período de EMA basados en el desempeño histórico
  2. Añadir otros indicadores técnicos para el filtrado de señales, por ejemplo, KDJ, MACD para mejorar la precisión
  3. Optimizar la configuración del stop loss y la toma de beneficios para adaptarse mejor a las características del mercado
  4. Utilizar técnicas de aprendizaje automático para la optimización automática de parámetros

Estas medidas pueden mejorar en gran medida la estabilidad, la adaptabilidad y la rentabilidad de la estrategia.

Conclusión

En conclusión, esta es una estrategia comercial típica a corto plazo basada en el seguimiento de tendencias y cruces de indicadores de impulso. Combina la lógica de cruce EMA y stop loss / take profit para capturar rápidamente las oportunidades de mercado direccionales. Hay un amplio margen de optimización mediante la introducción de otros indicadores de asistencia y métodos automatizados de ajuste de parámetros, que pueden hacer que el rendimiento de la estrategia sea más estable y sobresaliente.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)

Más.