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.
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.
As vantagens desta estratégia incluem:
A lógica é simples e fácil de entender, adequada para iniciantes no comércio quantitativo.
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.
O filtro de impulso duplo ajuda a evitar perdas por falsas fuga.
Adiciona posições após sinal para estabelecer posições de tendência e obter retornos excessivos durante os mercados de tendência.
A saída de stop loss atempada controla o tamanho das perdas de uma única transação e evita grandes perdas de reversões.
Alguns riscos desta estratégia a observar:
Pode considerar ampliar a faixa de stop loss durante pullbacks de curto prazo em uma tendência de alta.
Os preços de venda e de venda dos produtos de base podem variar de acordo com o mercado.
A continuação das participações na direcção original após a inversão da tendência aumenta as perdas.
As configurações incorretas dos parâmetros levam a sinais ausentes ou falsos. Os parâmetros devem ser ajustados para diferentes mercados.
Algumas maneiras de otimizar a estratégia:
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.
Adicionar outros filtros de indicadores como MACD, KD para evitar perdas por inversões de tendência.
Otimizar a estratégia de stop loss alargando as paradas nas tendências e apertando as paradas nos mercados não em tendência.
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.
Otimizar os parâmetros separadamente para diferentes produtos para melhorar a adaptabilidade.
Incorporar algoritmos de aprendizagem de máquina para otimizar dinamicamente parâmetros.
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)