Estratégia de ruptura do impulso

Autora:ChaoZhang, Data: 2023-11-15 11:09:21
Tags:

img

Resumo

A estratégia Momentum Breakout é uma estratégia de negociação quantitativa que segue as tendências do mercado. Ela calcula o indicador de momento com base em preços históricos para determinar a tendência e a força dos movimentos de preços do mercado, com o objetivo de capturar tendências de médio a longo prazo no mercado.

Estratégia lógica

O núcleo desta estratégia é baseado no indicador de momento. O indicador de momento é o preço de fechamento do período atual menos o preço de fechamento N períodos atrás. Quando o último fechamento da barra é maior do que N períodos atrás, o momento é positivo, indicando uma tendência de alta; quando o fechamento da última barra é menor do que N períodos atrás, o momento é negativo, indicando uma tendência de queda.

A estratégia primeiro calcula o momento de 18 períodos, que é o fechamento atual menos o fechamento de 18 períodos atrás, armazenado em mom0. Então calcula o momento de 1 período de mom0, armazenado em mom1.

Quando mom0>0 e mom1>0, um sinal longo é gerado, indicando um forte impulso ascendente.

A estratégia registra o tempo dos sinais longos e curtos mais recentes. Quando o tempo do sinal longo é mais recente do que o tempo do sinal curto, ele mantém uma posição longa. Quando o tempo do sinal curto é mais recente do que o tempo do sinal longo, ele mantém uma posição curta.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. A lógica é simples e fácil de entender, adequada para iniciantes no comércio quantitativo.

  2. Os indicadores de ímpeto podem capturar as tendências e a força do mercado com taxas de ganho relativamente elevadas ao acompanhar as tendências de médio a longo prazo.

  3. O filtro de impulso duplo ajuda a evitar perdas por falsas fuga.

  4. Adiciona posições após sinal para estabelecer posições de tendência e obter retornos excessivos durante os mercados de tendência.

  5. A saída de stop loss atempada controla o tamanho das perdas de uma única transação e evita grandes perdas de reversões.

Análise de riscos

Alguns riscos desta estratégia a observar:

  1. Pode considerar ampliar a faixa de stop loss durante pullbacks de curto prazo em uma tendência de alta.

  2. Os preços de venda e de venda dos produtos de base podem variar de acordo com o mercado.

  3. A continuação das participações na direcção original após a inversão da tendência aumenta as perdas.

  4. As configurações incorretas dos parâmetros levam a sinais ausentes ou falsos. Os parâmetros devem ser ajustados para diferentes mercados.

Orientações de otimização

Algumas maneiras de otimizar a estratégia:

  1. Otimizar os parâmetros de momento ajustando o cálculo da duração do momento com base no período de tempo e no mercado.

  2. Adicionar outros filtros de indicadores como MACD, KD para evitar perdas por inversões de tendência.

  3. Otimizar a estratégia de stop loss alargando as paradas nas tendências e apertando as paradas nos mercados não em tendência.

  4. Adicionar regras de dimensionamento de posições para diminuir o tamanho em não tendências e aumentar o tamanho em tendências para obter mais lucros.

  5. Otimizar os parâmetros separadamente para diferentes produtos para melhorar a adaptabilidade.

  6. Incorporar algoritmos de aprendizagem de máquina para otimizar dinamicamente parâmetros.

Conclusão

A estratégia de breakout é um sistema intuitivo de seguimento de tendências. Pode efetivamente capturar tendências de médio a longo prazo e alcançar bons lucros durante os mercados de tendências. A gestão de risco através da otimização de stop loss e o uso de outros indicadores para julgar a tendência também são importantes. Com otimização contínua, essa estratégia pode ser desenvolvida em um sistema de negociação quantitativa estável que gera lucros.


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

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)

Mais.