
Eine dynamische Regressionskanalstrategie ist eine quantitative Handelsstrategie, die eine lineare Regressionsanalyse des Preistrends nutzt und einen dynamischen Stop-Loss kombiniert, um einen Trend zu verfolgen. Die Strategie verwendet eine lineare Regression, um einen Preiskanal zu erstellen, Signal zu geben, dass der Preis den Kanal durchbricht, und Buy- und Sell-Anweisungen zu erteilen. Gleichzeitig verfolgt die Strategie den Preis, um die Stop-Loss-Position in Echtzeit zu aktualisieren und die Gewinne zu sperren.
Die Strategie berechnet zunächst die lineare Regressionskurve des Preises, um zu bestimmen, ob der Preis den Auf- oder Abwärtstrend zurückkehrt. Wenn der Preis den Aufwärtstrend überschreitet, wird ein Kaufsignal erzeugt. Wenn der Preis den Unterwärtstrand des Kanals überschreitet, wird ein Verkaufssignal erzeugt.
Nach dem Börsengang wird die Strategie in Echtzeit verfolgen, ob der Preis die Stop-Loss-Durchschnittslinie überschreitet. Wenn mehrere Bestellungen getätigt werden und der Preis die Stop-Loss-Durchschnittslinie überschreitet, werden Stop-Loss-Sale-Anweisungen ausgegeben. Wenn es sich um leere Bestellungen handelt und der Preis die Stop-Loss-Durchschnittslinie überschreitet, werden Stop-Loss-Buy-Anweisungen ausgegeben.
Es ist zu beachten, dass die Strategie, wenn der Preis den Kanal erneut durchbricht, umgekehrt wird.
Die Strategie kombiniert Trends und Reverse Trading Ideen, um den allgemeinen Kursverlauf zu folgen und gleichzeitig kurzfristige Anpassungsmöglichkeiten zu nutzen. Eine Stop-Loss-Strategie, die in Echtzeit aktualisiert wird, kann auch das Risiko effektiv kontrollieren und ist eine eher ausgewogene Handelsmethode.
Im Vergleich zu einfachen Moving Average Strategien ist die Dynamic Regression-Channel-Strategie empfindlicher auf Preisveränderungen und kann Fehlhandlungen reduzieren. Darüber hinaus wird die Strategie nur ausgeführt, wenn die Preise die Kanäle durchbrechen, was dazu beiträgt, ungeordnete aggressive Geschäfte zu vermeiden.
Diese Strategie besteht hauptsächlich aus dem Risiko einer ungenauen Anpassung der Regressionskurve. Wenn die Regressionskanäle falsch und zu breit eingestellt sind, erhöht sich die Wahrscheinlichkeit für einen ungültigen Handel. Wenn die Kanäle zu eng sind, werden Handelschancen verpasst.
Darüber hinaus ist die Einstellung der Stop-Position von entscheidender Bedeutung. Eine zu enge Stop-Position kann leicht durch kurzfristige Preisbewegungen ausgelöst werden, während eine zu locker gestellte Stop-Position keine Risikokontrolle bewirkt. Die Parameter müssen je nach Sorte angepasst werden.
Es kann in Betracht gezogen werden, die Parameter automatisch für verschiedene Zyklen oder Sorten zu optimieren, um die Rückkehrkanäle und die Stop-Loss-Linie besser an die Preisentwicklung anzupassen. Zum Beispiel können optimale Parameter in Kombination mit Machine Learning-Algorithmen trainiert werden.
Auf der anderen Seite kann man verschiedene Arten von Regressionsmethoden ausprobieren, wie z. B. Multimodal-Regression, lokal gewichtete Regression usw., um eine bessere Anpassung zu erzielen. Oder man kann mehrere Regressionsindikatoren kombinieren, um Handelsregeln zu erstellen und die Strategie zu verbessern.
Die Dynamische Reversion-Channel-Strategie verwendet eine Kombination aus Trend- und Reversal-Analysen, um kurzfristige Anpassungsmöglichkeiten zu nutzen und gleichzeitig die Gesamtpreisentwicklung zu berücksichtigen. Die Einstellung der kritischen Reversion-Channel- und Stop-Loss-Positionen hat einen wichtigen Einfluss auf die Effektivität der Strategie. Die Handelsstrategie kann durch Parameteroptimierung und Modell-Iteration weiter verbessert werden.
/*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")