Estrategia de seguimiento de tendencias de K-algo

ATR supertrend GANN HEIKIN-ASHI EMA
Fecha de creación: 2025-08-26 11:23:33 Última modificación: 2025-08-26 11:23:33
Copiar: 0 Número de Visitas: 288
2
Seguir
319
Seguidores

Estrategia de seguimiento de tendencias de K-algo Estrategia de seguimiento de tendencias de K-algo

Este no es un Supertrend normal, sino un cazador de tendencias de fusión multidimensional

No se deje engañar por el nombre, el K-algo trail no es una simple estrategia de seguimiento de ATR. Este sistema combina ingeniosamente los tres sistemas tecnológicos de SuperTrend, Gann y Heikin Ashi, formando un marco de identificación de tendencias tridimensional. El ATR de 10 ciclos está diseñado con multiplicadores triples, lo que garantiza la sensibilidad a las tendencias y filtra el ruido del mercado.

Heikin Ashi, con su doble EMA suave, es el verdadero filtro de señales

La innovación central de la estrategia reside en el gráfico de Heikin Ashi, que se maneja con un suavizado EMA de 11 ciclos dobles. El tradicional Heikin Ashi es propenso a generar falsas señales, pero después de dos rondas de suavizado EMA, la calidad de la señal se mejora significativamente. Cuando el precio de apertura después de la suavización es inferior al precio de cierre y el SuperTrend muestra una tendencia alcista, se confirma la señal de múltiples cabezas; al contrario, es una señal de cabezas vacías.

1.7:2.5:3.0 Ganancias y pérdidas comparadas con el diseño que muestra el nivel de profesionalidad

La configuración de stop loss utiliza directamente la línea de SuperTrend, que es la opción de stop loss dinámica más razonable. Lo que es más interesante es el diseño de la parada de tres grados: 1,7 veces, 2,5 veces y 3,0 veces la distancia de riesgo. Esta parada progresiva garantiza el rendimiento básico y deja suficiente espacio para la situación de la tendencia.

La inclusión de los nueve ángulos de Gann no es un adorno, sino un soporte clave para la resistencia

Los cálculos del cuadrado de Gann de 9 en el código parecen sencillos, pero en realidad son muy útiles. Los puntos de resistencia de soporte ascendente y descendente proporcionan puntos de soporte adicionales para la estrategia mediante el cálculo de la raíz cuadrada del precio actual. Aunque la lógica principal de la estrategia no usa directamente estas posiciones, proporcionan una referencia importante para el ajuste manual y la evaluación de riesgos.

Aplicable a tendencias a medio y largo plazo y al comportamiento general de los mercados convulsivos

Esta estrategia funciona muy bien en mercados de tendencia unilateral, especialmente en variedades con mucha volatilidad como las criptomonedas y los futuros de índices de acciones. Sin embargo, hay que tener en cuenta que, en un contexto de volatilidad horizontal, las falsas rupturas frecuentes pueden causar pequeñas pérdidas continuas. Se recomienda su uso en momentos de alta volatilidad y tendencia del mercado, evitando operar en un período de incertidumbre posterior a la publicación de datos económicos importantes.

El historial no representa las ganancias futuras

