Sumber daya yang dimuat... Pemuatan...

Strategi Perdagangan VWAP dengan Deteksi Anomali Volume

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

img

Gambaran umum

Strategi ini didasarkan pada beberapa tingkat VWAP (Volume Weighted Average Price), termasuk harga terbuka, harga tinggi, harga rendah, dan VWAP dari lilin dengan volume yang tinggi secara abnormal. Strategi ini menggunakan tingkat VWAP sebagai dukungan dan resistensi, sambil juga mempertimbangkan situasi volume abnormal. Ketika harga menembus level VWAP dan memenuhi kondisi tertentu, strategi menghasilkan sinyal perdagangan. Selain itu, strategi ini menggunakan indikator RSI untuk mendeteksi perubahan momentum sebagai kondisi keluar.

Prinsip Strategi

  1. Menghitung beberapa tingkat VWAP, termasuk VWAP harga terbuka, VWAP harga tinggi, VWAP harga rendah, dan VWAP lilin dengan volume yang tinggi secara abnormal.
  2. Mendeteksi lilin dengan volume yang tinggi secara abnormal dan mengatur ulang variabel kumulatif untuk VWAP volume yang tinggi secara abnormal pada lilin tersebut.
  3. Tentukan nilai pergeseran di atas dan di bawah tingkat VWAP sebagai kondisi pemicu untuk sinyal perdagangan.
  4. Periksa celah di sisi lain VWAP untuk menghindari sinyal palsu.
  5. Menghasilkan beberapa sinyal perdagangan berdasarkan posisi harga relatif terhadap VWAP dan hubungan antara harga penutupan dan harga pembukaan, termasuk jenis Wick dan Crossover.
  6. Menggunakan indikator RSI untuk mendeteksi perubahan momentum dan menutup perdagangan yang sesuai ketika RSI melebihi 70 atau turun di bawah 30.

Analisis Keuntungan

  1. Strategi ini menggunakan beberapa tingkat VWAP, memberikan informasi dukungan dan resistensi yang lebih komprehensif.
  2. Dengan mendeteksi lilin dengan volume yang tinggi secara abnormal, strategi dapat menangkap perubahan pasar yang signifikan.
  3. Menetapkan nilai pergeseran dapat menyaring beberapa sinyal kebisingan dan meningkatkan kualitas sinyal perdagangan.
  4. Strategi ini mempertimbangkan situasi celah di sisi lain VWAP, menghindari beberapa sinyal palsu.
  5. Beberapa sinyal perdagangan dihasilkan berdasarkan posisi harga relatif terhadap VWAP dan hubungan antara harga penutupan dan harga pembukaan, meningkatkan fleksibilitas strategi.
  6. Menggunakan indikator RSI sebagai kondisi keluar dapat membantu strategi keluar perdagangan secara tepat waktu ketika momentum berubah.

Analisis Risiko

  1. Strategi ini didasarkan pada tingkat VWAP, yang dapat kehilangan efektivitas selama kondisi pasar yang ekstrem.
  2. Penghakiman volume yang luar biasa tinggi didasarkan pada ambang batas yang tetap, yang mungkin tidak dapat disesuaikan dengan situasi pasar yang berbeda.
  3. Penentuan nilai pergeseran mungkin perlu disesuaikan sesuai dengan pasar dan instrumen perdagangan yang berbeda.
  4. Strategi ini menghasilkan beberapa sinyal perdagangan, yang dapat menyebabkan overtrading dan biaya transaksi yang tinggi.
  5. Indikator RSI dapat menghasilkan sinyal keluar yang tertinggal, menyebabkan strategi membawa risiko yang lebih besar.

Arahan Optimasi

  1. Mengoptimalkan metode perhitungan tingkat VWAP, seperti mempertimbangkan periode waktu yang lebih lama atau menggunakan metode tertimbang.
  2. Mengoptimalkan kriteria penilaian untuk volume yang tinggi secara abnormal, seperti mengadopsi ambang batas adaptif atau menggabungkannya dengan indikator volume lainnya.
  3. Melakukan optimasi parameter pada nilai perpindahan untuk menemukan kisaran penyimpangan optimal.
  4. Memperkenalkan langkah-langkah manajemen risiko, seperti menetapkan tingkat stop-loss dan take-profit, untuk mengontrol paparan risiko perdagangan individu.
  5. Cobalah indikator momentum lain atau gabungkan beberapa indikator untuk mendapatkan sinyal keluar yang lebih akurat.
  6. Filter sinyal perdagangan untuk mengurangi overtrading dan biaya transaksi yang lebih rendah.

Ringkasan

Strategi ini menggunakan beberapa tingkat VWAP dan deteksi volume abnormal untuk menghasilkan sinyal perdagangan yang beragam. Dengan mempertimbangkan posisi relatif harga terhadap VWAP, hubungan antara harga penutupan dan harga pembukaan, dan indikator RSI, strategi ini mencoba untuk menangkap perubahan pasar yang signifikan dan perdagangan keluar secara tepat waktu. Namun, strategi ini juga memiliki beberapa risiko, seperti kemampuan beradaptasi dengan kondisi pasar yang ekstrem, overtrading, dan sinyal keluar yang tertinggal. Untuk lebih meningkatkan strategi, seseorang dapat mempertimbangkan mengoptimalkan metode perhitungan VWAP, kriteria penilaian untuk volume abnormal, pengaturan nilai perpindahan, dan memperkenalkan langkah-langkah manajemen risiko dan lebih banyak kombinasi indikator. Secara keseluruhan, strategi ini memberikan titik awal yang baik untuk perdagangan berbasis VWAP tetapi masih memerlukan optimalisasi dan penyesuaian berdasarkan kondisi pasar yang sebenarnya.


/*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 banyak