Estrategia de negociación de compresión de EMA con stop loss dinámico para múltiples marcos temporales

EMA SQM CMF KC SL TP MTF
Fecha de creación: 2024-12-11 15:50:38 Última modificación: 2024-12-11 15:50:38
Copiar: 0 Número de Visitas: 435
1
Seguir
1617
Seguidores

Estrategia de negociación de compresión de EMA con stop loss dinámico para múltiples marcos temporales

Descripción general

La estrategia es un sistema de negociación dinámica basado en análisis de múltiples períodos de tiempo, que combina la generación de señales de negociación con el índice de promedio móvil (EMA), el indicador de volumen dinámico (SQM) y el indicador de flujo de capital (CMF). El núcleo de la estrategia es confirmar la tendencia a través del análisis de múltiples marcos de tiempo y utilizar el stop loss dinámico para optimizar la gestión del riesgo. La estrategia adopta un programa de stop loss y ganancias adaptativo que puede ajustar automáticamente los parámetros de negociación según la volatilidad del mercado.

Principio de estrategia

La estrategia utiliza tres combinaciones de indicadores técnicos principales para identificar oportunidades de negociación. En primer lugar, para determinar la dirección de la tendencia del mercado a través de los EMA de 11 y 34 ciclos. En segundo lugar, para detectar la presión del mercado y las oportunidades potenciales de ruptura con el indicador Squeeze Momentum, que calcula la desviación de los precios a través de un método de regresión lineal. Finalmente, para confirmar la dirección de la negociación a través del indicador de flujo de capital modificado (CMF) para asegurar que haya suficientes fondos para apoyar el movimiento de los precios.

Ventajas estratégicas

  1. Confirmación de señales multidimensionales: reduce significativamente el riesgo de falsas señales mediante la combinación de varios indicadores técnicos y análisis de períodos de tiempo.
  2. Gestión inteligente de riesgos: el sistema de stop loss dinámico puede ajustarse automáticamente a las fluctuaciones del mercado, evitando salidas prematuras y protegiendo los beneficios.
  3. Adaptabilidad: los parámetros de la estrategia se pueden ajustar según las diferentes condiciones del mercado y tienen una buena adaptabilidad.
  4. Un ciclo completo de transacciones cerradas: reglas claras desde la señal de entrada hasta la gestión de la salida, reduciendo la influencia del juicio subjetivo.
  5. Confirmación de flujos de capital: mejora la fiabilidad de las transacciones mediante la verificación de movimientos de precios mediante la monitorización de los flujos de capital.

Riesgo estratégico

  1. Sensibilidad de parámetros: la configuración de parámetros de varios indicadores técnicos requiere una optimización cuidadosa, y los parámetros incorrectos pueden causar una disminución en el rendimiento.
  2. Dependencia del entorno del mercado: la calidad de la señal puede verse afectada por la gran volatilidad o la poca liquidez del entorno del mercado.
  3. Complejidad de los cálculos: Los cálculos de múltiples períodos de tiempo pueden causar un retraso en la señal y afectar la efectividad de las operaciones.
  4. Riesgo de ajuste al stop loss: el stop loss dinámico puede ser demasiado radical o conservador en ciertas condiciones de mercado.
  5. Requisitos de gestión de fondos: La estrategia requiere una gestión de fondos razonable para equilibrar los riesgos y los beneficios.

Dirección de optimización de la estrategia

  1. Introducción de la adaptabilidad de la volatilidad: se pueden ajustar dinámicamente los parámetros en función del ATR u otros indicadores de la volatilidad para mejorar la adaptabilidad de la estrategia.
  2. Optimización de la filtración de la señal: se puede agregar un aumento de peso de la transacción o un filtro de tiempo para mejorar la calidad de la señal.
  3. Mecanismo de detención de pérdidas mejorado: la configuración del punto de detención de pérdidas se puede optimizar en combinación con la posición de soporte y resistencia.
  4. Aumentar el análisis del entorno del mercado: introducir indicadores de intensidad de las tendencias del mercado, y usar diferentes configuraciones de parámetros en diferentes entornos del mercado.
  5. Mejora de la gestión de fondos: introducción de algoritmos de gestión de posiciones que ajustan la proporción de posiciones en función de la intensidad de la señal y la volatilidad del mercado.

