
La estrategia se basa en el indicador de la vía de Brin, combinado con una línea media móvil adaptativa, para un juicio y seguimiento preciso de las tendencias. Mediante el ajuste dinámico de los parámetros, la estrategia puede adaptarse a diferentes variedades y entornos de mercado, con una mayor estabilidad y adaptabilidad.
La estrategia se compone principalmente de las siguientes partes:
Calculación de la media móvil de adaptación. Aquí se utiliza el indicador de regresión lineal para calcular la curva de regresión lineal en un período determinado como media móvil.
Calculación de la subida y bajada de la vía de Bryn. Se utiliza el indicador ATR para calcular la banda de la vía, y luego se combina con el parámetro ratio2 especificado por el usuario para calcular la subida y bajada de la vía de Bryn.
Determina el momento de compra y venta. La dirección de la tendencia y el momento de compra y venta se determinan en función de si el precio ha roto el tren de arriba abajo del canal de Brin.
Establezca un alto de pérdidas y ganancias. Utilice un alto de pérdidas de puntos fijos para controlar el riesgo, y al mismo tiempo utilice un alto de pérdidas de seguimiento después de un punto fijo para establecer un alto, maximizar la tendencia al mismo tiempo que garantiza las ganancias.
El tiempo de inicio y finalización de la prueba se establece en combinación con el período de retrospectiva para optimizar la prueba de la estrategia.
Diseño de parámetros de adaptación. Tanto la banda de canales como el promedio móvil de los canales de Bryn se calculan de manera adaptable, lo que permite que las estrategias se adapten a los cambios en el mercado.
Los cambios de tendencia son más claros en el biosignal que en el punto de inflexión.
La configuración de la parada de pérdidas es razonable. La adopción de un control de pérdidas fijas, el seguimiento de los riesgos de la parada para maximizar los beneficios de la tendencia.
La verificación de la efectividad de la retroalimentación. Establezca un tiempo de retroalimentación para verificar la estrategia y asegurarse de que también sea efectiva en el contexto histórico.
La implementación es fácil de entender. La estrategia es clara y fácil de entender, y el código es más sencillo, fácil de entender y de operar en el disco.
El canal de Brin necesita optimización de parámetros. La banda de canal y el ciclo de regresión del canal de Brin necesitan ser optimizados según las diferentes variedades y el entorno del mercado. Si la optimización no es adecuada, se producen múltiples señales erróneas o frecuentes False Triggers.
El tiempo de retroceso puede no ser suficiente. El retroceso solo establece un alcance de retroceso reciente y no puede cubrir un historial más largo para verificar completamente la estabilidad de la estrategia.
Puede haber un riesgo de sobreajuste. Los parámetros de retroalimentación actuales pueden estar optimizados solo para situaciones específicas recientes, por lo que existe un riesgo de sobreajuste histórico.
Se debe evaluar el número de puntos de parada. Los puntos de parada actuales son pequeños y pueden ser demasiado sensibles para ser cortados por pequeños temblores. Se debe evaluar el número de puntos de parada adecuados.
La falta de indicadores de verificación cuantitativa. Actualmente, las señales de negociación se juzgan solo a partir de las rupturas gráficas, sin la introducción de indicadores cuantitativos para verificar la efectividad de las señales.
Introducir más indicadores de adaptación. Se puede probar una variedad de combinaciones de indicadores de línea media de adaptación y de canales de adaptación para construir estrategias de seguimiento de tendencias más robustas.
Optimización de la configuración de los parámetros. Se puede encontrar la combinación óptima de los parámetros de la vía de Bryn y de la línea media a través de métodos más sistemáticos, como los algoritmos genéticos.
Ampliar el rango de tiempo de respuesta. Ampliar el rango de tiempo de respuesta, la estabilidad de la optimización de los parámetros de prueba. Introducir puntos de deslizamiento, comisiones y otros costos de transacción para una respuesta más realista.
Introducir reglas de filtro cuantitativo. Establecer reglas de indicadores cuantitativos, como el volumen de transacciones quebrado y la brecha de la columna MACD, para evitar que se produzca una señal de ruptura de canal de Brin incorrecta.
Optimización de los mecanismos de detención de pérdidas. Evaluación de diferentes configuraciones de puntos de detención fijos y diferentes métodos de seguimiento de la detención de pérdidas para encontrar el mejor modo de detención.
Verificación en el entorno real. Ejecutar la estrategia optimizada en el entorno real, registrar la retirada de ganancias y mejorar aún más la estabilidad y la fiabilidad de la estrategia.
La estrategia tiene una idea general clara, utiliza el canal de Brin para determinar la dirección de la tendencia y capturar las señales de ruptura, y ayuda a determinar la dirección de la tendencia general con una línea de mediano móvil. Con cierta optimización, puede ser una estrategia de seguimiento de tendencias más estable y confiable.
/*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)