Esta estrategia es un sistema de negociación de largo corto que combina señales de cruce de promedio móvil simple (SMA) con control de caída de pico. Utiliza el cruce de SMA de 14 períodos y 28 períodos para generar señales de negociación largas y cortas mientras monitoriza simultáneamente la caída máxima de la estrategia. Cuando la caída excede un umbral preestablecido, la estrategia detiene automáticamente la negociación. Además, la estrategia incluye una característica detallada de análisis de ciclo de pico a mínimo para ayudar a los operadores a comprender mejor las características de riesgo de la estrategia.
Generación de señales comerciales:
Control de extracción máxima:
Análisis del ciclo de pico a paso:
Combina el seguimiento de tendencias y el control de riesgos: La estrategia de cruce de SMA es un método clásico de seguimiento de tendencias, mientras que el control de retirada de picos proporciona una capa adicional de gestión del riesgo.
Alta adaptabilidad: Mediante la parametrización de los umbrales máximos y mínimos de utilización, la estrategia puede ajustarse de forma flexible a los diferentes entornos de mercado y a las preferencias personales de riesgo.
Indicadores de riesgo transparentes: El análisis del ciclo de pico a mínimo proporciona información detallada sobre el descenso histórico, lo que permite a los operadores comprender intuitivamente las características de riesgo de la estrategia, lo que ayuda a tomar decisiones comerciales más informadas.
Control de riesgos automatizado: Cuando el retiro excede el umbral preestablecido, la estrategia se detiene automáticamente.
Análisis integral del rendimiento: Además de las métricas de backtesting convencionales, la estrategia proporciona datos detallados del ciclo de pico a mínimo, incluidos los porcentajes de ejecución, los porcentajes de retirada y la información temporal, lo que facilita un análisis en profundidad del rendimiento de la estrategia.
Exceso de confianza en los datos históricos: La estrategia de cruce de la SMA se basa en datos históricos de precios y puede reaccionar lentamente en mercados que cambian rápidamente, lo que conduce a señales falsas.
Comercio frecuente: En los mercados oscilantes, las SMA pueden cruzarse con frecuencia, lo que resulta en operaciones excesivas y altos costos de transacción.
Posibilidad de grandes retiros: A pesar del control máximo de la absorción, una sola gran caída durante una fuerte volatilidad del mercado puede resultar en pérdidas significativas.
Sensitividad del parámetro: El rendimiento de la estrategia depende en gran medida de la elección de los períodos de SMA y los umbrales de extracción.
Oportunidades perdidas de reversión: Cuando la negociación se detiene después de alcanzar el umbral máximo de extracción, la estrategia puede perder las oportunidades proporcionadas por las inversiones del mercado.
Introducir el ajuste de parámetros dinámicos: Considerar el ajuste dinámico de los períodos de SMA y de los umbrales de extracción en función de la volatilidad del mercado para adaptarse a los diferentes entornos de mercado.
Filtros de mercado adicionales: Incorporar otros indicadores técnicos o factores fundamentales, como el RSI o el volumen, para filtrar posibles señales falsas.
Implementar la entrada y salida por etapas: En lugar de operaciones de todo o nada, implementar la creación y el cierre de posiciones por fases para reducir el riesgo de decisiones únicas.
Añadir Mecanismo de Ganancia: Además del control de extracción, añadir una función dinámica de toma de beneficios para bloquear las ganancias y mejorar los rendimientos generales.
Optimice la gestión del dinero: Implementar un dimensionamiento dinámico de las posiciones basado en el tamaño de la cuenta y la volatilidad del mercado para un mejor control del riesgo.
Introduzca algoritmos de aprendizaje automático: Utilizar técnicas de aprendizaje automático para optimizar los procesos de selección de parámetros y generación de señales, mejorando la adaptabilidad y precisión de la estrategia.
La estrategia SMA combinada con el control de caída de pico y la terminación automática es un sistema de negociación cuantitativo que equilibra el seguimiento de tendencias y la gestión de riesgos. Captura las tendencias del mercado a través de cruces de promedios móviles simples mientras gestiona el riesgo a la baja utilizando el control de caída de pico. La característica única de la estrategia radica en su detallado análisis del ciclo de pico a mínimo, proporcionando a los operadores una herramienta para comprender profundamente las características de riesgo de la estrategia.
Si bien la estrategia tiene algunos riesgos inherentes, como la dependencia excesiva de los datos históricos y la sensibilidad de los parámetros, puede mejorar significativamente su robustez y rentabilidad a través de la optimización y las mejoras apropiadas.
En general, esta estrategia proporciona a los traders un buen punto de partida que puede ser personalizado y optimizado para cumplir con los objetivos comerciales individuales y las preferencias de riesgo.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 00:00:00 period: 1d basePeriod: 1h 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/ capital = 10000 //@version=5 strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100) // The code below is from Tradingwhale LLC /// ============================================================================== // Peak-Trough Cycles with Date and Prev. RunUp // Initialize variables showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?") min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.") maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.") var float equityPeak = na var float equityTrough = na var int cycleCount = 0 var bool inDrawdown = false var float initialCapital = capital var float prevTrough = initialCapital var float prevRunUp = na var bool useLighterGray = true var int lastYear = na // Variable to indicate whether the strategy should end var bool end_strategy = false // Table to display data var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1) // Function to convert float to percentage string f_to_percent(value) => str.tostring(value, "#.##") + "%" // Function to get month/year string without commas get_month_year_string() => str.tostring(year) + "/" + str.tostring(month) // Update the table headers if (bar_index == 0 and showTable) table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal) // Track peaks and troughs in equity if (na(equityPeak) or strategy.equity > equityPeak) if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage > min_trough cycleCount += 1 prevRunUp := (equityPeak - prevTrough) / prevTrough * 100 if cycleCount <= 20 and showTable currentYear = year if na(lastYear) or currentYear != lastYear useLighterGray := not useLighterGray lastYear := currentYear rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50) table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal) prevTrough := equityTrough equityPeak := strategy.equity equityTrough := na inDrawdown := false else if (strategy.equity < equityPeak) equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity) inDrawdown := true // Calculate if the strategy should end if not na(equityPeak) and not na(equityTrough) drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage >= maxdraw end_strategy := true // This code below is from Tradingview, but with additions where commented (see below) longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Long Entry Id", strategy.long) shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Short Entry Id", strategy.short)