
La estrategia de seguimiento de tendencias cruzadas y reversión de promedios móviles es un sistema de negociación cuantitativa basado en la relación entre el precio y la media móvil. La estrategia determina las señales de negociación mediante la determinación de la dirección de las promedios móviles y las rupturas de precios, y tiene un mecanismo de stop loss dinámico.
La estrategia está basada en los siguientes principios centrales:
Mecanismos para determinar las tendencias dinámicas: La estrategia utiliza el movimiento de la media móvil (SMA, EMA o VWMA) para determinar la tendencia del mercado. Cuando la media móvil sube por encima del umbral establecido (el 0.25% por defecto), se determina como una tendencia alcista; cuando la caída supera el mismo umbral, se determina como una tendencia bajista.
Condiciones de admisión exactas:
Mecanismo de participación a varios niveles:
El filtro del tiempoLa estrategia incluye un filtro de horario de negociación para que las operaciones se realicen de forma predeterminada entre las 9:30 y las 15:15 para evitar los efectos de las fluctuaciones durante las horas de no negociación.
Rango de tiempo de detección: Los usuarios pueden personalizar la fecha de inicio de la retroalimentación para evaluar el rendimiento de la estrategia en diferentes entornos de mercado.
Después de un análisis en profundidad, la estrategia tiene las siguientes ventajas:
Adaptación a las condiciones del mercado: La estrategia puede ajustar automáticamente la dirección de las operaciones según las tendencias del mercado y adaptarse a diferentes entornos de mercado a través de la dirección de las medias móviles dinámicas.
El control del riesgoLa estrategia diseña mecanismos de control de riesgo a varios niveles, incluyendo filtros de tendencia, salidas de retorno, promedios móviles que atraviesan salidas y paradas de dureza, para evitar pérdidas considerables.
Sensibilidad de respuesta ajustableAl ajustar el tipo de media móvil (SMA/EMA/VWMA), la base de cálculo (precio de cierre/OHLC/4, etc.) y los parámetros de longitud, el usuario puede optimizar la sensibilidad de la estrategia a las fluctuaciones del mercado.
Diversidad en las opciones de ingresoLa estrategia no solo proporciona las principales señales de entrada de ruptura, sino que también incluye mecanismos de reingreso de retorno, aumentando las oportunidades de negociación y optimizando el precio promedio de entrada.
Visualización del estado de las transacciones: El código integra etiquetas de estado de transacción y etiquetas de entrada y salida, que muestran de forma intuitiva la ejecución de la estrategia para facilitar el análisis y la optimización.
Sistema de alerta completo: Función de alerta de señales de negociación incorporada, soporte para monitoreo y recordatorios en tiempo real, mejora la eficiencia de la ejecución de la estrategia.
Aunque la estrategia está diseñada para ser exhaustiva, los riesgos potenciales son:
Las falsas señales de los mercados: En mercados de oscilación horizontal, la dirección de las medias móviles puede cambiar con frecuencia, lo que provoca un exceso de operaciones y pérdidas. La solución es aumentar el umbral de confirmación de dirección o integrar otras señales de filtración de indicadores.
Sensibilidad de los parámetrosLa estrategia depende en gran medida de la configuración de los parámetros, como la longitud de las medias móviles y el porcentaje de desvalorización de los tipos. Las diferentes variedades de operaciones pueden requerir diferentes configuraciones de parámetros, lo que requiere una optimización adecuada de los parámetros.
Falta de confirmación de las entregasLas estrategias actuales se basan principalmente en el precio y la relación de las medias móviles, sin tener en cuenta los factores de volumen de transacción, que pueden generar señales engañosas en un entorno de bajo volumen de transacción.
Riesgo de brecha por restricciones de horarioLa estrategia de limitar la negociación a ciertos períodos de tiempo puede no ser capaz de hacer frente a cambios significativos en el mercado durante la noche o fuera de los períodos de tiempo de negociación, especialmente cuando los precios se disparan.
Reacción de retraso en la reversión de tendencias: A pesar de la existencia de un mecanismo de determinación de tendencias dinámicas, la reacción a una brusca reversión de tendencia puede tardar y puede conducir a una mayor retirada en un mercado de rápida reversión.
Basado en el análisis de código, la estrategia se puede optimizar en las siguientes direcciones:
Indicador de movilidad integradoLa inclusión de indicadores de dinámica como el RSI y el MACD en el sistema de confirmación de señales mejora la precisión de las tendencias y reduce las falsas señales. Esto se hace porque las rupturas de precios puros a veces pueden conducir a errores de juicio, mientras que los indicadores de dinámica pueden proporcionar confirmación adicional.
Aumento de los componentes de fluctuación de la tasa de adaptación: Ajuste de la entrada de la brecha y la amplitud de la parada de pérdidas en función de la dinámica de la volatilidad del mercado, aumentar los requisitos de la brecha en un entorno de alta volatilidad y reducir la frecuencia de activación; Bajar la brecha en un entorno de baja volatilidad y mejorar la sensibilidad.
Añadir filtro de volumen de transaccionesIntroducción de un mecanismo de confirmación de transacción que requiere un aumento en el volumen de transacción cuando el precio se rompe, filtrando las señales de ruptura débiles en un entorno de baja transacción.
Optimización de la gestión de fondos: Ajuste el tamaño de la posición en función del rendimiento de la operación, la amplitud de las retiradas y la dinámica de la tasa de ganancias, aumente la posición cuando la señal de confianza es alta y reduzca la posición cuando la incertidumbre es alta.
Síntesis del marco de tiempo: La combinación de señales de varios marcos de tiempo, como la exigencia de que las tendencias de las líneas horaria y diaria coincidan para operar, mejora la estabilidad del sistema.
Estrategias de construcción y liquidación de almacenes por lotesLa aplicación de un mecanismo de ingreso y salida por lotes evita el riesgo de un solo punto de ingreso, al tiempo que se obtienen ganancias por medio de la protección parcial de la terminación.
La estrategia de seguimiento y reversión de tendencias cruzada de la media móvil dinámica es un sistema de negociación de diseño exquisito que proporciona a los comerciantes herramientas para responder sistemáticamente a las fluctuaciones del mercado a través del juicio de tendencias dinámicas, condiciones de entrada flexibles y gestión de riesgos en varios niveles. Su característica más grande es que combina las ventajas de seguimiento de tendencias y reajuste de entrada, controlando el riesgo a través de puntos de entrada precisos, mientras se respeta la gran tendencia.
Esta estrategia es especialmente adecuada para los mercados con mucha volatilidad a medio y largo plazo, y los operadores pueden optimizar la estrategia para adaptarla a diferentes tipos de operaciones, ajustando el tipo y la duración de las medias móviles y los parámetros de desvalorización. Aunque existe el riesgo de falsas señales de mercado, como la sensibilidad de los parámetros y la oscilación, la estabilidad y adaptabilidad de la estrategia se pueden mejorar aún más mediante la orientación de optimización recomendada, como la integración de indicadores de dinámica, el ajuste de la volatilidad y la confirmación de múltiples marcos de tiempo.
En general, la estrategia ofrece a los comerciantes un marco estructurado de comercio cuantitativo, con el potencial de obtener mejores retornos de ajuste de riesgo que las compras y tenencias tradicionales, con la configuración correcta de los parámetros y la gestión adecuada del riesgo.
/*backtest
start: 2024-04-29 00:00:00
end: 2024-07-27 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// @ipuneetg
strategy("PG MA Crossover Buy and Sell Options Special", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === INPUTS ===
maType = input.string("SMA", title="Select MA Type", options=["SMA", "EMA", "VWMA"])
calcBasis = input.string("close", title="Calculation Basis", options=["close", "OHLC/4", "HLC/3", "HLCC/4"])
maLength = input.int(21, title="Moving Average Length")
reversalThresholdPercent = input.float(0.25, title="Reversal Threshold (%)", step=0.01)
percentBelowTop = input.float(1.0, title="Exit % Below Top (%)", step=0.1, minval=0.1)
shortProfitPercent = input.float(0.5, title="Short Profit Protection (%)", minval=0.1, step=0.1)
stopLossPercent = input.float(1.5, title="Stop Loss % Above Entry (for Shorts)", step=0.1, minval=0.1)
allowShorts = input.bool(true, title="Allow Short Trades?")
// === SESSION SETTINGS ===
startHour = input.int(9, title="Trade Start Hour")
startMinute = input.int(30, title="Start Minute")
endHour = input.int(15, title="Trade End Hour")
endMinute = input.int(15, title="End Minute")
tradeSession = str.tostring(startHour, "00") + str.tostring(startMinute, "00") + "-" + str.tostring(endHour, "00") + str.tostring(endMinute, "00")
sessionActive = not na(time(timeframe.period, tradeSession))
// === PRICE BASIS ===
basis = switch calcBasis
"OHLC/4" => (open + high + low + close) / 4
"HLC/3" => (high + low + close) / 3
"HLCC/4" => (high + low + close + close) / 4
=> close
// === MOVING AVERAGE ===
ma = switch maType
"SMA" => ta.sma(basis, maLength)
"EMA" => ta.ema(basis, maLength)
"VWMA" => ta.vwma(basis, maLength)
// === DYNAMIC REVERSAL DETECTION ===
var float lastReversal = na
var bool isRising = true
thresholdValue = ma * reversalThresholdPercent / 100
if na(lastReversal)
lastReversal := ma
if ma > lastReversal + thresholdValue
isRising := true
lastReversal := ma
else if ma < lastReversal - thresholdValue
isRising := false
lastReversal := ma
maColor = isRising ? color.green : color.red
// === TRADE VARIABLES ===
var float tradeHigh = na
var float tradeLow = na
var float shortEntryPrice = na
var bool inLong = false
var bool inShort = false
// === LONG & SHORT CONDITIONS ===
longEntry = sessionActive and isRising and close >= ma * (1 + reversalThresholdPercent / 100)
longReEntry = sessionActive and isRising and not inLong and close <= ma * 1.01
shortEntry = sessionActive and not isRising and close <= ma * (1 - reversalThresholdPercent / 100)
shortReEntry = sessionActive and not inShort and close >= ma * 0.998
// === EXIT CONDITIONS ===
exitLongBelowTop = close < tradeHigh * (1 - percentBelowTop / 100)
exitLongBelowMA = close < ma
exitShortAboveTop = close > tradeHigh * (1 + percentBelowTop / 100)
exitShortAboveMA = close > ma
// === EXECUTE TRADES ===
// === LONG SIDE ===
if not inLong and (longEntry or longReEntry)
strategy.entry("Long", strategy.long)
tradeHigh := close
inLong := true
if inLong
tradeHigh := math.max(tradeHigh, high)
if exitLongBelowTop or exitLongBelowMA
strategy.close("Long")
reason = exitLongBelowTop ? "Exit Long (Below Top)" : "Exit Long (Below MA)"
inLong := false
// === SHORT SIDE ===
if allowShorts
if not inShort and (shortEntry or shortReEntry)
if close >= ma * 0.996 and close <= ma * 1.002
strategy.entry("Short", strategy.short)
tradeHigh := close
tradeLow := close
shortEntryPrice := close
inShort := true
if inShort
// Update tradeLow dynamically
tradeLow := na(tradeLow) ? close : math.min(tradeLow, close)
// Calculate Stop Levels
hardStopLossPrice = shortEntryPrice * (1 + stopLossPercent / 100)
hardStopLossTriggered = high >= hardStopLossPrice
normalExitPrice1 = tradeLow * (1 + shortProfitPercent / 100)
normalExitTriggered = close > normalExitPrice1 or close > ma
// Exit Conditions
if hardStopLossTriggered
strategy.close("Short", comment="Hard Stop Loss")
inShort := false
tradeLow := na
else
if normalExitTriggered
reason = close > normalExitPrice1 ? "Exit Short (Above Profit %)" : "Exit Short (Above MA)"
strategy.close("Short", comment=reason)
inShort := false
tradeLow := na
// === PLOT MA ===
plot(ma, color=maColor, title="Dynamic Moving Average", linewidth=2)
// === TRADE STATUS BOX ===
var label tradeStatusLabel = na
var color statusColor = color.blue
var string statusText = "No Open Trade"
if inLong
statusColor := color.green
statusText := "Long Trade Open"
else if inShort
statusColor := color.red
statusText := "Short Trade Open"
if not na(tradeStatusLabel)
label.delete(tradeStatusLabel)