Estrategia de backtesting de ruptura de máximos y mínimos


Fecha de creación: 2023-11-27 15:37:13 Última modificación: 2023-11-27 15:37:13
Copiar: 0 Número de Visitas: 689
1
Seguir
1617
Seguidores

Estrategia de backtesting de ruptura de máximos y mínimos

Descripción general

La estrategia de retroalimentación de alta y baja brecha es una estrategia de seguimiento de tendencias que utiliza los altos y bajos históricos de las acciones para determinar si los precios han superado estos altos y bajos. Se produce una señal de compra al calcular los máximos y mínimos de un período determinado, cuando el precio del ciclo actual supera el precio más alto del período más reciente; cuando el precio cae por debajo del precio más bajo del período más reciente, se produce una venta.

Principio de estrategia

La lógica central de esta estrategia es calcular los precios más altos y más bajos en un período determinado (la línea K de 50 valores por defecto). Para calcular los precios más altos y más bajos, se puede elegir el precio de cierre o el precio más alto y más bajo (el precio más alto y más bajo por defecto). Luego, se determina si el precio de cierre o el precio más alto de la línea K actual supera el precio más alto de un período determinado.

Cuando se genera una señal de compra, la estrategia compra a ese precio y establece un precio de stop loss y un precio de stop loss. Cuando el precio toca el precio de stop loss, la estrategia se detiene y se retira; cuando el precio toca el precio de stop loss, la estrategia se detiene y se retira. La lógica de la señal de venta es similar.

Análisis de las ventajas

Esta estrategia de retroalimentación de alto y bajo nivel tiene las siguientes ventajas:

  1. La lógica de la estrategia es simple, fácil de entender e implementar.
  2. La capacidad de captar las características de tendencia de los precios de las acciones, y de seguirlos.
  3. Se puede ajustar la combinación de parámetros de la política más adecuada mediante el parámetro Finding.
  4. El sistema de frenado y deterioro integrado permite controlar el riesgo.
  5. La visualización facilita el ajuste de parámetros y el análisis de resultados.

Análisis de riesgos

La estrategia también tiene sus riesgos:

  1. Es probable que se produzcan transacciones repetitivas y excesivas.
  2. Cuando los precios fluctúan, las posiciones se abren con frecuencia.
  3. El indicador no está en su momento y puede haber perdido una gran oportunidad de tendencia.
  4. No se tiene en cuenta la frecuencia y la magnitud de las fluctuaciones en el precio de las acciones.
  5. No se combina con otros indicadores para verificar la señal.

Para controlar estos riesgos, se puede optimizar en los siguientes aspectos:

  1. Reducir adecuadamente el margen de pérdidas y aumentar el tiempo de mantenimiento de la posición.
  2. Aumentar las condiciones para abrir una posición y evitar que sea frecuente.
  3. Optimización de parámetros para encontrar la combinación óptima de parámetros.
  4. En combinación con otros indicadores, las señales de filtración.

Dirección de optimización

La estrategia de retroalimentación de la brecha alta y baja se puede optimizar en los siguientes aspectos:

  1. Optimización de parámetros. Se puede encontrar el parámetro óptimo probando más sistemáticamente diferentes combinaciones de parámetros.

  2. En combinación con otros indicadores se puede filtrar la señal de compra. Por ejemplo, se puede combinar con el indicador de promedios móviles, que solo genera una señal de compra cuando el precio supera el precio más alto y atraviesa el promedio móvil a largo plazo en el promedio móvil a corto plazo.

  3. Tenga en cuenta la frecuencia de fluctuación de los precios de las acciones. Por ejemplo, se puede combinar con el indicador ATR, con la amplitud adecuada de la ruptura cuando los precios de las acciones aumentan.

  4. Distinguir entre mercados de tendencia y mercados de crisis. En las fases en que la tendencia es evidente, flexibilizar adecuadamente los parámetros para seguir la tendencia. En los mercados de crisis, apretar adecuadamente los parámetros.

  5. Aumentar los mecanismos de gestión de posiciones, por ejemplo, detener la apertura de posiciones cuando se alcanza una cierta proporción de pérdidas.

Resumir

En general, la estrategia de retroalimentación de brechas altas y bajas es una estrategia de seguimiento de tendencias sencilla y práctica. Determina las señales de negociación al determinar si los precios superan los máximos y mínimos de un período determinado. La estrategia tiene ventajas como la simplicidad, el seguimiento de tendencias y la optimización parametrizada, pero también existe el riesgo de generar exceso de operaciones y no poder manejar mercados oscilantes.

Código Fuente de la Estrategia
/*backtest
start: 2023-11-25 00:00:00
end: 2023-11-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700)

// Strategy Settings
takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100
stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100
takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100
stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100


candlesBack = input(title="Number of candles back",  defval=50)
useHighAndLows =  input(true, title="Use high and lows (uncheck to use close)", defval=true)
lastBarsBackMinimum =  input(title="Number of candles back to ignore for last high/low",  defval=30)
showHighsAndLows = input(true, title="Show high/low lines", defval=true)

getIndexOfLowestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] <= current
            index := i
            current := series[i]
    index

getIndexOfHighestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] >= current
            index := i
            current := series[i]
    index

indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack)
indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack)

max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange]
min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange]

barsSinceLastHigh = indexOfHighestInRange
barsSinceLastLow = indexOfLowestInRange

isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum)
isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum)

alertcondition(condition=isNewHigh, title="New High", message="Last High Broken")
alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken")

if high > max 
    max := high
    barsSinceLastHigh := 0

if low < min
    min := low
    barsSinceLastLow := 0 

plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3)
plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3)

// Strategy Entry/Exit Logic
goLong =isNewHigh
longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong)
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong)

goShort = isNewLow
shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort)

strategy.entry("Long", strategy.long, when=goLong)
strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel)

strategy.entry("Short", strategy.short, when=goShort)
strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel)
        
plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)
plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)