
A estratégia utiliza o trajeto ascendente e descendente do canal de regressão linear, combinado com a configuração de duplo padrão de diferença para quebrar os sinais de compra e venda, para que o preço abra uma posição após a ruptura. Ao mesmo tempo, usa o cruzamento da linha central do canal como sinal de parada de posição, para que o lucro pare.
A lógica central da estratégia é baseada em trajectórias ascendentes e descendentes de um canal de regressão linear e uma linha central. O processo de cálculo específico é o seguinte:
Calcule o valor de regressão linear do preço, linreg, e o valor de regressão linear do próximo ciclo, linreg_p
A inclinação e intersecção da linha de regressão linear calculada com base no valor de regressão linear
Calcular o desvio do preço em relação à linha de regressão
Defina o múltiplo de desvio dev para obter o desvio de subtração e subtração
Quando o preço se move para cima da trajetória inferior, configure um sinal de compra
Quando o preço se move de cima para baixo, a configuração de sinal de venda sell
Quando o preço inverter da linha média do canal, configure o sinal de parada para exit
A lógica de negociação é definida de acordo com os sinais de compra, venda e parada.
A principal vantagem desta estratégia é a utilização de tendências de preços de médio e longo prazo refletida por um canal de regressão linear.
A trajetória ascendente e descendente do canal de regressão linear pode efetivamente refletir a amplitude normal das flutuações de preços, e a amplitude do canal pode ser usada para configurar sinais de negociação, o que pode reduzir os sinais errados.
O cruzamento da linha central serve como um sinal de parada para bloquear o máximo de lucro e evitar os prejuízos causados pela reversão após o lucro.
A regressão linear tem um certo atraso e pode efetivamente eliminar o ruído do mercado de curto prazo, tornando os sinais de negociação mais confiáveis.
A estratégia tem menos parâmetros, é fácil de implementar e é adequada para a quantificação de transações por meio de algoritmos.
A estratégia também apresenta alguns riscos, como:
Os canais de regressão linear são retardados e podem perder a tendência após mudanças bruscas de curto prazo. Pode-se reduzir adequadamente o ciclo do canal e otimizar os parâmetros.
A configuração incorreta do múltiplo de desvio também pode causar um sinal errado. Pode ser combinado com o parâmetro de otimização de feedback.
O risco de perda por choque é maior com base apenas no sinal de ruptura. Pode ser considerado um filtro em combinação com outros indicadores.
Existe um certo risco de curva de adequação. Pode ser considerado a combinação com outros indicadores de canal, ou testar diferentes fontes de dados.
A estratégia pode ser melhorada em vários aspectos:
Otimizar o comprimento dos canais de regressão linear, equilibrando o atraso e a sensibilidade de resposta.
Otimização do coeficiente de desvio para melhorar a qualidade do sinal, com o risco de controle máximo.
Adicionar outros indicadores para filtragem de sinais e aumentar a taxa de vitória da estratégia. Por exemplo, EMA, KDJ, etc.
Aumentar os mecanismos de stop loss, como o stop loss ATR, o stop loss de rastreamento, etc.
Teste o impacto de diferentes fontes de dados sobre a estratégia. Por exemplo, o uso de dados de recuperação, dados de índice, etc.
Parâmetros de ajuste dinâmico ou peso de sinal em combinação com o ambiente de mercado.
A estratégia como um todo é um sistema de ruptura que utiliza o canal de regressão linear como indicador de sinal. A estratégia é clara e fácil de entender, tem poucos parâmetros e não é muito difícil de implementar no local. Mas como otimizar e ajustar os parâmetros de acordo com a dinâmica do ambiente de mercado, em combinação com outros indicadores para filtrar o sinal, é a chave para o sucesso da estratégia.
/*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)