Stratégie de double percée longue et courte


Date de création: 2023-11-03 17:16:02 Dernière modification: 2023-11-03 17:16:02
Copier: 1 Nombre de clics: 623
1
Suivre
1617
Abonnés

Stratégie de double percée longue et courte

Aperçu

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.

Principe de stratégie

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.

Analyse des avantages

  • Les points de rupture clairement délimités de la ceinture de Brin permettent de saisir les opportunités de tendance.
  • Filtrage de l’indicateur ADX intégré pour éviter de suivre la vague quand il n’y a pas de tendance claire
  • Le réglage des pertes peut contrôler efficacement les pertes individuelles
  • La plupart des bénéfices peuvent être bloqués avec des stop-loss de suivi à la hausse

Analyse des risques

  • La rupture de la ceinture de Brin n’a pas pris en compte la relation entre la quantité d’énergie et la probabilité de fausse rupture
  • Le filtrage de l’ADX peut aussi être une occasion manquée de tendance
  • Le stop-loss peut s’arrêter en cas d’approche excessive.
  • Les paramètres mal définis peuvent également affecter les performances de la stratégie

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.

Direction d’optimisation

  • Optimiser le paramètre de longueur de la bande de Bryn pour obtenir le meilleur effet de percée
  • Optimiser les conditions de filtrage ADX, équilibrer les jugements de tendance et les taux d’erreur
  • Ajouter d’autres indicateurs pour juger de la capacité de soutien et éviter les faux-bénéfices
  • Optimisation de l’amplitude d’arrêt du réglage pour éviter un arrêt trop sensible
  • Optimisation de l’amplitude d’arrêt de la trace et élargissement approprié de la distance

Résumer

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.

Code source de la stratégie
/*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)