
La stratégie est basée sur l’indicateur de la voie de Brin, combinée à une moyenne mobile adaptative, permettant un jugement et un suivi précis des tendances. En ajustant dynamiquement les paramètres, la stratégie est adaptée à différentes variétés et environnements de marché, avec une plus grande stabilité et adaptabilité.
La stratégie se compose principalement des éléments suivants:
Calculer une moyenne mobile adaptative. Ici, l’indicateur de régression linéaire est utilisé pour calculer la courbe de régression linéaire sur une période donnée comme moyenne mobile.
Calculer le haut et le bas de la voie de Boolean. Utilisez ici la bande de calcul de l’indicateur ATR auto-adapté, puis combinez le ratio2 paramétré par l’utilisateur pour calculer le haut et le bas de la voie de Boolean.
Déterminer le moment de la vente et de l’achat. Déterminer la direction de la tendance et le moment de la vente et de l’achat en fonction du fait que le prix a franchi la trajectoire ascendante ou descendante du canal de Brin.
La mise en place d’un stop loss est un moyen de contrôler le risque en utilisant un stop loss à un nombre de points fixe, tout en utilisant un stop loss suivi d’un nombre de points fixes, afin de maximiser la tendance tout en garantissant les bénéfices.
Le temps de début et de fin du test est réglé en combinaison avec la période de test de retour, afin d’optimiser le test de la stratégie.
Les bandes de passages et les moyennes mobiles des canaux de Boolean sont calculées de manière adaptative, ce qui permet aux stratégies de s’adapter aux changements du marché.
Les ruptures sont claires. Les ruptures de trajectoire ascendantes et descendantes du canal de Brin sont utilisées pour déterminer le point de basculement de la tendance, le biosignal est plus clair.
Le système de stop loss est raisonnable. Le risque est contrôlé par un stop loss fixe, et le profit est maximisé en suivant le stop loss.
Vérifier l’efficacité de la rétroaction. Définir un délai de rétroaction pour vérifier la stratégie et s’assurer qu’elle est également efficace dans des contextes historiques.
L’idée de la stratégie est claire et compréhensible, le code est simple, facile à comprendre et à utiliser en direct.
Le canal de Brin nécessite une optimisation des paramètres. Les bandes de passage et les cycles de régression du canal de Brin doivent être optimisés en fonction des différentes variétés et des conditions du marché. Si l’optimisation est incorrecte, il peut y avoir plusieurs signaux erronés ou de fréquents faux déclencheurs.
Le temps de rétroaction peut ne pas être suffisant. Il ne couvre que la période récente et ne peut pas couvrir une période historique plus longue pour une vérification complète de la stabilité de la stratégie.
Il peut y avoir un risque de sur-adaptation. Les paramètres de réévaluation actuels peuvent avoir été optimisés uniquement pour une situation récente, ce qui présente un risque de sur-adaptation historique.
Le nombre de points d’arrêt doit être évalué. Le nombre de points d’arrêt actuels est trop petit et peut être trop sensible pour être coupé par une petite secousse. Le nombre de points d’arrêt appropriés doit être évalué.
Manque d’indicateurs de vérification quantitative. Actuellement, les signaux de transaction sont jugés uniquement à partir de la percée graphique. Aucun indicateur de vérification quantitative n’a été introduit pour vérifier l’efficacité du signal.
L’introduction de plus d’indicateurs d’adaptation. Il est possible de tester une combinaison d’indicateurs de ligne moyenne d’adaptation et de canaux d’adaptation pour construire des stratégies de suivi de tendances plus robustes.
Optimiser les paramètres. Les méthodes plus systématiques, telles que les algorithmes génétiques, permettent de trouver la combinaison optimale des paramètres de la voie de Boolean et de l’équilibre.
Élargissement de la période de rétroaction. Élargissement de la période de rétroaction, stabilité de l’optimisation des paramètres de test. Introduction de points de glissement, frais de traitement et autres coûts de transaction pour une rétroaction plus réaliste.
Introduire des règles de filtrage quantique. définir des règles d’indicateurs quantiques tels que la rupture du volume des transactions, l’écart entre les colonnes MACD, afin d’éviter les signaux de rupture de la voie de Boolean erronés.
Optimiser les mécanismes de stop-loss. Évaluer les différents réglages de points de stop-loss fixes et les différentes méthodes de suivi des stop-loss pour trouver les meilleurs modèles de stop-loss.
Vérification en temps réel. Exécution de stratégies optimisées en temps réel, enregistrement des retraits de gains, amélioration de la stabilité et de la fiabilité des stratégies.
La stratégie est bien pensée, utilise les canaux de Boolean pour déterminer la direction de la tendance et capturer les signaux de rupture, et est complétée par une ligne moyenne mobile pour déterminer la direction de la tendance globale. Avec une certaine optimisation, elle peut devenir une stratégie de suivi de tendance plus stable et plus fiable. Cependant, il faut toujours faire attention à la représentativité des intervalles de temps de retrait, à l’introduction de règles de filtrage quantifiées et à la maîtrise des niveaux de stop-loss.
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]
len = input(40)
linear_reg = linreg(close_price, len, 0)
calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2
calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott
plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))
//
length = input(title="linear Length", defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought", defval=1, minval=1)
oversold = input(title="Oversold", defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe", defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period
fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)
// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 9999, title = "To Year", minval = 2015)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev
bbr = (cierre - lower)/(upper - lower)
// plot(bbr)
// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] : nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)
// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] : nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1])
plotshape(zz, title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)
strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY", when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL", when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)