Estrategia de negociación de medias móviles de impulso


Fecha de creación: 2024-01-24 11:09:58 Última modificación: 2024-01-24 11:09:58
Copiar: 0 Número de Visitas: 614
1
Seguir
1617
Seguidores

Estrategia de negociación de medias móviles de impulso

Descripción general

La estrategia se basa en el cruce de las medias móviles rápidas y lentas para determinar la tendencia del mercado y el punto de compra y venta. Cuando el EMA rápido atraviesa el EMA lento, el mercado está en una tendencia alcista y genera una señal de compra; cuando el EMA rápido atraviesa el EMA lento, el mercado está en una tendencia descendente y genera una señal de venta. La estrategia también establece un precio de stop loss y un precio de parada para administrar el riesgo.

Principio de estrategia

La estrategia utiliza un cruce de EMA rápido (línea de 8 días) y EMA lento (línea de 21 días) para juzgar la tendencia del mercado. La lógica específica es:

  1. Calcular el EMA del 8 y el EMA del 21
  2. Cuando el EMA del 8 se cruza con el EMA del 21, se juzga que el mercado está cambiando y comienza una tendencia alcista.
  3. Cuando el EMA del 8 se desplomó por el EMA del 21, se consideró un cambio de tendencia y comenzó la tendencia a la baja.
  4. En una tendencia alcista, genera una señal de compra; en una tendencia bajista, genera una señal de venta
  5. Establezca un precio de stop loss y un precio de parada para administrar el riesgo de cada orden

La estrategia combina indicadores de dinámica y análisis de tendencias para capturar eficazmente la dirección y los puntos de inflexión del mercado. Los cruces de EMA rápidos y suaves combinados con las medias móviles suaves pueden filtrar parte de las señales de negociación ruidosas.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. Los EMA rápidos y los EMA lentos cruzados son eficaces para determinar las tendencias del mercado y los puntos de venta y venta
  2. Los parámetros de la estrategia tienen mucho margen para ser optimizados y el ciclo EMA puede ajustarse aún más.
  3. Combinado con el indicador de potencia, puede filtrar eficazmente las señales de ruido
  4. Configuración de la lógica de detención de pérdidas para controlar activamente el riesgo

En general, la estrategia combina tendencias y indicadores de dinámica que se pueden adaptar a diferentes entornos de mercado a través de ajustes de parámetros, una estrategia de negociación de línea corta relativamente flexible.

Análisis de riesgos

La estrategia también tiene ciertos riesgos:

  1. En situaciones de crisis, las señales de cruce de EMA son frecuentes y producen más operaciones erróneas.
  2. Incapacidad para manejar de manera eficaz las situaciones en las que se produce un vacío en el aire
  3. No se toman en cuenta las tendencias a largo plazo a nivel global

En cuanto a los riesgos, podemos optimizar en los siguientes aspectos:

  1. Añadir filtros de otros indicadores, como el Brinband, KDJ, etc., para reducir la probabilidad de señales falsas
  2. Evaluar las tendencias a largo plazo en combinación con indicadores cíclicos a mayor escala
  3. Optimización de parámetros, ajuste de la longitud de los EMA para adaptarse a diferentes entornos del mercado
  4. Intervención humana en las operaciones para evitar que las brechas de vacío causen pérdidas masivas por encima del límite de pérdidas

Dirección de optimización

La estrategia aún tiene mucho espacio para ser optimizada, principalmente en las siguientes direcciones:

  1. Optimización de los parámetros del ciclo EMA para probar la rentabilidad de diferentes parámetros en datos históricos
  2. Añadir otros indicadores técnicos para filtrar, como KDJ, MACD, etc., para mejorar la precisión de la estrategia
  3. Optimización de la configuración de la parada de pérdidas para que se adapte mejor a las características de la situación
  4. Optimización automática de parámetros mediante métodos de aprendizaje automático

Estas medidas de optimización pueden mejorar considerablemente la estabilidad, adaptabilidad y rentabilidad de las estrategias.

Resumir

Esta estrategia en su conjunto es una típica estrategia de comercio de línea corta basada en el seguimiento de tendencias y el cruce de indicadores de dinámica. Se combina con el cruce de líneas rápidas y lentas de EMA y la lógica de parada de pérdidas para capturar rápidamente oportunidades de dirección del mercado.

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