Esta estratégia usa as bandas superior e inferior do canal de regressão linear, combinado com o desvio padrão duplo para definir sinais de compra e venda de ruptura, para estabelecer posições quando os preços quebram.
A lógica central desta estratégia baseia-se na banda superior, banda inferior e linha média do canal de regressão linear.
Calcular o valor de regressão linear linreg dos preços e o valor de regressão linear do período seguinte linreg_p
Calcular a inclinação inclinação e interceptação interceptação da linha de regressão linear com base em linreg
Calcular o desvio de desvio dos preços em relação à linha de regressão
Definir o dev múltiplo do desvio para obter o deslocamento das bandas superior e inferior
Quando o preço rompe para cima a partir da faixa inferior, definir sinal de compra compra
Quando o preço rompe para baixo a partir da faixa superior, definir venda sinal vender
Quando o preço se inverte a partir da linha do meio do canal, definir o sinal de saída de lucro
Configurar a lógica de negociação baseada em sinais de compra, venda e saída
A maior vantagem desta estratégia é que utiliza a tendência a médio e longo prazo refletida pelo canal de regressão linear.
As bandas superior e inferior podem efetivamente refletir a faixa normal de flutuações de preços.
O cruzamento da linha média como sinal de lucro pode maximizar os lucros e evitar perdas causadas por reversões após a obtenção de lucros.
O canal de regressão linear tem algum atraso, o que pode efetivamente filtrar o ruído do mercado a curto prazo e tornar os sinais de negociação mais confiáveis.
Esta estratégia tem poucos parâmetros e é fácil de implementar, adequada para negociação algorítmica.
Há alguns riscos nesta estratégia:
O atraso do canal de regressão linear pode perder tendências após mudanças drásticas de curto prazo.
A configuração inadequada do multiplicador de desvio também pode levar a sinais falsos.
Confiar apenas nos sinais de ruptura pode levar a perdas de fenda.
A combinação com outros indicadores de canal ou o teste de diferentes fontes de dados podem ajudar.
As principais direcções de otimização desta estratégia:
Otimizar o comprimento do canal de regressão linear para equilibrar o atraso e a sensibilidade.
Otimizar o multiplicador de desvio para melhorar a qualidade do sinal, maximizando o controlo do risco.
Adicionar outros indicadores para filtragem de sinal para melhorar a taxa de vitória, por exemplo, EMA, KDJ, etc.
Adicionar mecanismos de stop loss, tais como o ATR trailing stop loss.
Teste o impacto de diferentes fontes de dados na estratégia, por exemplo, fechamento ajustado, dados de índice, etc.
Ajustar dinamicamente os parâmetros ou os pesos do sinal com base nas condições do mercado.
Em resumo, este é um sistema de ruptura usando o canal de regressão linear como indicador de sinal. A lógica da estratégia é clara e fácil de entender, com poucos parâmetros, tornando a negociação ao vivo relativamente fácil de implementar. No entanto, como otimizar dinamicamente os parâmetros com base nas condições de mercado em mudança e combinar outros indicadores para filtragem de sinal é a chave para o sucesso desta estratégia. Através de testes e otimização contínuos, esta estratégia pode se tornar um sistema quantitativo estável e gerador de lucro.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Robotrading //@version=4 strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1) //Settings source = input(close) length = input(100, minval=1) offset = input(0, minval=0) dev = input(2.0, "Deviation") smoothing = input(1, minval=1) mtf_val = input("", "Resolution", input.resolution) signals = input("Recent", "Signals Display", options=["Recent", "All"]) goto = input(0, "End At Bar Index") //Lin.reg. cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing) linreg = data(linreg(source, length, offset)) linreg_p = data(linreg(source, length, offset+1)) //Deviation x = bar_index slope = linreg - linreg_p intercept = linreg - x*slope deviationSum = 0.0 for i = 0 to length-1 deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2) deviation = sqrt(deviationSum/(length)) x1 = x-length x2 = x y1 = slope*(x-length)+intercept y2 = linreg //Cross dm_current = -deviation*dev + y2 dp_current = deviation*dev + y2 ex_current = (dm_current + dp_current) / 2 buy = crossunder(close, dm_current) sell = crossover(close, dp_current) exit = crossover(close, ex_current) or crossunder(close, ex_current) //Channel updating = goto <= 0 or x < goto // if updating // line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3) // line.delete(b[1]) // line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3) // line.delete(dp[1]) // line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3) // line.delete(dm[1]) //Lines plot(dm_current, color = color.lime) plot(dp_current, color = color.red) plot(ex_current) //Trading if ex_current > 0 strategy.entry("Long", strategy.long, na, limit = dm_current) strategy.entry("Short", strategy.short, na, limit = dp_current) strategy.exit("ExitLong", "Long", limit = ex_current) strategy.exit("ExitShort", "Short", limit = ex_current)