
A estratégia de retomada de alta e baixa é uma estratégia de acompanhamento de tendências que utiliza os altos e baixos históricos das ações para determinar se o preço ultrapassou esses altos e baixos. Ela gera um sinal de compra quando o preço do ciclo atual supera o preço mais alto do período mais recente; e um sinal de venda quando o preço cai abaixo do preço mais baixo do período mais recente.
A lógica central da estratégia é a de calcular o máximo e o mínimo dos preços de um determinado período (default 50 K-line). Para calcular o máximo e o mínimo, pode-se optar por usar o preço de fechamento ou o máximo e o mínimo (default use o máximo e o mínimo). Em seguida, determinar se o preço de fechamento ou o máximo da linha K atual excede o máximo do período mais recente. Se for o caso, e a distância entre um máximo de um determinado período (default 30 K-line), produz um sinal de compra.
Quando um sinal de compra é gerado, a estratégia compra a esse preço e define um preço de stop loss e um preço de stop loss. Quando o preço toca o preço de stop loss, a estratégia pára a perda e sai; quando o preço toca o preço de stop loss, a estratégia pára e sai. A lógica do sinal de venda é semelhante.
A estratégia de retrospecção de alta e baixa velocidade tem as seguintes vantagens:
A estratégia também apresenta alguns riscos:
Para controlar esses riscos, pode-se fazer otimizar as seguintes coisas:
A estratégia de retrospectiva de alta e baixa de ruptura pode ser otimizada de várias maneiras:
Optimização de parâmetros. Pode-se encontrar o parâmetro ótimo testando diferentes combinações de parâmetros de forma mais sistemática.
Em combinação com outros indicadores, filtra os sinais de compra. Por exemplo, pode ser combinado com o indicador de média móvel, apenas quando o preço ultrapassa o preço máximo, e quando a média móvel de curto prazo atravessa a média móvel de longo prazo, o sinal de compra é gerado.
Considere a frequência de oscilação dos preços das ações. Por exemplo, pode ser combinado com o indicador ATR, quando os preços das ações aumentam oscilações, a amplitude de ruptura é devidamente amenizada.
Distinguir entre mercados de tendência e mercados de turbulência. Em fases de tendência visível, relaxar os parâmetros de forma apropriada para acompanhar a tendência; em mercados de turbulência, apertar os parâmetros de forma apropriada.
Aumentar o mecanismo de gerenciamento de posições. Por exemplo, quando a perda atinge uma certa proporção, a abertura de posições é interrompida.
Em geral, a estratégia de retomada de alta e baixa é uma estratégia de acompanhamento de tendências simples e práticas. Ela determina os sinais de negociação julgando se os preços ultrapassaram os preços mais altos e mais baixos em um determinado período. A estratégia tem vantagens como a simplicidade, o acompanhamento de tendências e a otimização paramétrica, mas também existe o risco de produzir excesso de negociação e de não poder lidar com mercados turbulentos.
/*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)