Estrategia de doble ruptura larga y corta


Fecha de creación: 2023-11-03 17:16:02 Última modificación: 2023-11-03 17:16:02
Copiar: 1 Número de Visitas: 623
1
Seguir
1617
Seguidores

Estrategia de doble ruptura larga y corta

Descripción general

La estrategia utiliza el indicador de las bandas de Brin para buscar puntos de ruptura en el espacio de los polinomios, y se combina con el indicador ADX para filtrar las acciones desfavorables de las fluctuaciones bajas para lograr el seguimiento de la tendencia.

Principio de estrategia

La estrategia se basa principalmente en el indicador de la banda de Brin para determinar la dirección de la carencia. La línea central de la banda de Brin es el promedio móvil del precio de cierre de N días, y el ancho de banda se calcula a través de la diferencia estándar.

Para evitar el error de negociación causado por una ruptura ineficaz de un movimiento no en tendencia, la estrategia combina el indicador ADX para filtrar el movimiento de baja volatilidad. Sólo se emite una señal de compra o venta cuando el valor del ADX está por debajo del umbral establecido.

La estrategia también establece un stop loss de reajuste y un stop loss de seguimiento hacia arriba. En concreto, cada vez que se abre una posición, se registra el precio mínimo de los días N anteriores como el stop loss de reajuste en esa dirección y el precio máximo como el stop loss de seguimiento hacia arriba. Esto puede bloquear los beneficios y minimizar las pérdidas provocadas por la reversión.

Desde el punto de vista de la lógica del código, la estrategia primero calcula los parámetros del indicador de la banda de Brin y el ADX. Luego, se determina si el precio ha roto la banda de Brin para descender, y si el valor de ADX está por debajo de la brecha, y si se cumple, se genera una señal de compra y venta.

Análisis de las ventajas

  • El uso de la banda de Brin para determinar puntos de ruptura claros en el espacio puede aprovechar las oportunidades de tendencia.
  • Filtración del indicador ADX integrado para evitar el flujo de ondas cuando no hay una tendencia clara
  • El control de pérdidas por retroalimentación es eficaz para controlar las pérdidas individuales
  • El bloqueo de seguimiento hacia arriba puede bloquear la mayor parte de los beneficios

Análisis de riesgos

  • La ruptura de la banda de Brin no tiene en cuenta la relación de energía cuantitativa y podría producir una falsa ruptura
  • El error de filtro de ADX también puede perder oportunidades de tendencia
  • La parada de pérdidas demasiado cerca puede ser revertida
  • Los parámetros incorrectos también afectan el rendimiento de la política

Se puede considerar la combinación de otros indicadores para asegurar el soporte de la capacidad de juicio para romper el VALID; optimizar las condiciones de filtración de ADX, usar la pendiente de la curva de ADX para determinar el punto de inflexión de la tendencia; relajar adecuadamente el rango de paradas de stop loss para evitar que se detenga demasiado cerca.

Dirección de optimización

  • Optimización de los parámetros de longitud de la banda de Bryn para obtener el mejor efecto de ruptura
  • Optimización de las condiciones de filtración de ADX para equilibrar los juicios de tendencia y la tasa de error
  • Añadir otros indicadores para juzgar el grado de apoyo y evitar falsas brechas
  • Optimización de la amplitud de frenado de retroalimentación para evitar el frenado demasiado sensible
  • Optimización de la amplitud de frenado de seguimiento y ampliación de la distancia apropiada

Resumir

La idea general de la estrategia es clara y concisa, utiliza la banda de Bryn para juzgar las señales de ruptura de múltiples espacios claros, y utiliza el indicador ADX para filtrar las operaciones Choppy sin tendencias claras, para bloquear las oportunidades de tendencia. Al mismo tiempo, establece paradas de ajuste de pérdidas y paradas de seguimiento para controlar el riesgo y bloquear las ganancias. La estrategia es fácil de entender y implementar, vale la pena probar y optimizar más, y puede ser una estrategia básica de seguimiento de tendencias.

Código Fuente de la Estrategia
/*backtest
start: 2023-10-26 00:00:00
end: 2023-11-02 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © tweakerID

// This strategy uses Bollinger Bands to buy when the price 
// crosses over the lower band and sell when it crosses down
// the upper band. It only takes trades when the ADX is 
// below a certain level, and exits all trades when it's above it.

//@version=4
strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100)

//Inputs
i_reverse=input(false, title="Reverse Trades")
i_ADXClose=input(true, title="ADX Close")
i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=.5, title="SL Expander")
i_TPExpander=input(defval=0, step=.5, title="TP Expander")

//ADX Calculations
adxlen = input(14, title="ADX Smoothing")
dilen = input(20, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
adxlevel=input(30, step=5)

//BB Calculations
BBCALC=input(false, title="-----------BB Inputs-----------")

length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)
MAlen=input(defval=9)
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Entry Logic
BUY = crossover(source, lower) and sig < adxlevel
SELL = crossunder(source, upper) and sig < adxlevel

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander)
lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander))
sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na
TP= islong ? lTP : isshort ? sTP : na

//Entries
strategy.entry("long", long=i_reverse?false:true, when=BUY)
strategy.entry("short", long=i_reverse?true:false, when=SELL)

//EXITS
if i_ADXClose
    strategy.close_all(when=sig > adxlevel)
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots	
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP")
plot(upper)
plot(lower)