Sistema de negociación de media móvil doble con tendencia de rebote combinado con estrategia de optimización de stop loss dinámico ATR

EMA ATR SL TP MA
Fecha de creación: 2025-01-10 15:19:40 Última modificación: 2025-01-10 15:19:40
Copiar: 1 Número de Visitas: 454
1
Seguir
1617
Seguidores

Sistema de negociación de media móvil doble con tendencia de rebote combinado con estrategia de optimización de stop loss dinámico ATR

Descripción general

Esta estrategia es un sistema de trading de seguimiento de tendencias basado en un sistema de doble media móvil y stop loss dinámico ATR. Utiliza medias móviles exponenciales (EMA) de 38 y 62 períodos para identificar tendencias del mercado, determina señales de entrada a través del cruce de precios con la EMA rápida y lo combina con el indicador ATR para la gestión dinámica del stop loss. La estrategia ofrece modos comerciales tanto agresivos como conservadores para adaptarse a operadores con diferentes preferencias de riesgo.

Principio de estrategia

La lógica central de la estrategia se basa en los siguientes elementos clave:

  1. Determinación de la tendencia: la tendencia actual del mercado está determinada por la relación posicional entre las EMA de 38 y 62 períodos. Cuando la EMA rápida está por encima de la EMA lenta, es una tendencia ascendente, de lo contrario es una tendencia descendente.
  2. Señales de entrada: En una tendencia alcista, se genera una señal larga cuando el precio rompe la EMA rápida desde abajo; en una tendencia bajista, se genera una señal corta cuando el precio rompe por debajo de la EMA rápida desde arriba.
  3. Gestión de riesgos: utilizando un sistema dinámico de stop-loss basado en ATR, el nivel de stop-loss se ajusta en consecuencia a medida que el precio se mueve en una dirección favorable, protegiendo las ganancias existentes y sin abandonar el mercado prematuramente. También se establecen objetivos de stop loss y ganancias porcentuales fijos.

Ventajas estratégicas

  1. Excelente rendimiento de seguimiento de tendencias: el sistema de promedio móvil dual puede capturar eficazmente tendencias de mediano y largo plazo y evitar operaciones frecuentes en un mercado volátil.
  2. Control perfecto del riesgo: la combinación de stop loss fijo y stop loss dinámico puede limitar el riesgo máximo y proteger las ganancias.
  3. Fuerte adaptabilidad: proporciona dos modos comerciales, agresivo y conservador, que se pueden ajustar de manera flexible según el entorno del mercado y las preferencias de riesgo personales.
  4. Retroalimentación visual clara: el estado del mercado y las señales comerciales se muestran intuitivamente a través de líneas K y marcas de flechas de diferentes colores.

Riesgo estratégico

  1. Riesgo de reversión de tendencia: pueden producirse paradas continuas en puntos de reversión de tendencia. Se recomienda operar sólo cuando la tendencia sea clara.
  2. Riesgo de deslizamiento: cuando el mercado fluctúa violentamente, el precio de transacción real puede desviarse significativamente del precio de la señal. El rango de stop loss debe relajarse adecuadamente.
  3. Sensibilidad de los parámetros: La elección del período de la media móvil y del múltiplo ATR afectará significativamente el rendimiento de la estrategia. Necesita optimizarse para diferentes entornos de mercado.

Dirección de optimización de la estrategia

  1. Agregar filtro de fuerza de tendencia: se pueden introducir indicadores de fuerza de tendencia como ADX para ingresar al mercado solo cuando la tendencia es clara.
  2. Mecanismo de stop loss optimizado: el múltiplo ATR se puede ajustar dinámicamente según la volatilidad para hacer que el stop loss sea más adaptable.
  3. Agregar confirmación de volumen: cuando aparezca la señal de entrada, combínela con el análisis de volumen para mejorar la confiabilidad de la señal.
  4. Clasificación del entorno de mercado: ajusta dinámicamente los parámetros de la estrategia según los diferentes entornos de mercado (tendencia/oscilación).

Resumir

Esta estrategia construye un sistema completo de trading de seguimiento de tendencias combinando el clásico sistema de doble media móvil con la moderna tecnología dinámica de stop-loss. La ventaja de esta estrategia es su perfecto control del riesgo y su fuerte adaptabilidad, pero los traders aún necesitan optimizar los parámetros y gestionar los riesgos de acuerdo con el entorno específico del mercado. A través de las direcciones de optimización recomendadas, se espera mejorar aún más la estabilidad y la rentabilidad de la estrategia.

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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © aalapsharma

//@version=5
strategy(title="CM_SlingShotSystem - Strategy", shorttitle="SlingShotSys_Enhanced_v5", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1)

