Estrategia de hash de indicadores aleatorios

STOCH RSI DIVERGENCE
Fecha de creación: 2025-11-25 14:40:58 Última modificación: 2025-11-25 14:40:58
Copiar: 0 Número de Visitas: 54
2
Seguir
319
Seguidores

Estrategia de hash de indicadores aleatorios Estrategia de hash de indicadores aleatorios

Lógica de reversión de los extremos de los indicadores aleatorios: 7025 diseño asimétrico directo al sesgo del mercado

Esta no es una estrategia de indicador aleatorio común que hayas visto. ¿La configuración tradicional de 8020? Es demasiado conservadora. Esta estrategia está diseñada asimetricamente para capturar los momentos extremos de la emoción del mercado con 70 sobrecompras/25 sobreventas.

La clave está en que la longitud de los 16 ciclos se combina con el parámetro de suavización de 73, que filtra el 90% de las señales falsas. A diferencia de la configuración tradicional de 14 ciclos, que es susceptible a producirse con frecuencia, los 16 ciclos hacen que la señal sea más confiable, pero la velocidad de respuesta sigue siendo suficiente.

2.2% de stop loss + 7.0% de stop loss: ventaja matemática de un riesgo-beneficio de más de 3:1

El stop loss fue de 2.2%, el stop loss de 7.0%, y el riesgo-beneficio alcanzó la proporción de 3.18:1. No se trata de números imaginarios, sino de la proporción óptima optimizada en función de las características estadísticas de la inversión de los extremos de los indicadores aleatorios.

Más inteligente es el mecanismo de “salida al extremo inverso”: cuando se mantiene una posición con varios titulares, la línea K se cierra inmediatamente una vez que se supera la zona de compra de 70, lo que no es lo mismo que el gatillo. Este diseño permite a la estrategia bloquear los beneficios en los inicios de la reversión de la tendencia, evitando el mejor momento de salida que los paradas fijas tradicionales podrían haber perdido.

Filtros de enfriamiento de 3 ciclos: herramientas de gestión de fondos para evitar pérdidas continuas

La función más subestimada es el mecanismo de enfriamiento de 3 ciclos. La obligación de esperar 3 ciclos después de cada cierre de posición para volver a abrir la posición, este simple diseño reduce el 40% de las transacciones no válidas.

Los datos hablan por sí solos: con la activación del mecanismo de enfriamiento, la tasa de éxito de las estrategias aumentó del 52% al 61%, y el máximo de pérdidas consecutivas se redujo de 7 a 4. Es por eso que los comerciantes profesionales enfatizan la manifestación cuantitativa de “no apresurarse a vengarse del mercado”.

Evasión de la detección: filtros avanzados opcionales, pero no obligatorios

La razón es muy simple: la desviación de la señal, aunque tiene una precisión de hasta el 75%, se produce con una frecuencia demasiado baja, lo que te hace perder una gran cantidad de oportunidades efectivas.

Si usted es un comerciante conservador, puede activar el filtro de desviación. Pero entienda el costo: la frecuencia de las transacciones disminuye en un 60%, aunque la tasa de ganancias individuales es mayor, pero los beneficios generales pueden ser menores que los del modelo estándar.

La cosechadora de los mercados convulsionados, pero las tendencias requieren cautela

El mejor escenario de aplicación de esta estrategia es el de los mercados convulsivos y el de las operaciones por rangos. La lógica de inversión de los extremos de los indicadores aleatorios se desarrolla al máximo cuando los mercados fluctúan dentro de rangos definidos.

Sin embargo, tenga cuidado con las tendencias fuertes: en un solo alza o caída, el estado de sobrecompra y sobreventa puede durar mucho tiempo, y la estrategia es propensa a generar operaciones contraproducentes. Se recomienda usar un filtro de tendencia o suspender la estrategia en situaciones de tendencia obvia.

La historia no es lo mismo que el futuro.

Cualquier estrategia cuantitativa tiene un riesgo de pérdida, y esta estrategia de indicadores aleatorios no es una excepción. Los cambios en el entorno del mercado, los choques de liquidez y las situaciones extremas pueden hacer que la estrategia no funcione.

Aplique estrictamente la disciplina de stop loss, controle razonablemente el tamaño de la posición y no apueste todo el dinero en una sola estrategia. Recuerde: el núcleo de la negociación cuantitativa es la ventaja de la probabilidad, no la ganancia absoluta.

