
La estrategia utiliza el índice de movimiento de la media cruzada inteligente para fijar la cadena de seguimiento de pérdidas. La estrategia utiliza el índice de movimiento de la media (EMA) para identificar señales de cruce de tendencias ascendentes potenciales, en combinación con el dólar costo promedio (DCA) para hacer una apuesta inteligente, y proteger los beneficios a través de un mecanismo de doble seguimiento de la parada. El núcleo de la estrategia es utilizar la cruz de la rápida EMA y la lenta EMA para determinar el momento de entrada en el mercado, la deplotación automática de hasta dos órdenes de seguridad cuando los precios caen (Orders de seguridad), mediante el promedio real rango de fluctuación (ATR) o el cálculo de porcentaje fijo de la posición de la apuesta, y el uso de un sistema de seguimiento de pérdidas estándar de seguimiento de pérdidas y el bloqueo de las ganancias y el bloqueo de las pérdidas).
La estrategia se basa en varios componentes clave:
Mecanismo de identificación de tendenciasUtiliza el cruce de EMA rápido (default 9 cycles) y EMA lento (default 21 cycles) para identificar una tendencia ascendente potencial. Cuando el EMA rápido cruza hacia arriba el EMA lento, el sistema genera una señal de compra.
Orden de base y orden de seguridadLa estrategia adopta un método de gestión de fondos estratificado, comenzando con un pedido básico (de \( 1,000 por defecto) y agregando dos órdenes de seguridad adicionales cuando el precio baja (de \) 1,250 por defecto SO1 y $ 1,750 por defecto SO2).
Cálculo de la distancia dinámicaEl precio de activación de una orden de seguridad se puede calcular de dos maneras:
Sistema de doble seguimiento y deterioro:
Condiciones de salidaLa estrategia es cerrar posiciones en las siguientes situaciones:
Filtros de tiempo de refrigeración y fecha: La estrategia incluye un período de enfriamiento después de la orden básica (de 4 horas por defecto) y un filtro de fecha opcional para limitar la retroalimentación o ejecutar un período de tiempo específico.
Al analizar en profundidad el código de la estrategia, podemos resumir las principales ventajas:
Administración de fondos adaptados: La estrategia utiliza el promedio de costos en dólares en combinación con órdenes de seguridad dinámicas para ajustar automáticamente las posiciones según las condiciones del mercado. Este método es especialmente efectivo en mercados volátiles, ya que puede reducir el precio promedio de entrada y aumentar las ganancias potenciales.
Ajuste de posición basado en la volatilidadLa estrategia puede ajustar automáticamente el intervalo de alza de posición en función de la fluctuación actual del mercado a través del cálculo de la posición de la orden de seguridad ATR, lo que es más flexible que el método de porcentaje fijo.
Protección doble de las ganancias: El sistema de doble seguimiento de la pérdida ofrece una gestión de riesgos innovadora, el seguimiento estándar de la pérdida protege la mayor parte de los fondos, mientras que el mecanismo de bloqueo de ganancias se activa después de alcanzar un objetivo de ganancias específico para proteger los beneficios obtenidos con un porcentaje más ajustado.
Completamente personalizadoTodos los parámetros clave (duración de EMA, tamaño de la orden, porcentaje de seguimiento de stop loss, intervalo de orden de seguridad) se pueden ajustar según las preferencias de riesgo del comerciante y las condiciones del mercado.
Sistema de alerta temprana integrado: La estrategia contiene condiciones de alerta pre-formateadas que se pueden integrar con plataformas de automatización de terceros (como 3Commas) para realizar transacciones totalmente automatizadas.
Información transparente sobre el nombramiento: Contiene una tabla de despliegue detallada que muestra los indicadores y el estado de las operaciones clave para facilitar la monitorización en tiempo real y la optimización de la estrategia.
A pesar de las ventajas de esta estrategia, existen los siguientes riesgos potenciales:
Cómo solucionarlo: Ajuste el porcentaje de tracking stop loss y el intervalo de órdenes seguras según la variedad de transacción y el marco de tiempo; Considere agregar stop loss global como una capa de protección adicional.
Cómo solucionarlo: Realizar un exhaustivo análisis y optimización de las variedades de transacciones y condiciones de mercado específicas; Implementar un mecanismo de ajuste de parámetros de adaptación.
*Cómo solucionarlo*Considere la posibilidad de implementar mecanismos de activación de órdenes de seguridad más flexibles, como la ejecución obligatoria basada en el tiempo o el ajuste de intervalos en condiciones específicas del mercado.
*Cómo solucionarlo*Aumentar los filtros de negociación, como la volatilidad de las tendencias o la confirmación de la intensidad de la tendencia; extender el período de enfriamiento para reducir la frecuencia de negociación.
*Cómo solucionarlo*Considere la integración de filtros básicos o indicadores de sentimiento de riesgo; agregue una verificación de relevancia entre mercados como señal de confirmación.
Basado en un análisis profundo del código de la política, las siguientes son algunas posibles direcciones de optimización:
Ajuste de los parámetros de adaptación: Implementar un mecanismo para ajustar automáticamente la longitud de EMA y el multiplicador de ATR en función de la volatilidad del mercado o el volumen de transacciones. Por ejemplo, usar un EMA más largo y un multiplicador de ATR más grande en un entorno de alta volatilidad y un EMA más corto y un multiplicador de ATR más pequeño en un entorno de baja volatilidad. Esto mejorará la adaptabilidad de la estrategia en diferentes condiciones de mercado.
Señales de confirmación múltiples: Añadir indicadores de confirmación adicionales, como el índice de fuerza relativa (RSI), el volumen de transacción o la banda de Brin, para reducir las falsas señales. Se puede implementar un filtro que requiera que varios indicadores técnicos confirmen al mismo tiempo la señal de entrada, lo que mejora la calidad de la señal.
Distribución dinámica de fondos: Ajuste el tamaño de la orden en función de la situación del mercado y la volatilidad histórica. Por ejemplo, aumentar el tamaño de la orden básica en una fase del mercado donde la volatilidad es baja o donde es más probable que aumente en la historia, y reducirlo en un entorno de alto riesgo.
La estrategia de salida inteligente: Implementación de un mecanismo de ganancias parciales, que permite la salida gradual en diferentes niveles de ganancias, en lugar de una posición plana única. Esto se puede lograr mediante el establecimiento de múltiples objetivos de ganancias y un porcentaje de salida correspondiente, optimizando la relación de riesgo-rentabilidad.
Indicadores emocionales integrados: Añadir análisis de la emoción del mercado, como el índice de miedo y avaricia o análisis de volumen de transacciones, como filtros adicionales de entrada y salida. Esto ayudará a la estrategia a evitar transacciones innecesarias en períodos de emoción extrema del mercado.
Gestión de la exposición al riesgo: Implementar la función de calcular dinámicamente la exposición máxima al riesgo (la suma de todos los pedidos de seguridad posibles) y establecer límites de riesgo máximos aceptables. Esto garantizará que la estrategia no exponga demasiado dinero en una sola transacción en ningún momento.
El sistema de seguimiento de pérdidas de la cadena de lanzamiento inteligente de los índices móviles de media cruzada es una estrategia de comercio cuantitativa bien diseñada que combina detección de tendencias, estratificación y gestión de pérdidas avanzadas. Su principal ventaja radica en la capacidad de adaptarse a las fluctuaciones del mercado, la gestión inteligente de fondos y el sistema de protección de ganancias de dos niveles. La estrategia es especialmente adecuada para entornos de mercado de volatilidad moderada, en los que las tendencias tienen suficiente continuidad y orientación.
La estrategia puede mejorar aún más su rendimiento y estabilidad mediante la optimización de los parámetros y la mejora de las recomendaciones adecuadas. En particular, la adaptación de los parámetros y la señal de confirmación múltiple pueden mejorar significativamente la calidad de entrada, mientras que la asignación dinámica de fondos y la estrategia de salida inteligente pueden optimizar las características de retorno del riesgo.
En última instancia, la estrategia representa un método de negociación cuantitativo equilibrado, centrado en la conservación y la consistencia de los fondos, en lugar de buscar la maximización de las ganancias en cada operación. Proporciona a los operadores un marco sólido que se puede personalizar según las preferencias personales de riesgo y las condiciones del mercado, con el potencial de lograr resultados comerciales sostenibles a largo plazo.
/*backtest
start: 2025-04-15 00:00:00
end: 2025-07-13 19:30:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":200000}]
*/
//@version=5
strategy(
title="DCA + Dual Trailing Strategy",
overlay=true
)
// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length")
slowMALen = input.int(21, title="Slow EMA Length")
// --- Trailing Stops ---
trailStopPerc = input.float(8.0, title="Standard Trailing Stop (%)", minval=0.1) / 100
lockInThreshold = input.float(2.5, title="Profit Lock-In Trigger (%)", minval=0.1) / 100
lockInTrailPct = input.float(1.5, title="Lock-In Trail (%) after Trigger", minval=0.1) / 100
// --- Safety Orders (SO) ---
useATRSpacing = input.bool(true, title="Use ATR-Based Spacing?")
atrLength = input.int(14, title="ATR Length", minval=1)
atrSo1Multiplier = input.float(1.2, title="ATR SO1 Multiplier", minval=0.1)
atrSo2Multiplier = input.float(2.5, title="ATR SO2 Multiplier", minval=0.1)
// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0, title="Fallback SO1 Drop (%) ", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) ", minval=0.1) / 100
// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry", minval=0)
// --- Order Sizes in USD ---
baseUsd = input.float(10000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd = input.float(12500.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd = input.float(17500.0, title="Safety Order 2 Size (USD)", minval=1.0)
// 2) CALCULATIONS
// --- Trend & Reversal Detection ---
fastMA = ta.ema(close, fastMALen)
slowMA = ta.ema(close, slowMALen)
trendUp = ta.crossover(fastMA, slowMA)
trendDown = ta.crossunder(fastMA, slowMA)
// --- ATR Value ---
atrValue = ta.atr(atrLength)
// 3) BASE ENTRY LOGIC
// Base Buy Signal: EMA crossover
baseBuySignal = trendUp
var int lastBuyBar = na // Tracks the bar index of the last base entry
inCooldown = not na(lastBuyBar) and (bar_index - lastBuyBar < cooldownBars)
var float baseEntryPrice = na // Stores the price of the initial base entry for SO calculations
// --- Execute Base Entry ---
if baseBuySignal and strategy.position_size == 0 and not inCooldown
baseQty = baseUsd / close // Calculate quantity based on USD
strategy.order("Base Order", strategy.long, qty=baseQty, comment="Base Entry")
baseEntryPrice := close
lastBuyBar := bar_index
// 4) SAFETY ORDERS LOGIC
// --- Calculate SO Trigger Prices ---
float so1TriggerPrice = na
float so2TriggerPrice = na
if strategy.position_size > 0 // Only calculate if a base order has been placed
so1TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo1Multiplier) :
(baseEntryPrice * (1 - fallbackSo1Perc))
so2TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo2Multiplier) :
(baseEntryPrice * (1 - fallbackSo2Perc))
// --- Conditions for SO Execution ---
// Added 'inDateRange' check
// Ensure base order exists, price trigger hit, and the specific SO hasn't filled yet
bool so1Condition = strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2
// --- Execute SO1 ---
if so1Condition
so1Qty = so1Usd / close // Calculate quantity based on USD
strategy.order("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")
// --- Execute SO2 ---
if so2Condition
so2Qty = so2Usd / close // Calculate quantity based on USD
strategy.order("Safety Order 2", strategy.long, qty=so2Qty, comment="SO2")
// 5) AVERAGE ENTRY PRICE
// Use the built-in variable for the average price of the open position
avgEntryPrice = strategy.position_avg_price
// 6) DUAL TRAILING STOP LOGIC
// Variables to track trailing stop levels and states
var float highestSinceEntry = na
var float trailStopPrice = na
var bool stopHitNormal = false
var bool lockInTriggered = false
var float lockInPeak = na
var float lockInStopPrice = na
var bool stopHitLockIn = false
// --- Update Trailing Logic when in a Position ---
if strategy.position_size > 0
// --- Standard Trail ---
highestSinceEntry := na(highestSinceEntry) ? close : math.max(highestSinceEntry, close)
trailStopPrice := highestSinceEntry * (1 - trailStopPerc)
stopHitNormal := close < trailStopPrice
// --- Lock-In Trail ---
if not lockInTriggered and close >= avgEntryPrice * (1 + lockInThreshold)
lockInTriggered := true
lockInPeak := close
if lockInTriggered
lockInPeak := math.max(lockInPeak, close)
lockInStopPrice := lockInPeak * (1 - lockInTrailPct)
stopHitLockIn := close < lockInStopPrice
else
stopHitLockIn := false
lockInStopPrice := na
// --- Reset Variables when Flat ---
else
highestSinceEntry := na
trailStopPrice := na
stopHitNormal := false
lockInTriggered := false
lockInPeak := na
lockInStopPrice := na
stopHitLockIn := false
// lastBuyBar is intentionally NOT reset here, cooldown depends on it
// 7) EXIT CONDITIONS
// Added 'inDateRange' check
// Exit if either trailing stop is hit OR if the trend reverses downward
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0
if exitCondition
strategy.close_all(comment="Exit: SL / LockIn / TrendDown")
// 9) PLOTS & DEBUG TABLE
// --- Plot MAs ---
plot(fastMA, color=color.new(color.green, 0), title="Fast EMA", linewidth=2)
plot(slowMA, color=color.new(color.red, 0), title="Slow EMA", linewidth=2)
// --- Plot Trailing Stops ---
plot(strategy.position_size > 0 ? trailStopPrice : na, color=color.new(color.orange, 0), title="Standard Trailing Stop", style=plot.style_linebr, linewidth=2)
plot(lockInTriggered ? lockInStopPrice : na, color=color.new(color.fuchsia, 0), title="Lock-In Trailing Stop", style=plot.style_linebr, linewidth=2)