Stratégie de suivi de tendance intelligente ADX


Date de création: 2023-11-28 14:04:00 Dernière modification: 2023-11-28 14:04:00
Copier: 0 Nombre de clics: 884
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance intelligente ADX

Aperçu

La stratégie de suivi des tendances intelligentes ADX utilise l’indice de tendance moyenne ((ADX) pour juger de la force de la tendance, la capture de la tendance lorsque la tendance est faible, et le suivi des bénéfices dans la tendance forte. Cette stratégie de déterminer la force de la tendance en même temps que la combinaison de la rupture de prix pour produire un signal de négociation, appartient à une stratégie de suivi de la tendance.

Principe de stratégie

La stratégie est basée sur l’indice de tendance moyenne (ADX) pour juger de la force de la tendance actuelle. L’ADX représente la force de la tendance en calculant la moyenne de l’indicateur de direction des fluctuations de prix au cours d’une période donnée. Lorsque la valeur de l’ADX est inférieure à la valeur de seuil définie, nous pensons que la situation est en train de se compléter, et nous déterminons la portée du carré.

Plus précisément, la stratégie commence par calculer la valeur ADX de 14 cycles, et considère la tendance comme faible si elle est inférieure à 18. Ensuite, elle calcule la portée des cases où les prix les plus élevés et les plus bas des 20 dernières lignes K ont été formés. Lorsque le prix franchit cette case, un signal d’achat et de vente est généré.

Cette stratégie, combinant à la fois un jugement de la force de la tendance et des signaux de rupture, permet de capturer une tendance faible et d’entrer dans la résolution, évitant ainsi de négocier fréquemment dans des conditions désordonnées. Lorsque la tendance est forte, le périmètre d’arrêt est plus grand et permet de réaliser plus de bénéfices.

Avantages stratégiques

  1. La combinaison de la force de la tendance permet d’éviter de faire des transactions fréquentes dans des situations désordonnées.
  2. La perforation du carré ajoute un filtre pour éviter d’être coincé lors d’une secousse.
  3. Il est possible d’obtenir une plus grande marge de manœuvre dans une tendance.
  4. Il est possible de personnaliser les paramètres ADX, les paramètres carrés, le coefficient d’arrêt de perte, etc., pour s’adapter à différentes variétés.

Risque stratégique

  1. Une mauvaise configuration des paramètres ADX peut entraîner une perte de tendance ou une erreur de jugement.
  2. Les cadres trop grands ou trop petits peuvent affecter l’effet.
  3. Un mauvais coefficient d’arrêt peut entraîner un arrêt trop faible ou trop précoce.

Il peut être optimisé en ajustant les paramètres ADX, les paramètres de carré, le coefficient d’arrêt de perte, etc., afin de mieux s’adapter aux différentes variétés et conditions de marché. En même temps, une gestion rigoureuse des fonds est également importante pour contrôler le taux de perte unique et éviter les pertes importantes.

Orientation de l’optimisation de la stratégie

  1. Les paramètres ADX permettent de tester différents effets cycliques.
  2. Les paramètres de carré permettent de tester différentes longueurs pour déterminer la taille optimale de la plage.
  3. Le coefficient d’arrêt de perte peut être ajusté pour optimiser le rapport risque/bénéfice.
  4. On peut tester l’effet d’une transaction unilatérale qui ne fait que faire plus, qui ne fait que faire moins.
  5. On peut ajouter d’autres indicateurs pour les combiner, tels que l’indicateur d’augmentation de la quantité d’énergie.

Résumer

La stratégie de suivi de tendance intelligente ADX est une stratégie de tendance plus stable dans l’ensemble. Elle combine à la fois le jugement de la force de la tendance et les signaux de rupture des prix, évitant dans une certaine mesure le problème de la poursuite des hauts et des bas dans la stratégie de suivi de tendance courante.

Code source de la stratégie
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Developer: Andrew Palladino. 
//Creator: Rob Booker.
//Date: 9/29/2017
//@version=5
//Date: 08/10/2022
//Updated to V5 from V1, default cash settings added and indicators made more easily visible by:
// @ Powerscooter

strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000)

adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings")
adxPeriod = input(14, title="ADX Period", group = "ADX Settings")
adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings")
boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox")
profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss")
stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss")
enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction")


// When the ADX drops below threshold limit, then we consider the pair in consolidation. 
// Set Box around highs and lows of the last 20 candles. with upper and lower boundaries. 
// When price breaks outside of box, a trade is taken. (on close or on touch?)
// Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips. 
// Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3. 


dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

adxHigh(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	plus
	
adxLow(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	minus
	
sig = adx(adxSmoothPeriod, adxPeriod)
//sigHigh = adxHigh(dilen, adxlen)
//sigLow = adxLow(dilen, adxlen)

isADXLow = sig < adxLowerLevel

//boxUpperLevel = ta.highest(high, boxLookBack)[1]
//boxLowerLevel = ta.lowest(low, boxLookBack)[1]

var float boxUpperLevelCarry = 0
var float boxLowerLevelCarry = 0

boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry
boxUpperLevelCarry := boxUpperLevel
boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry
boxLowerLevelCarry := boxLowerLevel

boxWidth = boxUpperLevel - boxLowerLevel

profitTarget = strategy.position_size > 0  ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ?  strategy.position_avg_price - profitTargetMultiple*boxWidth : na
stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na

plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr)
plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr)


bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit")
plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine")
plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine")

isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow

//Long Entry Condition
strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss)
if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0)
    strategy.entry("open_long", strategy.long)

isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow

//Short Entry condition
strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss)
if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0)
    strategy.entry("open_short", strategy.short)