Estrategia de seguimiento de tendencias

El autor:¿ Qué pasa?, Fecha: 2024-01-22 17:21:10
Las etiquetas:

img

Resumen general

Esta es una estrategia de ruptura basada en el seguimiento de tendencias.

Estrategia lógica

La estrategia se basa principalmente en dos indicadores para determinar las señales de entrada y salida: la función más alta que determina el precio más alto durante un determinado período y la función más baja que determina el precio más bajo durante un determinado período.

Cuando el precio de cierre está por encima del precio más alto durante un determinado período (parámetro highPeriod), se considera una ruptura de tendencia al alza, por lo que se emite una señal larga.

La estrategia también establece un stop loss móvil y un stop loss fijo. El stop loss móvil se basa en el indicador ATR, calculado por un valor ATR durante un cierto período multiplicado por un factor (parámetro trailingAtrMultiplier) como el nivel de stop loss móvil.

Después de ir largo o corto, el stop loss fijo entra en vigencia para la primera barra; luego cambia a un stop loss principalmente móvil.

La estrategia también establece reglas para el cálculo del tamaño de la posición. Basándose en el porcentaje máximo de pérdida aceptable, el capital de cuenta, etc., calcula el tamaño de posición adecuado. También tiene en cuenta el número de instrumentos de negociación, reduciendo adecuadamente el tamaño de posición para cada instrumento.

En resumen, esta es una estrategia típica de breakout de seguimiento de tendencias.

Análisis de ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. El uso de los precios más altos y más bajos para determinar si las tendencias se invierten, la precisión es muy alta y las señales falsas son poco probables.

  2. Tamaño razonable de la posición y stop loss. Establecimiento de porcentaje máximo de pérdida, asociación de equidad de cuenta, etc. hacen que los tamaños de posición sean razonables, evitando el exceso de negociación o la negociación ineficaz. El stop loss combinado bloquea las ganancias y sigue los movimientos de tendencia.

  3. Es simple y práctico, fácil de entender y de utilizar, se basa únicamente en indicadores básicos y la lógica es sencilla y fácil de entender.

  4. Los parámetros del indicador, las reglas de dimensionamiento de la posición, etc. proporcionan cajas de entrada para que los usuarios puedan ajustar según sea necesario.

En resumen, esta es una estrategia de escape muy práctica, segura y confiable en el juicio, mientras que el diseño considera el control y seguimiento de riesgos, muy adecuado para la tenencia a mediano y largo plazo.

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. Si los parámetros del ciclo de precios más altos o más bajos se eligen mal, las tendencias podrían pasarse por alto.

  2. Si la distancia de stop loss en movimiento es demasiado pequeña, el ruido del mercado podría eliminar la posición prematuramente.

Las principales soluciones son:

  1. Añadir filtros de tendencia, como indicadores adicionales para comprobar si hay fallas.

  2. Optimizar la selección de parámetros mediante pruebas de estabilidad.

  3. Relajar la distancia de stop loss adecuadamente para soportar retracements razonables.

Direcciones de optimización

Las principales direcciones de optimización para esta estrategia son:

  1. Además de los precios más altos / más bajos, también se pueden agregar indicadores como promedios móviles para hacer que la determinación de tendencias sea más precisa.

  2. Optimice la configuración de parámetros. Pruebe y encuentre las combinaciones óptimas para parámetros como ciclos de precios más altos / más bajos, factores de multiplicador de stop loss, etc.

  3. Ajustar el tamaño del algoritmo de posiciones en función de las condiciones del mercado, por ejemplo, reducir el tamaño de las posiciones cuando aumente la volatilidad (por ejemplo, VIX).

  4. Añadir el filtro de volumen para la confirmación de la fuga, para evitar las falsas fugas.

  5. En la selección de instrumentos de negociación, debe tenerse en cuenta los diferenciales y las correlaciones, ya que la elección de instrumentos con pequeñas variaciones de diferenciales y correlaciones bajas puede reducir los riesgos de cartera.

  6. Optimiza el mecanismo de stop loss. Prueba diferentes composiciones de stop loss móviles y fijos para hacer que los stop losses sean menos agresivos.

Conclusión

Como estrategia de ruptura de tendencia, esta estrategia tiene un buen rendimiento en la precisión del juicio, el tamaño de la posición y el control de riesgos, la facilidad de operación, etc. Captura las tendencias temprano y equilibra la obtención de ganancias y el seguimiento a través de pérdidas de parada en movimiento.

Por supuesto, como estrategia de ruptura, se basa en gran medida en el juicio de tendencias y es propenso a interferencias de ruido del mercado.

En general, esta es una estrategia muy práctica. Su estructura básica ya contiene los componentes más cruciales para una estrategia cuántica. Con optimizaciones y mejoras continuas, definitivamente puede convertirse en una estrategia automatizada estable y rentable.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
     overlay=true)

// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
     tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
     tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")

// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
     , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
     , group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
     tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
     , group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
     , group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
     , group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
     , group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
     , group = "Exit Condition")
// Pair info 
pair = syminfo.basecurrency + syminfo.currency

// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier

// Trade Condition
longCondition = crossover(close, highestHigh) 
shortCondition = crossunder(close, lowestLow)

// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]

// Position size Long
maxpossize = strategy.equity / close 
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) 
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong =  (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close

// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) 
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort =  (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close

// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(posperclong) +
                     '\nLeverage' + tostring(leveragelong) +
                     '\nStoploss Price =' + tostring(stopvaluelong) +
                     '\nClose any Short position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(pospercshort) +
                     '\nLeverage' + tostring(leverageshort) +
                     '\nStoploss Price =' + tostring(stopvalueshort) +
                     '\nClose any Long position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'
// Order
if longCondition 
    strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
     , alert_message = entry_long_message)
if shortCondition
    strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
     , alert_message = entry_short_message)

// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr

var longTrailingStop = 0.0
var shortTrailingStop = 999999.9

trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
    if 0 == inTrade
        if longCondition
            inTrade := 1
        else
            inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
    inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
    inTrade := 0

longTrailingStop := if (1 == inTrade)
    stopValue = longTrailing
    max(stopValue, longTrailingStop[1])
else
    0

shortTrailingStop := if (-1 == inTrade)
    stopValue = shortTrailing
    min(stopValue, shortTrailingStop[1])
else
    999999

// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
    firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
    firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
    if 1 == inTrade
        fixedStopLine := firstPrice - firstFixAtr
        trailingStopLine := longTrailingStop
    else
        fixedStopLine := firstPrice + firstFixAtr
        trailingStopLine := shortTrailingStop

if (strategy.position_size > 0)
    strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
     , alert_message = exit_long_message)

if (strategy.position_size < 0)
    strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
     , alert_message = exit_long_message)
    

// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')

Más.