Estrategia dinámica de stop loss de línea central ATR


Fecha de creación: 2023-10-16 16:20:06 Última modificación: 2023-10-16 16:20:06
Copiar: 0 Número de Visitas: 716
1
Seguir
1617
Seguidores

Estrategia dinámica de stop loss de línea central ATR

Descripción general

Esta estrategia utiliza la función de regresión lineal y el mínimo de binomial para calcular el canal de precios, que consta de dos líneas verde y roja. Utiliza un stop loss dinámico basado en el ATR reciente para colocar los pedidos de stop loss.

Principio de estrategia

La estrategia utiliza una longitud de 25, la regresión lineal de la desviación de 5 para calcular la línea central xLG. Luego toma el 6% de cada precio por debajo de la línea central como un rango de canal, la línea superior del canal es xLG1r, y la línea inferior del canal es xLG1s.

Cuando el precio es superior a xLG1r, hacer más; cuando el precio es inferior a xLG1s, hacer vacío. Y registrar el último tiempo de hacer más y de hacer vacío. Cuando el último tiempo de hacer más es mayor que el último tiempo de hacer vacío.

El stop de ATR dinámico se calcula utilizando el ciclo ATR 1, multiplicado por 2. En el caso de hacer más, la línea de parada es el precio de cierre menos el producto del valor de ATR y el producto del múltiplo; en el caso de hacer vacío, la línea de parada es el producto del valor de cierre más el valor de ATR y el producto del múltiplo.

Análisis de las ventajas

  • Utilizando un canal de regresión lineal, se puede seguir una tendencia a largo plazo
  • Se puede ajustar de forma dinámica para evitar pérdidas demasiado grandes o demasiado pequeñas basadas en el cálculo de ATR
  • La adopción de señales de ruptura de precios puede reducir las falsas señales

Riesgos y mejoras

  • Los parámetros del canal de regresión lineal necesitan ser optimizados, y el alcance actual del canal puede ser demasiado estrecho.
  • El multiplicador ATR también necesita pruebas para obtener los mejores parámetros
  • Se puede considerar la posibilidad de agregar un mecanismo de confirmación en el momento de la brecha para evitar una falsa brecha.

Optimización de las ideas

  • Prueba de diferentes ciclos de longitud de regresión para encontrar un parámetro óptimo
  • Prueba diferentes ciclos de ATR y multiplicadores de stop loss
  • Añadir condiciones de confirmación adicionales, como la ruptura de volumen de transacción, cuando se detecta una señal de ruptura

Resumir

La estrategia integra varios indicadores técnicos, como el seguimiento de tendencias, paradas dinámicas y señales de ruptura, formando un sistema de seguimiento de tendencias con una mayor adaptabilidad. La estabilidad y rentabilidad de la estrategia se pueden mejorar aún más mediante la optimización de los parámetros y el aumento de la filtración de señales. La estrategia puede proporcionar una idea muy valiosa para los comerciantes cuantitativos.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("Center of Gravity BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.15)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Center of Gravity /////////////
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

/////////////// Srategy ///////////////
long = possig == 1 
short = possig == -1 

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)