Stratégie de trading VWAP et surveillance des anomalies de volume

VWAP RSI YTD SMA
Date de création: 2024-06-07 15:44:04 Dernière modification: 2024-06-07 15:44:04
Copier: 0 Nombre de clics: 316
1
Suivre
1166
Abonnés

Stratégie de trading VWAP et surveillance des anomalies de volume

Aperçu

La stratégie est basée sur plusieurs niveaux de VWAP (Value-Weighted Average Price) comprenant le prix d’ouverture, le prix le plus élevé, le prix le plus bas et un graphique de volume anormalement élevé. La stratégie utilise le VWAP comme support et résistance, tout en tenant compte des situations exceptionnelles de volume.

Principe de stratégie

  1. Calculer plusieurs niveaux de VWAP, y compris le VWAP du prix d’ouverture, le VWAP du prix le plus élevé, le VWAP du prix le plus bas et le VWAP du graphique des volumes de transactions anormalement élevés.
  2. Détecter un diagramme de trafic anormalement élevé et réinsérer sur ce diagramme les variables cumulatives du VWAP anormalement élevé.
  3. La valeur de déviation est définie au-dessus et en dessous du niveau VWAP comme condition de déclenchement du signal de transaction.
  4. Vérifiez si le prix est en train de sauter de l’autre côté du VWAP pour éviter les faux signaux.
  5. Selon la position du prix par rapport au VWAP et la relation entre le prix de clôture et le prix d’ouverture, plusieurs types de signaux de négociation sont générés, y compris Wick (en ligne de fond) et Crossover (en croisement).
  6. L’indicateur RSI est utilisé pour détecter la variation de la dynamique, et les transactions correspondantes sont placées à plat lorsque le RSI est supérieur à 70 ou inférieur à 30.

Analyse des avantages

  1. Cette stratégie utilise plusieurs niveaux de VWAP pour fournir une information plus complète sur les points de support et de résistance.
  2. En détectant des courbes de volume anormalement élevées, la stratégie peut capturer les changements importants du marché.
  3. Le réglage de l’écart permet de filtrer certains signaux de bruit et d’améliorer la qualité des signaux de transaction.
  4. En tenant compte du fait que les prix ont sauté de l’autre côté du VWAP, nous avons évité certains signaux erronés.
  5. En fonction de la position relative du prix par rapport au VWAP et de la relation entre le prix de clôture et le prix d’ouverture, plusieurs signaux de négociation sont générés, ce qui augmente la flexibilité de la stratégie.
  6. L’utilisation de l’indicateur RSI comme condition d’aplatissement peut aider la stratégie à se retirer de la transaction en temps opportun en cas de changement de dynamique.

Analyse des risques

  1. Cette stratégie est tributaire du niveau de VWAP, qui peut être inefficace en cas de phénomènes extrêmes sur le marché.
  2. Les jugements de volume anormalement élevé sont basés sur des seuils fixes et peuvent ne pas s’adapter aux différentes conditions du marché.
  3. Les paramètres de l’écart peuvent nécessiter des ajustements en fonction des différents marchés et types de transactions.
  4. Cette stratégie génère plusieurs signaux de transaction, ce qui peut entraîner des transactions excessives et des coûts de transaction élevés.
  5. L’indicateur RSI peut générer des signaux de placement en retard, ce qui entraîne un risque accru pour la stratégie.

Direction d’optimisation

  1. Optimisation des méthodes de calcul du niveau VWAP, par exemple en tenant compte de périodes de temps plus longues ou en utilisant une méthode de pondération.
  2. Optimiser les critères de jugement des transactions anormalement élevées, par exemple en utilisant des seuils adaptatifs ou en combinant avec d’autres indicateurs de transaction.
  3. Optimiser les paramètres de la valeur d’écart pour trouver l’amplitude d’écart optimale.
  4. Introduire des mesures de gestion des risques, telles que la mise en place de stop-loss et de stop-loss, et contrôler les marges de risque pour les transactions individuelles.
  5. Essayez d’autres indicateurs de dynamique ou une combinaison de plusieurs indicateurs pour obtenir des signaux de placement plus précis.
  6. Il permet de filtrer les signaux de trading, de réduire les sur-transactions et de réduire les coûts de transaction.

Résumer

La stratégie utilise plusieurs niveaux de VWAP et la détection d’anomalies de volumes de transactions pour générer une variété de signaux de négociation. En tenant compte de la position relative du prix par rapport au VWAP, de la relation entre le prix de clôture et le prix d’ouverture et de l’indicateur RSI, la stratégie essaie de capturer les changements importants du marché et de se retirer de la transaction à temps. Cependant, la stratégie présente également certains risques, tels que l’adaptation aux conditions extrêmes, les transactions excessives et les signaux de placement en retard.

Code source de la stratégie
/*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")