Estrategia de stop loss dinámico con cruce de indicadores de momentum


Fecha de creación: 2024-02-29 13:55:16 Última modificación: 2024-02-29 13:55:16
Copiar: 0 Número de Visitas: 671
1
Seguir
1617
Seguidores

Estrategia de stop loss dinámico con cruce de indicadores de momentum

Descripción general

Esta estrategia combina un indicador de promedio móvil y un indicador de índice de movimiento, que permite la señal cruzada de los dos indicadores para emitir señales de compra y venta. Al mismo tiempo, la estrategia incorpora un stop loss de seguimiento dinámico para controlar el riesgo.

Principio de estrategia

  1. Construye un indicador de promedio móvil usando un EMA de 9 días corto y un EMA de 21 días largo. Genera una señal de compra cuando el EMA de corto está sobre el EMA de largo; genera una señal de venta cuando el EMA de corto está bajo el EMA de largo.
  2. Construye el indicador DMI con ADX, +DI y -DI. Cuando +DI está encima de -DI es una señal de compra; cuando -DI está encima de +DI es una señal de venta.
  3. La combinación de las señales de los indicadores EMA y DMI, es decir, cuando ambos indicadores cumplen las condiciones, se emite una señal de compra y venta real.
  4. Utiliza el stop loss dinámico para rastrear el precio más alto / más bajo.

Análisis de las ventajas

  1. El doble indicador se combina con el filtro de señales falsas para mejorar la precisión de la señal. El indicador a corto plazo capta los cambios de tendencia; el indicador a largo plazo determina la dirección de la tendencia general.
  2. El indicador de movimiento capta la tendencia de los precios con anticipación y tiene ciertas características de liderazgo.
  3. El mecanismo de stop loss dinámico permite el máximo bloqueo de ganancias y control de riesgos.

Análisis de riesgos

  1. La combinación de los dos indicadores reduce las señales de compra y venta, y es posible que se pierda parte de la oportunidad.
  2. La configuración incorrecta de los parámetros del indicador puede causar una frecuencia de transacción excesiva o una mala calidad de la señal.
  3. Si el stop loss es demasiado flexible, aumenta el riesgo de pérdidas; si es demasiado estricto, aumenta el riesgo de desajuste de la tendencia.

Dirección de optimización

  1. Prueba combinaciones de parámetros de EMA largo y corto de diferentes longitudes para encontrar el parámetro óptimo.
  2. Prueba diferentes opciones de parámetros ADX para mejorar la calidad de la señal DMI.
  3. Optimización de los parámetros de stop loss para maximizar el bloqueo de ganancias y controlar el riesgo.
  4. Se puede considerar la adición de más indicadores de filtración para mejorar aún más la calidad de la señal.

Resumir

Esta estrategia integra las ventajas de las medias móviles y los indicadores de movimiento, las señales de doble confirmación, y utiliza la complementariedad entre los indicadores para mejorar la rentabilidad de la estrategia. Al mismo tiempo, el mecanismo de stop loss de seguimiento dinámico puede controlar eficazmente el riesgo de la estrategia.

Código Fuente de la Estrategia
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Combined EMA and DMI Strategy with Enhanced Table", overlay=true)

// Input parameters for EMA
shortTermEMA = input.int(9, title="Short-Term EMA Period")
longTermEMA = input.int(21, title="Long-Term EMA Period")
riskPercentageEMA = input.float(1, title="Risk Percentage EMA", minval=0.1, maxval=5, step=0.1)

// Calculate EMAs
emaShort = ta.ema(close, shortTermEMA)
emaLong = ta.ema(close, longTermEMA)

// EMA Crossover Strategy
longConditionEMA = emaShort > emaLong and emaShort[1] <= emaLong[1]
shortConditionEMA = emaShort < emaLong and emaShort[1] >= emaLong[1]

// Input parameters for DMI
adxlen = input(17, title="ADX Smoothing")
dilen = input(17, title="DI Length")

// DMI Logic
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    truerange = ta.tr
    plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
    minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) => 
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adxValue = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    [adxValue, plus, minus]

[adxValue, up, down] = adx(dilen, adxlen)

// DMI Conditions
buyConditionDMI = up > down or (up and adxValue > down)
sellConditionDMI = down > up or (down and adxValue > up)

// Combined Conditions for Entry
longEntryCondition = longConditionEMA and buyConditionDMI
shortEntryCondition = shortConditionEMA and sellConditionDMI

// Combined Conditions for Exit
longExitCondition = shortConditionEMA
shortExitCondition = longConditionEMA

// Enter long trade based on combined conditions
if (longEntryCondition)
    strategy.entry("Long", strategy.long)

// Enter short trade based on combined conditions
if (shortEntryCondition)
    strategy.entry("Short", strategy.short)

// Exit trades
if (longExitCondition)
    strategy.close("Long")

if (shortExitCondition)
    strategy.close("Short")

// Plot EMAs
plot(emaShort, color=color.blue, title="Short-Term EMA")
plot(emaLong, color=color.red, title="Long-Term EMA")

// Create and fill the enhanced table
var tbl = table.new(position.top_right, 4, 1)
if (barstate.islast)
    table.cell(tbl, 0, 0, "ADX: " + str.tostring(adxValue), bgcolor=color.new(color.red, 90), width=15, height=4)
    table.cell(tbl, 1, 0, "+DI: " + str.tostring(up), bgcolor=color.new(color.blue, 90), width=15, height=4)
    table.cell(tbl, 2, 0, "-DI: " + str.tostring(down), bgcolor=color.new(color.orange, 90), width=15, height=4)