A estratégia High Low Breaker Backtest é uma estratégia de seguimento de tendências que usa os máximos e mínimos históricos de uma ação para determinar se o preço rompe esses intervalos altos-baixos. Ele calcula o preço mais alto e o preço mais baixo em um determinado período, e gera sinais de compra quando o preço do período atual excede o preço mais alto em um período recente, e sinais de venda quando o preço rompe abaixo do preço mais baixo em um período recente. Como um tipo de estratégia de seguimento de tendências, ele pode capturar algumas características de tendência dos preços das ações e tem valor prático para negociação ao vivo.
A lógica central desta estratégia é calcular o preço mais alto e o preço mais baixo em um certo número de barras (default 50 barras). Ao calcular os preços mais altos / mais baixos, ele permite o uso de preços próximos ou preços altos / baixos reais (default para usar preços altos / baixos). Em seguida, verifica se o preço de fechamento ou preço alto do bar atual excede o preço mais alto no período recente. Se sim e tiver sido mais do que um número mínimo de barras (default 30 bar) desde a última barra de preço mais alto, ele gera um sinal de compra. Da mesma forma, se o preço de fechamento ou o preço baixo do bar atual quebra o preço mais baixo no período recente e um número mínimo de barras desde o último preço mais baixo passado, ele gera um sinal de venda.
Após a geração de sinais de compra, a estratégia entra em posições longas nesse preço, com um preço de stop loss e preço de take profit definido.
Esta estratégia de backtest de alto e baixo interceptor tem as seguintes vantagens:
Esta estratégia tem também alguns riscos:
Os seguintes aspectos podem ajudar a mitigar estes riscos:
Esta estratégia pode ser melhorada das seguintes formas:
Em resumo, a Estratégia de Backtest de High Low Breaker é uma estratégia simples e prática de seguimento de tendências. Ela gera sinais de negociação com base na quebra de preços dos preços mais altos / mais baixos periódicos. A estratégia tem vantagens como simplicidade, seguimento de tendências e otimização de parâmetros, mas também riscos como excesso de negociação e incapacidade de lidar com mercados oscilantes.
/*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)