La stratégie de négociation de BabyShark VWAP basée sur les indicateurs RSI VWAP et OBV

Auteur:ChaoZhang est là., Date: 2024-03-08 16h39 et 28
Les étiquettes:

img

Vue d'ensemble de la stratégie

La stratégie de trading BabyShark VWAP est une stratégie de trading quantitative basée sur le prix moyen pondéré par volume (VWAP) et l'indice de force relative du volume sur le solde (OBV RSI).

Principe de stratégie

Le principe de base de cette stratégie est d'utiliser les indicateurs VWAP et OBV RSI pour capturer les tendances du marché et les changements de momentum. VWAP est une moyenne mobile dynamique basée sur le prix et le volume, qui reflète les principales zones de négociation du marché. Lorsque le prix s'écarte de manière significative de VWAP, il indique généralement des conditions de surachat ou de survente sur le marché.

Plus précisément, la stratégie utilise 60 bougies comme période de calcul pour le VWAP, avec le prix de clôture comme données d'entrée. Elle construit ensuite des zones de surachat et de survente basées sur des écarts de prix de 3 écarts types positifs et négatifs par rapport au VWAP. Pour l'IBV RSI, elle utilise 5 bougies comme période de calcul et fixe des seuils de 70 et 30 comme critères pour déterminer les conditions de surachat et de survente.

En termes de logique de négociation, lorsque le prix est dans la zone de survente en dessous de la bande inférieure de VWAP et OBV RSI est inférieure à 30, la stratégie génère un signal long. Inversement, lorsque le prix est dans la zone de surachat au-dessus de la bande supérieure de VWAP et OBV RSI est supérieur à 70, il génère un signal court. En outre, la stratégie fixe un ratio de profit et de stop-loss de 0,6% et introduit une période de refroidissement de 10 bougies après des pertes consécutives pour contrôler les risques.

Les avantages de la stratégie

  1. Combine plusieurs facteurs de marché tels que le prix et le volume pour capturer de manière exhaustive les tendances et l'élan du marché.
  2. Il adopte des indicateurs dynamiques de VWAP et OBV RSI pour s'adapter aux changements dans les différents cycles de marché.
  3. Il définit des ratios raisonnables de prise de bénéfices et d'arrêt des pertes et des périodes de réflexion pour contrôler efficacement les risques tout en saisissant les opportunités.
  4. Une logique claire, facile à comprendre et à mettre en œuvre, avec un certain niveau d'interprétabilité.
  5. Paramètres réglables, adaptés aux traders avec différents styles pour optimiser et améliorer.

Risques stratégiques

  1. Pour les marchés oscillants ou répétitifs, des signaux de négociation fréquents peuvent entraîner une survente et une augmentation des coûts de glissement.
  2. Dans les marchés en tendance, s'appuyer uniquement sur le VWAP pour réaliser des bénéfices peut entraîner une sortie trop précoce de la stratégie, ce qui entraîne une perte de bénéfices de tendance ultérieurs.
  3. Les paramètres fixes peuvent ne pas s'adapter aux changements des conditions du marché, ce qui nécessite une optimisation pour différents instruments et délais.
  4. L'indicateur OBV repose fortement sur les données de volume; lorsque les données de volume sont inexactes ou manipulées, les distorsions de l'indicateur peuvent induire en erreur les jugements.
  5. La stratégie ne tient pas compte de facteurs externes tels que la macroéconomie et les nouvelles, et peut échouer dans des conditions de marché extrêmes.

Directions d'optimisation

  1. Mettre en place davantage de conditions de filtrage pour les marchés oscillants, telles que des indicateurs de confirmation de tendance et des indicateurs de volatilité, afin de réduire la fréquence des transactions.
  2. Optimiser les conditions de sortie, par exemple en utilisant des arrêts de trailing ou en les combinant avec d'autres indicateurs de tendance pour mieux capturer les marchés en tendance.
  3. Effectuer une optimisation adaptative des paramètres RSI VWAP et OBV, en ajustant dynamiquement les périodes de calcul et les paramètres de seuil.
  4. Mettre en place des mécanismes de vérification de l'authenticité du volume afin d'améliorer la fiabilité de l'indicateur RSI OBV.
  5. Il convient d'envisager d'intégrer l'analyse des données macroéconomiques, des indicateurs de sentiment, etc., afin d'améliorer l'adaptabilité et la robustesse de la stratégie.

