
A estratégia baseia-se no indicador do canal de Brin, combinado com uma média móvel adaptável, para permitir o julgamento e o acompanhamento de tendências com precisão. Ao ajustar os parâmetros dinamicamente, a estratégia pode se adaptar a diferentes variedades e ambientes de mercado, com maior estabilidade e adaptabilidade.
A estratégia é composta por:
Calcule a média móvel adaptativa. Aqui, o indicador de regressão linear é usado para calcular a curva de regressão linear em um determinado período como a média móvel.
Calcule o trajeto ascendente e descendente do canal de Boolean. Aqui, a banda de cálculo do canal é calculada usando o indicador ATR adaptado e, em combinação com o parâmetro ratio2 especificado pelo usuário, calcula-se o trajeto ascendente e descendente do canal de Boolean.
Julgar a hora de comprar e vender. Julgar a direção da tendência e o momento de comprar e vender com base no fato de que o preço quebrou o trajeto de cima para baixo do canal de Brin. Quando o preço quebrou o trajeto de baixo para cima, foi considerado um sinal de compra; Quando o preço caiu de cima para baixo e quebrou o trajeto de cima, foi considerado um sinal de venda.
Estabelecer um stop loss. Usar um stop loss de ponto fixo para controlar o risco, e ao mesmo tempo usar um stop loss de seguimento após o ponto fixo para definir um stop loss, ao mesmo tempo em que garante o lucro e maximiza a tendência.
O tempo de início e fim do teste de retrospectiva é definido em combinação com o período de retrospectiva, para otimização de testes de estratégias.
Desenho de parâmetros adaptativos. A banda de passagem e a média móvel do canal de Brin são calculadas de forma adaptativa, permitindo que a estratégia se adapte às mudanças do mercado.
O ponto de ruptura é claro. O ponto de ruptura de tendência é determinado com o uso de um ponto de ruptura ascendente e descendente do canal de Brin. O biosignal é mais claro.
A configuração do stop loss é razoável. O risco de controle de stop loss é fixado e o stop loss é rastreado para maximizar o lucro da tendência.
Avaliar a eficácia da retrospectiva. Definir um tempo de retrospectiva para verificar a eficácia da estratégia e garantir que ela também seja eficaz em situações históricas.
Implementação fácil de entender. A estratégia é clara e fácil de entender, o código é mais simples, fácil de entender e de operar no disco.
O canal de Brinh precisa de otimização de parâmetros. O canal de Brinh precisa de bandas e ciclos de regressão para ser otimizado de acordo com diferentes variedades e condições de mercado. Se a otimização for inadequada, haverá vários sinais errados ou frequentes False Triggers.
O tempo de retorno pode não ser suficiente. O retorno apenas estabelece o alcance do retorno recente, e não pode cobrir uma situação histórica mais longa para comprovar a estabilidade da estratégia.
Pode haver um risco de sobreajuste. Os parâmetros de retomada atuais podem ter sido otimizados apenas para situações específicas recentes, o que representa um risco de sobreajuste histórico.
O número de pontos de parada precisa ser avaliado para determinar. O número de pontos de parada atual é pequeno e pode ser sensível demais para ser cortado por pequenos choques. O número de pontos de parada adequado precisa ser avaliado.
Falta de indicadores de verificação quantitativa. Atualmente, os sinais de negociação são julgados apenas a partir da ruptura gráfica, sem a introdução de indicadores quantitativos para verificar a eficácia do sinal.
A introdução de mais indicadores de auto-adaptação. Pode testar várias combinações de indicadores de auto-adaptação de linha média, auto-adaptação de canal, para construir estratégias de acompanhamento de tendências mais robustas.
Optimizar a configuração dos parâmetros. É possível encontrar a melhor combinação de parâmetros de canal de Bryn e de linha média por meio de métodos mais sistemáticos, como algoritmos genéticos.
Ampliação do intervalo de tempo de resposta. Ampliação do intervalo de tempo de resposta, a estabilidade da otimização dos parâmetros de teste. Introdução de pontos de deslizamento, taxas de comissão e outros custos de transação para uma resposta mais realista.
Introdução de regras de filtragem de quantificação. Defina regras de indicadores de quantificação, como volume de transação quebrado, diferença de coluna MACD, para evitar sinais errados de ruptura do canal de Boolean.
Otimização do mecanismo de parada. Avaliação de diferentes configurações de pontos de parada fixos e diferentes formas de rastrear a parada para encontrar o padrão de parada ideal.
Verificação em tempo real. Execução de estratégias de otimização em tempo real, registro de reversões de receita e melhoria da estabilidade e confiabilidade das estratégias.
A estratégia tem uma visão geral clara, usa o canal de Brin para determinar a direção da tendência e capturar sinais de ruptura, auxiliado pela linha média móvel para determinar a direção da tendência geral. Com uma certa otimização, pode ser uma estratégia de acompanhamento de tendência mais estável e confiável.
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]
len = input(40)
linear_reg = linreg(close_price, len, 0)
calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2
calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott
plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))
//
length = input(title="linear Length", defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought", defval=1, minval=1)
oversold = input(title="Oversold", defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe", defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period
fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)
// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 9999, title = "To Year", minval = 2015)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev
bbr = (cierre - lower)/(upper - lower)
// plot(bbr)
// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] : nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)
// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] : nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1])
plotshape(zz, title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)
strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY", when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL", when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)