리소스 로딩... 로딩...

부피 변칙 탐지 기능이 있는 VWAP 거래 전략

저자:차오장, 날짜: 2024-06-07 15:44:04
태그:VWAPRSIYTDSMA

img

전반적인 설명

이 전략은 오픈 가격, 높은 가격, 낮은 가격, 비정상적으로 높은 볼륨의 촛불의 VWAP를 포함한 여러 VWAP (Volume Weighted Average Price) 레벨을 기반으로합니다. 전략은 비정상적 인 볼륨 상황을 고려하면서도 지원 및 저항으로 VWAP 레벨을 활용합니다. 가격이 VWAP 수준을 넘어서 특정 조건을 충족하면 전략은 거래 신호를 생성합니다. 또한 전략은 RSI 지표를 사용하여 출구 조건으로 추진력 변화를 감지합니다.

전략 원칙

  1. 오픈 가격 VWAP, 높은 가격 VWAP, 낮은 가격 VWAP 및 비정상적으로 많은 볼륨의 촛불의 VWAP를 포함한 여러 VWAP 수준을 계산합니다.
  2. 비정상적으로 큰 부피의 촛불을 감지하고 그 촛불의 비정상적으로 큰 부피의 VWAP에 대한 누적 변수를 재설정합니다.
  3. 거래 신호의 트리거 조건으로 VWAP 레벨 이상 및 이하의 이동 값을 설정합니다.
  4. 잘못된 신호를 피하기 위해 VWAP 반대편의 틈을 확인하십시오.
  5. VWAP에 대한 가격 위치 및 Wick 및 Crossover 유형을 포함한 종료 가격과 개시 가격 사이의 관계를 기반으로 여러 거래 신호를 생성합니다.
  6. RSI 표시기를 사용하여 동력 변화를 감지하고 RSI가 70을 초과하거나 30 이하로 떨어지면 해당 거래를 종료합니다.

이점 분석

  1. 이 전략은 여러 VWAP 레벨을 활용하여 보다 포괄적인 지원 및 저항 정보를 제공합니다.
  2. 비정상적으로 큰 부피의 촛불을 감지함으로써 전략은 중요한 시장 변화를 포착 할 수 있습니다.
  3. 이동 값을 설정하면 소음 신호를 필터링하고 거래 신호의 품질을 향상시킬 수 있습니다.
  4. 이 전략은 VWAP의 반대편의 격차 상황을 고려하고 일부 잘못된 신호를 피합니다.
  5. 여러 거래 신호는 VWAP에 대한 가격 위치와 종료 가격과 개시 가격 사이의 관계를 기반으로 생성되며 전략의 유연성을 높입니다.
  6. RSI 지표를 출구 조건으로 사용하는 것은 동력이 변할 때 전략 출구 거래를 적시에 도울 수 있습니다.

위험 분석

  1. 이 전략은 극단적인 시장 조건에서 효과를 잃을 수 있는 VWAP 수준에 의존합니다.
  2. 비정상적으로 많은 부피에 대한 판단은 고정된 기준에 기초하고 있으며, 이는 다른 시장 상황에 적응하지 않을 수 있습니다.
  3. 변동 값의 설정은 다른 시장과 거래 도구에 따라 조정되어야 할 수 있습니다.
  4. 이 전략은 여러 개의 거래 신호를 생성하여 과잉 거래와 높은 거래 비용을 초래할 수 있습니다.
  5. RSI 지표는 지연 출구 신호를 생성하여 전략이 더 큰 위험을 감수하게 할 수 있습니다.

최적화 방향

  1. 더 긴 기간을 고려하거나 가중된 방법을 사용하여 VWAP 수준을 계산하는 방법을 최적화하십시오.
  2. 비정상적으로 높은 부피에 대한 판단 기준을 최적화하십시오. 예를 들어 적응적 임계치를 채택하거나 다른 부피 지표와 결합하십시오.
  3. 최적의 오차 범위를 찾기 위해 이동 값에 대한 매개 변수 최적화를 수행합니다.
  4. 개별 거래의 위험 노출을 제어하기 위해 스톱 로스 및 영업 취득 수준을 설정하는 것과 같은 위험 관리 조치를 도입하십시오.
  5. 다른 모멘텀 표시기를 시도하거나 더 정확한 출구 신호를 얻기 위해 여러 표시기를 결합하십시오.
  6. 오버 트레이딩을 줄이고 거래 비용을 낮추기 위해 거래 신호를 필터링합니다.

요약

이 전략은 다양한 거래 신호를 생성하기 위해 여러 VWAP 레벨과 비정상적인 볼륨 검출을 활용합니다. VWAP에 대한 가격의 상대적 위치, 종료 가격과 개시 가격 사이의 관계 및 RSI 지표를 고려함으로써 전략은 중요한 시장 변화와 출구 거래를 적시에 파악하려고 시도합니다. 그러나 전략에는 극단적인 시장 조건, 과잉 거래 및 지체 출구 신호에 대한 적응력과 같은 몇 가지 위험이 있습니다. 전략을 더 개선하기 위해 VWAP의 계산 방법, 비정상적인 볼륨에 대한 판단 기준, 이동 값의 설정 및 위험 관리 조치 및 더 많은 지표 조합을 도입하는 것을 고려 할 수 있습니다. 전반적으로, 이것은 VWAP 기반 거래에 좋은 출발점을 제공하지만 여전히 실제 시장 조건에 따라 최적화 및 조정을 요구합니다.


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

관련

더 많은