
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.
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.
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.
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.
/*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)