
A estratégia de dupla ruptura de tendência utiliza um conjunto de indicadores técnicos, incluindo linhas de tendência, cruzamentos de linhas médias e rupturas de canais de preço, para identificar mudanças na tendência do mercado e capturar oportunidades de reversão de tendência. A estratégia combina o acompanhamento de tendências e sinais de ruptura, e as entradas e saídas são mais estáveis, mas também existem riscos de falsa ruptura.
A estratégia primeiro divide a tendência do horizonte por um ponto alto e um ponto baixo no eixo central. Quando o preço quebra a linha de tendência, indica uma reversão de tendência potencial. A inclinação é calculada usando o método ATR, para torná-la mais próxima da flutuação real.
A estratégia usa a linha de 5 dias de curto prazo e a linha de 34 dias de longo prazo para construir uma estratégia de cruzamento de linha de média lenta. A linha de média curta passa pela linha de média longa como um sinal de compra e a linha de média baixa como um sinal de venda.
A estratégia também estabelece um canal de preços de 5 dias, que quebra o rack de compra e o rack de venda, capturando brechas de preços de curto prazo. Combinado com a média rápida e lenta, determina a confiabilidade da quebra.
A combinação dos três indicadores técnicos acima é usada para a estratégia, formando um forte mecanismo de julgamento duplo e evitando erros de negociação.
A integração de vários indicadores técnicos permitiu avaliar a robustez dos sinais e reduzir os danos causados por falhas.
As medias rápidas e os canais de preços capturam as mudanças de tendências de preços de curto prazo. As medias lentas e as linhas de tendência seguem tendências de longo prazo, sendo mais estáveis nas entradas e saídas.
A estrutura do código é clara, os parâmetros do indicador são ajustáveis e podem ser ajustados e otimizados para diferentes períodos e variedades.
A combinação de julgamento de tendência e sinais de ruptura, em uma tendência de mercado de alta, o mercado é mais agressivo, o que favorece a obtenção de lucro; em uma escalação de alcance, a frequência de negociação de sinais de ruptura é menor, o que ajuda a evitar grandes tremores.
Existe um certo risco de falsa ruptura, especialmente em cenários de liquidação de preços de turbulência, que pode levar a perdas.
O cruzamento da linha média é um sinal de atraso e, se a tendência se inverter drasticamente, existe o risco de comprar mais ou vender menos.
A integração de vários indicadores técnicos requer um grande número de testes e cálculos para a otimização de parâmetros, o que é bastante demorado.
Para o risco de falsa ruptura, pode ser adicionado um indicador de volume de transação para filtragem, por exemplo, o volume de transação deve ser ampliado quando a ruptura, ou o preço de fechamento de uma linha K não foi ultrapassado antes de alta ou baixa anterior.
Para o risco de compra de alta, você pode definir condições de filtragem de indicadores de sobrevenda, como o indicador RSI para evitar a sobrevenda. Ou definir uma linha de parada para acelerar a parada.
Para os problemas de otimização de parâmetros, pode-se adotar métodos de aprendizado de máquina para auxiliar a busca de otimização, procurando a combinação ideal de parâmetros em uma grande quantidade de dados históricos.
Adicione o indicador de volume de transação ou o indicador de sobrevenda para avaliar a confiabilidade da tendência e configure condições de filtragem rigorosas para evitar perdas por falsas rupturas.
Para diferentes variedades de negociação, ajuste a configuração do parâmetro de linha média e o parâmetro do canal de preço para que ele seja mais adequado às características da variedade.
Aumentar a estratégia de stop loss e controlar as perdas individuais por meio de stop loss móvel, stop loss pendente, etc.
O método de adaptação consiste em reduzir a frequência de abertura de posições quando o mercado entra em uma fase de liquidação de turbulência; aumentar a frequência de negociação quando a tendência é visível.
O método de aprendizagem profunda treina modelos para determinar pontos de compra e venda, auxiliar ou substituir indicadores técnicos tradicionais, e usar a capacidade de generalização da aprendizagem profunda para encontrar estratégias de negociação mais eficazes.
Esta estratégia integra vários indicadores técnicos comuns para formar um sistema de julgamento duplo, capaz de identificar efetivamente as mudanças de tendência, apresentando uma boa estabilidade na retomada. Mas também deve-se ter em conta certos riscos de falsa ruptura, otimizando-se através do aumento de condições de filtragem, estratégias de parada de perda, ajuste de parâmetros e aplicação de métodos de aprendizagem de máquina, que podem melhorar ainda mais o desempenho real da estratégia.
/*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")