Les ressources ont été chargées... Je charge...

Stratégie de négociation VWAP avec détection des anomalies de volume

Auteur:ChaoZhang est là., Date: 2024-06-07 15:44:04 Je suis désolé
Les étiquettes:VWAPIndice de résistanceDTJSMA

img

Résumé

Cette stratégie est basée sur plusieurs niveaux VWAP (Volume Weighted Average Price), y compris le prix d'ouverture, le prix élevé, le prix bas et le VWAP des bougies avec un volume anormalement élevé. La stratégie utilise les niveaux VWAP comme support et résistance, tout en tenant compte des situations de volume anormales. Lorsque le prix franchit les niveaux VWAP et remplit certaines conditions, la stratégie génère des signaux de trading.

Principes de stratégie

  1. Calculer plusieurs niveaux de VWAP, y compris le VWAP au prix d'ouverture, le VWAP au prix élevé, le VWAP au prix bas et le VWAP des bougies à volume anormalement élevé.
  2. Détecter les bougies à volume anormalement élevé et réinitialiser les variables cumulatives pour le VWAP à volume anormalement élevé sur ces bougies.
  3. Définir des valeurs de déplacement au-dessus et au-dessous des niveaux VWAP comme conditions de déclenchement des signaux de négociation.
  4. Vérifiez les lacunes du côté opposé du VWAP pour éviter les faux signaux.
  5. Générer plusieurs signaux de négociation basés sur la position de prix par rapport au VWAP et la relation entre le prix de clôture et le prix d'ouverture, y compris les types Wick et Crossover.
  6. Utiliser l'indicateur RSI pour détecter les changements de dynamique et fermer les transactions correspondantes lorsque l'indicateur RSI dépasse 70 ou tombe en dessous de 30.

Analyse des avantages

  1. La stratégie utilise plusieurs niveaux de VWAP, fournissant des informations de support et de résistance plus complètes.
  2. En détectant des bougies avec un volume anormalement élevé, la stratégie peut capturer des changements significatifs du marché.
  3. En définissant des valeurs de déplacement, on peut filtrer certains signaux sonores et améliorer la qualité des signaux de négociation.
  4. La stratégie prend en considération les situations d'écart sur le côté opposé du VWAP, en évitant certains faux signaux.
  5. Plusieurs signaux de négociation sont générés en fonction de la position de prix par rapport au VWAP et de la relation entre le prix de clôture et le prix d'ouverture, ce qui augmente la flexibilité de la stratégie.
  6. L'utilisation de l'indicateur RSI comme condition de sortie peut aider la stratégie à exécuter les transactions en temps opportun lorsque l'élan change.

Analyse des risques

  1. La stratégie repose sur des niveaux de VWAP, qui peuvent perdre leur efficacité dans des conditions de marché extrêmes.
  2. L'appréciation d'un volume anormalement élevé est fondée sur un seuil fixe, qui peut ne pas s'adapter aux différentes situations du marché.
  3. Il peut être nécessaire d'ajuster la fixation des valeurs de déplacement en fonction des différents marchés et instruments de négociation.
  4. La stratégie génère de multiples signaux de négociation, ce qui peut entraîner une survente et des coûts de transaction élevés.
  5. L'indicateur RSI peut produire des signaux de sortie retardés, ce qui entraîne une augmentation des risques liés à la stratégie.

Directions d'optimisation

  1. Optimiser la méthode de calcul des niveaux de VWAP, par exemple en tenant compte de périodes de temps plus longues ou en utilisant des méthodes pondérées.
  2. Optimiser les critères de jugement pour un volume anormalement élevé, par exemple en adoptant des seuils adaptatifs ou en les combinant avec d'autres indicateurs de volume.
  3. Effectuer une optimisation des paramètres sur les valeurs de déplacement pour trouver la plage de déviation optimale.
  4. Mettre en place des mesures de gestion des risques, telles que la fixation des niveaux de stop-loss et de take-profit, afin de contrôler l'exposition au risque des transactions individuelles.
  5. Essayez d'autres indicateurs de momentum ou combinez plusieurs indicateurs pour obtenir des signaux de sortie plus précis.
  6. Filtrer les signaux de négociation pour réduire les sur-trades et les coûts de transaction.

Résumé

Cette stratégie utilise plusieurs niveaux de VWAP et la détection de volume anormal pour générer divers signaux de trading. En considérant la position relative du prix par rapport au VWAP, la relation entre le prix de clôture et le prix d'ouverture, et l'indicateur RSI, la stratégie tente de capturer les changements significatifs du marché et les transactions de sortie en temps opportun. Cependant, la stratégie comporte également certains risques, tels que l'adaptabilité aux conditions extrêmes du marché, le surtrading et les signaux de sortie en retard. Pour améliorer davantage la stratégie, on peut envisager d'optimiser la méthode de calcul du VWAP, les critères de jugement pour le volume anormal, la définition des valeurs de déplacement et l'introduction de mesures de gestion des risques et plus de combinaisons d'indicateurs.