Résumé

La stratégie de trading BabyShark VWAP est une stratégie de trading quantitative qui combine le prix moyen pondéré par volume et l'indice de force relative du volume sur le solde pour générer des signaux de trading en capturant les conditions de surachat et de survente et les changements de dynamique de tendance. La stratégie a une logique claire, intégrant plusieurs facteurs de marché tels que le prix et le volume pour saisir complètement le pouls du marché. En même temps, des paramètres raisonnables de prise de profit et de stop-loss et des mécanismes de contrôle des risques permettent à la stratégie de poursuivre des rendements tout en tenant compte de la gestion des risques. Cependant, la stratégie présente également des problèmes potentiels tels que l'adaptabilité inadéquate aux marchés oscillants et en tendance et des optimisateurs fixes. Les améliorations futures peuvent se concentrer sur les filtres d'entrée, la prise de profit dynamique, les paramètres de paramètres, l'amélioration de l'analyse des données externes et l'amélioration de la robustesse et


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GreatestUsername

//@version=5
strategy("BabyShark VWAP Strategy", overlay=true, margin_long=100, margin_short=100, calc_on_every_tick = true)


// VWAP
ls = input(false, title='Log-space', group = "Optional")
type = 'Average Deviation'
length = input(60, group="Strategy Modification")
source = input(close, group="Strategy Modification")
_low = ls == true ? math.log(low) : low
_high = ls == true ? math.log(high) : high
src = ls == true ? math.log(source) : source

//weighted mean
pine_vwmean(x, y) =>
    cw = 0.0
    cd = 0.0
    w_sum = 0.0
    d_sum = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw := volume[i]
        d_sum += cw * cd
        w_sum += cw
        w_sum
    d_sum / w_sum

//weighted standard deviation
pine_vwstdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.pow(cd - b, 2)
        w_sum += cw
        w_sum
    math.sqrt(d_sum / w_sum)

//weighted average deviation
pine_vwavdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.abs(cd - b)
        w_sum += cw
        w_sum
    d_sum / w_sum

vwmean = pine_vwmean(src, length)

//consider using Average Deviation instead of Standard Deviatio if there are values outside of 3rd upper & lower bands within a rolling window
dev = if type == 'Standard Deviation'
    dev = pine_vwstdev(src, length, vwmean)
    dev
else if type == 'Average Deviation'
    dev = pine_vwavdev(src, length, vwmean)
    dev

