La stratégie de canal de régression dynamique utilise l'analyse de régression linéaire des tendances des prix combinée à un stop loss dynamique pour mettre en œuvre le suivi des tendances dans le trading quantitatif.
La stratégie calcule d'abord une courbe de régression linéaire des prix pour déterminer si les prix dépassent ou dépassent le canal de régression.
Après avoir entré dans une position, la stratégie continue à suivre si les prix dépassent la ligne moyenne mobile de stop-loss. Pour les ordres longs, si les prix tombent en dessous de la ligne de stop-loss, un ordre de vente de stop-loss sera émis. Pour les ordres courts, si les prix dépassent la ligne de stop-loss, un ordre d'achat de stop-loss sera déclenché. Cela bloque les profits et contrôle les risques.
Il est important de noter que si les prix rompent à nouveau le canal en inversant la direction, la stratégie aplatira immédiatement la position initiale et passera à la négociation dans la direction opposée.
Cette stratégie combine à la fois les concepts de suivi de tendance et de réversion moyenne, en suivant la tendance globale des prix tout en capturant les renversements à court terme.
Comparée aux stratégies simples de moyenne mobile, la stratégie de canal de régression dynamique est plus sensible aux changements de prix et peut réduire les mistrades.
Le principal risque réside dans le mauvais ajustement de la courbe de régression: si la plage de canaux est réglée de manière incorrecte, étant trop large ou trop étroite, cela augmentera les transactions invalides ou les opportunités de négociation manquées.
En outre, un bon positionnement du stop loss est essentiel. Un stop loss trop proche des prix du marché est sujet à une liquidation prématurée par volatilité à court terme tandis qu'un stop loss trop éloigné ne peut pas servir son objectif de contrôle des risques.
Considérez l'optimisation automatique des paramètres pour différentes périodes ou produits afin de rendre le canal de régression et la ligne de stop-loss mieux adaptés aux tendances des prix.
Alternativement, différents types de régression tels que la régression polynomielle et la régression pondérée localement peuvent être testés pour améliorer l'ajustement.
La stratégie de canal de régression dynamique utilise habilement à la fois les techniques de suivi de tendance et de réversion moyenne, en suivant la tendance globale du prix tout en capturant les renversements à court terme.
/*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")