/*backtest
start: 2024-05-30 00:00:00
end: 2024-06-06 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("5 Anchored VWAP Strategy with Abnormally High Volume Candle", overlay=true)

// Initialize VWAP variables
var float vwap_open = na
var float vwap_high = na
var float vwap_low = na
var float vwap_high_volume = na

var float cum_v_open = 0
var float cum_v_high = 0
var float cum_v_low = 0
var float cum_v_high_volume = 0

var float cum_pv_open = 0
var float cum_pv_high = 0
var float cum_pv_low = 0
var float cum_pv_high_volume = 0

var float highest_volume = 0

// Initialize YTD high and low variables
var float ytd_high = na
var float ytd_low = na

// Parameters for abnormal volume detection
length = 20
volume_threshold = 2.0

// Displacement parameters
displacement_percentage = 0.01 // 1% displacement

// Calculate average volume
avg_volume = ta.sma(volume, length)

// Check if it's the first day of the year
is_first_day_of_year = year(time) != year(time[1])

// Reset YTD high and low on the first day of the year
if is_first_day_of_year
    ytd_high := high
    ytd_low := low

// Update YTD high and low
ytd_high := na(ytd_high) ? high : math.max(ytd_high, high)
ytd_low := na(ytd_low) ? low : math.min(ytd_low, low)

// Update cumulative variables for open VWAP
cum_v_open += volume
cum_pv_open += close * volume
if cum_v_open != 0
    vwap_open := cum_pv_open / cum_v_open

// Update cumulative variables for high VWAP
if high == ytd_high
    cum_v_high := 0
    cum_pv_high := 0

cum_v_high += volume
cum_pv_high += close * volume
if cum_v_high != 0
    vwap_high := cum_pv_high / cum_v_high

// Update cumulative variables for low VWAP
if low == ytd_low
    cum_v_low := 0
    cum_pv_low := 0

cum_v_low += volume
cum_pv_low += close * volume
if cum_v_low != 0
    vwap_low := cum_pv_low / cum_v_low

// Check for new high-volume candle that is also abnormally high and reset cumulative variables for high-volume VWAP
new_high_volume = false
if volume > highest_volume and volume > volume_threshold * avg_volume
    highest_volume := volume
    cum_v_high_volume := 0
    cum_pv_high_volume := 0
    new_high_volume := true

cum_v_high_volume += volume
cum_pv_high_volume += close * volume
if cum_v_high_volume != 0
    vwap_high_volume := cum_pv_high_volume / cum_v_high_volume

// Plot VWAPs
plot(vwap_open, color=color.red, linewidth=2, title="VWAP Open")
plot(vwap_high, color=color.green, linewidth=2, title="VWAP High")
plot(vwap_low, color=color.blue, linewidth=2, title="VWAP Low")
plot(vwap_high_volume, color=color.purple, linewidth=2, title="VWAP High Volume")

// Plot a vertical line on the chart only when a new high-volume VWAP anchor occurs
bgcolor(new_high_volume ? color.new(color.purple, 90) : na, offset=-1)

// Calculate displacement amounts
displacement_amount_open = vwap_open * displacement_percentage
displacement_amount_high = vwap_high * displacement_percentage
displacement_amount_low = vwap_low * displacement_percentage
displacement_amount_high_volume = vwap_high_volume * displacement_percentage

// Check for gaps on the opposite side of a VWAP
gap_up_opposite_open = na(close[1]) ? false : (open > close[1] and open < vwap_open and close[1] > vwap_open)
gap_down_opposite_open = na(close[1]) ? false : (open < close[1] and open > vwap_open and close[1] < vwap_open)

gap_up_opposite_high = na(close[1]) ? false : (open > close[1] and open < vwap_high and close[1] > vwap_high)
gap_down_opposite_high = na(close[1]) ? false : (open < close[1] and open > vwap_high and close[1] < vwap_high)

gap_up_opposite_low = na(close[1]) ? false : (open > close[1] and open < vwap_low and close[1] > vwap_low)
gap_down_opposite_low = na(close[1]) ? false : (open < close[1] and open > vwap_low and close[1] < vwap_low)

gap_up_opposite_high_volume = na(close[1]) ? false : (open > close[1] and open < vwap_high_volume and close[1] > vwap_high_volume)
gap_down_opposite_high_volume = na(close[1]) ? false : (open < close[1] and open > vwap_high_volume and close[1] < vwap_high_volume)

// RSI calculation for momentum change detection
rsi = ta.rsi(close, 14)
long_exit_condition = rsi > 70
short_exit_condition = rsi < 30

// Debugging Plots
plotshape(not gap_up_opposite_open and not gap_down_opposite_open and close > vwap_open and low < vwap_open - displacement_amount_open and close[1] < vwap_open, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Open Long Signal")
plotshape(not gap_up_opposite_open and not gap_down_opposite_open and close < vwap_open and high > vwap_open + displacement_amount_open and close[1] > vwap_open, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Open Short Signal")

plotshape(not gap_up_opposite_high and not gap_down_opposite_high and close > vwap_high and low < vwap_high - displacement_amount_high and close[1] < vwap_high, style=shape.triangledown, location=location.abovebar, color=color.blue, size=size.small, title="High Long Signal")
plotshape(not gap_up_opposite_high and not gap_down_opposite_high and close < vwap_high and high > vwap_high + displacement_amount_high and close[1] > vwap_high, style=shape.triangleup, location=location.belowbar, color=color.orange, size=size.small, title="High Short Signal")

plotshape(not gap_up_opposite_low and not gap_down_opposite_low and close > vwap_low and low < vwap_low - displacement_amount_low and close[1] < vwap_low, style=shape.triangledown, location=location.abovebar, color=color.purple, size=size.small, title="Low Long Signal")
plotshape(not gap_up_opposite_low and not gap_down_opposite_low and close < vwap_low and high > vwap_low + displacement_amount_low and close[1] > vwap_low, style=shape.triangleup, location=location.belowbar, color=color.yellow, size=size.small, title="Low Short Signal")

plotshape(not gap_up_opposite_high_volume and not gap_down_opposite_high_volume and close > vwap_high_volume and low < vwap_high_volume - displacement_amount_high_volume and close[1] < vwap_high_volume, style=shape.triangledown, location=location.abovebar, color=color.teal, size=size.small, title="High Volume Long Signal")
plotshape(not gap_up_opposite_high_volume and not gap_down_opposite_high_volume and close < vwap_high_volume and high > vwap_high_volume + displacement_amount_high_volume and close[1] > vwap_high_volume, style=shape.triangleup, location=location.belowbar, color=color.fuchsia, size=size.small, title="High Volume Short Signal")

// Trading signals based on VWAP support/resistance with displacement, no gaps on the opposite side, and bounce conditions
if not gap_up_opposite_open and not gap_down_opposite_open
    if (close > vwap_open and low < vwap_open)
        if close > open
            strategy.entry("Long_Open_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_Open_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_open and high > vwap_open)
        if close < open
            strategy.entry("Short_Open_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_Open_Crossover", strategy.short, comment="Crossover")

if not gap_up_opposite_high and not gap_down_opposite_high
    if (close > vwap_high and low < vwap_high)
        if close > open
            strategy.entry("Long_High_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_High_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_high and high > vwap_high)
        if close < open
            strategy.entry("Short_High_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_High_Crossover", strategy.short, comment="Crossover")

if not gap_up_opposite_low and not gap_down_opposite_low
    if (close > vwap_low and low < vwap_low)
        if close > open
            strategy.entry("Long_Low_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_Low_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_low and high > vwap_low)
        if close < open
            strategy.entry("Short_Low_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_Low_Crossover", strategy.short, comment="Crossover")

if not gap_up_opposite_high_volume and not gap_down_opposite_high_volume
    if (close > vwap_high_volume and low < vwap_high_volume)
        if close > open
            strategy.entry("Long_High_Volume_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_High_Volume_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_high_volume and high > vwap_high_volume)
        if close < open
            strategy.entry("Short_High_Volume_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_High_Volume_Crossover", strategy.short, comment="Crossover")

// Exit trades based on RSI momentum change
if strategy.position_size > 0 and long_exit_condition
    strategy.close("Long_Open_Wick")
    strategy.close("Long_Open_Crossover")
    strategy.close("Long_High_Wick")
    strategy.close("Long_High_Crossover")
    strategy.close("Long_Low_Wick")
    strategy.close("Long_Low_Crossover")
    strategy.close("Long_High_Volume_Wick")
    strategy.close("Long_High_Volume_Crossover")

if strategy.position_size < 0 and short_exit_condition
    strategy.close("Short_Open_Wick")
    strategy.close("Short_Open_Crossover")
    strategy.close("Short_High_Wick")
    strategy.close("Short_High_Crossover")
    strategy.close("Short_Low_Wick")
    strategy.close("Short_Low_Crossover")
    strategy.close("Short_High_Volume_Wick")
    strategy.close("Short_High_Volume_Crossover")

Relationnée

Plus de