Suivi des tendances et stratégie de négociation à court terme basée sur l'indicateur ADX

Auteur:ChaoZhang est là., Date: 22 janvier 2024 à 17h10
Les étiquettes:

img

Résumé

Cette stratégie combine la super tendance, les points pivots et la plage moyenne vraie (ATR) pour former une ligne de stop loss dynamique, et l'indicateur d'indice de mouvement directionnel moyen (ADX) pour juger et suivre les tendances.

Principe

L'indicateur ADX émet des signaux de trading uniquement lorsque la tendance est suffisamment forte.

En particulier, les Pivot Points obtiennent d'abord le dernier support et la résistance, puis forment un prix moyen dynamique avec la moyenne arithmétique des deux jours précédents. Ensuite, l'ATR est calculé et multiplié par le facteur ATR, puis ajouté ou soustrait du prix moyen dynamique pour obtenir les rails supérieur et inférieur. Lorsque le prix franchit le rail supérieur, il est haussier. Lorsqu'il franchit le rail inférieur, il est baissier.

La ligne de stop loss sera dynamiquement ajustée en fonction du dernier prix et de la valeur ATR, ce qui permet de suivre très bien la tendance.

Analyse des avantages

La stratégie présente les avantages suivants:

  1. Utilisez l'indicateur Super Trend pour suivre la direction de la tendance afin d'éviter de bloquer les bénéfices par les marchés oscillants.

  2. A l'aide de l'indicateur ADX pour juger de la force de la tendance, éviter les erreurs dans les transactions lors de la consolidation.

  3. La ligne de stop-loss est réglée dynamiquement pour maximiser les bénéfices.

  4. Combinez le RSI pour éviter la surachat et la survente.

  5. Dans l'ensemble, le paramètre de stratégie est raisonnable. La sélection de dframe tient compte de la continuité.

Analyse des risques

La stratégie comporte également certains risques:

  1. Les indicateurs Super Trend et MA peuvent émettre des signaux contradictoires.

  2. L'indicateur ADX est réglé sur 14 cycles, ce qui est insuffisamment sensible aux événements soudains.

  3. Le paramètre RSI est défini par défaut, ce qui peut ne pas éviter complètement les surachats et les surventes.

  4. L'impact d'événements soudains n'a pas été pris en compte, comme les mauvaises/bons nouvelles majeures.

Solution correspondante:

  1. Ajustez le cycle MA pour qu'il corresponde à l'indicateur Super Trend.

  2. Essayez de raccourcir le cycle ADX pour augmenter la sensibilité aux événements soudains.

  3. Optimiser les paramètres du RSI pour trouver des valeurs optimales.

  4. Ajoutez le module de filtrage des nouvelles pour éviter les communiqués de presse majeurs.

Optimisation

La stratégie peut également être optimisée dans les aspects suivants:

  1. Ajoutez un modèle d'apprentissage automatique pour juger de la tendance, rendant les décisions commerciales plus intelligentes.

  2. Essayez d'introduire des indicateurs émotionnels alternatifs au lieu d'ADX pour juger de la force de la tendance.

  3. Augmenter le module d'arrêt de perte adaptatif pour rendre l'arrêt de perte plus dynamique et précis.

  4. Extraire plus de fonctionnalités avec la technologie d'apprentissage profond pour optimiser la stratégie globale.

  5. Utiliser des langages avancés comme Python pour le développement de stratégies afin d'augmenter l'évolutivité de la stratégie.

Résumé

Dans l'ensemble, cette stratégie est très pratique. Le noyau est de suivre la direction de la tendance et de participer lorsque la tendance est suffisamment forte. Le paramètre de stop loss et take profit est également très en place pour maximiser le verrouillage des bénéfices tout en évitant les pertes. Bien sûr, il y a encore beaucoup de place pour l'optimisation. L'ajout de la technologie d'apprentissage automatique et d'apprentissage en profondeur rendra la stratégie plus efficace et évolutive.


/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Bendre ADX STrend", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 21, title = "ATR Period")

StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window()  => true

var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)

float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph

if lastpp > 0
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))

var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)

//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)

//
// DMI - Direction Movement Index
// 
[diplus1, diminus1, adx] = ta.dmi(14, 14)

// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 


if (buy and vrsi > overBought and adx > 19)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long, when = window())
    // strategy.close("Sell", "close Sell")

if (sell) and (strategy.position_size > 0)
    // strategy.entry("Sell", strategy.short)
    strategy.close("Buy", "Close Buy")

if(sell and vrsi < overSold and adx > 25)
    strategy.entry("Sell", strategy.short, when = window())

if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
    strategy.close("Sell", "close Sell")

// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
//     strategy.entry("Sell", strategy.short, when = window())

// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0  and (buy))
//     strategy.close("Sell", "close Sell")





Plus de