Estrategia de cruce de SMA larga y corta combinada con control de retroceso de pico y terminación automática

SMA
Fecha de creación: 2024-07-29 14:16:58 Última modificación: 2024-07-29 14:16:58
Copiar: 0 Número de Visitas: 555
1
Seguir
1617
Seguidores

Estrategia de cruce de SMA larga y corta combinada con control de retroceso de pico y terminación automática

Descripción general

La estrategia es un sistema de negociación multi-hoja que combina una señal de cruce de media móvil simple (SMA) y un control de reversión de pico. Utiliza cruces de SMA de 14 y 28 días para generar señales de negociación multi-hoja, mientras monitorea en tiempo real el reversión de pico de la estrategia. La estrategia se detiene automáticamente cuando la reversión supera el umbral predeterminado.

Principio de estrategia

  1. Se generan señales de transacción:

    • Cuando el SMA de 14 pasa por el SMA de 28, se produce una señal de multiplicación.
    • Cuando el SMA de 14 pulsa el SMA de 28, se genera una señal de brecha.
  2. El control de retiro de pico:

    • La curva de intereses de las estrategias en tiempo real, registrando los máximos históricos (pico)
    • Cuando el derecho-interés actual está por debajo del pico, entra en estado de retirada, registrando un mínimo.
    • Calcula el porcentaje de retroceso = (pico - fondo del valle) / pico * 100%。
    • Si el porcentaje de retiro supera el límite máximo de retiro establecido, la estrategia detiene la apertura de nuevas posiciones.
  3. El análisis de ciclo pico-valo:

    • Establece el porcentaje mínimo de retroceso para definir el ciclo pico-fondo válido.
    • Cada vez que se completa un ciclo válido, se registra el número del ciclo, la magnitud de la subida anterior, la magnitud de la retirada y la hora de finalización.
    • Los resultados del análisis se muestran en forma de tablas para que los operadores puedan ver el rendimiento histórico de la estrategia.

Ventajas estratégicas

  1. La combinación de seguimiento de tendencias y control de riesgos: La estrategia de cruce de SMA es un método clásico de seguimiento de tendencias, mientras que el control de retroceso de pico ofrece una capa adicional de gestión de riesgos. Esta combinación permite controlar eficazmente el riesgo de bajada al mismo tiempo que se captura la tendencia del mercado.

  2. Es muy adaptable: La estrategia se puede ajustar de manera flexible en función de las diferentes circunstancias del mercado y las preferencias de riesgo personales mediante la configuración paramétrica de los límites máximos y mínimos de retirada.

  3. Indicadores de riesgo transparentes: El análisis de ciclo pico-valo proporciona información detallada sobre el retiro histórico, lo que permite a los operadores conocer de manera intuitiva las características de riesgo de la estrategia, lo que ayuda a tomar decisiones comerciales más inteligentes.

  4. Control automático de riesgos: Cuando la retirada supera el umbral predeterminado, la estrategia detiene automáticamente el comercio, un mecanismo que puede ser eficaz para evitar pérdidas continuas en un entorno de mercado desfavorable.

  5. El análisis de rendimiento completo: Además de los indicadores de retroalimentación convencionales, la estrategia también proporciona datos detallados sobre los ciclos de picos y valles, incluyendo información sobre la amplitud de las subidas y retrocesos y el tiempo, lo que ayuda a analizar en profundidad el rendimiento de la estrategia.

Riesgo estratégico

  1. La excesiva dependencia de los datos históricos: Las estrategias de cruce SMA se basan en datos históricos de precios y pueden reaccionar con retraso en un mercado que cambia rápidamente, lo que provoca señales erróneas.

  2. Las transacciones frecuentes: En un mercado convulso, los SMA pueden cruzarse con frecuencia, lo que genera exceso de transacciones y altos costos de transacción.

  3. El retiro potencial es grande: A pesar de la máxima retracción controlada, una sola caída puede causar grandes pérdidas en momentos de fuerte volatilidad del mercado.

  4. Sensibilidad de los parámetros: El rendimiento de la estrategia depende en gran medida de la elección de los períodos de SMA y de los límites de retirada. La configuración inadecuada de los parámetros puede dar lugar a un resultado suboptimista.

  5. La oportunidad perdida de cambiar: Cuando se alcanza el límite máximo de retirada para detener el comercio, la estrategia puede perder la oportunidad de una reversión del mercado.

Dirección de optimización de la estrategia

  1. Introducir ajustes de parámetros dinámicos: Se puede considerar el ajuste de los ciclos de SMA y la retirada de los límites en función de la dinámica de la volatilidad del mercado para adaptarse a diferentes circunstancias del mercado.

  2. Los filtros de mercado adicionales: En combinación con otros indicadores técnicos o fundamentales, como el RSI o el volumen de transacciones, para filtrar posibles señales falsas.

  3. La entrada y salida por lotes: En lugar de operar el almacén completo, se puede construir el almacén en lotes para reducir el riesgo de una sola decisión.

  4. El sistema de suspensión se ha puesto en marcha: Basado en el control de retiro, se añade la función de parada dinámica para bloquear las ganancias y mejorar la tasa de rendimiento general.

  5. Optimización de la gestión de fondos: Implementar una gestión dinámica de posiciones basada en el tamaño de la cuenta y la volatilidad del mercado para un mejor control del riesgo.

  6. La introducción de un algoritmo de aprendizaje automático: Utiliza técnicas de aprendizaje automático para optimizar la selección de parámetros y el proceso de generación de señales, mejorando la adaptabilidad y la precisión de las estrategias.

Resumir

La estrategia SMA Cross Multi-Hole combinando control de reversión de pico con terminación automática es un sistema de trading cuantitativo que combina seguimiento de tendencias y gestión de riesgos. Captura las tendencias del mercado mediante el cruce de simples medias móviles, mientras que utiliza el control de reversión de pico para administrar el riesgo a la baja. La estrategia se distingue por su detallada función de análisis de ciclos de pico-valo, que proporciona a los operadores una herramienta para obtener una comprensión profunda de las características de riesgo de la estrategia.

Aunque la estrategia presenta algunos riesgos inherentes, como una dependencia excesiva de los datos históricos y la sensibilidad de los parámetros, puede mejorar significativamente su estabilidad y rentabilidad mediante la optimización y mejora adecuadas, como la introducción de ajustes de parámetros dinámicos, la adición de filtros de mercado adicionales y la implementación de una gestión de fondos más inteligente.

En general, esta estrategia ofrece a los comerciantes un buen punto de partida, sobre la base del cual se puede personalizar y optimizar aún más para satisfacer los objetivos de negociación y las preferencias de riesgo de cada individuo. El diseño modular de la estrategia también hace que sea fácil de integrar con otras estrategias de negociación o tecnologías de gestión de riesgos, sentando las bases para la construcción de sistemas de negociación más complejos y completos.

Código Fuente de la Estrategia
/*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)