// Inputs
sae = input.bool(true, "Show Aggressive Entry Bars? (Highlight only)")
sce = input.bool(true, "Show Conservative Entry Bars? (Highlight only)")
st = input.bool(true, "Show Trend Arrows (Top/Bottom)?")
def = input.bool(false, "(Unused) Only Choose 1 - Either Conservative Entry Arrows or 'B'-'S' Letters")
pa = input.bool(true, "Show Conservative Entry Arrows?")
sl = input.bool(false, "Show 'B'-'S' Letters?")
useStopLoss = input.bool(true, "Use Stop-Loss?")
stopLossPerc = input.float(5.0, "Stop-Loss (%)", step=0.1)
useTakeProfit = input.bool(true, "Use Take-Profit?")
takeProfitPerc = input.float(20.0, "Take-Profit (%)", step=0.1)
useTrailingStop = input.bool(false, "Use ATR Trailing Stop?")
atrLength = input.int(14, "ATR Length", minval=1)
atrMult = input.float(2.0, "ATR Multiple for Trailing Stop", step=0.1)

// Calculations
emaSlow = ta.ema(close, 62)
emaFast = ta.ema(close, 38)
upTrend = emaFast >= emaSlow
downTrend = emaFast < emaSlow
pullbackUpT() => emaFast > emaSlow and close < emaFast
pullbackDnT() => emaFast < emaSlow and close > emaFast
entryUpT() => emaFast > emaSlow and close[1] < emaFast and close > emaFast
entryDnT() => emaFast < emaSlow and close[1] > emaFast and close < emaFast
entryUpTrend = entryUpT() ? 1 : 0
entryDnTrend = entryDnT() ? 1 : 0
atrValue = ta.atr(atrLength)

// Trailing Stop Logic (Improved)
var float trailStopLong = na
var float trailStopShort = na

if (strategy.position_size > 0)
    trailStopLong := math.max(close - (atrValue * atrMult), nz(trailStopLong[1], close))
    trailStopLong := strategy.position_avg_price > trailStopLong ? strategy.position_avg_price : trailStopLong
else
    trailStopLong := na

if (strategy.position_size < 0)
    trailStopShort := math.min(close + (atrValue * atrMult), nz(trailStopShort[1], close))
    trailStopShort := strategy.position_avg_price < trailStopShort ? strategy.position_avg_price : trailStopShort
else
    trailStopShort := na

// Plotting
col = emaFast > emaSlow ? color.lime : emaFast < emaSlow ? color.red : color.yellow
p1 = plot(emaSlow, "Slow MA (62)", linewidth=4, color=col)
p2 = plot(emaFast, "Fast MA (38)", linewidth=2, color=col)
fill(p1, p2, color=color.silver, transp=50)
barcolor((sae and pullbackUpT()) ? color.yellow : (sae and pullbackDnT()) ? color.yellow : na)
barcolor((sce and entryUpT()) ? color.aqua : (sce and entryDnT()) ? color.aqua : na)
plotshape(st and upTrend, title="Trend UP", style=shape.triangleup, location=location.bottom, color=color.lime)
plotshape(st and downTrend, title="Trend DOWN", style=shape.triangledown, location=location.top, color=color.red)
plotarrow((pa and entryUpTrend == 1) ? 1 : na, title="Up Entry Arrow", colorup=color.lime, maxheight=30, minheight=30)
plotarrow((pa and entryDnTrend == 1) ? -1 : na, title="Down Entry Arrow", colordown=color.red, maxheight=30, minheight=30)
plotchar(sl and entryUpTrend ? (low - ta.tr) : na, title="Buy Entry (Letter)", char='B', location=location.absolute, color=color.lime)
plotchar(sl and entryDnTrend ? (high + ta.tr) : na, title="Short Entry (Letter)", char='S', location=location.absolute, color=color.red)
plot(useTrailingStop and strategy.position_size > 0 ? trailStopLong : na, "Trailing Stop Long", color=color.green, style=plot.style_linebr)
plot(useTrailingStop and strategy.position_size < 0 ? trailStopShort : na, "Trailing Stop Short", color=color.red, style=plot.style_linebr)

// Function to calculate stop and limit prices
f_calcStops(_entryPrice, _isLong) =>
    _stopLoss = _isLong ? _entryPrice * (1.0 - stopLossPerc / 100.0) : _entryPrice * (1.0 + stopLossPerc / 100.0)
    _takeProfit = _isLong ? _entryPrice * (1.0 + takeProfitPerc / 100.0) : _entryPrice * (1.0 - takeProfitPerc / 100.0)
    [_stopLoss, _takeProfit]

// Entry and Exit Logic (Simplified using strategy.close)
if (entryUpT() and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)

if (entryDnT() and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)

// Exit conditions based on Stop-loss and Take-profit
[slPrice, tpPrice] = f_calcStops(strategy.position_avg_price, strategy.position_size > 0)

if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop=slPrice, limit=tpPrice, trail_price = trailStopLong, trail_offset = atrValue * atrMult)

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop=slPrice, limit=tpPrice, trail_price = trailStopShort, trail_offset = atrValue * atrMult)

// Close opposite position on new entry signal
if (entryUpT() and strategy.position_size < 0)
    strategy.close("Short", comment="Close Short on Long Signal")

if (entryDnT() and strategy.position_size > 0)
    strategy.close("Long", comment="Close Long on Short Signal")