Tài nguyên đang được tải lên... tải...

Chiến lược giao dịch VWAP với phát hiện bất thường khối lượng

Tác giả:ChaoZhang, Ngày: 2024-06-07 15:44:04
Tags:VWAPRSIYTDSMA

img

Tổng quan

Chiến lược này dựa trên nhiều mức VWAP (Volume Weighted Average Price), bao gồm giá mở, giá cao, giá thấp và VWAP của nến có khối lượng cao bất thường. Chiến lược sử dụng mức VWAP làm hỗ trợ và kháng cự, đồng thời xem xét các tình huống khối lượng bất thường. Khi giá vượt qua mức VWAP và đáp ứng một số điều kiện nhất định, chiến lược tạo ra tín hiệu giao dịch. Ngoài ra, chiến lược sử dụng chỉ số RSI để phát hiện sự thay đổi động lực như một điều kiện thoát.

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, VWAP giá thấp và VWAP của nến có khối lượng lớn bất thường.
  2. Phát hiện nến có khối lượng lớn bất thường và thiết lập lại các biến tích lũy cho VWAP có khối lượng lớn bất thường trên các nến đó.
  3. Đặt giá trị dịch chuyển trên và dưới mức VWAP làm điều kiện kích hoạt cho tín hiệu giao dịch.
  4. Kiểm tra các khoảng trống ở phía đối diện của VWAP để tránh tín hiệu sai.
  5. Tạo nhiều tín hiệu giao dịch dựa trên vị trí giá so với VWAP và mối quan hệ giữa giá đóng cửa và giá mở cửa, bao gồm các loại Wick và Crossover.
  6. Sử dụng chỉ số RSI để phát hiện sự thay đổi động lực và đóng giao dịch tương ứng khi RSI vượt quá 70 hoặc giảm xuống dưới 30.

Phân tích lợi thế

  1. Chiến lược sử dụng nhiều mức VWAP, cung cấp thông tin hỗ trợ và kháng cự toàn diện hơn.
  2. Bằng cách phát hiện nến với khối lượng lớn bất thường, chiến lược có thể nắm bắt những thay đổi thị trường đáng kể.
  3. Thiết lập các giá trị dịch chuyển có thể lọc một số tín hiệu tiếng ồn và cải thiện chất lượng của tín hiệu giao dịch.
  4. Chiến lược xem xét các tình huống lỗ hổng ở phía đối diện của VWAP, tránh một số tín hiệu sai.
  5. Nhiều tín hiệu giao dịch được tạo ra dựa trên vị trí giá tương đối với VWAP và mối quan hệ giữa giá đóng cửa và giá mở cửa, làm tăng tính linh hoạt của chiến lược.
  6. Sử dụng chỉ số RSI như một điều kiện thoát có thể giúp chiến lược thoát giao dịch kịp thời khi động lực thay đổi.

Phân tích rủi ro

  1. Chiến lược dựa trên mức VWAP, có thể mất hiệu quả trong điều kiện thị trường cực đoan.
  2. Phán quyết về khối lượng cao bất thường dựa trên ngưỡng cố định, có thể không thích nghi với các tình huống thị trường khác nhau.
  3. Việc thiết lập các giá trị thay thế có thể cần phải điều chỉnh theo các thị trường và công cụ giao dịch khác nhau.
  4. Chiến lược 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 các tín hiệu thoát chậm, khiến chiến lược có rủi ro lớn hơn.

Hướng dẫn 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 các khoảng thời gian dài hơn hoặc sử dụng các phương pháp cân nhắc.
  2. Tối ưu hóa các tiêu chí đánh giá đối với khối lượng cao bất thường, chẳng hạn như áp dụng ngưỡng thích nghi hoặc kết hợp với các chỉ số khối lượng khác.
  3. Thực hiện tối ưu hóa tham số trên các giá trị dịch chuyển để tìm phạm vi độ lệch tối ưu.
  4. Thiết lập các biện pháp quản lý rủi ro, chẳng hạn như thiết lập mức dừng lỗ và lấy lợi nhuận, để kiểm soát rủi ro của các giao dịch cá nhân.
  5. Hãy 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 thoát chính xác hơn.
  6. Bộ lọc tín hiệu giao dịch để giảm quá mức giao dịch và chi phí giao dịch thấp hơn.

Tóm lại

Chiến lược này sử dụng nhiều mức VWAP và phát hiện khối lượng bất thường để 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á đối với VWAP, mối quan hệ giữa giá đóng cửa và giá mở cửa, và chỉ số RSI, chiến lược này cố gắng nắm bắt những thay đổi thị trường quan trọng và giao dịch ra khỏi thị trường 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ư khả năng thích nghi với điều kiện thị trường cực đoan, giao dịch quá mức và tín hiệu ra khỏi chậm. Để cải thiện thêm chiến lược, người ta có thể xem xét tối ưu hóa phương pháp tính toán của VWAP, các tiêu chí phán đoán đối với khối lượng bất thường, thiết lập giá trị dịch chuyển và giới thiệu các biện pháp quản lý rủi ro và nhiều sự kết hợp chỉ số hơn. Nhìn chung, chiến lược này cung cấp một điểm khởi đầu tốt cho giao dịch dựa trên VWAP nhưng vẫn yêu cầu tối ưu hóa và điều chỉnh dựa trên điều kiện thị trường thực tế.


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

Có liên quan

Thêm nữa