Stratégie de trading quantitative de croisement de moyennes mobiles d'ouverture et de clôture combinée à l'indicateur dynamique ADX

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Date de création: 2025-02-18 13:35:54 Dernière modification: 2025-02-18 13:35:54
Copier: 1 Nombre de clics: 445
1
Suivre
1617
Abonnés

Stratégie de trading quantitative de croisement de moyennes mobiles d’ouverture et de clôture combinée à l’indicateur dynamique ADX

Aperçu

Il s’agit d’une stratégie de négociation quantitative basée sur la croisée des moyennes mobiles des prix d’ouverture et de clôture et combinant l’indicateur de tendance moyen ((ADX) comme filtre. La stratégie utilise plusieurs types de moyennes mobiles, y compris SMMA, EMA, DEMA, etc., pour capturer les changements de tendance du marché en identifiant les points de croisement des moyennes, tout en utilisant l’indicateur ADX pour confirmer la force de la tendance, ce qui améliore la fiabilité des transactions.

Principe de stratégie

La logique centrale de la stratégie consiste à calculer les moyennes mobiles des prix d’ouverture et de clôture, produisant des signaux de multiplication lorsque la moyenne de clôture traverse la moyenne d’ouverture vers le haut et que la valeur ADX est supérieure à la barre définie; produisant des signaux de blanchiment lorsque la moyenne de clôture traverse la moyenne d’ouverture vers le bas et que la valeur ADX est supérieure à la barre définie. La stratégie prend en charge plusieurs méthodes de calcul des moyennes mobiles, y compris les moyennes mobiles simples (SMA), les moyennes mobiles indicielles (EMA) et les moyennes mobiles doubles (EMAD), permettant de choisir le type de moyenne le plus approprié en fonction des différentes caractéristiques du marché.

Avantages stratégiques

  1. Flexibilité: plusieurs types de moyennes mobiles sont pris en charge, permettant de choisir la meilleure méthode de calcul de la moyenne en fonction des différents environnements de marché
  2. Confirmation de la tendance: le filtrage de l’indicateur ADX peut réduire efficacement les faux signaux dans les marchés en crise
  3. Contrôle des risques: avec des fonctionnalités de stop loss et de stop-loss, vous pouvez contrôler efficacement le risque de chaque transaction
  4. Haute personnalisation: offre plusieurs interfaces de paramètres, y compris les cycles de ligne moyenne, les valeurs de seuil ADX, la direction des transactions, etc., pour faciliter l’optimisation de la stratégie
  5. Prise en charge de plusieurs cycles temporels: fonctionne sur différents cycles temporels et s’adapte à différents styles de trading

Risque stratégique

  1. Décalage de la moyenne: la moyenne mobile est essentiellement un indicateur de décalage, qui peut générer un signal de décalage dans un marché en évolution rapide
  2. Risque de fausse rupture: une fausse rupture de la ligne moyenne peut survenir lors d’une perturbation du marché, même avec un filtre ADX
  3. Sensitivité des paramètres: les effets de la stratégie sont sensibles aux paramètres, et doivent être adaptés en fonction des conditions du marché
  4. Adaptabilité du marché: meilleure performance dans les marchés en forte tendance, mais peut être fréquent dans les marchés en turbulence
  5. Complexité du calcul: plusieurs types de calculs linéaires peuvent augmenter la charge du système et nécessitent une attention particulière à l’efficacité opérationnelle

Orientation de l’optimisation de la stratégie

  1. Présentation des indicateurs de volume : L’efficacité de la tendance peut être confirmée en combinant les variations de volume
  2. Optimisation des paramètres ADX: ajustement des seuils ADX en fonction des différentes dynamiques du cycle du marché
  3. Ajout d’indicateurs de confirmation de tendance: d’autres indicateurs de tendance peuvent être envisagés pour améliorer la fiabilité du signal
  4. Amélioration des mécanismes d’arrêt des pertes: introduction d’un arrêt de suivi des pertes ou d’un arrêt d’adaptation aux fluctuations
  5. Optimiser le moment de la transaction: prendre en compte les fluctuations du marché et les facteurs de liquidité pour choisir le meilleur moment de la transaction

Résumer

Il s’agit d’un système de trading quantifié qui combine une stratégie classique de croisement de la ligne de parité avec un indicateur ADX. Grâce à la prise en charge de plusieurs types de ligne de parité et à la confirmation de tendances ADX, il est possible de mieux saisir les tendances du marché, tout en disposant d’un mécanisme de contrôle des risques bien développé. La stratégie est hautement personnalisable et peut être adaptée de manière optimale en fonction des différentes conditions du marché.

Code source de la stratégie
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © algostudio

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===