Esta es una estrategia de negociación de ruptura de largo plazo basada en líneas de tendencia dinámicas y confirmación de volumen. La estrategia identifica los máximos de oscilación clave mediante el seguimiento de los movimientos de precios en tiempo real y construye líneas de tendencia dinámicamente. Cuando el precio se rompe por encima de la línea de tendencia superior con un volumen significativo, la estrategia entra en una posición larga mientras gestiona el riesgo a través de mecanismos de toma de ganancias, stop-loss y trailing stop basados en porcentajes.
La lógica básica se basa en tres pilares principales: construcción dinámica de la línea de tendencia, confirmación de volumen y sistema de gestión de riesgos. En primer lugar, la estrategia utiliza la función ta.pivothigh para identificar dinámicamente los máximos de oscilación de precios y construye líneas de tendencia superiores basadas en la pendiente e interceptación calculadas a partir de los dos máximos de oscilación más recientes. En segundo lugar, las señales de entrada deben ir acompañadas de un volumen 1,5 veces mayor que el promedio de 20 períodos para garantizar la validez de la ruptura. Por último, la estrategia emplea un porcentaje fijo de take-profit (2%) y stop-loss (1%), con un 1% de trailing stop para bloquear las ganancias.
Esta es una estrategia de seguimiento de tendencias bien diseñada con una lógica robusta. A través de la combinación de líneas de tendencia dinámicas y confirmación de volumen, junto con un sistema integral de gestión de riesgos, la estrategia demuestra una buena adaptabilidad y fiabilidad. Aunque tiene cierta dependencia del mercado, hay un margen significativo de mejora a través de las direcciones de optimización sugeridas. Se aconseja a los comerciantes que realicen una optimización exhaustiva de parámetros y pruebas de retroceso antes de la implementación en vivo.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-09 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Long Only Strategy with Dynamic Trend Lines, Fixed TP/SL, and Trailing SL+", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, pyramiding=0, // Prevent multiple entries calc_on_order_fills=true, calc_on_every_tick=true) // === Parameters === swingThreshold = input.int(5, title="Swing Detection Threshold") tpPercent = input.float(2.0, title="Take Profit (%)") slPercent = input.float(1.0, title="Stop Loss (%)") trailPercent = input.float(1.0, title="Trailing Stop (%)") volumeThresholdMultiplier = input.float(1.5, title="Volume Spike Threshold (x MA)") // === Volume Indicator === avgVolume = ta.sma(volume, 20) volumeSpike = volume > (avgVolume * volumeThresholdMultiplier) // === Detect Swing High === isSwingHigh = ta.pivothigh(high, swingThreshold, swingThreshold) // Variables to store swing highs var float swingHigh1 = na var float swingHigh2 = na var int swingHighBar1 = na var int swingHighBar2 = na // Update swing highs if (isSwingHigh) swingHigh2 := swingHigh1 swingHighBar2 := swingHighBar1 swingHigh1 := high[swingThreshold] swingHighBar1 := bar_index - swingThreshold // === Calculate Upper Trend Line === var float upperSlope = na var float upperIntercept = na // Calculate slope and intercept for upper trend line if there are two swing highs if (not na(swingHigh1) and not na(swingHigh2)) deltaX = swingHighBar1 - swingHighBar2 if (deltaX != 0) upperSlope := (swingHigh1 - swingHigh2) / deltaX upperIntercept := swingHigh1 - (upperSlope * swingHighBar1) else upperSlope := 0 upperIntercept := swingHigh1 // Calculate trend line price for the current bar var float upperTrendPrice = na if (not na(upperSlope) and not na(upperIntercept)) upperTrendPrice := upperSlope * bar_index + upperIntercept // Calculate trend line price for the previous bar var float upperTrendPrice_prev = na if (not na(upperSlope) and not na(upperIntercept)) upperTrendPrice_prev := upperSlope * (bar_index - 1) + upperIntercept // === Buy Condition Based on Trend Line Breakout === // Buy Signal: Price breaks above Upper Trend Line with volume spike breakoutBuyCondition = (not na(upperTrendPrice)) and (close > upperTrendPrice) and (not na(upperTrendPrice_prev)) and (close[1] <= upperTrendPrice_prev) and volumeSpike // === Manage Single Position === // Calculate Take Profit and Stop Loss levels based on percentage longTakeProfit = close * (1 + tpPercent / 100) longStopLoss = close * (1 - slPercent / 100) // Calculate Trailing Stop as trail_offset (in price) trail_offset = close * (trailPercent / 100) // Execute Trade with Single Position Management if (breakoutBuyCondition) // Close existing short position if any if (strategy.position_size < 0) strategy.close("Sell") // Open long position strategy.entry("Buy", strategy.long) // Set Take Profit, Stop Loss, and Trailing Stop Loss for long position strategy.exit("Take Profit Buy", from_entry="Buy", limit=longTakeProfit, stop=longStopLoss, trail_offset=trail_offset) // Plot Buy Signal plotshape(breakoutBuyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")