En la carga de los recursos... Cargando...

Estrategia de corto plazo de SMA cruzada con control de extracción máxima y terminación automática

El autor:¿ Qué pasa?, Fecha: 2024-07-29 14:16:58
Las etiquetas:La SMA

img

Resumen general

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.

Principio de la estrategia

  1. Generación de señales comerciales:

    • Se genera una señal larga cuando la SMA de 14 períodos cruza por encima de la SMA de 28 períodos.
    • Se genera una señal corta cuando la SMA de 14 períodos cruza por debajo de la SMA de 28 períodos.
  2. Control de extracción máxima:

    • Seguimiento en tiempo real de la curva de renta variable de la estrategia, registrando los máximos históricos.
    • Cuando el capital corriente cae por debajo del pico, entra en un estado de absorción, registrando el punto más bajo (fondo).
    • El porcentaje de extracción se calcula como: (Pico - Bajo) / Pico * 100%.
    • Si el porcentaje de utilización supera el umbral máximo de utilización preestablecido, la estrategia deja de abrir nuevas posiciones.
  3. Análisis del ciclo de pico a paso:

    • Establecer un porcentaje mínimo de extracción para definir ciclos válidos de pico a fondo.
    • Para cada ciclo válido completado, registrar el número del ciclo, el porcentaje de ejecución anterior, el porcentaje de extracción y el tiempo de finalización.
    • Los resultados del análisis de visualización dan lugar a un formato de tabla que facilita la revisión del rendimiento histórico de la estrategia.

Ventajas estratégicas

  1. 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.

  2. 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.

  3. 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.

  4. Control de riesgos automatizado: Cuando el retiro excede el umbral preestablecido, la estrategia se detiene automáticamente.

  5. 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.

Riesgos estratégicos

  1. 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.

  2. Comercio frecuente: En los mercados oscilantes, las SMA pueden cruzarse con frecuencia, lo que resulta en operaciones excesivas y altos costos de transacción.

  3. 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.

  4. 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.

  5. 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.

Direcciones para la optimización de la estrategia

  1. 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.

  2. Filtros de mercado adicionales: Incorporar otros indicadores técnicos o factores fundamentales, como el RSI o el volumen, para filtrar posibles señales falsas.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Conclusión

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)



Relacionados

Más.