Cette stratégie juge la conversion des cycles haussier et baissier en calculant le taux de variation de la variation du volume, qui appartient aux stratégies de divergence volume-prix. Elle combine l'indicateur de dynamique du volume et les bandes de Bollinger du prix pour déterminer l'effet principal de la variation du volume sur le prix et capturer les points tournants des tendances.
Calculer le taux de variation de la variation de volume (le taux de variation de l'indicateur de différence de volume), pour obtenir le résultat de l'indicateur basé sur la dynamique de volume.
Calculer les bandes de Bollinger de n résultat pour obtenir bbr représentant l'écart type de l'élan de volume.
Calculer les bandes de Bollinger du prix de clôture pour obtenir bbr1 représentant l'écart type du prix.
Calculer la différence hist entre les deux, qui est l'écart type de l'élan de volume moins l'écart type du prix, comme indicateur final.
Lorsque le hist passe au-dessus de 0, c'est le signal d'entrée court, et lorsqu'il passe en dessous de 0, c'est le signal d'entrée long.
En calculant le taux de variation de la variation du volume, l'effet principal de la variation du volume sur le prix est amplifié. Lorsque le volume inverse alors que le prix n'a pas encore été inversé, hist passera au-dessus ou en dessous de 0, générant des signaux de trading. Il peut prédire les points de basculement des tendances des prix à l'avance.
Cette stratégie est une stratégie de divergence volume-prix basée sur le taux de variation du volume, qui peut refléter à l'avance les points tournants de l'évolution des prix.
Le calcul du taux de variation de la variation du volume amplifie l'effet principal de la variation du volume sur le prix, ce qui se traduit par de meilleures performances commerciales.
La combinaison des indicateurs de dynamique de volume avec les bandes de Bollinger des prix rend les signaux de trading plus fiables.
L'utilisation d'un triple lissage exponentiel sur les données Hist rend les signaux plus précis et plus lisse.
La mise en place de lignes surachetées/survendues et d'ordres stop loss/take profit longs/courts permet de contrôler efficacement les risques.
De nombreux paramètres personnalisables tels que la longueur des bandes de Bollinger, le multiplicateur d'écart type et les facteurs de lissage Hist permettent l'optimisation de la stratégie.
Les données sur le volume peuvent ne pas refléter véritablement les transactions sur le marché et pourraient être manipulées.
Il est possible que la divergence volume-prix ne persiste pas et que les prix puissent s'effondrer sans s'inverser.
Des paramètres mal réglés peuvent entraîner une survente ou des signaux inexacts.
Méfiez-vous des faux signaux provenant de données de volume anormales.
Les signaux d'inversion doivent être évités lorsque la tendance est forte.
Les risques peuvent être atténués en optimisant les paramètres, en ajoutant d'autres filtres et en définissant un stop loss/take profit.
Optimiser les paramètres des bandes de Bollinger pour des signaux plus stables.
Ajouter un filtre de tendance pour éviter de négocier contre la tendance.
Incorporer d'autres indicateurs comme le MACD pour la confirmation du signal.
Utilisez l'IA pour optimiser automatiquement les paramètres de manière adaptative.
Ajouter un stop loss/take profit dynamique pour optimiser la gestion des risques.
Appliquer l'apprentissage automatique pour déterminer le taux de réussite de la divergence volume-prix pour une meilleure qualité du signal.
Cette stratégie amplifie l'effet principal du changement de volume sur le prix en calculant le taux de changement de volume, permettant une détection précoce des points tournants de la tendance. Par rapport aux indicateurs de volume uniques, elle a une fiabilité et une précision plus élevées. Mais des risques tels que la manipulation du volume et la rupture de la divergence doivent être évités par l'optimisation des paramètres, des filtres d'indicateurs, etc. À l'avenir, l'IA peut être utilisée pour l'optimisation adaptative des paramètres afin d'améliorer davantage la stabilité et la rentabilité de la stratégie.
/*backtest start: 2022-10-23 00:00:00 end: 2023-10-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © tathal and special thanks to oakwhiz for his porting of my custom volume indicator //@version=5 strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000) startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31) startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12) startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100) endDate = input.int(title='End Date', defval=31, minval=1, maxval=31) endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12) endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100) // Normalize Function normalize(_src, _min, _max) => // Normalizes series with unknown min/max using historical min/max. // _src : series to rescale. // _min, _min: min/max values of rescaled series. var _historicMin = 10e10 var _historicMax = -10e10 _historicMin := math.min(nz(_src, _historicMin), _historicMin) _historicMax := math.max(nz(_src, _historicMax), _historicMax) _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true // Stop loss & Take Profit Section l_sl_inp = input(2.0, title='Long Stop Loss %') / 100 l_tp_inp = input(4.0, title='Long Take Profit %') / 100 l_stop_level = strategy.position_avg_price * (1 - l_sl_inp) l_take_level = strategy.position_avg_price * (1 + l_tp_inp) s_sl_inp = input(2.0, title='Short Stop Loss %') / 100 s_tp_inp = input(4.0, title='Short Take Profit %') / 100 s_stop_level = strategy.position_avg_price * (1 + s_sl_inp) s_take_level = strategy.position_avg_price * (1 - s_tp_inp) src = close // Volume Differnce Indicator Delta float change_src = ta.change(src) float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume) float i_pvt = ta.pvt float result = ta.change(i_obv - i_pvt) float nresult = ta.ema(normalize(result, -1, 1), 20) // Volume Differnce Indicator Delta %B length = input.int(20, minval=1, title='Volume Bands Length') mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev') basis = ta.ema(nresult, length) dev = mult * ta.stdev(nresult, length) upper = basis + dev lower = basis - dev bbr = (nresult - lower) / (upper - lower) // Normal %B, Based on close l1 = input.int(20, minval=1, title='Bollinger Bands Length') src2 = close mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev') basis1 = ta.sma(src2, l1) dev1 = mult1 * ta.stdev(src2, l1) upper1 = basis1 + dev1 lower1 = basis1 - dev1 bbr1 = (src - lower1) / (upper1 - lower1) /// Final Output Line hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3')) /// Overbought / Oversold Line Creation oversold = input(-.1) overbought = input(.4) hline(oversold, linewidth=2, color=color.new(#81c784, 62)) hline(overbought, linewidth=2, color=color.new(#c2185b, 38)) /// Long & Short Conditions short = hist > overbought long = hist < oversold /// Colors & Plotting histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350 plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0)) CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na bgcolor(color.new(CrossBgColor, 90)) /// Strategy Methodology if inDateRange strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level) if inDateRange and strategy.position_size > 0 strategy.close_all(when=short) if inDateRange strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level) if inDateRange and strategy.position_size < 0 strategy.close_all(when=long)