Estrategia de análisis de fatiga del mercado multiperiodo y sistema de gestión de riesgos

ATR RRR SL TP DD
Fecha de creación: 2025-02-10 14:27:15 Última modificación: 2025-02-10 14:27:15
Copiar: 1 Número de Visitas: 370
1
Seguir
1617
Seguidores

Estrategia de análisis de fatiga del mercado multiperiodo y sistema de gestión de riesgos

Descripción general

La estrategia es un sistema de negociación multicapa basado en el análisis de la fatiga del mercado, que identifica los momentos críticos en los que el mercado puede girar a través de un análisis profundo de la dinámica de los precios. La estrategia combina un mecanismo de gestión de riesgos dinámico, que incluye varias dimensiones, como la gestión de fondos, la optimización de stop loss y el control de retiros, para formar un marco de decisión de negociación completo.

Principio de estrategia

El núcleo de la estrategia es evaluar la fatiga del mercado mediante la observación de los movimientos continuos de los precios.

  1. Determina la dirección de la tendencia comparando el precio de cierre actual con el precio de cierre de la línea K anterior de la 4a raíz
  2. Se establecen tres puntos de activación de señales de diferentes niveles de intensidad (de 9/12/14)
  3. Cuando el precio continúa moviéndose en una dirección, el sistema acumula una cuenta de señales.
  4. Una vez que se alcanza el umbral de intensidad de la señal predeterminada, el sistema da la señal de transacción correspondiente
  5. Un sistema de gestión de posiciones que integra un mecanismo de stop loss dinámico basado en ATR y un sistema de gestión de posiciones basado en la relación riesgo-retorno

Ventajas estratégicas

  1. El sistema de señales multicapa ofrece diferentes grados de identificación de oportunidades de negociación
  2. Proteger la seguridad de los fondos mediante mecanismos de gestión de fondos y control de riesgos
  3. El uso de ATR para detener pérdidas dinámicas para adaptarse mejor a las fluctuaciones del mercado
  4. La introducción de un mecanismo de seguimiento de las pérdidas para asegurar mejor los beneficios
  5. Protección máxima de retiro para evitar pérdidas excesivas
  6. El sistema tiene buena escalabilidad y espacio para la optimización de parámetros

Riesgo estratégico

  1. Las señales erróneas en mercados convulsionados
  2. Los umbrales de señal fijos pueden no ser adecuados para todos los entornos de mercado
  3. El deterioro de las ventas en un mercado de inversión rápida podría ser mayor
  4. Se necesita más optimización de parámetros
  5. Los sistemas de gestión de fondos pueden limitar el espacio de ganancias en ciertos casos.

Dirección de optimización de la estrategia

  1. Introducción de un filtro de fluctuación del mercado para ajustar el umbral de la señal en diferentes entornos de fluctuación
  2. Aumente la dimensión del análisis de volumen y mejore la confiabilidad de la señal.
  3. Desarrollo de sistemas de optimización de parámetros adaptativos
  4. Añadir más indicadores de análisis del entorno del mercado
  5. Optimizar el sistema de gestión de fondos para que sea más flexible

Resumir

La estrategia proporciona a los operadores un marco de negociación sistematizado a través de análisis de fatiga en varios niveles y un sistema de gestión de riesgos completo. Aunque hay algunos lugares que necesitan optimización, la idea de diseño general está intacta y tiene valor de aplicación práctica. Se recomienda la adopción de estrategias de gestión de fondos conservadoras en el mercado real y la optimización continua de los parámetros y la mejora del sistema.

