Esta estrategia se basa en las características estadísticas de las recesiones extremas del mercado. Al analizar estadísticamente las reducciones y usar desviaciones estándar para medir los extremos de volatilidad del mercado, inicia posiciones de compra cuando las caídas del mercado exceden los rangos normales. La idea central es capturar oportunidades de sobreventa causadas por el pánico del mercado, identificando oportunidades de inversión a través de métodos estadísticos matemáticos que surgen de la irracionalidad del mercado.
La estrategia emplea una ventana de tiempo de rodaje para calcular las reducciones máximas de precios y sus características estadísticas. Primero calcula el precio más alto en los últimos 50 períodos, luego calcula el porcentaje de reducción del precio de cierre actual en relación con el precio más alto. Luego calcula la media y la desviación estándar de las reducciones, estableciendo -1 desviación estándar como el umbral de activación. Cuando la reducción del mercado excede la media menos un conjunto múltiple de desviaciones estándar, lo que indica condiciones potenciales de sobreventa, se ingresa una posición larga. Las posiciones se cierran automáticamente después de 35 períodos. La estrategia también traza curvas de reducción y uno, dos y tres niveles de desviación estándar para la evaluación visual de las condiciones de sobreventa del mercado.
Esta estrategia captura oportunidades de sobreventa del mercado a través de métodos estadísticos, con una sólida base teórica y valor práctico. La lógica de la estrategia es simple y clara con parámetros ajustables, adecuados como una estrategia base para la expansión y optimización. La estabilidad y rentabilidad de la estrategia se pueden mejorar aún más agregando indicadores técnicos y medidas de control de riesgos.
/*backtest start: 2019-12-23 08:00:00 end: 2024-11-28 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Buy When There's Blood in the Streets Strategy", overlay=false, shorttitle="BloodInTheStreets") //This strategy identifies opportunities to buy during extreme market drawdowns based on standard deviation thresholds. //It calculates the maximum drawdown over a user-defined lookback period, identifies extreme deviations from the mean, //and triggers long entries when specific conditions are met. The position is exited after a defined number of bars. // User Inputs lookbackPeriod = input.int(50, title="Lookback Period", minval=1, tooltip="Period to calculate the highest high for drawdown") stdDevLength = input.int(50, title="Standard Deviation Length", minval=1, tooltip="Length of the period to calculate standard deviation") stdDevThreshold = input.float(-1.0, title="Standard Deviation Threshold", tooltip="Trigger level for long entry based on deviations") exitBars = input.int(35, title="Exit After (Bars)", minval=1, tooltip="Number of bars after which to exit the trade") // Drawdown Calculation peakHigh = ta.highest(high, lookbackPeriod) drawdown = ((close - peakHigh) / peakHigh) * 100 // Standard Deviation Calculation drawdownStdDev = ta.stdev(drawdown, stdDevLength) meanDrawdown = ta.sma(drawdown, stdDevLength) // Define Standard Deviation Levels stdDev1 = meanDrawdown - drawdownStdDev stdDev2 = meanDrawdown - 2 * drawdownStdDev stdDev3 = meanDrawdown - 3 * drawdownStdDev // Plot Drawdown and Levels plot(drawdown, color=color.red, linewidth=2, title="Drawdown (%)") plot(meanDrawdown, color=color.blue, linewidth=2, title="Mean Drawdown") plot(stdDev1, color=color.green, linewidth=1, title="1st Std Dev") plot(stdDev2, color=color.orange, linewidth=1, title="2nd Std Dev") plot(stdDev3, color=color.purple, linewidth=1, title="3rd Std Dev") // Entry Condition var float entryBar = na goLong = drawdown <= meanDrawdown + stdDevThreshold * drawdownStdDev if (goLong and strategy.position_size == 0) strategy.entry("Long", strategy.long) entryBar := bar_index // Exit Condition if (strategy.position_size > 0 and not na(entryBar) and bar_index - entryBar >= exitBars) strategy.close("Long")