Stratégie de négociation de l'oscillateur du cycle delta par différence de volume

Auteur:ChaoZhang est là., Date: le 30 octobre 2023 à 11h45
Les étiquettes:

img

Résumé

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.

Logique de négociation

  1. 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.

  2. Calculer les bandes de Bollinger de n résultat pour obtenir bbr représentant l'écart type de l'élan de volume.

  3. Calculer les bandes de Bollinger du prix de clôture pour obtenir bbr1 représentant l'écart type du prix.

  4. 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.

  5. 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.

Les avantages

  1. 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.

  2. 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.

  3. La combinaison des indicateurs de dynamique de volume avec les bandes de Bollinger des prix rend les signaux de trading plus fiables.

  4. L'utilisation d'un triple lissage exponentiel sur les données Hist rend les signaux plus précis et plus lisse.

  5. 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.

  6. 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 risques

  1. Les données sur le volume peuvent ne pas refléter véritablement les transactions sur le marché et pourraient être manipulées.

  2. Il est possible que la divergence volume-prix ne persiste pas et que les prix puissent s'effondrer sans s'inverser.

  3. Des paramètres mal réglés peuvent entraîner une survente ou des signaux inexacts.

  4. Méfiez-vous des faux signaux provenant de données de volume anormales.

  5. 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.

Des possibilités d'amélioration

  1. Optimiser les paramètres des bandes de Bollinger pour des signaux plus stables.

  2. Ajouter un filtre de tendance pour éviter de négocier contre la tendance.

  3. Incorporer d'autres indicateurs comme le MACD pour la confirmation du signal.

  4. Utilisez l'IA pour optimiser automatiquement les paramètres de manière adaptative.

  5. Ajouter un stop loss/take profit dynamique pour optimiser la gestion des risques.

  6. Appliquer l'apprentissage automatique pour déterminer le taux de réussite de la divergence volume-prix pour une meilleure qualité du signal.

Conclusion

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)



Plus de