Código Fuente de la Estrategia
/*backtest
start: 2024-02-10 00:00:00
end: 2025-02-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy(title="Improved Exhaustion Signal with Risk Management and Drawdown Control", shorttitle="Exhaustion Signal", overlay=true)

// ———————————————— INPUT SETTINGS ————————————————
showLevel1 = input.bool(true, 'Show Level 1 Signals')
showLevel2 = input.bool(true, 'Show Level 2 Signals')
showLevel3 = input.bool(true, 'Show Level 3 Signals')

// Thresholds for signal strength levels
level1 = 9
level2 = 12
level3 = 14

// Risk management inputs
riskPercentage = input.float(1.0, title="Risk Percentage per Trade", minval=0.1, maxval=5.0)  // Risk per trade in percentage
riskRewardRatio = input.float(2.0, title="Risk-to-Reward Ratio", minval=1.0, maxval=5.0)  // Reward-to-risk ratio
trailingStop = input.bool(true, title="Enable Trailing Stop")  // Enable/Disable trailing stop
trailingStopDistance = input.int(50, title="Trailing Stop Distance (in points)", minval=1)  // Distance for trailing stop

// Drawdown protection settings
maxDrawdown = input.float(10.0, title="Max Drawdown Percentage", minval=0.1, maxval=50.0)  // Max allowable drawdown before stopping trading

// ———————————————— GLOBAL VARIABLES ————————————————
var int cycle = 0
var int bullishSignals = 0
var int bearishSignals = 0
var float equityHigh = na  // Initialize as undefined

// Track equity drawdown
if (na(equityHigh) or strategy.equity > equityHigh)
    equityHigh := strategy.equity

drawdownPercent = 100 * (equityHigh - strategy.equity) / equityHigh

// Stop trading if drawdown exceeds the limit
if drawdownPercent >= maxDrawdown
    strategy.close_all()

// ———————————————— FUNCTION: RESET & IMMEDIATE RECHECK USING AN ARRAY RETURN ————————————————
f_resetAndRecheck(_bullish, _bearish, _cycle, _close, _close4) =>
    newBullish = _bullish
    newBearish = _bearish
    newCycle = _cycle

    // Reset cycle if necessary based on price action
    newBullish := 0
    newBearish := 0
    newCycle := 0

    if _close < _close4
        newBullish := 1
        newCycle := newBullish
    else if _close > _close4
        newBearish := 1
        newCycle := newBearish

    resultArray = array.new_int(3, 0)
    array.set(resultArray, 0, newBullish)
    array.set(resultArray, 1, newBearish)
    array.set(resultArray, 2, newCycle)

    resultArray

// ———————————————— EXHAUSTION LOGIC ————————————————
if cycle < 9
    // Bullish cycle: close < close[4]
    if close < close[4]
        bullishSignals += 1
        bearishSignals := 0
        cycle := bullishSignals
    // Bearish cycle: close > close[4]
    else if close > close[4]
        bearishSignals += 1
        bullishSignals := 0
        cycle := bearishSignals
    else
        newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
        bullishSignals := array.get(newVals, 0)
        bearishSignals := array.get(newVals, 1)
        cycle := array.get(newVals, 2)
else
    // ——— BULLISH checks ———
    if bullishSignals > 0
        if bullishSignals < (level3 - 1)
            if close < close[3]
                bullishSignals += 1
                bearishSignals := 0
                cycle := bullishSignals
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
                bullishSignals := array.get(newVals, 0)
                bearishSignals := array.get(newVals, 1)
                cycle := array.get(newVals, 2)
        else if bullishSignals == (level3 - 1)
            if close < close[2]
                bullishSignals := level3
                cycle := bullishSignals
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
                bullishSignals := array.get(newVals, 0)
                bearishSignals := array.get(newVals, 1)
                cycle := array.get(newVals, 2)
        else
            newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
            bullishSignals := array.get(newVals, 0)
            bearishSignals := array.get(newVals, 1)
            cycle := array.get(newVals, 2)
    // ——— BEARISH checks ———
    else if bearishSignals > 0
        if bearishSignals < (level3 - 1)
            if close > close[3]
                bearishSignals += 1
                bullishSignals := 0
                cycle := bearishSignals
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
                bullishSignals := array.get(newVals, 0)
                bearishSignals := array.get(newVals, 1)
                cycle := array.get(newVals, 2)
        else if bearishSignals == (level3 - 1)
            if close > close[2]
                bearishSignals := level3
                cycle := bearishSignals
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
                bullishSignals := array.get(newVals, 0)
                bearishSignals := array.get(newVals, 1)
                cycle := array.get(newVals, 2)
        else
            newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
            bullishSignals := array.get(newVals, 0)
            bearishSignals := array.get(newVals, 1)
            cycle := array.get(newVals, 2)
    else
        newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4])
        bullishSignals := array.get(newVals, 0)
        bearishSignals := array.get(newVals, 1)
        cycle := array.get(newVals, 2)

// ———————————————— SIGNAL FLAGS ————————————————
bullishLevel1 = showLevel1 and (bullishSignals == level1)
bearishLevel1 = showLevel1 and (bearishSignals == level1)

bullishLevel2 = showLevel2 and (bullishSignals == level2)
bearishLevel2 = showLevel2 and (bearishSignals == level2)

bullishLevel3 = showLevel3 and (bullishSignals == level3)
bearishLevel3 = showLevel3 and (bearishSignals == level3)

// ———————————————— PLOT SIGNALS ————————————————
plotshape(bullishLevel1, style=shape.diamond, color=color.new(#30ff85, 0), textcolor=color.white, size=size.tiny, location=location.belowbar, title="Level 1 Bullish Signal")
plotshape(bearishLevel1, style=shape.diamond, color=color.new(#ff1200, 0), textcolor=color.white, size=size.tiny, location=location.abovebar, title="Level 1 Bearish Signal")

plotshape(bullishLevel2, style=shape.xcross, color=color.new(#30ff85, 0), textcolor=color.white, size=size.tiny, location=location.belowbar, title="Level 2 Bullish Signal")
plotshape(bearishLevel2, style=shape.xcross, color=color.new(#ff1200, 0), textcolor=color.white, size=size.tiny, location=location.abovebar, title="Level 2 Bearish Signal")

plotshape(bullishLevel3, style=shape.flag, color=color.new(#30ff85, 0), textcolor=color.white, size=size.tiny, location=location.belowbar, title="Level 3 Bullish Signal")
plotshape(bearishLevel3, style=shape.flag, color=color.new(#ff1200, 0), textcolor=color.white, size=size.tiny, location=location.abovebar, title="Level 3 Bearish Signal")

// ———————————————— RESET AFTER LEVEL 3 ————————————————
if bullishSignals == level3 or bearishSignals == level3
    bullishSignals := 0
    bearishSignals := 0
    cycle := 0

// ———————————————— BACKTEST LOGIC ————————————————
// Set up basic long and short entry conditions based on signal levels
longCondition = bullishLevel1 or bullishLevel2 or bullishLevel3
shortCondition = bearishLevel1 or bearishLevel2 or bearishLevel3

// Calculate position size based on risk percentage
equity = strategy.equity
riskAmount = equity * riskPercentage / 100
atr = ta.atr(14)
stopLossLevel = atr * 1.5  // Using ATR for dynamic stop-loss
positionSize = riskAmount / stopLossLevel

// Initialize strategy logic
if longCondition
    strategy.entry("Long", strategy.long, qty=positionSize)

if shortCondition
    strategy.entry("Short", strategy.short, qty=positionSize)

// ———————————————— CONCRETE STOP LOSS AND TAKE PROFIT ————————————————
stopLoss = stopLossLevel
takeProfit = stopLoss * riskRewardRatio

// Apply stop loss and take profit to the strategy based on concrete price levels
strategy.exit("Exit Long", from_entry="Long", stop=close - stopLoss, limit=close + takeProfit)
strategy.exit("Exit Short", from_entry="Short", stop=close + stopLoss, limit=close - takeProfit)

// ———————————————— TRAILING STOP ————————————————
if trailingStop
    strategy.exit("Exit Long Trailing", from_entry="Long", trail_price=close - trailingStopDistance, trail_offset=trailingStopDistance)
    strategy.exit("Exit Short Trailing", from_entry="Short", trail_price=close + trailingStopDistance, trail_offset=trailingStopDistance)