Chiến lược giao dịch VWAP và giám sát bất thường về khối lượng

VWAP RSI YTD SMA
Ngày tạo: 2024-06-07 15:44:04 sửa đổi lần cuối: 2024-06-07 15:44:04
sao chép: 0 Số nhấp chuột: 717
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch VWAP và giám sát bất thường về khối lượng

Tổng quan

Chiến lược này dựa trên nhiều mức VWAP (transaction volume weighted average price) bao gồm giá mở, giá cao nhất, giá thấp nhất và các biểu đồ giao dịch cực kỳ cao. Chiến lược sử dụng VWAP làm mức hỗ trợ và kháng cự, đồng thời xem xét các trường hợp bất thường của giao dịch. Chiến lược sẽ tạo ra tín hiệu giao dịch khi giá vượt qua mức VWAP và đáp ứng một số điều kiện nhất định. Ngoài ra, chiến lược này cũng sử dụng chỉ số RSI để kiểm tra sự thay đổi khối lượng động, như là điều kiện bình thường.

Nguyên tắc chiến lược

  1. Tính toán nhiều mức VWAP, bao gồm VWAP giá mở, VWAP giá cao nhất, VWAP giá thấp nhất và VWAP với đồ thị khối lượng giao dịch cao bất thường.
  2. Xác định biểu đồ giao thông cao bất thường và đặt lại các biến tích lũy của VWAP giao thông cao bất thường trên biểu đồ này.
  3. Đặt giá trị lệch trên và dưới mức VWAP làm điều kiện kích hoạt tín hiệu giao dịch.
  4. Kiểm tra xem giá có nằm ở phía bên kia của VWAP để tránh tín hiệu sai.
  5. Tùy thuộc vào vị trí của giá so với VWAP và mối quan hệ giữa giá đóng cửa và giá mở cửa, tạo ra nhiều tín hiệu giao dịch, bao gồm hai loại: Wick (đường bóng) và Crossover (đường chéo).
  6. Sử dụng chỉ số RSI để kiểm tra sự thay đổi động lượng, khi RSI trên 70 hoặc dưới 30, giao dịch bằng phẳng tương ứng.

Phân tích lợi thế

  1. Chiến lược này sử dụng nhiều cấp VWAP để cung cấp thông tin về hỗ trợ và kháng cự.
  2. Các chiến lược có thể nắm bắt được những thay đổi quan trọng trong thị trường bằng cách phát hiện các biểu đồ giao dịch bất thường.
  3. Đặt giá trị lệch có thể lọc một số tín hiệu nhiễu và cải thiện chất lượng tín hiệu giao dịch.
  4. Một số tín hiệu sai lầm đã được tránh khi giá cả tăng lên ở phía bên kia của VWAP.
  5. Tạo ra nhiều tín hiệu giao dịch dựa trên vị trí tương đối của giá với VWAP và mối quan hệ giữa giá đóng cửa và giá mở cửa, tăng tính linh hoạt của chiến lược.
  6. Sử dụng chỉ số RSI như là một điều kiện bình thường, có thể giúp chiến lược thoát khỏi giao dịch kịp thời khi có thay đổi động lực.

Phân tích rủi ro

  1. Chiến lược này phụ thuộc vào mức độ VWAP, và VWAP có thể mất hiệu lực nếu thị trường xảy ra tình huống cực đoan.
  2. Việc đánh giá khối lượng giao dịch cao bất thường dựa trên các mức giá cố định có thể không phù hợp với các tình huống thị trường khác nhau.
  3. Cài đặt giá trị lệch có thể cần điều chỉnh cho các thị trường khác nhau và các loại giao dịch.
  4. Chiến lược này tạo ra nhiều tín hiệu giao dịch, có thể dẫn đến giao dịch quá mức và chi phí giao dịch cao.
  5. Chỉ số RSI có thể tạo ra tín hiệu giảm giá chậm, khiến chiến lược chịu rủi ro lớn hơn.

Hướng tối ưu hóa

  1. Tối ưu hóa phương pháp tính toán mức VWAP, chẳng hạn như xem xét chu kỳ thời gian dài hơn hoặc sử dụng phương pháp tăng trọng.
  2. Tối ưu hóa các tiêu chuẩn đánh giá về khối lượng giao dịch cao bất thường, chẳng hạn như sử dụng các ngưỡng thích ứng hoặc kết hợp với các chỉ số khối lượng giao dịch khác.
  3. Tối ưu hóa tham số cho giá trị sai lệch để tìm mức sai lệch tối ưu.
  4. Đưa ra các biện pháp quản lý rủi ro, chẳng hạn như thiết lập các lệnh dừng lỗ và ngăn chặn, kiểm soát các lỗ hổng rủi ro cho các giao dịch đơn lẻ.
  5. Thử các chỉ số động lực khác hoặc kết hợp nhiều chỉ số để có được tín hiệu cân bằng chính xác hơn.
  6. Các tín hiệu giao dịch được lọc để giảm giao dịch quá mức và giảm chi phí giao dịch.

Tóm tắt

Chiến lược này sử dụng nhiều mức độ VWAP và phát hiện bất thường khối lượng giao dịch để tạo ra các tín hiệu giao dịch đa dạng. Bằng cách xem xét vị trí tương đối của giá với VWAP, mối quan hệ giữa giá đóng cửa và giá mở cửa và các chỉ số RSI, chiến lược này cố gắng nắm bắt những thay đổi quan trọng trong thị trường và rút khỏi giao dịch kịp thời. Tuy nhiên, chiến lược này cũng có một số rủi ro, chẳng hạn như thích ứng với tình huống cực đoan, giao dịch quá mức và tín hiệu bán tháo bị trì hoãn.

Mã nguồn chiến lược
/*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")