
La stratégie utilise les indices de la ceinture de Brin pour trouver les points de rupture de la pluralité et, en combinaison avec les indices ADX, filtre les comportements défavorables des fluctuations négatives pour réaliser le suivi de la tendance.
La stratégie est basée sur l’indicateur de la ceinture de Brin pour déterminer la direction de la volatilité. La ligne médiane de la ceinture de Brin est la moyenne mobile du prix de clôture de N jours. La largeur de la bande est calculée par le biais du décalage standard.
Afin d’éviter les erreurs de négociation causées par une rupture inefficace d’une tendance non tendancielle, la stratégie intègre les indicateurs ADX pour filtrer les mouvements à basse volatilité. Un signal d’achat ou de vente n’est émis que lorsque la valeur de l’ADX est inférieure au seuil fixé.
La stratégie impose également un stop-loss de retracement et un stop-trace à la hausse. Plus précisément, chaque fois qu’une position est ouverte, le prix le plus bas des N jours précédents est enregistré comme un stop-loss de retracement dans cette direction et le prix le plus élevé comme un stop-trace à la hausse. Cela permet de bloquer les bénéfices tout en minimisant les pertes causées par le renversement.
D’un point de vue logique du code, la stratégie commence par calculer les bandes de Brin et les paramètres de l’indicateur ADX. Ensuite, elle détermine si le prix a franchi la bande de Brin et s’il est descendu, et si la valeur de l’ADX est inférieure à la valeur de la marge.
On peut envisager de combiner le support de la valeur de jugement avec d’autres indicateurs pour assurer la rupture de la VALID; optimiser les conditions de filtrage ADX, en utilisant la pente de la courbe ADX pour déterminer le point de basculement de la tendance; assouplir correctement la zone d’arrêt de la perte, afin d’éviter un arrêt trop proche.
L’idée générale de la stratégie est claire et concise. Elle utilise les courbes de Boolean pour juger des signaux de rupture clairs et utilise les indicateurs ADX pour filtrer les transactions Choppy sans tendance claire, afin de bloquer les opportunités de tendance.
/*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)