Cette stratégie utilise les bandes de Bollinger pour identifier les points de rupture pour les transactions longues et courtes, combinée à l'indicateur ADX pour filtrer les conditions défavorables du marché à faible volatilité, afin de suivre les tendances.
La stratégie est principalement basée sur l'indicateur Bollinger Bands pour déterminer la direction longue ou courte. La bande moyenne de Bollinger Bands est la moyenne mobile de N jours du prix de clôture, et la largeur de la bande est calculée en utilisant l'écart type. Une rupture en dessous de la bande inférieure indique des transactions longues, tandis qu'une rupture au-dessus de la bande supérieure indique des transactions courtes.
Pour éviter les ruptures invalides et les transactions erronées sur les marchés agités, la stratégie intègre l'indicateur ADX pour filtrer les conditions de marché à faible volatilité. Les signaux de trading ne sont générés que lorsque la valeur de l'ADX est inférieure à un seuil. Lorsque l'ADX dépasse le seuil, toutes les positions sont fermées pour attendre les conditions de tendance.
La stratégie définit également un stop loss et un profit pour les transactions ouvertes. Plus précisément, après l'ouverture d'une position, le prix le plus bas et le prix le plus élevé des N jours précédents sont enregistrés comme le stop loss et les niveaux de profit pour cette direction. Cela permet de verrouiller les bénéfices tout en réduisant les pertes des inversions.
D'après la logique du code, la stratégie calcule d'abord les bandes de Bollinger et les paramètres de l'ADX. Puis elle vérifie si le prix dépasse les bandes supérieures ou inférieures, et si l'ADX est en dessous du seuil, pour générer des signaux de trading.
Considérez la combinaison avec d'autres indicateurs pour confirmer la rupture avec le volume; optimiser le filtre ADX en utilisant la pente pour identifier les changements de tendance; élargir la plage de stop loss et de profit pour éviter une sortie prématurée.
La stratégie a une logique claire et simple, utilisant des bandes de Bollinger pour les signaux de rupture évidents, filtrés par ADX pour les conditions de tendance, pour capturer 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)