basis = ls == true ? math.exp(vwmean) : vwmean
plot(basis, color=color.new(#b7b7b7, 60), title='Basis')

upper_dev_2 = vwmean + dev * 2
upper_dev_3 = vwmean + dev * 3

lower_dev_2 = vwmean - dev * 2
lower_dev_3 = vwmean - dev * 3

fill(
     plot1=plot(ls == true ? math.exp(upper_dev_2) : upper_dev_2, color=color.new(#B20000, 0), title='Upper dev 2'), 
     plot2=plot(ls == true ? math.exp(upper_dev_3) : upper_dev_3, color=color.new(#FF6666, 0), title='Upper dev 3', display=display.none), 
     color=color.new(#FF4D4D, 80), title='Upper band'
     )
fill(
     plot1=plot(ls == true ? math.exp(lower_dev_3) : lower_dev_3, color=color.new(#00CC00, 0), title='Lower dev 3', display=display.none), 
     plot2=plot(ls == true ? math.exp(lower_dev_2) : lower_dev_2, color=color.new(#008000, 0), title='Lower dev 2'), 
     color=color.new(#006600, 80), title='Lower band'
     )


// Input to enable or disable the table visibility
table_visible = input(false, title="Show Table", group="Deviation Cross Monitor")
// Input for the number of candles to look back
table_length = input(300, title="Table Lookback Length", group="Deviation Cross Monitor")

// Custom count function
count_occurrences(cond, length) =>
    count = 0
    for i = 0 to length - 1
        if cond[i]
            count := count + 1
    count

// Count occurrences of prices above Upper dev 2 and below Lower dev 2

above_upper_dev_2 = count_occurrences(close > upper_dev_2, table_length)
below_lower_dev_2 = count_occurrences(close < lower_dev_2, table_length)

// Create table in the bottom right corner
var table tbl = table.new(position=position.bottom_right, rows=2, columns=2)

if table_visible
    if barstate.islast
        // Update the table headers
        table.cell(tbl, 0, 0, "Above Upper Dev 2", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl, 0, 1, "Below Lower Dev 2", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl, 1, 0, str.tostring(above_upper_dev_2), bgcolor=color.new(color.green, 90), text_color=color.green)
        table.cell(tbl, 1, 1, str.tostring(below_lower_dev_2), bgcolor=color.new(color.red, 90), text_color=color.red)
else
    table.delete(tbl)

// RSI
obvsrc = close
change_1 = ta.change(obvsrc)
obv = ta.cum(ta.change(obvsrc) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)

src2 = obv
len = input.int(5, minval=1, title="RSI Length", group="Strategy Modification")
up = ta.rma(math.max(ta.change(src2), 0), len)
down = ta.rma(-math.min(ta.change(src2), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
higherlvl = input(70, title="Higher Level", group="Strategy Modification")
lowerlvl = input(30, title="Lower Level", group="Strategy Modification")


plot_color = rsi >= higherlvl ? color.red : rsi <= lowerlvl ? color.green : color.new(#b7b7b7, 60)
// plot(rsi, color=plot_color)

//plot(rsi, color=color.white)



// Count occurrences of RSI crossing higher level and lower level
cross_above_higher = ta.crossover(rsi, higherlvl)
cross_below_lower = ta.crossunder(rsi, lowerlvl)
above_higher_count = count_occurrences(cross_above_higher, table_length)
below_lower_count = count_occurrences(cross_below_lower, table_length)

// Create table in the bottom right corner
if (table_visible)
    var table tbl2 = table.new(position=position.bottom_right, rows=2, columns=2)
    if (barstate.islast)
        // Update the table headers
        table.cell(tbl2, 0, 0, "Higher Level Cross", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl2, 0, 1, "Lower Level Cross", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl2, 1, 0, str.tostring(above_higher_count), bgcolor=color.new(color.red, 90), text_color=color.red)
        table.cell(tbl2, 1, 1, str.tostring(below_lower_count), bgcolor=color.new(color.green, 90), text_color=color.green)


// Entries

// Long Entry:
// Price is in the shaded GREEN area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is GREEN.
longCondition1 = close <= lower_dev_3
longConditions = plot_color == color.green and longCondition1 and strategy.position_size == 0

// Short Entry:
// Price is in the shaded RED area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is RED.
shortCondition1 = close >= upper_dev_3
shortConditions = plot_color == color.red and shortCondition1 and strategy.position_size == 0

var int lastEntryBar = 0


shortEMA = ta.ema(close, 12)
longEMA = ta.ema(close, 21)
uptrend = shortEMA > longEMA

if longConditions and lastEntryBar < bar_index - 10 //and uptrend
    strategy.entry("Long", strategy.long, stop=close * 0.994)
    lastEntryBar := bar_index

if shortConditions and lastEntryBar < bar_index - 10 //and not uptrend
    strategy.entry("Short", strategy.short, stop=close * 1.006)
    lastEntryBar := bar_index


if strategy.position_size > 0 and (ta.crossover(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 0.994 > close)
    strategy.close("Long", immediately = true)
if strategy.position_size < 0 and (ta.crossunder(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 1.006 < close)
    strategy.close("Short", immediately = true)

// Stop Loss:
// 0.6%
// After 1 Loss => NO more Trades for 10 Candles (10 minutes) (usually a breakout will happen, and it takes average 10min till it ranges again. So basically wait for range to form again)

// Take Profit:
// Grey line on [Hoss] VWAP Deviation or 0.6%



Plus de