
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.
Se generan señales de transacción:
El control de retiro de pico:
El análisis de ciclo pico-valo:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
/*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)