Stratégie de rupture double

Auteur:ChaoZhang est là., Date: 2023-11-03 17:16:02 Je vous en prie.
Les étiquettes:

img

Résumé

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 logique de la stratégie

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.

Analyse des avantages

  • Les bandes de Bollinger offrent des signaux de rupture clairs pour saisir les opportunités de tendance
  • Filtre ADX évite les marchés agités sans tendance claire
  • Le stop loss contrôle efficacement les pertes d'une seule transaction
  • La plupart des bénéfices sont à la traîne

Analyse des risques

  • Les écarts peuvent être faux sans tenir compte du volume
  • Le filtre ADX peut également manquer les opportunités de tendance
  • Arrêtez la perte et prenez le profit trop près peut être arrêté
  • Un mauvais réglage des paramètres affecte les performances de la stratégie

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.

Directions d'amélioration

  • Optimiser la longueur des bandes de Bollinger pour obtenir les meilleurs résultats de rupture
  • Filtre ADX afin d'équilibrer la précision de la tendance et les faux signaux
  • Ajouter d'autres indicateurs pour confirmer la validité de la rupture
  • Optimiser la plage de stop-loss pour éviter une sensibilité excessive
  • Élargir la gamme de bénéfices pour obtenir plus de bénéfices

Conclusion

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)




Plus de