Indicateur de momentum Stratégie de suivi de tendance croisée de moyenne mobile


Date de création: 2023-10-24 12:31:44 Dernière modification: 2023-10-24 12:31:44
Copier: 0 Nombre de clics: 686
1
Suivre
1617
Abonnés

Indicateur de momentum Stratégie de suivi de tendance croisée de moyenne mobile

Aperçu

La stratégie utilise d’abord les moyennes mobiles rapides et les moyennes mobiles lentes pour former des signaux de creux et de creux. Puis, en combinant les moyennes mobiles de certains paramètres, si les moyennes mobiles sur les moyennes mobiles rapides augmentent à nouveau, la tendance se poursuit et le creux est maintenu.

Principe de stratégie

La logique centrale de la stratégie est basée sur les signaux de tendance formés par la croisée des moyennes mobiles et les indicateurs de dynamique pour déterminer le renversement de tendance. La logique du code pour les parties clés est la suivante:

  1. Calculer la moyenne mobile rapide price1 et la moyenne mobile lente price2. Le prix1 est une HMA de 5 cycles et le prix2 est une HMA de 7 cycles.

  2. Un signal de pause est généré lorsque le prix 1 est au-dessus du prix 2 et un signal de pause lorsque le prix 1 est au-dessous du prix 2. C’est une utilisation courante basée sur les moyennes mobiles.

  3. Après le déclenchement d’un signal de multiplication, si l’indicateur de la dynamique de la moyenne mobile rapide price1 croît à nouveau, il est considéré comme une tendance à la poursuite et reste dans l’état de multiplication.

  4. Lorsque l’indicateur de dynamique roc1 est en baisse, on considère que la tendance est inversée et on effectue une position de clôture. La logique de traitement du signal de coupe est la même.

  5. L’introduction d’un seuil ADX, utilisé pour filtrer les signaux erronés dans les conditions de non-tendance, ne génère un véritable signal de plus-que-moins que lorsque l’ADX est supérieur au seuil.

Analyse des avantages

Le plus grand avantage de cette stratégie par rapport à une simple stratégie de moyenne mobile réside dans l’introduction d’un indicateur de dynamique pour déterminer le renversement de tendance, ce qui permet de suivre plus rapidement et plus précisément les tendances et les renversements. Les avantages spécifiques sont les suivants:

  1. Les moyennes mobiles elles-mêmes sont en retard de réponse aux variations de prix, tandis que les indicateurs dynamiques peuvent être plus rapides à capter les signaux de reprise, ce qui est favorable à l’arrêt ou à la réversion des positions en temps opportun.

  2. Les signaux de reprise basés sur des indicateurs de dynamique sont plus fiables et permettent de réduire les positions de reprise inutiles dans les transactions tendancielles.

  3. L’application de l’indicateur ADX évite les signaux erronés dans les marchés non tendanciels et permet à la stratégie de se concentrer davantage sur les phases de tendance, ce qui améliore la probabilité de réaliser des bénéfices.

  4. La logique de la stratégie est claire et simple, facile à comprendre et à suivre, adaptée aux débutants en trading algorithmique.

  5. L’optimisation des paramètres de l’indicateur est large et peut être réalisée pour différents marchés en ajustant les cycles des moyennes mobiles, les paramètres de dynamique, etc.

Analyse des risques

Les principaux risques liés à cette stratégie sont les suivants:

  1. La moyenne mobile elle-même est en retard de réponse aux variations de prix, ce qui peut entraîner un retard de signal et la perte du meilleur moment d’entrée.

  2. La fausse rupture entraîne une ouverture ou une fermeture inutile des positions, nécessitant une optimisation supplémentaire des paramètres de l’indicateur ou l’introduction de conditions de filtrage supplémentaires.

  3. L’analyse de l’inversion de tendance repose sur des indicateurs de dynamique, dont l’effet peut être décompté lorsque le marché change radicalement.

  4. L’indice ADX ne peut pas être parfait pour juger de la tendance et de la consolidation, les seuils trop élevés ou trop bas peuvent causer des problèmes.

  5. La stratégie ne prend pas en compte les coûts de transaction.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Essayez d’autres types de moyennes mobiles, ou ajustez les paramètres des moyennes mobiles pour optimiser l’effet de l’indicateur.

  2. Optimisation de la longueur des paramètres de l’indicateur de dynamique pour qu’il soit plus sensible aux retournements de prix.

  3. Essayez de définir un filtre de prix lorsque l’indicateur de dynamique se retourne pour éviter d’être induit en erreur par de petites fluctuations à court terme.

  4. Améliorer encore l’utilisation de l’ADX, par exemple en utilisant différents paramètres pour différents niveaux d’ADX.

  5. L’introduction de conditions auxiliaires telles que l’indicateur de volume des transactions, l’amélioration de la qualité du signal et le filtrage des fausses percées.

  6. Ajout d’un mécanisme de stop-loss pour contrôler les pertes individuelles. Évaluer le niveau de frais de commission du marché réel et définir un stop-loss raisonnable.

Résumer

La stratégie intègre les avantages des moyennes mobiles et des indicateurs de dynamique, permettant le suivi de la tendance et la capture des inversions. Comparée au suivi de la tendance pure, la stratégie peut répondre plus flexiblement aux différentes phases du marché, tout en conservant la tendance de la négociation, en évitant les pertes causées par la reprise de la hausse.

Code source de la stratégie
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(open, title="Source")

price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"])

ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"])

adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
adxthreshold = input(20, title="ADX threshold")

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)

//study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="")

//plot(sig, color=color.red, title="ADX")

f_hma(_src, _length)=>
    _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
    sma(price, ma1)
else
    if (type1 == "EMA")
        ema(price, ma1)
    else
        f_hma(price, ma1)
    
price2 = if (type2 == "SMA")
    sma(price, ma2)
else
    if (type2 == "EMA")
        ema(price, ma2)
    else
        f_hma(price, ma2)

//plot(series=price, style=line,  title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line,  title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)


//longCondition = price1> price2
longCondition = price1> price2 and sig > adxthreshold
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = price1 < price2 and sig > adxthreshold
if (shortCondition)
    strategy.entry("Short", strategy.short)

lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)

ma1up = false
ma1down = false
ma2up = false
ma2down = false

ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])

trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01

if crossover(roc1, trendStrength1)
    ma1up := true
    ma1down := false
    
if crossunder(roc1, -trendStrength1) 
    ma1up := false
    ma1down := true

shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold
if (shortexitCondition)
    strategy.close("Short")

longexitCondition = ma1down and ma1up[1] and sig > adxthreshold
if (longexitCondition)
    strategy.close("Long")