Estratégia de Backtesting de Breakout Alto-Baixo


Data de criação: 2023-11-27 15:37:13 última modificação: 2023-11-27 15:37:13
cópia: 0 Cliques: 689
1
focar em
1617
Seguidores

Estratégia de Backtesting de Breakout Alto-Baixo

Visão geral

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.

Princípio da estratégia

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.

Análise de vantagens

A estratégia de retrospecção de alta e baixa velocidade tem as seguintes vantagens:

  1. A lógica da estratégia é simples, fácil de entender e de implementar.
  2. A capacidade de captar as características tendenciais dos preços das ações, seguindo a tendência dos preços.
  3. Pode-se ajustar a combinação de parâmetros da política mais adequada através do parâmetro Finding.
  4. Mecanismos de bloqueio e deterioração embutidos para controlar o risco.
  5. A visualização facilita o ajuste de parâmetros e a análise de resultados.

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. É fácil de produzir transações repetidas e excessivas.
  2. Quando os preços estão a fluctuar, é frequente abrir posições.
  3. O indicador não está na hora e pode ter perdido uma grande oportunidade de tendência.
  4. Não tem em conta a frequência e a amplitude das flutuações do preço das ações.
  5. Sem combinação com outros indicadores para verificar o sinal.

Para controlar esses riscos, pode-se fazer otimizar as seguintes coisas:

  1. Reduzir adequadamente o limiar de perda e aumentar o tempo de detenção.
  2. Aumentar as condições de abertura de posições para evitar aberturas frequentes.
  3. Optimizar parâmetros para encontrar a melhor combinação de parâmetros.
  4. Em combinação com outros indicadores, os sinais de filtragem

Direção de otimização

A estratégia de retrospectiva de alta e baixa de ruptura pode ser otimizada de várias maneiras:

  1. Optimização de parâmetros. Pode-se encontrar o parâmetro ótimo testando diferentes combinações de parâmetros de forma mais sistemática.

  2. 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.

  3. 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.

  4. 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.

  5. Aumentar o mecanismo de gerenciamento de posições. Por exemplo, quando a perda atinge uma certa proporção, a abertura de posições é interrompida.

Resumir

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.

Código-fonte da estratégia
/*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)