
A estratégia de canal de regressão dinâmica é uma estratégia de negociação quantitativa que utiliza a regressão linear para analisar a tendência de preços e, em combinação com a parada dinâmica, para realizar o acompanhamento da tendência. A estratégia usa a regressão linear para mapear o canal de preços, determinar os sinais de que os preços quebram o canal e emitir ordens de compra e venda.
A estratégia primeiro calcula a curva de regressão linear do preço para determinar se o preço quebrou o canal de regressão ascendente ou descendente. Quando o preço excede o canal de regressão ascendente, gera um sinal de compra; quando o preço cai no canal de regressão descendente, gera um sinal de venda.
Após a entrada no mercado, a estratégia acompanhará em tempo real a situação em que o preço quebra a linha média de stop loss. Se for feito um pedido excessivo, o preço cai abaixo da linha média de stop loss e emite uma instrução de venda de stop loss; Se for um pedido de fechamento, o preço supera a linha média de stop loss e emite uma instrução de compra de stop loss.
Note-se que, se o preço voltar a atravessar o canal e executar a operação de reversão, a estratégia será imediatamente cancelada e substituída por uma negociação de reversão.
A estratégia combina tendências e inversão de negociação de ideias, permitindo que os preços de acordo com a tendência geral, ao mesmo tempo aproveitar as oportunidades de correção de curto prazo. A estratégia de parada de perda atualizado em tempo real também pode controlar o risco de forma eficaz, é um método de negociação mais equilibrada.
A estratégia de canal de regressão dinâmica é mais sensível às mudanças de preço do que a estratégia de linha média móvel simples, e pode reduzir a ocorrência de erros de negociação. Além disso, a estratégia só é executada quando o preço atravessa o canal para cima e para baixo, o que ajuda a evitar negociações radicais desordenadas.
A estratégia enfrenta principalmente o risco de uma curva de retorno não ser ajustada com precisão. Se o alcance do canal de retorno for definido de forma inadequada e muito ampla, aumentará a probabilidade de negociações inválidas. Se o canal for muito estreito, a oportunidade de negociação será perdido.
Além disso, a configuração do ponto de parada também é fundamental. O ponto de parada é muito próximo, sendo facilmente acionado por flutuações de preços de curto prazo; e um ponto de parada muito relaxado não pode ter o efeito de controle de risco.
Pode-se considerar a otimização automática de parâmetros de acordo com diferentes períodos ou variedades, para que o caminho de retorno e a linha de parada sejam mais adequados à tendência de preços. Por exemplo, pode-se combinar algoritmos de aprendizado de máquina para treinar os parâmetros mais ótimos.
Por outro lado, pode-se experimentar diferentes tipos de regressão, como regressão múltipla, regressão localmente ponderada, etc., para melhorar a eficácia da combinação. Ou combinar vários indicadores de regressão para construir regras de negociação e aumentar a estabilidade da estratégia.
A estratégia de canal de regressão dinâmica utiliza um método integrado de análise de tendências e reversões para negociar ao mesmo tempo em que segue a tendência geral dos preços, aproveitando oportunidades de ajuste de curto prazo. A configuração de canais de regressão e de pontos de parada críticos tem um impacto importante na eficácia da estratégia.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)
// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)
// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)
// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0
var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0
// Regressão linear para uso como sinal de entrada
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)
//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])
// Condição de entrada (reversão da regressão)
if long_entry_signal
long_signal := true
short_signal := false
long_entry_level := high
long_stop_level := low
if short_entry_signal
short_signal := true
long_signal := false
short_entry_level := low
short_stop_level := high
// Indica quando o preço cruzou o nível de stop
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)
// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
if low > long_entry_level
long_stop_level := high
// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
if high < short_stop_level
short_stop_level := low
// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
if long_entry_signal //and short_order_open
strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
short_order_open:= false
if short_entry_signal //and long_order_open
strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
long_order_open:=false
// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
if strategy.opentrades != 0
strategy.cancel_all()
long_order_id+=1
// strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
long_order_open := true
// log.info("Open Long:"+str.tostring(long_order_id))
if short_signal and close < short_entry_level and not short_order_open
if strategy.opentrades != 0
strategy.cancel_all()
short_order_id+=1
// strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
short_order_open := true
// log.info("Open Short:"+str.tostring(short_order_id))
// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
long_order_open := false
if short_signal and close > short_stop_level and short_order_open
strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
short_order_open := false
// Plotagem da regressão e do stop
plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))
plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")
plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)
plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")