Estratégia de teste de retorno do quebra-cabeça alto-baixo

Autora:ChaoZhang, Data: 2023-11-27 15:37:13
Tags:

img

Resumo

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.

Estratégia lógica

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.

Análise das vantagens

Esta estratégia de backtest de alto e baixo interceptor tem as seguintes vantagens:

  1. A lógica é simples e fácil de compreender/implementar.
  2. Pode capturar algumas características de tendência dos preços das ações.
  3. Os parâmetros podem ser otimizados para encontrar as melhores combinações de parâmetros.
  4. Controles de risco de stop loss e take profit.
  5. As visualizações facilitam muito o ajuste dos parâmetros e a análise dos resultados.

Análise de riscos

Esta estratégia tem também alguns riscos:

  1. Propensos a múltiplos negócios de flip-flop e excesso de negociação.
  2. Abertura frequente de posições quando oscila o preço.
  3. Perda de grandes oportunidades de tendência se os parâmetros não forem adequadamente definidos.
  4. Sem considerar a frequência e a magnitude das flutuações de preços.
  5. Nenhuma validação do sinal com outros indicadores.

Os seguintes aspectos podem ajudar a mitigar estes riscos:

  1. Reduzir a distância de stop loss para aumentar o tempo de espera.
  2. Adicionar mais critérios de entrada para evitar entradas frequentes.
  3. Otimizar parâmetros para encontrar combinações ideais.
  4. Adicionar condições de filtragem com outros indicadores.

Orientações de otimização

Esta estratégia pode ser melhorada das seguintes formas:

  1. Optimização de parâmetros utilizando testes mais sistemáticos.
  2. Adicionar filtros de sinal com outros indicadores, por exemplo, médias móveis.
  3. Considerar a volatilidade dos preços utilizando o ATR para adaptar os limiares de ruptura.
  4. Diferenciar as tendências dos mercados oscilantes para adaptar os parâmetros.
  5. Melhorar as regras de dimensionamento das posições, por exemplo, parar de abrir novas posições após perdas significativas.

Resumo

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)


Mais.