Cualquier estrategia cuantitativa conlleva un riesgo de pérdida, y esta estrategia no es una excepción. Aunque los datos de retrospectiva muestran un buen rendimiento de los beneficios ajustados al riesgo, es posible que se enfrenten a pérdidas continuas en las operaciones reales. Se recomienda controlar estrictamente las posiciones individuales no más del 2% del capital total y suspender la negociación después de 3 paros consecutivos y volver a evaluar el entorno del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2025-06-11 00:00:00
end: 2025-08-25 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy('K-algo trail', overlay=true)
// ===== INPUTS =====
Periods = input(title='ATR Period', defval=10)
src = input(hl2, title='Source')
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3)
changeATR = input(title='Change ATR Calculation Method ?', defval=true)
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
// ===== ATR & SUPER TREND (K-TREND) CALCULATION =====
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
// Plot SuperTrend
upPlot = plot(trend == 1 ? up : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title='UpTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title='DownTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
// ===== GANN SQUARE OF 9 =====
normalise_squareRootCurrentClose = math.floor(math.sqrt(close))
upperGannLevel_1 = (normalise_squareRootCurrentClose + 1) * (normalise_squareRootCurrentClose + 1)
upperGannLevel_2 = (normalise_squareRootCurrentClose + 2) * (normalise_squareRootCurrentClose + 2)
zeroGannLevel = normalise_squareRootCurrentClose * normalise_squareRootCurrentClose
lowerGannLevel_1 = (normalise_squareRootCurrentClose - 1) * (normalise_squareRootCurrentClose - 1)
lowerGannLevel_2 = (normalise_squareRootCurrentClose - 2) * (normalise_squareRootCurrentClose - 2)
// ===== SMOOTHED HEIKIN ASHI CALCULATION =====
ma1_len = input.int(title='MA1', defval=11, minval=1, maxval=100, step=1)
ma2_len = input.int(title='MA2', defval=11, minval=1, maxval=100, step=1)
// First Smoothing (11,11)
o = ta.ema(open, ma1_len)
c = ta.ema(close, ma1_len)
h = ta.ema(high, ma1_len)
l = ta.ema(low, ma1_len)
ha_t = ticker.heikinashi(syminfo.tickerid)
ha_o = request.security(ha_t, timeframe.period, o)
ha_c = request.security(ha_t, timeframe.period, c)
ha_h = request.security(ha_t, timeframe.period, h)
ha_l = request.security(ha_t, timeframe.period, l)
o2 = ta.ema(ha_o, ma2_len)
c2 = ta.ema(ha_c, ma2_len)
h2 = ta.ema(ha_h, ma2_len)
l2 = ta.ema(ha_l, ma2_len)
ha_col = o2 > c2 ? color.orange : color.blue
plotcandle(o2, h2, l2, c2, title='Heikin Ashi Smoothed', color=ha_col, wickcolor=#00000000)
// ===== STRATEGY LOGIC =====
// Final Combined Long Condition
longCondition = (o2 < c2 and trend == 1) and barstate.isconfirmed
// Final Combined Short Condition
shortCondition = (o2 > c2 and trend == -1) and barstate.isconfirmed
// ===== STRATEGY EXECUTION =====
if longCondition
    SL = math.round(up, 2)
    range_1 = math.abs(close - SL)
    TARGET1 = close + range_1 * 1.7
    TARGET2 = close + range_1 * 2.5
    TARGET3 = close + range_1 * 3.0
    strategy.entry('BUY', strategy.long)
    strategy.exit('BUY T1', 'BUY', qty=1, limit=TARGET1)
    strategy.exit('BUY T2', 'BUY', qty=1, limit=TARGET2)
    strategy.exit('BUY T3', 'BUY', qty=1, limit=TARGET3)
    strategy.exit('BUY SL', 'BUY', stop=SL)
if shortCondition
    SL = math.round(dn, 2)
    range_2 = math.abs(close - SL)
    TARGET1 = close - range_2 * 1.7
    TARGET2 = close - range_2 * 2.5
    TARGET3 = close - range_2 * 3.0
    strategy.entry('SELL', strategy.short)
    strategy.exit('SELL T1', 'SELL', qty=1, limit=TARGET1)
    strategy.exit('SELL T2', 'SELL', qty=1, limit=TARGET2)
    strategy.exit('SELL T3', 'SELL', qty=1, limit=TARGET3)
    strategy.exit('SELL SL', 'SELL', stop=SL)
// Plot entry signals
plotshape(longCondition ? close : na, title='Buy', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))
plotshape(shortCondition ? close : na, title='Sell', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))