
La estrategia de seguimiento de tendencias de Haiken Ashe es un sistema de negociación integral que combina los beneficios de los filtros de los gráficos de Haiken Ashe, el indicador de tendencias súper y el índice de tendencias promedio (ADX) para identificar los movimientos de tendencia fuertes y administrar eficazmente los fondos. La estrategia se centra en capturar el dinamismo de las tendencias establecidas, mientras que se utiliza un mecanismo de alto riesgo de tres niveles avanzados para proteger los fondos y bloquear las ganancias.
La estrategia de seguimiento de tendencias de Haykanush se basa en la sinergia de tres indicadores tecnológicos centrales:
El análisis de los mapas de HaykanushLa estrategia se enfoca en las “entidades” de Hickenlooper que no tienen casi ninguna línea de sombra superior o inferior, que indican que el precio se mueve de forma decisiva en una dirección y casi no se desvía, lo que sugiere un fuerte impulso y la continuación de la tendencia. Las rayas verdes sin línea de sombra inferior se consideran como señales múltiples, y las rayas rojas sin línea de sombra superior se consideran como señales vacías.
Filtración de los indicadores de tendencias súper: El sistema utiliza el indicador de tendencia súper ((factor por defecto: 3.0, ciclo ATR: 10) para confirmar la dirección de la tendencia potencial. La señal de entrada debe coincidir con la dirección de la tendencia súper, lo que aumenta la fiabilidad de la señal y reduce los errores de transacción.
El filtro ADX (opcional)El indicador de dirección promedio se utiliza para evaluar la intensidad de la tendencia, y las operaciones se activan solo cuando el ADX supera el umbral especificado (default: 25), lo que ayuda a filtrar las señales de ruido en los mercados de oscilación o horizontal.
El sistema tiene reglas claras de entrada y salida:
La característica más notable de esta estrategia es su innovador sistema de tres niveles de stop loss:
Gestión de riesgos en varias capasLa ventaja más destacada de la estrategia es que el sistema de tres niveles de stop loss ofrece una protección completa de los fondos para adaptarse a diferentes condiciones de mercado y escenarios de riesgo.
Altamente adaptableTodos los componentes (Supertrend, ADX) pueden ser activados o desactivados en función de las diferentes condiciones del mercado, y los parámetros también pueden ser ajustados, lo que permite una gran flexibilidad en la estrategia.
Una fuerte capacidad de captura de tendenciasCombinando las señales visuales claras de Heiken-Ashi, la confirmación de supertrends y la evaluación de la fuerza de la tendencia en el ADX, la estrategia permite identificar movimientos de tendencias fuertes.
La respuesta visual es clara.La estrategia muestra el estado de la posición, el precio de entrada y el nivel de parada actual en el gráfico, lo que permite al comerciante comprender y seguir la ejecución de la estrategia de forma intuitiva.
Administración de fondos integradaLa estrategia utiliza un método de gestión de posiciones basado en porcentajes de derechos y intereses (por defecto: 3%) que asegura que el margen de riesgo sea constante a medida que cambia el tamaño de la cuenta.
Sistema de intercambio completoEl objetivo de la plataforma es proporcionar un proceso de negociación completo desde la señal de entrada hasta las reglas de salida, sin necesidad de tomar decisiones o indicadores adicionales.
El riesgo de optimización excesiva: La estrategia contiene varios parámetros ajustables, lo que puede causar problemas de ajuste de curva, es decir, la estrategia funciona bien en datos históricos, pero no funciona bien en operaciones en tiempo real. La solución es utilizar datos históricos lo suficientemente largos para realizar un retrospectivo y probar la solidez de la estrategia en diferentes condiciones de mercado.
Riesgo de inversión de tendenciaA pesar de tener un mecanismo de alto riesgo multicamillado, la estrategia puede enfrentarse a un gran retroceso cuando una tendencia fuerte se invierte repentinamente. Las fluctuaciones extremas en el mercado pueden provocar que el alto riesgo no se active a tiempo, causando pérdidas más altas de las esperadas. La solución es considerar aumentar los filtros de volatilidad o implementar reglas de gestión de riesgos más estrictas.
Sensibilidad de los parámetrosLos diferentes parámetros de configuración pueden dar lugar a resultados muy diferentes, especialmente el factor de tendencia súper y el umbral de ADX. Esto requiere que el comerciante tenga una comprensión profunda de la influencia de cada parámetro y encuentre el punto de equilibrio adecuado para el entorno de mercado en particular.
Bajo rendimiento en entornos de baja volatilidadEn un mercado de baja volatilidad o horizontal, la estrategia puede generar múltiples señales erróneas, lo que lleva a una negociación de “pico”. La solución es suspender la negociación en este tipo de entornos, o agregar un filtro adicional de entornos de mercado.
Riesgos de la gestión de fondosLa administración de posiciones de porcentaje fijo puede no ser adecuada para todos los entornos de mercado y puede ser necesario reducir el tamaño de las posiciones para controlar el riesgo en mercados altamente volátiles.
Mecanismos de adaptación más volátiles: La estrategia actual puede optimizarse aún más mediante la introducción de filtros de volatilidad, como el índice de fluctuación histórica (HV) o el índice de fluctuación implícita (IV), para ajustar automáticamente los parámetros en diferentes entornos de mercado. Esto permitirá que la estrategia mantenga un rendimiento estable tanto en períodos de alta como baja volatilidad.
Integrar el filtro de tiempoConsidere agregar filtros basados en el tiempo para evitar comerciar en períodos de tiempo con poca volatilidad o tendencias de mercado conocidas. Esto es especialmente útil para comerciar con variedades específicas, ya que diferentes variedades muestran diferentes características de comportamiento en diferentes períodos del día.
La introducción de la optimización del aprendizaje automáticoSe puede usar la tecnología de aprendizaje automático para identificar la combinación de parámetros óptima, en lugar de depender de la configuración de parámetros estáticos. Esto puede hacerse mediante el análisis de patrones en los datos históricos para predecir qué configuración de parámetros podría funcionar mejor en condiciones de mercado específicas en el futuro.
Añadir filtros de mercado relevantesAumentar las señales de entrada observando el comportamiento de los mercados o índices relevantes, por ejemplo, considerando la tendencia general del mercado o la fortaleza de los mercados relevantes al negociar con una variedad específica.
Optimización de los mecanismos de pérdidasEl sistema de pérdidas de tres niveles actual puede optimizarse aún más, por ejemplo, ajustando el porcentaje de pérdidas de seguro en función de la volatilidad dinámica, o utilizando niveles de soporte / resistencia para configurar con precisión los puntos de pérdidas de oscilación, en lugar de simples puntos altos y bajos de retorno.
Análisis integrado de volumen de transaccionesSe añade un filtro de volumen de transacciones durante la confirmación de la señal para asegurar que la tendencia de los precios está respaldada por un volumen de transacciones suficiente, lo que aumenta la fiabilidad de la señal.
La estrategia de seguimiento de tendencias de Haiken Ashe es un sistema de negociación complejo y completo, que se centra en capturar oportunidades dinámicas en tendencias fuertes a través de una combinación única de gráficos de Haiken Ashe, indicadores de tendencias súper y filtros ADX. Su sistema de detención de pérdidas en tres niveles ofrece una administración de riesgos completa, mientras que su configuración de parámetros personalizables lo permite adaptarse a una variedad de condiciones de mercado.
Las principales ventajas de esta estrategia residen en sus claras señales visuales, su poderosa capacidad de reconocimiento de tendencias y su completo mecanismo de protección de fondos. Sin embargo, los operadores deben ser conscientes de los desafíos de la optimización de los parámetros y de las posibles limitaciones en un entorno de baja volatilidad.
La estrategia puede mejorar aún más su estabilidad y adaptabilidad mediante la implementación de direcciones de optimización de las recomendaciones, como la adición de mecanismos de adaptación a la volatilidad, la integración de filtros de tiempo y el análisis de volumen de transacciones. En última instancia, la estrategia de seguimiento de tendencias de Heikhan Ashi representa un enfoque equilibrado que combina la claridad de las señales del análisis técnico y los principios de gestión de riesgos sistematizados, proporcionando una herramienta valiosa para los operadores de seguimiento de tendencias.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Heiken Ashi Supertrend ADX - Strategy", overlay=true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0, calc_on_every_tick=true, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=3)
// Supertrend Settings
useSupertrend = input.bool(true, "Use Supertrend for Entries", group="Supertrend Settings")
atrPeriod = input.int(10, "ATR Period", minval=1, group="Supertrend Settings")
factor = input.float(3.0, "Supertrend Factor", minval=0.5, step=0.1, group="Supertrend Settings")
// ADX Filter Settings
useAdxFilter = input.bool(false, "Use ADX Filter", group="ADX Filter")
adxPeriod = input.int(14, "ADX Period", minval=1, group="ADX Filter")
adxThreshold = input.float(25, "ADX Threshold", minval=0, group="ADX Filter")
// Stop Loss Options
useSwingStop = input.bool(false, "Use Swing Point Stop", group="Stop Loss Options")
swingLookback = input.int(3, "Swing Lookback Periods", minval=1, maxval=20, group="Stop Loss Options")
useSafetyNetStop = input.bool(true, "Use Insurance Stop", group="Stop Loss Options")
safetyNetPercent = input.float(5.0, "Insurance Stop Loss Percent", minval=0.1, step=0.1, group="Stop Loss Options")
// Trailing Stop Loss Settings
useTrailingStop = input.bool(true, "Use ATR Trailing Stop", group="Stop Loss Options")
trailAtrMultiplier = input.float(2.0, "Trailing Stop ATR Multiplier", minval=0.1, step=0.1, group="Stop Loss Options")
// Get HA data for signals
ha_security = ticker.heikinashi(syminfo.tickerid)
[o, h, l, c] = request.security(ha_security, timeframe.period, [open, high, low, close])
// Get real price data
real_open = open
real_high = high
real_low = low
real_close = close
// Calculate Supertrend using built-in function with real price data
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
supertrend := barstate.isfirst ? na : supertrend
// Determine if we're in an uptrend or downtrend based on Supertrend
isUptrend = direction < 0 // In TradingView, negative direction means uptrend
isDowntrend = direction > 0 // In TradingView, positive direction means downtrend
// Calculate ATR for visualization
atrValue = ta.atr(atrPeriod)
// Calculate ADX and Trade Logic
[diplus, diminus, adx] = ta.dmi(adxPeriod, adxPeriod)
int trade = 0
if trade == 0 and diplus > diminus
trade := 1
else if trade == 0 and diminus > diplus
trade := -1
else if trade == 1 and diminus > diplus
trade := -1
else if trade == -1 and diplus > diminus
trade := 1
else
trade := trade[1]
// Combine with ADX Threshold
isAdxBullish = diplus > diminus and adx > adxThreshold
isAdxBearish = diminus > diplus and adx > adxThreshold
// Debug ADX Values (only if needed for development)
// plot(adx, "ADX", color=color.orange, linewidth=1)
// plot(diplus, "DI+", color=color.green, linewidth=1)
// plot(diminus, "DI-", color=color.red, linewidth=1)
// hline(adxThreshold, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)
// Check for wicks on the current candle
threshold = syminfo.mintick * 0.1
noBottomWick = math.abs(math.min(o, c) - l) <= threshold
noTopWick = math.abs(h - math.max(o, c)) <= threshold
// Identify candle color and signal conditions
isGreenCandle = c > o
isRedCandle = c < o
// KEY INTEGRATION: Color the real bars based on HA trend
bullishColor = color.green // Green for long/bullish
bearishColor = color.purple // Purple for short/bearish
barcolor(isGreenCandle ? bullishColor : bearishColor)
// Signal conditions for both entry and exit
longCondition = (isGreenCandle and noBottomWick and barstate.isconfirmed) and (not useSupertrend or isUptrend) and (not useAdxFilter or isAdxBullish)
shortCondition = (isRedCandle and noTopWick and barstate.isconfirmed) and (not useSupertrend or isDowntrend) and (not useAdxFilter or isAdxBearish)
exitLongCondition = isRedCandle and noTopWick and barstate.isconfirmed
exitShortCondition = isGreenCandle and noBottomWick and barstate.isconfirmed
// Calculate swing points based on real candles (not HA)
swingLow = ta.lowest(real_low, swingLookback)
swingHigh = ta.highest(real_high, swingLookback)
// Position tracking
var int position = 0 // 0 = no position, 1 = long, -1 = short
var float entryPrice = na
var float trailStopLevel = na // For ATR trailing stop
var float swingStopLevel = na // For swing point stop
var float safetyNetStopLevel = na // For safety net stop
var float highestSinceEntry = na // For tracking highest price since entry (for long positions)
var float lowestSinceEntry = na // For tracking lowest price since entry (for short positions)
// Alert variables
var bool longAlert = false
var bool shortAlert = false
var bool exitLongAlert = false
var bool exitShortAlert = false
// Reset alerts each bar
longAlert := false
shortAlert := false
exitLongAlert := false
exitShortAlert := false
// Handle entries and exits
if longCondition and (position <= 0)
if position < 0
exitShortAlert := true
strategy.close("Short", comment="Exit Short")
position := 0
longAlert := true
strategy.entry("Long", strategy.long, comment="Enter Long")
position := 1
entryPrice := real_close
highestSinceEntry := real_close
lowestSinceEntry := na
// Initialize trailing stops
if useTrailingStop
trailStopLevel := real_close - (atrValue * trailAtrMultiplier)
// Initialize swing point stop
if useSwingStop
swingStopLevel := swingLow
// Initialize safety net stop
if useSafetyNetStop
safetyNetStopLevel := real_close * (1 - safetyNetPercent / 100)
if shortCondition and (position >= 0)
if position > 0
exitLongAlert := true
strategy.close("Long", comment="Exit Long")
position := 0
shortAlert := true
strategy.entry("Short", strategy.short, comment="Enter Short")
position := -1
entryPrice := real_close
highestSinceEntry := na
lowestSinceEntry := real_close
// Initialize trailing stops
if useTrailingStop
trailStopLevel := real_close + (atrValue * trailAtrMultiplier)
// Initialize swing point stop
if useSwingStop
swingStopLevel := swingHigh
// Initialize safety net stop
if useSafetyNetStop
safetyNetStopLevel := real_close * (1 + safetyNetPercent / 100)
if position > 0 and exitLongCondition
exitLongAlert := true
strategy.close("Long", comment="Exit Long Signal")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
if position < 0 and exitShortCondition
exitShortAlert := true
strategy.close("Short", comment="Exit Short Signal")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Check for swing point stop hit
if useSwingStop and position != 0 and not na(swingStopLevel)
// For long positions, check if price drops below the swing low
if position > 0 and real_low <= swingStopLevel
strategy.close("Long", comment="Swing Point Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// For short positions, check if price rises above the swing high
else if position < 0 and real_high >= swingStopLevel
strategy.close("Short", comment="Swing Point Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Check for safety net stop loss hit
if useSafetyNetStop and position != 0 and not na(safetyNetStopLevel)
// For long positions, check if price drops below the safety net level
if position > 0 and real_low <= safetyNetStopLevel
strategy.close("Long", comment="Safety Net Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// For short positions, check if price rises above the safety net level
else if position < 0 and real_high >= safetyNetStopLevel
strategy.close("Short", comment="Safety Net Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Track highest/lowest prices for trailing stop calculation
if position > 0 and not na(highestSinceEntry)
highestSinceEntry := math.max(highestSinceEntry, real_high)
if position < 0 and not na(lowestSinceEntry)
lowestSinceEntry := math.min(lowestSinceEntry, real_low)
// Update and check trailing stop (ATR-based)
if useTrailingStop and position != 0 and not na(trailStopLevel)
// Update trailing stop level for long positions
if position > 0
// Calculate new potential trailing stop level
trailStopNew = real_close - (atrValue * trailAtrMultiplier)
// Only move the stop up, never down
if trailStopNew > trailStopLevel
trailStopLevel := trailStopNew
// Check if price hit stop
if real_low <= trailStopLevel
strategy.close("Long", comment="ATR Trailing Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// Update trailing stop level for short positions
else if position < 0
// Calculate new potential trailing stop level
trailStopNew = real_close + (atrValue * trailAtrMultiplier)
// Only move the stop down, never up
if trailStopNew < trailStopLevel
trailStopLevel := trailStopNew
// Check if price hit stop
if real_high >= trailStopLevel
strategy.close("Short", comment="ATR Trailing Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Plot stop loss levels
plot(useTrailingStop and position != 0 ? trailStopLevel : na, "ATR Trailing Stop", color=color.yellow, style=plot.style_linebr, linewidth=1)
plot(useSwingStop and position != 0 ? swingStopLevel : na, "Swing Point Stop", color=color.red, style=plot.style_circles, linewidth=2)
plot(useSafetyNetStop and position != 0 ? safetyNetStopLevel : na, "Insurance Stop", color=color.yellow, style=plot.style_circles, linewidth=1)
// Visual signals for chart (just entry/exit markers, no ADX labels)
plotshape(longAlert, title="Long Entry", location=location.abovebar, color=bullishColor, style=shape.triangleup, size=size.small)
plotshape(shortAlert, title="Short Entry", location=location.belowbar, color=bearishColor, style=shape.triangledown, size=size.small)
plotshape(exitLongAlert, title="Long Exit Signal", location=location.abovebar, color=bullishColor, style=shape.xcross, size=size.small)
plotshape(exitShortAlert, title="Short Exit Signal", location=location.belowbar, color=bearishColor, style=shape.xcross, size=size.small)
// Supertrend visualization
bodyMiddlePlot = plot((real_open + real_close) / 2, "Body Middle", display=display.none)
upTrend = plot(useSupertrend and isUptrend ? supertrend : na, "Up Trend", color=bullishColor, style=plot.style_linebr, linewidth=1)
downTrend = plot(useSupertrend and isDowntrend ? supertrend : na, "Down Trend", color=bearishColor, style=plot.style_linebr, linewidth=1)
fill(upTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bullishColor, 85) : na, title="Uptrend Background")
fill(downTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bearishColor, 85) : na, title="Downtrend Background")
// Position background
bgcolor(position == 1 ? color.new(bullishColor, 85) : position == -1 ? color.new(bearishColor, 85) : na, title="Position Background")
// Position label
var label positionLabel = na
label.delete(positionLabel)
if barstate.islast
positionText = position == 1 ? "LONG" : position == -1 ? "SHORT" : "FLAT"
entryInfo = not na(entryPrice) ? "\nEntry: " + str.tostring(entryPrice, "#.00000") : ""
atrStopInfo = useTrailingStop and not na(trailStopLevel) ? "\nATR Stop: " + str.tostring(trailStopLevel, "#.00000") + " (" + str.tostring(trailAtrMultiplier, "#.0") + "x ATR)" : ""
swingStopInfo = useSwingStop and not na(swingStopLevel) ? "\nSwing Stop: " + str.tostring(swingStopLevel, "#.00000") + " (" + str.tostring(swingLookback) + " bars)" : ""
safetyNetInfo = useSafetyNetStop and not na(safetyNetStopLevel) ? "\nInsurance Stop: " + str.tostring(safetyNetStopLevel, "#.00000") + " (" + str.tostring(safetyNetPercent, "#.0") + "%)" : ""
supertrendInfo = useSupertrend ? "\nSupertrend: " + (isUptrend ? "UPTREND" : "DOWNTREND") : ""
positionColor = position == 1 ? bullishColor : position == -1 ? bearishColor : color.gray
positionLabel := label.new(bar_index, high, positionText + entryInfo + atrStopInfo + swingStopInfo + safetyNetInfo + supertrendInfo, color=positionColor, style=label.style_label_down, textcolor=color.white)