В процессе загрузки ресурсов... загрузка...

Стратегия торговли VWAP с обнаружением аномалий объема

Автор:Чао Чжан, Дата: 2024-06-07 15:44:04
Тэги:VWAPРСИДТГSMA

img

Обзор

Эта стратегия основана на нескольких уровнях VWAP (Volume Weighted Average Price), включая открытую цену, высокую цену, низкую цену и VWAP свечей с аномально высоким объемом. Стратегия использует уровни VWAP в качестве поддержки и сопротивления, а также учитывает аномальные ситуации с объемом.

Принципы стратегии

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

Связанные

Больше