Resumir

La estrategia ofrece a los operadores un programa de negociación sistematizado a través de un análisis técnico multidimensional y una gestión inteligente del riesgo. Su principal ventaja es que combina el seguimiento de tendencias y la gestión dinámica del riesgo, lo que permite capturar oportunidades de mercado mientras se protegen los beneficios. Si bien la estrategia tiene algunos aspectos que necesitan ser optimizados, aún puede ser una herramienta de negociación efectiva mediante una configuración razonable de parámetros y control de riesgos.

Código Fuente de la Estrategia
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("LL Crypto - SUI", overlay=true)

// Parâmetros de tempo para criptomoedas
fast_ema_len = input.int(11, minval=5, title="Fast EMA")
slow_ema_len = input.int(34, minval=20, title="Slow EMA")
sqm_lengthKC = input.int(20, title="SQM KC Length")
kauf_period = input.int(20, title="Kauf Period")
kauf_mult = input.float(2, title="Kauf Mult factor")
min_profit_sl = input.float(5, minval=0.01, maxval=100.0, title="Min profit to start moving SL [%]")
longest_sl = input.float(10, minval=0.01, maxval=100.0, title="Maximum possible of SL [%]")
sl_step = input.float(0.5, minval=0.0, maxval=1.0, title="Take profit factor")

// Parâmetros adaptados para criptomoedas
CMF_length = input.int(11, minval=1, title="CMF length")
show_plots = input.bool(true, title="Show plots")

// Definir intervalos de tempo para criptomoedas
selected_timeframe = input.string(defval="15", title="Intervalo de Tempo", options=["1", "15", "60"])

lower_resolution = timeframe.period == '1' ? '1' :
                   timeframe.period == '5' ? '15' :
                   timeframe.period == '15' ? '60' :
                   timeframe.period == '60' ? '240' :
                   timeframe.period == '240' ? 'D' :
                   timeframe.period == 'D' ? 'W' : 'M'

sp_close = close[barstate.isrealtime ? 1 : 0]
sp_high = high[barstate.isrealtime ? 1 : 0]
sp_low = low[barstate.isrealtime ? 1 : 0]
sp_volume = volume[barstate.isrealtime ? 1 : 0]

// Calcular Squeeze Momentum ajustado para criptomoedas
sqm_val = ta.linreg(sp_close - math.avg(math.avg(ta.highest(sp_high, sqm_lengthKC), ta.lowest(sp_low, sqm_lengthKC)), ta.sma(sp_close, sqm_lengthKC)), sqm_lengthKC, 0)
close_low = request.security(syminfo.tickerid, lower_resolution, sp_close, lookahead=barmerge.lookahead_on)
high_low = request.security(syminfo.tickerid, lower_resolution, sp_high, lookahead=barmerge.lookahead_on)
low_low = request.security(syminfo.tickerid, lower_resolution, sp_low, lookahead=barmerge.lookahead_on)
sqm_val_low = ta.linreg(close_low - math.avg(math.avg(ta.highest(high_low, sqm_lengthKC), ta.lowest(low_low, sqm_lengthKC)), ta.sma(close_low, sqm_lengthKC)), sqm_lengthKC, 0)

// CMF adaptado para criptomoedas
ad = sp_close == sp_high and sp_close == sp_low or sp_high == sp_low ? 0 : ((2 * sp_close - sp_low - sp_high) / (sp_high - sp_low)) * sp_volume
money_flow = math.sum(ad, CMF_length) / math.sum(sp_volume, CMF_length)

// Condições de entrada para criptomoedas
low_condition_long = (sqm_val_low > sqm_val_low[1])
low_condition_short = (sqm_val_low < sqm_val_low[1])
money_flow_min = (money_flow[4] > money_flow[2]) and (money_flow[3] > money_flow[2]) and (money_flow[2] < money_flow[1]) and (money_flow[2] < money_flow)
money_flow_max = (money_flow[4] < money_flow[2]) and (money_flow[3] < money_flow[2]) and (money_flow[2] > money_flow[1]) and (money_flow[2] > money_flow)
condition_long = ((sqm_val > sqm_val[1])) and money_flow_min and ta.lowest(sqm_val, 5) < 0
condition_short = ((sqm_val < sqm_val[1])) and money_flow_max and ta.highest(sqm_val, 5) > 0
enter_long = low_condition_long and condition_long
enter_short = low_condition_short and condition_short

