Estratégia de ruptura de tendência dupla

Autora:ChaoZhang, Data: 2024-02-19 11:52:40
Tags:

img

Resumo

A estratégia de ruptura de tendência dupla integra vários indicadores técnicos, incluindo linhas de tendência, cruzamento de médias móveis e rupturas de canal de preços para identificar potenciais pontos de virada no mercado.

Estratégia lógica

Linhas de tendência

A estratégia primeiro usa pivots altos e baixos para dividir tendências de alta e baixa. Quando o preço quebra a linha de tendência, ele sinaliza uma potencial inversão de tendência. A inclinação é calculada usando o método ATR para acompanhar as flutuações reais.

Crossover de média móvel

A estratégia adota uma média móvel de curto prazo de 5 dias e uma média móvel de longo prazo de 34 dias para negociação cruzada rápida e lenta. Uma MA curta cruzando acima da MA longa dá sinais de compra, enquanto cruzar abaixo dá sinais de venda. A MA rápida capta tendências de curto prazo e a MA lenta acompanha tendências de longo prazo.

Canal de preços

O canal de preços de 5 dias também é configurado na estratégia. A quebra acima da faixa superior desencadeia uma entrada longa e a quebra abaixo da faixa inferior desencadeia uma entrada curta para capturar breakouts de preços de curto prazo.

Os três tipos de indicadores técnicos são integrados numa única estratégia para formar um mecanismo robusto de confirmação dupla, evitando operações falsas.

Vantagens

  1. Integra múltiplos indicadores para sinais relativamente fiáveis, reduzindo as perdas de falsas rupturas.

  2. A MA rápida e o canal de preços captam as mudanças de tendência de curto prazo rapidamente.

  3. Estrutura de código limpa com parâmetros ajustáveis para otimização em diferentes produtos e prazos.

  4. Combina rastreamento de tendências e sinais de ruptura para rentabilidade em tendências fortes e evitar falhas em mercados de faixa.

Riscos

  1. Pode haver alguns riscos de falhas, especialmente em cenários de alcance, levando a perdas.

  2. A natureza atrasada dos cruzes de MA comporta o risco de compra de tops ou venda de fundos após uma grande inversão da tendência.

  3. Indicadores integrados múltiplos exigem pesados backtesting e computação para ajuste de parâmetros.

  • Os indicadores de volume podem ser adicionados para validação de rupturas, por exemplo, exigindo expansão de volume em rupturas.

  • Os indicadores de sobrevenda/supercompra evitam cenários de esgotamento de compra/venda.

  • Parar perdas para controlar perdas em negócios falsos.

  • Aprendizagem de máquina para encontrar parâmetros ótimos rapidamente através de dados históricos maciços.

Reforço

  1. Adicionar filtros de volume ou RSI para confirmar mudanças de tendência confiáveis, definindo filtros rigorosos para evitar perdas por falhas.

  2. Ajustar os parâmetros de MA e de canal para diferentes produtos de acordo com as suas características.

  3. Adicionar mecanismos de stop loss através de stop loss de trailing, stop limit ordens para restringir a perda por comércio.

  4. Adotar abordagens adaptativas para negociar com menos frequência durante os mercados de gama e mais durante as fortes tendências estabelecidas.

  5. Treinar modelos de aprendizagem profunda para gerar sinais de compra/venda em vez de apenas usar indicadores técnicos, alavancando redes neurais capacidades de reconhecimento de padrões para encontrar estratégias mais preditivas.

Conclusão

Esta estratégia forma um sistema de confirmação dupla, combinando vários indicadores técnicos populares, capaz de capturar efetivamente as mudanças de tendência com resultados de backtest relativamente estáveis.


