
La estrategia de entrada dinámica de riesgo ajustable para el retroceso de tendencia está diseñada para los operadores de oscilación que desean establecer posiciones múltiples en el retroceso después de un cambio de tendencia a corto plazo, mientras que entran en el alza de inmediato cuando las condiciones del mercado son favorables para el movimiento a la baja. La estrategia combina la confirmación de tendencia de la cruz SMA, el punto de entrada de retroceso porcentual fijo y los parámetros de gestión de riesgo ajustables para lograr la ejecución óptima de la operación.
El núcleo de la estrategia es el uso de una simple media móvil (SMA) cruzada de 10 y 25 períodos para confirmar la dirección de la tendencia, y combinada con una media móvil (EMA) de 150 períodos como condición de filtración adicional para las operaciones a la izquierda. Las operaciones de más tiendas no entran inmediatamente después de la cruzada de SMA, sino que esperan a que el precio regrese al porcentaje especificado para entrar, lo que optimiza el precio de entrada y aumenta el riesgo-beneficio.
El funcionamiento de la estrategia se puede dividir en varias partes clave:
Mecanismo de reconocimiento de tendencias:
Mecanismo de devolución de entrada por múltiples cabezas:
Reglas para entrar sin cabeza:
Gestión de riesgos y estrategias de salida:
Las estrategias utilizan variables de persistencia para rastrear las señales de retorno y asegurarse de que la entrada se realice en el momento adecuado. Cuando no hay posición, el sistema restablece todos los indicadores y niveles para prepararse para la próxima señal de negociación.
Después de analizar el código en profundidad, la estrategia muestra las siguientes ventajas:
Tiempo de ingreso optimizado:
Gestión integral de los riesgos:
Filtrado de tendencias alineadas:
Comentarios visuales:
Altamente adaptable:
A pesar de las muchas ventajas de esta estrategia, hay riesgos a tener en cuenta:
Riesgo de mercado rápido:
El comportamiento de los mercados convulsionados:
Limitaciones de la gestión de riesgos de puntos fijos:
La excesiva dependencia de los indicadores técnicos:
Riesgos de la optimización de parámetros:
A partir de un análisis de código, las siguientes son algunas de las direcciones clave en las que la estrategia puede ser optimizada:
Gestión de riesgos dinámicos:
stopDistance = input.float(2.0) * ta.atr(14)Cómo se calculaFiltrado de intensidad de tendencia:
Análisis de marcos de tiempo múltiples:
Reconocimiento de retroceso inteligente:
Confirmación de la transacción:
Parámetros de adaptación:
La estrategia de entrada dinámica es un sistema de negociación bien diseñado que combina la identificación de tendencias, la optimización de la entrada y la gestión integral del riesgo. Al esperar la corrección de los precios para volver a entrar, la estrategia obtiene un mejor precio de entrada y un mejor índice de retorno al riesgo que el simple sistema de cruzamiento SMA.
La ventaja central de esta estrategia es su flexibilidad y adaptabilidad, permitiendo a los operadores ajustar los parámetros de acuerdo con las preferencias de riesgo personales y las condiciones del mercado. Al mismo tiempo, la función de gestión de riesgos integrada (incluyendo stop loss, stop loss y puntos de capital) ofrece una protección completa de los fondos.
Sin embargo, la estrategia también tiene algunas limitaciones, incluida la capacidad de rendimiento en mercados inestables y la capacidad de gestión de riesgos de puntos fijos. La estabilidad y el rendimiento general de la estrategia pueden mejorarse significativamente mediante la implementación de optimizaciones recomendadas, como gestión de riesgos dinámicos, filtración de la intensidad de la tendencia y confirmación de volumen de operaciones.
Esta es una estrategia básica ideal para los operadores de swing, que se puede personalizar aún más en función del estilo y los objetivos de negociación individuales. Con una configuración razonable de parámetros y un ajuste de monitoreo continuo, la estrategia tiene el potencial de proporcionar resultados de negociación estables en una variedad de entornos de mercado.
/*backtest
start: 2024-08-01 00:00:00
end: 2025-03-25 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("BTCUSD with adjustable sl,tp",
overlay=true,
initial_capital=10000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=10,
calc_on_every_tick=true)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ USER INPUTS
// ─────────────────────────────────────────────────────────────────────────────
longSignalStyle = input.string("Label Up", title="Long Signal Style", options=["Label Up", "Arrow Up", "Cross"])
shortSignalStyle = input.string("Label Down", title="Short Signal Style", options=["Label Down", "Arrow Down", "Cross"])
// Adjustable exit parameters (in points)
tpDistance = input.int(1000, "Take Profit Distance (points)", minval=1)
slDistance = input.int(250, "Stop Loss Distance (points)", minval=1)
beTrigger = input.int(500, "Break-Even Trigger Distance (points)", minval=1)
// Adjustable retracement percentage for long pullback entry (e.g. 0.01 = 1%)
retracementPct = input.float(0.01, "Retracement Percentage (e.g. 0.01 for 1%)", step=0.001)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ INDICATORS: SMA & EMA
// ─────────────────────────────────────────────────────────────────────────────
sma10 = ta.sma(close, 10)
sma25 = ta.sma(close, 25)
ema150 = ta.ema(close, 150)
plot(sma10, color=color.blue, title="SMA 10")
plot(sma25, color=color.red, title="SMA 25")
plot(ema150, color=color.orange, title="EMA 150")
// ─────────────────────────────────────────────────────────────────────────────
// ▌ ENTRY CONDITIONS
// ─────────────────────────────────────────────────────────────────────────────
longCondition = ta.crossover(sma10, sma25)
shortCondition = ta.crossunder(sma10, sma25)
shortValid = close < ema150 // Only take shorts if price is below EMA150
// Plot immediate entry signals (for visual reference)
plotshape(longCondition and (strategy.position_size == 0), title="Long Signal",
style=(longSignalStyle == "Label Up" ? shape.labelup : (longSignalStyle == "Arrow Up" ? shape.triangleup : shape.cross)),
location=location.belowbar, color=color.green, text="Long", size=size.small)
plotshape(shortCondition and shortValid and (strategy.position_size == 0), title="Short Signal",
style=(shortSignalStyle == "Label Down" ? shape.labeldown : (shortSignalStyle == "Arrow Down" ? shape.triangledown : shape.cross)),
location=location.abovebar, color=color.red, text="Short", size=size.small)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ LONG PULLBACK ENTRY USING FIXED PERCENTAGE RETRACEMENT
// ─────────────────────────────────────────────────────────────────────────────
// We use persistent variables to track the pullback signal.
var bool longSignalActive = false
var float pullHigh = na // highest high since long signal activation
var float retraceLevel = na // level = pullHigh * (1 - retracementPct)
// Only consider new entries when no position is open.
if strategy.position_size == 0
// When a long crossover occurs, activate the signal and initialize pullHigh.
if longCondition
longSignalActive := true
pullHigh := high
// If signal active, update pullHigh and compute retracement level.
if longSignalActive
pullHigh := math.max(pullHigh, high)
retraceLevel := pullHigh * (1 - retracementPct)
// When price bounces upward and crosses above the retracement level, enter long
if ta.crossover(close, retraceLevel)
strategy.entry("Long", strategy.long)
longSignalActive := false
// Short entries: enter immediately if conditions are met
if shortCondition and shortValid
strategy.entry("Short", strategy.short)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ EXIT CONDITIONS WITH ADJUSTABLE TP, SL & BE
// ─────────────────────────────────────────────────────────────────────────────
var bool beLong = false
var bool beShort = false
// LONG EXIT LOGIC
if strategy.position_size > 0 and strategy.position_avg_price > 0
longEntry = strategy.position_avg_price
// Additional exit: if SMA(10) crosses below SMA(25) while price < EMA150, exit long
if ta.crossunder(sma10, sma25) and close < ema150
label.new(bar_index, low, "SMA Exit", style=label.style_label_down, color=color.red, textcolor=color.white)
strategy.close("Long", comment="SMA Cross Exit")
// Break-even trigger if price moves in favor by beTrigger points
if close >= longEntry + beTrigger
beLong := true
effectiveLongStop = beLong ? longEntry : (longEntry - slDistance)
if close <= effectiveLongStop
label.new(bar_index, low, (beLong ? "BE Hit" : "SL Hit"), style=label.style_label_down, color=color.red, textcolor=color.white)
strategy.close("Long", comment=(beLong ? "BE Hit" : "SL Hit"))
if close >= longEntry + tpDistance
label.new(bar_index, high, "TP Hit", style=label.style_label_up, color=color.green, textcolor=color.white)
strategy.close("Long", comment="TP Hit")
// SHORT EXIT LOGIC
if strategy.position_size < 0 and strategy.position_avg_price > 0
shortEntry = strategy.position_avg_price
// Basic stop logic
if close >= shortEntry + slDistance
label.new(bar_index, high, (beShort ? "BE Hit" : "SL Hit"), style=label.style_label_up, color=color.red, textcolor=color.white)
strategy.close("Short", comment=(beShort ? "BE Hit" : "SL Hit"))
// Take profit logic
if close <= shortEntry - tpDistance
label.new(bar_index, low, "TP Hit", style=label.style_label_down, color=color.green, textcolor=color.white)
strategy.close("Short", comment="TP Hit")
// Break-even trigger
if close <= shortEntry - beTrigger
beShort := true
effectiveShortStop = beShort ? shortEntry : (shortEntry + slDistance)
if close >= effectiveShortStop
label.new(bar_index, high, (beShort ? "BE Hit" : "SL Hit"), style=label.style_label_up, color=color.red, textcolor=color.white)
strategy.close("Short", comment=(beShort ? "BE Hit" : "SL Hit"))
// Reset BE flags when no position is open
if strategy.position_size == 0
beLong := false
beShort := false
// Reset the pullback signal
if not longSignalActive
pullHigh := na
retraceLevel := na