
La stratégie de négociation en pourcentage de dynamique relative au volume d’échange est un système de négociation intégré combinant l’analyse de la dynamique de l’échange, le filtrage du comportement des prix, la détection des ruptures et la logique d’arrêt/arrêt dynamique. Le cœur de la stratégie est d’identifier le moment de l’expansion ou de la contraction du volume d’échange en calculant un indicateur similaire à celui de Williams %R du volume d’échange relatif (RVPR), en combinaison avec un filtre bi-homogène (moyenne mobile rapide et lente) pour identifier le moment de l’expansion ou de la contraction du volume d’échange.
Le principe central de cette stratégie est de convertir les données de transaction en intervalles de pourcentage, en utilisant une méthode de calcul similaire à celle de Williams %R pour analyser la relation entre le volume de transaction actuel et son champ historique. La stratégie utilise les composants clés suivants pour générer des signaux de transaction:
L’oscillateur de la transaction relative %R: il compare la transaction actuelle avec les plus hauts et les plus bas de la transaction historique pour calculer la position relative. Cet indicateur est similaire au Williams %R dans le domaine des prix, mais s’applique aux données de la transaction.
Filtrage des doubles moyennes mobiles: la stratégie utilise deux moyennes mobiles de transaction (FAST et SLOW) et plusieurs algorithmes de lissage (SMA, EMA, JMA, T3, Super Smoother, etc.) peuvent être choisis. Lorsque le volume de transaction est supérieur à la moyenne rapide et que la moyenne rapide est supérieure à la moyenne lente, cela indique une tendance à la hausse du volume de transaction, ce qui peut être un signal de multiplication.
Filtre de comportement des prix: pour filtrer davantage les signaux de négociation en fonction des différentes configurations de filtrage:
Dépasser les filtres: exclure sélectivement les transactions situées à proximité des hauts/bas des 5 piles afin d’éviter des transactions à risque/rendement négatif.
Système d’arrêt et d’arrêt: un mécanisme d’arrêt/arrêt dynamique basé sur l’ATR (amplitude réelle moyenne) peut être configuré en multiples pour ajuster la distance entre l’arrêt et l’arrêt.
Décision de sortie: le trader peut choisir de se retirer de la transaction après un nombre fixe de coups.
Les conditions d’entrée à plusieurs têtes incluent: un volume d’échanges supérieur à la moyenne mobile rapide, une moyenne mobile rapide supérieure à la moyenne mobile lente, un volume d’échanges relatif %R supérieur à la marge, le prix passant par un filtre de direction à plusieurs têtes, et une option inférieure au point de rupture le plus récent. Les conditions d’entrée à vide sont le contraire, et déclenchent une position d’arrêt lorsque les conditions d’exit sont définies.
Analyse multidimensionnelle: Cette stratégie combine le volume des transactions, le comportement des prix et la dynamique des arrêts/arrêts pour fournir un cadre complet d’analyse du marché.
Hauteur personnalisable: la stratégie offre une variété de paramètres qui peuvent être ajustés, y compris le contrôle de la direction des transactions, différents modes de filtrage des prix, le choix du type de moyenne mobile de la transaction, etc., permettant aux traders de personnaliser leur style et leurs préférences sur le marché.
Filtrage d’entrée intelligent: en combinant la dynamique du volume et le comportement des prix, la stratégie est capable d’identifier les opportunités de transactions à plus forte probabilité et d’éviter les signaux de transaction de faible qualité.
Mécanisme de sortie flexible: la stratégie offre des options de sortie basées sur le temps et le prix, y compris des sorties à nombre de barres fixes et des arrêts/arrêts dynamiques basés sur l’ATR, ce qui rend la gestion des risques plus flexible et efficace.
Adaptation à de multiples environnements de marché: grâce à différents modèles de comportement des prix (simple, filtré, dynamique, interne), la stratégie peut s’adapter à différentes conditions de marché, y compris les tendances et les marchés intermédiaires.
Intégration des indicateurs techniques avancés: la stratégie intègre plusieurs types de moyennes mobiles avancées, telles que JMA, T3 et Super Smoother, qui sont excellentes pour réduire le bruit et capturer les tendances réelles.
Risque d’optimisation des paramètres: étant donné que la stratégie contient plusieurs paramètres réglables, il existe un risque d’optimisation excessive, ce qui peut entraîner une excellente performance de la rétroanalyse historique mais une mauvaise efficacité en temps réel. La solution consiste à utiliser des tests avant et une analyse de robustesse pour s’assurer que les paramètres restent stables dans différentes conditions de marché.
Risque de fausse rupture: une hausse du volume de transactions n’est pas nécessairement toujours accompagnée d’une évolution durable des prix. La stratégie peut générer un faux signal lors d’une fausse rupture. Ce risque peut être atténué en ajoutant des indicateurs de confirmation supplémentaires ou en retardant l’entrée.
Dépendance des conditions du marché: la stratégie peut ne pas fonctionner de manière cohérente dans différents environnements de marché (par exemple, haute volatilité vs basse volatilité). Il est recommandé de tester la stratégie dans diverses conditions de marché avant de la mettre en œuvre.
Risque de déclenchement d’un stop: les stops basés sur l’ATR peuvent être déclenchés en cas d’augmentation soudaine de la volatilité. Il peut être plus efficace d’envisager d’utiliser un multiplicateur de stop ajusté sur la volatilité ou de régler le stop à un support/résistance critique.
Le timing de sortie est inflexible: les sorties à barres fixes peuvent fermer des transactions rentables trop tôt ou fermer des transactions perdantes trop tard. Le timing des sorties peut être considéré comme un ajustement dynamique combiné à une tendance ou à un indicateur de dynamique.
Complexité du calcul: La stratégie utilise plusieurs algorithmes de moyennes mobiles complexes et combinaisons de conditions, ce qui peut augmenter la charge de calcul et entraîner des retards d’exécution. Dans les transactions en temps réel, il peut être nécessaire de simplifier certains indicateurs à forte intensité de calcul.
Ajustement dynamique des seuils: les stratégies actuelles utilisent des seuils R de % de volume de transaction relatif fixe (<27), et on peut envisager d’adapter automatiquement les seuils en fonction de la volatilité des volumes de transaction récents. Cela permettra aux stratégies de mieux s’adapter aux différentes conditions du marché et aux changements saisonniers.
Confirmation de plusieurs périodes: l’introduction d’un signal de confirmation de périodes plus élevées permettant de négocier uniquement dans le sens d’une tendance plus importante peut améliorer le taux de réussite de la stratégie et le rapport de risque/rendement. Par exemple, un signal de plusieurs têtes sur la ligne horaire n’est exécuté que lorsque la ligne jour est en hausse.
Analyse de la qualité des transactions: en plus de la quantité de transactions relative, on peut ajouter des indicateurs de diffusion des transactions ou une analyse de la distribution des transactions pour évaluer la qualité des transactions plutôt que la quantité. Cela aide à distinguer les tendances saines de la confirmation des transactions et des signaux potentiels d’épuisement.
Arrêt/arrêt intelligent: l’arrêt/arrêt de base de l’ATR actuel peut être amélioré pour un système plus intelligent, par exemple en fonction de la position critique de support/résistance, ou en utilisant un arrêt ajusté en fonction de la volatilité, resserrant l’arrêt pendant les périodes de basse volatilité et assouplissant l’arrêt pendant les périodes de haute volatilité.
Intégration de la structure du marché: l’intégration de l’analyse de la structure des prix (tels que le support/résistance, les lignes de tendance, les canaux de prix) dans la stratégie peut améliorer la qualité des points d’entrée et de sortie.
Amélioration de la gestion des risques: réalisation d’ajustements dynamiques de la taille des positions, basés sur la volatilité du marché actuel et la performance de la stratégie récente, augmentation des positions dans des environnements à forte probabilité de victoire et réduction des positions dans des périodes d’incertitude.
Intégration de l’apprentissage automatique: l’utilisation d’algorithmes d’apprentissage automatique pour optimiser dynamiquement les paramètres de la stratégie ou pour prédire quels filtres de comportement des prix sont les plus efficaces dans les conditions actuelles du marché peut améliorer encore la performance de la stratégie.
La stratégie de trading dynamique en pourcentage de volume de transaction est un système de trading complet et flexible qui offre aux traders un outil puissant pour identifier les opportunités de marché potentielles en combinant l’analyse du volume de transaction, plusieurs filtres de comportement des prix et des technologies de gestion dynamique des risques. Le principal avantage de la stratégie réside dans son adaptabilité et sa personnalisation, qui permet aux traders de s’adapter en fonction des préférences personnelles et des conditions du marché.
La stratégie est particulièrement adaptée aux traders qui recherchent des signaux de revers ou de poursuite de la tendance basés sur la confirmation de la transaction. En utilisant l’indicateur de volume de transaction relatif de style Williams %R, la stratégie est capable d’identifier les pics de transaction, qui représentent généralement des changements importants dans l’humeur du marché ou une accélération de la tendance.
Bien que cette stratégie offre de nombreux avantages, les traders doivent être conscients des risques potentiels d’optimisation excessive et de la dépendance aux conditions du marché. En testant et en ajustant continuellement, en combinant les directions d’optimisation recommandées, les traders peuvent renforcer davantage la stabilité et la rentabilité à long terme de cette stratégie.
/*backtest
start: 2024-07-04 00:00:00
end: 2025-07-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GabrielAmadeusLau
//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")
// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
e1 = ta.ema(src, length)
e2 = ta.ema(e1, length)
e3 = ta.ema(e2, length)
e4 = ta.ema(e3, length)
e5 = ta.ema(e4, length)
e6 = ta.ema(e5, length)
c1 = -a * a * a
c2 = 3 * a * a + 3 * a * a * a
c3 = -6 * a * a - 3 * a - 3 * a * a * a
c4 = 1 + 3 * a + a * a * a + 3 * a * a
c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
// == Jurik MA == //
jma(float src, int length, float power, float phase) =>
phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
alpha = math.pow(beta, power)
JMA = 0.0
e0 = 0.0
e0 := (1 - alpha) * src + alpha * nz(e0[1])
e1 = 0.0
e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
JMA := e2 + nz(JMA[1])
//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
var float ALPHA = math.pi * math.sqrt(2.0) / Period
var float BETA = math.exp(-ALPHA )
var float COEF2 = -math.pow(BETA, 2)
var float COEF1 = math.cos( ALPHA ) * 2.0 * BETA
var float COEF0 = 1.0 - COEF1 - COEF2
float sma2 = math.avg(Series, nz(Series[1], Series))
float smooth = na, smooth := COEF0 * sma2 +
COEF1 * nz(smooth[1]) +
COEF2 * nz(smooth[2])
// === MA Selector === //
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :
type == "EMA" ? ta.ema(source, length) :
type == "SMMA (RMA)"? ta.rma(source, length) :
type == "WMA" ? ta.wma(source, length) :
type == "VWMA" ? ta.vwma(source, length) :
type == "HMA" ? ta.hma(source, length) :
type == "ALMA" ? ta.alma(source, length, 0.85, 6) :
type == "LSMA" ? ta.linreg(source, length, 0) :
type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
type == "JMA" ? jma(source, length, 2, 50) :
type == "Super Smoother" ? superSmoother(source, length) :
type == "T3" ? t3(source, length, 0.7) :
na
// === Input Parameters === //
rvolRLength = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")
// === Williams %R for Volume === //
wpr(src, length) =>
max_ = ta.highest(src, length)
min_ = ta.lowest(src, length)
(100 * (src - max_) / (max_ - min_)) * -1
// === Volume MAs === //
rvol = wpr(volume, rvolRLength)
rvolFast = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow = ma(volume, rvolSlowLength, rvolmaTypeInput)
// === Price Action Filters === //
up = close > open
upRange = low > low[1] and close > high[1]
upRange_Aggr = close > close[1] and close > open[1]
insideDayUp = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down = close < open
downRange = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow = ta.lowest(low, 5)
// === Mode-Based Filter Logic === //
longBarOK =
dirBarModeL == "Simple" ? up :
dirBarModeL == "Filtered" ? upRange :
dirBarModeL == "Aggressive"? upRange_Aggr :
dirBarModeL == "Inside"? insideDayUp :
dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
dirBarModeL == "Without" ? true : false
shortBarOK =
dirBarModeS == "Simple" ? down :
dirBarModeS == "Filtered" ? downRange :
dirBarModeS == "Aggressive"? downRange_Aggr :
dirBarModeS == "Inside"? insideDayDown :
dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
dirBarModeS == "Without" ? true : false
// === Entry & Exit Logic === //
longCondition = volume > rvolFast and rvolFast > rvolSlow and longBarOK and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)
exitLongCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"
atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na
// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
if (longCondition)
strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)
if (tradeDirection == "Short Only" or tradeDirection == "Both")
if (shortCondition)
strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)
if (exitLongCondition)
strategy.close("Long")
if (exitShortCondition)
strategy.close("Short")
// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)