Estratégia de alto/baixo quebrada

Autora:ChaoZhang, Data: 22-12-2023 12:59:43
Tags:

img

Resumo

A estratégia Broken High/Low é uma estratégia que segue a tendência e que rastreia as rupturas de preço além do alto ou baixo do candelabro anterior.

Estratégia lógica

As principais condições de entrada e saída determinadas pela presente estratégia são:

  1. Identificar se o candelabro é verde ou vermelho para determinar se é uma vela para cima ou para baixo
  2. Verifique se a vela atual quebra o alto ou baixo da vela anterior
  3. Usar médias móveis rápidas e lentas para definir a direção da tendência
  4. Vá longo quando uma vela para cima quebra acima do máximo de uma vela para baixo anterior, vá curto quando uma vela para baixo quebra abaixo do mínimo de uma vela para cima anterior
  5. As condições de saída são desencadeadas por stop loss ou trailing stop; também pode sair imediatamente se uma vela de reversão aparecer

A estratégia também utiliza filtros baseados na segunda vela de reversão para evitar falhas e garantir a confiabilidade do sinal.

Análise das vantagens

  • Orientação estratégica clara, operações de fuga fáceis de compreender
  • Assegura um juízo de tendência correto combinando médias móveis duplas
  • O trailing stop ajuda a garantir mais lucros.
  • Os filtros de velas de inversão ajudam a evitar perseguir altos e matar baixos

Análise de riscos

  • Uma fuga fracassada pode causar perdas de operações de curto prazo
  • Maior risco de falha de ruptura nos mercados de gama
  • As médias móveis duplas podem atrasar-se, levando a erros de julgamento

Medidas de controlo de riscos:

  1. Selecionar índices ou principais índices de referência para evitar o elevado risco de existências individuais
  2. Otimizar os parâmetros da média móvel para melhorar a precisão do julgamento
  3. Expandir razoavelmente o intervalo de stop loss para controlar a perda de uma única operação

Orientações de otimização

Esta estratégia pode ser otimizada nos seguintes aspectos:

  1. Ensaiar diferentes combinações de parâmetros da média móvel
  2. Ensaio que incorpore outros indicadores técnicos para avaliação combinada
  3. Otimizar os parâmetros dos níveis de entrada e stop loss
  4. Adicionar regras de filtragem quantitativa para selecionar o subjacente de alta qualidade
  5. Incorporar algoritmos de aprendizagem de máquina para otimização de parâmetros adaptativos

Resumo

A estratégia Broken High/Low é, em geral, uma estratégia madura de seguir tendências. Com a ajuda de médias móveis para julgamento auxiliar, pode capturar certo grau de tendências. Os mecanismos de stop loss e trailing stop também ajudam a bloquear lucros. Através de testes e otimização contínuos, os parâmetros e o desempenho desta estratégia podem se tornar mais notáveis.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity)

useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy')
trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy')

fastMALength = input(5 , 'Fast MA length', group = 'Trend strength')
fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength')

slowMALength = input(10, 'Slow MA length', group = 'Trend strength')
slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength')

ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength')

useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy')
secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength')

longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings')
shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings')

fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength)
slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength)

FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters')
FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters')
FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters')
ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters')
ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters')
ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters')
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>time>=start and time<=finish?true:false
afterStartDate = time >= start and time<=finish?true:false
closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters')

trailStopMA = ta.ema(close, trailStopMALength)

isGreenCandle = close > open
isRedCandle = close < open
isBrokenHigh = close > open[1]
isPriorCandleRed = close[1] < open[1]
isPriorPriorCandleRed = close[2] < open[2]
isPriorPriorCandleGreen = close[2] > open[2]
isPriorCandleGreen = close[1] > open[1]
isBrokenLow = close < open[1]

isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh
isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow

isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false
isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false

longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled
longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA)
longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition

shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled
shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA)
shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition

if (longOpenCondition)
    strategy.entry("Long Entry", strategy.long)

if (longCloseCondition)
    strategy.close('Long Entry', 'Long Exit')

if (shortOpenCondition)
    strategy.entry("Short Entry", strategy.long)

if (shortCloseCondition)
    strategy.close('Short Entry', 'Short Exit')

if (closeTradesEOD and hour >= 14 and minute >= 30)
    strategy.close_all("EOD")

plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red)
plot(fastMA)
plot(ignoreSlowMA ? na : slowMA, linewidth = 4)

Mais.