// Stop conditions
var float current_target_price = na
var float current_sl_price = na
var float current_target_per = na
var float current_profit_per = na

set_targets(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    if isLong
        target := sp_close * (1.0 + current_target_per)
        sl := sp_close * (1.0 - (longest_sl / 100.0))
    else
        target := sp_close * (1.0 - current_target_per)
        sl := sp_close * (1.0 + (longest_sl / 100.0))
    [target, sl]

target_reached(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    float profit_per = na
    float target_per = na
    if current_profit_per == na
        profit_per := (min_profit * sl_step) / 100.0
    else
        profit_per := current_profit_per + ((min_profit * sl_step) / 100.0)
    target_per := current_target_per + (min_profit / 100.0)
    if isLong
        target := strategy.position_avg_price * (1.0 + target_per)
        sl := strategy.position_avg_price * (1.0 + profit_per)
    else
        target := strategy.position_avg_price * (1.0 - target_per)
        sl := strategy.position_avg_price * (1.0 - profit_per)
    [target, sl, profit_per, target_per]

hl_diff = ta.sma(sp_high - sp_low, kauf_period)
stop_condition_long = 0.0
new_stop_condition_long = sp_low - (hl_diff * kauf_mult)
if (strategy.position_size > 0)
    if (sp_close > current_target_price)
        [target, sl, profit_per, target_per] = target_reached(true, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_long := math.max(stop_condition_long[1], current_sl_price)
else
    stop_condition_long := new_stop_condition_long

stop_condition_short = 99999999.9
new_stop_condition_short = sp_high + (hl_diff * kauf_mult)
if (strategy.position_size < 0)
    if (sp_close < current_target_price)
        [target, sl, profit_per, target_per] = target_reached(false, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_short := math.min(stop_condition_short[1], current_sl_price)
else
    stop_condition_short := new_stop_condition_short

// Submit entry orders
if (enter_long and (strategy.position_size <= 0))
    if (strategy.position_size < 0)
        strategy.close(id="SHORT")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(true, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="LONG", direction=strategy.long)

    if show_plots
        label.new(bar_index, sp_high, text="LONG\nSL: " + str.tostring(stop_condition_long), style=label.style_label_down, color=color.green)





if (enter_short and (strategy.position_size >= 0))
    if (strategy.position_size > 0)
        strategy.close(id="LONG")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(false, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="SHORT", direction=strategy.short)
    if show_plots
        label.new(bar_index, sp_high, text="SHORT\nSL: " + str.tostring(stop_condition_short), style=label.style_label_down, color=color.red)

if (strategy.position_size > 0)
    strategy.exit(id="EXIT LONG", stop=stop_condition_long)

if (strategy.position_size < 0)
    strategy.exit(id="EXIT SHORT", stop=stop_condition_short)

// Plot anchor trend
plotshape(low_condition_long, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(low_condition_short, style=shape.triangledown, location=location.abovebar, color=color.red)

plotshape(condition_long, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(condition_short, style=shape.triangledown, location=location.belowbar, color=color.red)

plotshape(enter_long, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(enter_short, style=shape.triangledown, location=location.bottom, color=color.red)

// Plot emas
plot(ta.ema(close, 20), color=color.blue, title="20 EMA")
plot(ta.ema(close, 50), color=color.orange, title="50 EMA")
plot(ta.sma(close, 200), color=color.red, title="MA 200")

// Plot stop loss values for confirmation
plot(series=(strategy.position_size > 0) and show_plots ? stop_condition_long : na, color=color.green, style=plot.style_linebr, title="Long Stop")
plot(series=(strategy.position_size < 0) and show_plots ? stop_condition_short : na, color=color.green, style=plot.style_linebr, title="Short Stop")
plot(series=(strategy.position_size < 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Short TP")
plot(series=(strategy.position_size > 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Long TP")