/*backtest
start: 2024-02-11 00:00:00
end: 2024-02-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FinanceUpPvtLtd

//@version=5
strategy("FINANCE UP FREE STRATEGY (+919665229664)", overlay=true)

// Script 01 - Trendlines
length_tl = input.int(14, 'Swing Detection Lookback')
mult_tl = input.float(1., 'Slope', minval=0, step=.1)
calcMethod_tl = input.string('Atr', 'Slope Calculation Method', options=['Atr', 'Stdev', 'Linreg'])
backpaint_tl = input(true, tooltip='Backpainting offset displayed elements in the past. Disable backpainting to see real-time information returned by the indicator.')
upCss_tl = input(color.teal, 'Up Trendline Color', group='Style')
dnCss_tl = input(color.red, 'Down Trendline Color', group='Style')
showExt_tl = input(true, 'Show Extended Lines')

var upper_tl = 0.
var lower_tl = 0.
var slope_ph_tl = 0.
var slope_pl_tl = 0.
var offset_tl = backpaint_tl ? length_tl : 0
n_tl = bar_index
src_tl = close
ph_tl = ta.pivothigh(length_tl, length_tl)
pl_tl = ta.pivotlow(length_tl, length_tl)
slope_tl = switch calcMethod_tl
    'Atr'    => ta.atr(length_tl) / length_tl * mult_tl
    'Stdev'  => ta.stdev(src_tl, length_tl) / length_tl * mult_tl
    'Linreg' => math.abs(ta.sma(src_tl * n_tl, length_tl) - ta.sma(src_tl, length_tl) * ta.sma(n_tl, length_tl)) / ta.variance(n_tl, length_tl) / 2 * mult_tl
slope_ph_tl := ph_tl ? slope_tl : slope_ph_tl
slope_pl_tl := pl_tl ? slope_tl : slope_pl_tl
upper_tl := ph_tl ? ph_tl : upper_tl - slope_ph_tl
lower_tl := pl_tl ? pl_tl : lower_tl + slope_pl_tl
var upos_tl = 0
var dnos_tl = 0
upos_tl := ph_tl ? 0 : close > upper_tl - slope_ph_tl * length_tl ? 1 : upos_tl
dnos_tl := pl_tl ? 0 : close < lower_tl + slope_pl_tl * length_tl ? 1 : dnos_tl

// var uptl_tl = line.new(na, na, na, na, color=upCss_tl, style=line.style_dashed, extend=extend.right)
// var dntl_tl = line.new(na, na, na, na, color=dnCss_tl, style=line.style_dashed, extend=extend.right)
// if ph_tl and showExt_tl
//     uptl_tl.set_xy1(n_tl - offset_tl, backpaint_tl ? ph_tl : upper_tl - slope_ph_tl * length_tl)
//     uptl_tl.set_xy2(n_tl - offset_tl + 1, backpaint_tl ? ph_tl - slope_tl : upper_tl - slope_ph_tl * (length_tl + 1))
// if pl_tl and showExt_tl
//     dntl_tl.set_xy1(n_tl - offset_tl, backpaint_tl ? pl_tl : lower_tl + slope_pl_tl * length_tl)
//     dntl_tl.set_xy2(n_tl - offset_tl + 1, backpaint_tl ? pl_tl + slope_tl : lower_tl + slope_pl_tl * (length_tl + 1))

plot(backpaint_tl ? upper_tl : upper_tl - slope_ph_tl * length_tl, 'Upper', color=ph_tl ? na : upCss_tl, offset=-offset_tl)
plot(backpaint_tl ? lower_tl : lower_tl + slope_pl_tl * length_tl, 'Lower', color=pl_tl ? na : dnCss_tl, offset=-offset_tl)

plotshape(upos_tl > upos_tl[1] ? low : na, "Upper Break", shape.labelup, location.absolute, upCss_tl, text="B", textcolor=color.white, size=size.tiny)
plotshape(dnos_tl > dnos_tl[1] ? high : na, "Lower Break", shape.labeldown, location.absolute, dnCss_tl, text="B", textcolor=color.white, size=size.tiny)

alertcondition(upos_tl > upos_tl[1], 'Upward Breakout', 'Price broke the down-trendline upward')
alertcondition(dnos_tl > dnos_tl[1], 'Downward Breakout', 'Price broke the up-trendline downward')

// Script 02 - Channel Breakout
length_channel = input.int(title="Channel Length", minval=1, maxval=1000, defval=5)
upBound_channel = ta.highest(high, length_channel)
downBound_channel = ta.lowest(low, length_channel)
if (not na(close[length_channel]))
    strategy.entry("LE-LE", strategy.long, stop=upBound_channel + syminfo.mintick, comment="LE-LE")
strategy.entry("BECH-DE", strategy.short, stop=downBound_channel - syminfo.mintick, comment="BECH-DE")

// Script 03 - MA Cross
shortlen_ma = input.int(5, "Short MA Length", minval=1)
longlen_ma = input.int(34, "Long MA Length", minval=1)
short_ma = ta.sma(close, shortlen_ma)
long_ma = ta.sma(close, longlen_ma)
plot(short_ma, color=#FF6D00, title="Short MA")
plot(long_ma, color=#43A047, title="Long MA")
plot(ta.cross(short_ma, long_ma) ? short_ma : na, color=#2962FF, style=plot.style_cross, linewidth=4, title="Cross")


Mais.