La stratégie de négociation de réversion moyenne est basée sur l'écart de prix par rapport à une moyenne mobile pour prendre des décisions de négociation. Elle tire parti de l'écart à court terme et du modèle de réversion à long terme des prix par rapport à la moyenne en établissant des positions lorsque les prix sont nettement inférieurs ou supérieurs à la moyenne mobile et en clôturant les positions lorsque les prix reviennent.
La stratégie calcule d'abord une moyenne mobile sur une certaine période pour représenter l'évolution des prix à long terme, puis elle détermine le moment et la taille des positions en fonction de l'écart du prix par rapport à la moyenne mobile.
Lorsque le prix tombe en dessous de la moyenne mobile d'un certain pourcentage, cela indique que le prix dévie de la tendance à long terme. Dans ce cas, les positions longues sont progressivement construites avec une taille croissante à mesure que l'écart s'élargit. Lorsque le prix rebondit au-dessus de la moyenne mobile, ce qui suggère un retour à la moyenne, les positions longues sont fermées pour tirer profit.
De même, lorsque le prix dépasse la moyenne mobile d'un seuil, des positions courtes sont construites.
Utiliser la capacité d'identification des tendances des moyennes mobiles pour suivre la tendance d'équilibre à long terme des cours des actions et identifier la direction de la tendance principale.
Réduire le coût moyen en augmentant les positions, obtenant de meilleurs prix d'entrée.
Adopter le "take-profit" par étapes afin d'assurer des bénéfices à différents niveaux de réversion moyenne, réduisant les risques.
La taille des positions de contrôle par pourcentage fixe pour limiter la taille des pertes d'une seule transaction.
Des paramètres flexibles tels que la période de moyenne mobile et la dimensionnement de la position en fonction des différents produits.
L'arrêt de perte fréquent lorsque les prix oscillent peut élargir la plage d'arrêt ou ajouter d'autres filtres.
Une tendance forte peut dépasser la moyenne mobile, ne pouvant pas être fermée à la réversion moyenne, peut réduire la taille de la position identifiée par les indicateurs de force de tendance.
Des paramètres incorrects peuvent entraîner des entrées ou des arrêts trop agressifs.
Une fréquence de négociation élevée entraîne des coûts de négociation substantiels.
Optimiser la période moyenne mobile pour l'adapter aux caractéristiques du produit.
Optimiser la taille des positions pour équilibrer le risque et le rendement.
Ajoutez d'autres filtres techniques pour éviter les transactions inutiles.
Incorporer des mesures de volatilité pour ajuster la taille de la position en fonction des niveaux de fluctuation du marché.
Introduire une mise à l'échelle des objectifs de profit pour réduire les risques et augmenter le rendement.
La stratégie de réversion moyenne utilise la tendance de réversion d'équilibre des actions en entrant sur l'écart par rapport à la moyenne mobile et en tirant un profit sur la réversion. Avec un réglage et des filtres de paramètres appropriés, elle peut s'adapter aux changements du marché et obtenir de bons rendements sous contrôle des risques.
/*backtest start: 2022-10-19 00:00:00 end: 2023-10-25 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("YJ Mean Reversion", overlay=true) //Was designed firstly to work on an index like the S&P 500 , which over time tends to go up in value. //Avoid trading too frequently (e.g. Daily, Weekly), to avoid getting eaten by fees. //If you change the underlying asset, or time frame, tweaking the moving average may be necessary. //Can work with a starting capital of just $1000, optimise the settings as necessary. //Accepts floating point values for the amount of units to purchase (e.g. Bitcoin ). //If price of units exceeds available capital, script will cancel the buy. //Adjusted the input parameters to be more intuitive. //input variables movingAverage = input(title="Moving Average (bars)", type=input.integer, defval=28, minval=1, maxval=1000) //riskPercentage = input(title="Amount to Risk (%)", type=input.integer, defval=1, minval=1, maxval=50) deviation = input(title="Deviation Increment (%)", type=input.float, defval=5, minval=0.01, maxval=100) / 100 unitsLevel1 = input(title="Level 1 (units)", type=input.float, defval=1, minval=0.0001, maxval=10000) unitsLevel2 = input(title="Level 2 (units)", type=input.float, defval=2, minval=0.0001, maxval=10000) unitsLevel3 = input(title="Level 3 (units)", type=input.float, defval=4, minval=0.0001, maxval=10000) unitsLevel4 = input(title="Level 4 (units)", type=input.float, defval=8, minval=0.0001, maxval=10000) unitsLevel5 = input(title="Level 5 (units)", type=input.float, defval=16, minval=0.0001, maxval=10000) //moving average and ma slope (use on weekly chart) ma = sma(close, movingAverage) //sl = ma > ma[4] //units to buy //amount = riskPercentage / 100 * (strategy.initial_capital + strategy.netprofit) //units = floor(amount / close) //mode 1 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (strategy.position_size < 10)) //strategy.order("sell", false, strategy.position_size, when = (close > 1.05 * ma) and (strategy.position_size > 0)) //mode 2 //strategy.order("buy", true, 1, when = close < 0.8 * ma) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 3 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("buy", true, 2, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("buy", true, 4, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("buy", true, 8, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("buy", true, 16, when = (close < 0.75 * ma)) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 4 //strategy.order("buy", true, 1, when = (close < 0.98 * ma) and (close > 0.96 * ma) and (sl)) //strategy.order("buy", true, 2, when = (close < 0.96 * ma) and (close > 0.94 * ma) and (sl)) //strategy.order("buy", true, 4, when = (close < 0.94 * ma) and (close > 0.92 * ma) and (sl)) //strategy.order("buy", true, 8, when = (close < 0.92 * ma) and (close > 0.90 * ma) and (sl)) //strategy.order("buy", true, 16, when = (close < 0.90 * ma) and (sl)) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 5 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("buy", true, 2, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("buy", true, 4, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("buy", true, 8, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("buy", true, 16, when = (close < 0.75 * ma)) //strategy.order("sell", false, 1, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 2, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 4, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 8, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 16, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //mode 6 //strategy.order("B1", true, unitsLevel1 * units, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("B2", true, unitsLevel2 * units, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("B3", true, unitsLevel3 * units, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("B4", true, unitsLevel4 * units, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("B5", true, unitsLevel5 * units, when = (close < 0.75 * ma)) //strategy.order("S1", false, unitsLevel1 * units, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("S2", false, unitsLevel2 * units, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("S3", false, unitsLevel3 * units, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("S4", false, unitsLevel4 * units, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("S5", false, unitsLevel5 * units, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //mode 7 //strategy.order("B1", true, units, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("B2", true, units, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("B3", true, units, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("B4", true, units, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("B5", true, units, when = (close < 0.75 * ma)) //strategy.order("S1", false, units, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("S2", false, units, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("S3", false, units, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("S4", false, units, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("S5", false, units, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //banding calculations aH = 1.0 - deviation aL = aH - deviation bH = aL bL = bH - deviation cH = bL cL = cH - deviation dH = cL dL = dH - deviation eH = dL strategy.initial_capital = 50000 //mode 8 strategy.order("B1", true, unitsLevel1, when = (close < aH * ma) and (close > aL * ma) and (unitsLevel1 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B2", true, unitsLevel2, when = (close < bH * ma) and (close > bL * ma) and (unitsLevel2 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B3", true, unitsLevel3, when = (close < cH * ma) and (close > cL * ma) and (unitsLevel3 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B4", true, unitsLevel4, when = (close < dH * ma) and (close > dL * ma) and (unitsLevel4 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B5", true, unitsLevel5, when = (close < eH * ma) and (unitsLevel5 * close < (strategy.initial_capital + strategy.netprofit))) //banding calculations fL = 1.0 + deviation fH = fL + deviation gL = fH gH = gL + deviation hL = gH hH = hL + deviation iL = hH iH = iL + deviation jL = iH strategy.order("S1", false, unitsLevel1, when = (close > fL * ma) and (close < fH * ma) and (strategy.position_size > 0)) strategy.order("S2", false, unitsLevel2, when = (close > gL * ma) and (close < gH * ma) and (strategy.position_size > 0)) strategy.order("S3", false, unitsLevel3, when = (close > hL * ma) and (close < hH * ma) and (strategy.position_size > 0)) strategy.order("S4", false, unitsLevel4, when = (close > iL * ma) and (close < iH * ma) and (strategy.position_size > 0)) strategy.order("S5", false, unitsLevel5, when = (close > jL * ma) and (strategy.position_size > 0)) plot(ma, color=#666666, linewidth=5)