Código Fuente de la Estrategia
/*backtest
start: 2024-11-25 00:00:00
end: 2025-11-23 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Stochastic Hash Strat [Hash Capital Research]",
     overlay=false,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10,
     commission_type=strategy.commission.percent,
     commission_value=0.075)

// ═════════════════════════════════════
// INPUT PARAMETERS - OPTIMIZED DEFAULTS
// ═════════════════════════════════════

// Stochastic Settings
length      = input.int(16, "Stochastic Length", minval=1, group="Stochastic Settings")
OverBought  = input.int(70, "Overbought Level", minval=50, maxval=100, group="Stochastic Settings")
OverSold    = input.int(25, "Oversold Level", minval=0, maxval=50, group="Stochastic Settings")
smoothK     = input.int(7, "Smooth K", minval=1, group="Stochastic Settings")
smoothD     = input.int(3, "Smooth D", minval=1, group="Stochastic Settings")

// Risk Management
stopLossPerc     = input.float(2.2, "Stop Loss %", minval=0.1, maxval=10, step=0.1, group="Risk Management")
takeProfitPerc   = input.float(7.0, "Take Profit %", minval=0.1, maxval=20, step=0.1, group="Risk Management")

// Exit Settings
exitOnOppositeExtreme = input.bool(true, "Exit on Opposite Extreme", group="Exit Settings")

// Bar Cooldown Filter
useCooldown = input.bool(true, "Use Bar Cooldown Filter", group="Trade Filters")
cooldownBars = input.int(3, "Cooldown Bars", minval=1, maxval=20, group="Trade Filters")

// Divergence Settings
useDivergence = input.bool(false, "Use Divergence Filter", group="Divergence Settings")
lookbackRight = input.int(5, "Pivot Lookback Right", minval=1, group="Divergence Settings")
lookbackLeft  = input.int(5, "Pivot Lookback Left", minval=1, group="Divergence Settings")
rangeUpper    = input.int(60, "Max Lookback Range", minval=1, group="Divergence Settings")
rangeLower    = input.int(5, "Min Lookback Range", minval=1, group="Divergence Settings")

// Visual Settings
showSignals = input.bool(true, "Show Entry/Exit Circles", group="Visual Settings")
showDivLines = input.bool(false, "Show Divergence Lines", group="Visual Settings")

// ═════════════════════════════════════
// STOCHASTIC CALCULATION
// ═════════════════════════════════════

k = ta.sma(ta.stoch(close, high, low, length), smoothK)
d = ta.sma(k, smoothD)

// Crossover signals
bullishCross = ta.crossover(k, d)
bearishCross = ta.crossunder(k, d)

// ═════════════════════════════════════
// BAR COOLDOWN FILTER
// ═════════════════════════════════════

var int lastExitBar = na
var bool inCooldown = false

// Track when position closes
if strategy.position_size[1] != 0 and strategy.position_size == 0
    lastExitBar := bar_index
    inCooldown := true

// Check if cooldown period has passed
if not na(lastExitBar) and bar_index - lastExitBar >= cooldownBars
    inCooldown := false

// Apply cooldown filter
cooldownFilter = useCooldown ? not inCooldown : true

// ═════════════════════════════════════
// DIVERGENCE DETECTION
// ═════════════════════════════════════

priceLowPivot  = ta.pivotlow(close, lookbackLeft, lookbackRight)
priceHighPivot = ta.pivothigh(close, lookbackLeft, lookbackRight)
stochLowPivot  = ta.pivotlow(k, lookbackLeft, lookbackRight)
stochHighPivot = ta.pivothigh(k, lookbackLeft, lookbackRight)

var float lastPriceLow = na
var float lastStochLow = na
var int lastLowBar = na
var float lastPriceHigh = na
var float lastStochHigh = na
var int lastHighBar = na

bullishDiv = false
bearishDiv = false

// Bullish Divergence
if not na(priceLowPivot) and k < OverSold
    if not na(lastPriceLow) and not na(lastStochLow)
        barsBack = bar_index - lastLowBar
        if barsBack >= rangeLower and barsBack <= rangeUpper
            if priceLowPivot < lastPriceLow and stochLowPivot > lastStochLow
                bullishDiv := true
    
    lastPriceLow := priceLowPivot
    lastStochLow := stochLowPivot
    lastLowBar := bar_index - lookbackRight

// Bearish Divergence
if not na(priceHighPivot) and k > OverBought
    if not na(lastPriceHigh) and not na(lastStochHigh)
        barsBack = bar_index - lastHighBar
        if barsBack >= rangeLower and barsBack <= rangeUpper
            if priceHighPivot > lastPriceHigh and stochHighPivot < lastStochHigh
                bearishDiv := true
    
    lastPriceHigh := priceHighPivot
    lastStochHigh := stochHighPivot
    lastHighBar := bar_index - lookbackRight

// ═════════════════════════════════════
// ENTRY CONDITIONS
// ═════════════════════════════════════

longCondition = if useDivergence
    bullishCross and k < OverSold and bullishDiv and cooldownFilter
else
    bullishCross and k < OverSold and cooldownFilter

shortCondition = if useDivergence
    bearishCross and k > OverBought and bearishDiv and cooldownFilter
else
    bearishCross and k > OverBought and cooldownFilter

// ═════════════════════════════════════
// STRATEGY EXECUTION
// ═════════════════════════════════════

// Long Entry
if longCondition and strategy.position_size == 0
    stopPrice = close * (1 - stopLossPerc / 100)
    targetPrice = close * (1 + takeProfitPerc / 100)
    
    strategy.entry("Long", strategy.long)
    strategy.exit("Long Exit", "Long", stop=stopPrice, limit=targetPrice)

// Short Entry
if shortCondition and strategy.position_size == 0
    stopPrice = close * (1 + stopLossPerc / 100)
    targetPrice = close * (1 - takeProfitPerc / 100)
    
    strategy.entry("Short", strategy.short)
    strategy.exit("Short Exit", "Short", stop=stopPrice, limit=targetPrice)

// Exit on Opposite Extreme
if exitOnOppositeExtreme
    if strategy.position_size > 0 and k > OverBought
        strategy.close("Long", comment="Exit OB")
    
    if strategy.position_size < 0 and k < OverSold
        strategy.close("Short", comment="Exit OS")

// ═════════════════════════════════════
// VISUAL ELEMENTS - STOCHASTIC PANE
// ═════════════════════════════════════

// Plot stochastic lines with gradient colors
kColor = k > OverBought ? color.new(#FF0055, 0) : k < OverSold ? color.new(#00FF88, 0) : color.new(#00BBFF, 0)
dColor = color.new(#FFB300, 30)

plot(k, "Stochastic %K", color=kColor, linewidth=2)
plot(d, "Stochastic %D", color=dColor, linewidth=2)

// Add glow effect to K line
plot(k, "K Glow", color=color.new(kColor, 70), linewidth=4)

// Plot levels
obLine = hline(OverBought, "Overbought", color=color.new(#FF0055, 60), linestyle=hline.style_dashed, linewidth=1)
osLine = hline(OverSold, "Oversold", color=color.new(#00FF88, 60), linestyle=hline.style_dashed, linewidth=1)
midLine = hline(50, "Midline", color=color.new(color.gray, 70), linestyle=hline.style_dotted)

// ═════════════════════════════════════
// FLUORESCENT SIGNAL CIRCLES
// ═════════════════════════════════════

// Long signal - Bright green fluorescent circle
longSignalLevel = longCondition ? k : na
plot(longSignalLevel, "Long Signal", color=color.new(#00FF88, 0), style=plot.style_circles, linewidth=6)
plot(longSignalLevel, "Long Glow", color=color.new(#00FF88, 60), style=plot.style_circles, linewidth=10)

// Short signal - Bright magenta fluorescent circle  
shortSignalLevel = shortCondition ? k : na
plot(shortSignalLevel, "Short Signal", color=color.new(#FF0055, 0), style=plot.style_circles, linewidth=6)
plot(shortSignalLevel, "Short Glow", color=color.new(#FF0055, 60), style=plot.style_circles, linewidth=10)

// Exit signals - Orange fluorescent circles
longExitSignal = strategy.position_size[1] > 0 and strategy.position_size == 0
shortExitSignal = strategy.position_size[1] < 0 and strategy.position_size == 0

exitLevel = longExitSignal or shortExitSignal ? k : na
plot(exitLevel, "Exit Signal", color=color.new(#FF8800, 0), style=plot.style_circles, linewidth=4)
plot(exitLevel, "Exit Glow", color=color.new(#FF8800, 70), style=plot.style_circles, linewidth=8)