Sumber dimuat naik... memuat...

Strategi Perdagangan VWAP dengan Pengesanan Anomali Volume

Penulis:ChaoZhang, Tarikh: 2024-06-07 15:44:04
Tag:VWAPRSIYTDSMA

img

Ringkasan

Strategi ini berdasarkan pelbagai tahap VWAP (Volume Weighted Average Price), termasuk harga terbuka, harga tinggi, harga rendah, dan VWAP lilin dengan jumlah yang tidak normal. Strategi ini menggunakan tahap VWAP sebagai sokongan dan rintangan, sambil juga mempertimbangkan keadaan jumlah yang tidak normal. Apabila harga memecahkan tahap VWAP dan memenuhi syarat tertentu, strategi menghasilkan isyarat perdagangan. Di samping itu, strategi menggunakan penunjuk RSI untuk mengesan perubahan momentum sebagai syarat keluar.

Prinsip Strategi

  1. Mengira pelbagai tahap VWAP, termasuk VWAP harga terbuka, VWAP harga tinggi, VWAP harga rendah, dan VWAP lilin dengan jumlah yang luar biasa tinggi.
  2. Mengesan lilin dengan jumlah yang luar biasa tinggi dan menetapkan semula pembolehubah kumulatif untuk VWAP jumlah yang luar biasa tinggi pada lilin tersebut.
  3. Tetapkan nilai pergeseran di atas dan di bawah tahap VWAP sebagai syarat pencetus untuk isyarat perdagangan.
  4. Periksa untuk jurang di sisi bertentangan VWAP untuk mengelakkan isyarat palsu.
  5. Menghasilkan beberapa isyarat dagangan berdasarkan kedudukan harga berbanding VWAP dan hubungan antara harga penutupan dan harga pembukaan, termasuk jenis Wick dan Crossover.
  6. Gunakan penunjuk RSI untuk mengesan perubahan momentum dan menutup dagangan yang sepadan apabila RSI melebihi 70 atau jatuh di bawah 30.

Analisis Kelebihan

  1. Strategi ini menggunakan pelbagai tahap VWAP, memberikan maklumat sokongan dan rintangan yang lebih komprehensif.
  2. Dengan mengesan lilin dengan jumlah yang luar biasa tinggi, strategi dapat menangkap perubahan pasaran yang signifikan.
  3. Menetapkan nilai perpindahan boleh menapis beberapa isyarat bunyi dan meningkatkan kualiti isyarat perdagangan.
  4. Strategi ini mempertimbangkan situasi jurang di sisi yang bertentangan dengan VWAP, mengelakkan beberapa isyarat palsu.
  5. Pelbagai isyarat dagangan dihasilkan berdasarkan kedudukan harga berbanding VWAP dan hubungan antara harga penutupan dan harga pembukaan, meningkatkan fleksibiliti strategi.
  6. Menggunakan penunjuk RSI sebagai keadaan keluar boleh membantu strategi keluar perdagangan dengan tepat pada masanya apabila perubahan momentum.

Analisis Risiko

  1. Strategi ini bergantung kepada tahap VWAP, yang mungkin kehilangan keberkesanan semasa keadaan pasaran yang melampau.
  2. Penghakiman jumlah yang luar biasa tinggi adalah berdasarkan ambang yang tetap, yang mungkin tidak disesuaikan dengan situasi pasaran yang berbeza.
  3. Penentuan nilai perpindahan mungkin perlu disesuaikan mengikut pasaran dan instrumen perdagangan yang berbeza.
  4. Strategi ini menghasilkan beberapa isyarat perdagangan, yang boleh membawa kepada overtrading dan kos transaksi yang tinggi.
  5. Penunjuk RSI boleh menghasilkan isyarat keluar yang tertinggal, menyebabkan strategi membawa risiko yang lebih besar.

Arahan pengoptimuman

  1. Mengoptimumkan kaedah pengiraan tahap VWAP, seperti mempertimbangkan tempoh masa yang lebih lama atau menggunakan kaedah yang ditimbang.
  2. Mengoptimumkan kriteria penilaian untuk jumlah yang luar biasa tinggi, seperti mengamalkan ambang adaptasi atau menggabungkan dengan penunjuk jumlah lain.
  3. Melakukan pengoptimuman parameter pada nilai perpindahan untuk mencari julat penyimpangan yang optimum.
  4. Memperkenalkan langkah-langkah pengurusan risiko, seperti menetapkan tahap stop-loss dan mengambil keuntungan, untuk mengawal pendedahan risiko perdagangan individu.
  5. Cuba penunjuk momentum lain atau menggabungkan beberapa penunjuk untuk mendapatkan isyarat keluar yang lebih tepat.
  6. Menapis isyarat perdagangan untuk mengurangkan overtrading dan kos transaksi yang lebih rendah.

Ringkasan

Strategi ini menggunakan pelbagai tahap VWAP dan pengesanan jumlah yang tidak normal untuk menjana isyarat perdagangan yang pelbagai. Dengan mempertimbangkan kedudukan relatif harga kepada VWAP, hubungan antara harga penutupan dan harga pembukaan, dan penunjuk RSI, strategi ini cuba menangkap perubahan pasaran yang signifikan dan perdagangan keluar dengan cara yang tepat pada masanya. Walau bagaimanapun, strategi ini juga mempunyai beberapa risiko, seperti kemampuan beradaptasi dengan keadaan pasaran yang melampau, overtrading, dan isyarat keluar yang tertinggal. Untuk meningkatkan lagi strategi, seseorang boleh mempertimbangkan untuk mengoptimumkan kaedah pengiraan VWAP, kriteria penghakiman untuk jumlah yang tidak normal, penetapan nilai perpindahan, dan memperkenalkan langkah pengurusan risiko dan lebih banyak kombinasi penunjuk. Secara keseluruhan, strategi ini memberikan titik permulaan yang baik untuk perdagangan berasaskan VWAP tetapi masih memerlukan pengoptimuman dan penyesuaian berdasarkan keadaan pasaran sebenar.


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

Berkaitan

Lebih lanjut