Die Ressourcen sind geladen. Beförderung...

VWAP-Handelsstrategie mit Volumenanomalie-Erkennung

Schriftsteller:ChaoZhang, Datum: 2024-06-07 15:44:04
Tags:VWAPRSIJahr für JahrSMA

img

Übersicht

Diese Strategie basiert auf mehreren VWAP-Leveln (Volume Weighted Average Price), einschließlich des offenen Preises, des hohen Preises, des niedrigen Preises und der VWAP von Kerzen mit ungewöhnlich hohem Volumen. Die Strategie nutzt VWAP-Level als Unterstützung und Widerstand, wobei auch ungewöhnliche Volumensituationen berücksichtigt werden. Wenn der Preis durch VWAP-Level bricht und bestimmte Bedingungen erfüllt, erzeugt die Strategie Handelssignale. Zusätzlich verwendet die Strategie den RSI-Indikator, um Dynamikveränderungen als Ausgangskondition zu erkennen.

Strategieprinzipien

  1. Berechnen Sie mehrere VWAP-Niveaus, einschließlich des VWAP für den offenen Preis, des VWAP für den hohen Preis, des VWAP für den niedrigen Preis und des VWAP für Kerzen mit ungewöhnlich hohem Volumen.
  2. Es werden Kerzen mit ungewöhnlich hohem Volumen erkannt und die kumulativen Variablen für das ungewöhnlich hohe Volumen des VWAP für diese Kerzen zurückgesetzt.
  3. Es werden als Auslöserbedingungen für Handelssignale Wertverlagerungen über und unter den VWAP-Leveln festgelegt.
  4. Überprüfen Sie, ob auf der anderen Seite des VWAP Lücken vorhanden sind, um falsche Signale zu vermeiden.
  5. Erstellen Sie mehrere Handelssignale basierend auf der Preisposition im Verhältnis zum VWAP und dem Verhältnis zwischen dem Schlusskurs und dem Eröffnungskurs, einschließlich Wick- und Crossover-Typen.
  6. Verwenden Sie den RSI-Indikator, um Dynamikveränderungen zu erkennen und entsprechende Trades zu schließen, wenn der RSI 70 übersteigt oder unter 30 fällt.

Analyse der Vorteile

  1. Die Strategie nutzt mehrere VWAP-Level, die umfassendere Support- und Widerstandsinformationen liefern.
  2. Durch die Erkennung von Kerzen mit ungewöhnlich hohem Volumen kann die Strategie signifikante Marktveränderungen erfassen.
  3. Durch die Festlegung von Verschiebungswerten können einige Geräuschsignale ausgefiltert und die Qualität der Handelssignale verbessert werden.
  4. Die Strategie berücksichtigt Lücken auf der anderen Seite des VWAP und vermeidet einige falsche Signale.
  5. Dabei werden mehrere Handelssignale erzeugt, die auf der Preisposition im Verhältnis zum VWAP und dem Verhältnis zwischen dem Schlusskurs und dem Eröffnungskurs basieren, wodurch die Flexibilität der Strategie erhöht wird.
  6. Die Verwendung des RSI-Indikators als Exit-Bedingung kann der Strategie helfen, bei Dynamikveränderungen rechtzeitig zu handeln.

Risikoanalyse

  1. Die Strategie stützt sich auf VWAP-Levels, die unter extremen Marktbedingungen ihre Wirksamkeit verlieren können.
  2. Die Beurteilung eines ungewöhnlich hohen Volumens beruht auf einem festgelegten Schwellenwert, der sich möglicherweise nicht an unterschiedliche Marktsituationen anpassen kann.
  3. Die Festlegung der Verschiebungswerte kann je nach verschiedenen Märkten und Handelsinstrumenten angepasst werden müssen.
  4. Die Strategie erzeugt mehrere Handelssignale, was zu Überhandelungen und hohen Transaktionskosten führen kann.
  5. Der RSI-Indikator kann verzögerte Ausstiegssignale erzeugen, wodurch die Strategie größere Risiken trägt.

Optimierungsrichtlinien

  1. Optimierung der Berechnungsmethode für VWAP-Werte, z. B. Berücksichtigung längerer Zeiträume oder Verwendung gewichteter Methoden.
  2. Optimierung der Beurteilungskriterien für ungewöhnlich hohe Volumenmengen, z. B. Annahme anpassungsfähiger Schwellenwerte oder Kombination mit anderen Volumenindikatoren.
  3. Parameteroptimierung an Verlagerungswerten durchführen, um den optimalen Abweichungsbereich zu finden.
  4. Einführung von Risikomanagementmaßnahmen, z. B. Festlegung von Stop-Loss- und Take-Profit-Levels, um die Risikoposition einzelner Geschäfte zu kontrollieren.
  5. Versuchen Sie andere Schwungindikatoren oder kombinieren Sie mehrere Indikatoren, um genauere Ausstiegssignale zu erhalten.
  6. Filtern Sie Handelssignale, um Überhandelungen und Transaktionskosten zu reduzieren.

Zusammenfassung

Diese Strategie nutzt mehrere VWAP-Level und abnorme Volumenerkennung, um verschiedene Handelssignale zu generieren. Durch die Berücksichtigung der relativen Position des Preises zu VWAP, der Beziehung zwischen dem Schlusskurs und dem Eröffnungskurs und dem RSI-Indikator versucht die Strategie, signifikante Marktveränderungen und Exit-Trades rechtzeitig zu erfassen. Die Strategie birgt jedoch auch einige Risiken, wie Anpassungsfähigkeit an extreme Marktbedingungen, Überhandel und verzögerte Exit-Signale. Um die Strategie weiter zu verbessern, kann man die Berechnungsmethode von VWAP optimieren, die Urteilskriterien für abnorme Volumen, die Festlegung von Verschiebungswerten und die Einführung von Risikomanagementmaßnahmen und mehr Indikatorenkombinationen in Betracht ziehen. Insgesamt bietet diese Strategie einen guten Ausgangspunkt für den VWAP-basierten Handel, erfordert aber immer noch Optimierung und Anpassung basierend auf den tatsächlichen Marktbedingungen.


/*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")

Verwandt

Mehr