La estrategia High Low Breaker Backtest es una estrategia de seguimiento de tendencias que utiliza los máximos y mínimos históricos de una acción para determinar si el precio se rompe de estos rangos altos-bajos. Calcula el precio más alto y el precio más bajo durante un cierto período, y genera señales de compra cuando el precio del período actual excede el precio más alto durante un período reciente, y señales de venta cuando el precio se rompe por debajo del precio más bajo durante un período reciente. Como un tipo de estrategia de seguimiento de tendencias, puede capturar algunas características de tendencia de los precios de las acciones y tiene valor práctico para el comercio en vivo.
La lógica básica de esta estrategia es calcular el precio más alto y el precio más bajo en un cierto número de barras (default 50 barras). Al calcular los precios más altos / más bajos, permite usar precios cerrados o precios altos / bajos reales (default para usar precios altos / bajos). Luego verifica si el precio de cierre o el precio alto del barro actual excede el precio más alto en el período reciente. Si es así y ha sido más de un número mínimo de barras (default 30 barras) desde la última barra de precios más altos, genera una señal de compra. Del mismo modo, si el precio de cierre o el precio bajo del barro actual rompe el precio más bajo en el período reciente y un número mínimo de barras desde el último precio más bajo pasado, genera una señal de venta.
Al generar señales de compra, la estrategia entra en posiciones largas a ese precio, con un precio de stop loss y un precio de take profit establecido.
Esta estrategia de backtest de alta y baja interruptor tiene las siguientes ventajas:
Esta estrategia también tiene algunos riesgos:
Los siguientes aspectos pueden ayudar a mitigar estos riesgos:
Esta estrategia puede mejorarse de las siguientes maneras:
En resumen, la Estrategia de prueba de retroceso de alta baja es una estrategia simple y práctica de seguimiento de tendencias. Genera señales comerciales basadas en precios de ruptura periódicos más altos / más bajos. La estrategia tiene ventajas como la simplicidad, el seguimiento de tendencias y la optimización de parámetros, pero también riesgos como el exceso de negociación e incapacidad para manejar mercados oscilantes. Se pueden hacer optimizaciones adicionales en torno a parámetros, filtros de señal, tamaño de posición, etc. para mejorar su rendimiento.
/*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)