Торговая стратегия BabyShark VWAP на основе индикаторов VWAP и OBV RSI

Автор:Чао Чжан, Дата: 2024-03-08 16:39:28
Тэги:

img

Обзор стратегии

Торговая стратегия BabyShark VWAP - это количественная торговая стратегия, основанная на средневзвешенной цене объема (VWAP) и индексе относительной силы объема баланса (OBV RSI).

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

Основной принцип этой стратегии заключается в использовании индикаторов VWAP и OBV RSI для фиксации рыночных тенденций и изменений импульса. VWAP - это динамическая скользящая средняя, основанная на цене и объеме, которая отражает основные торговые области рынка. Когда цена значительно отклоняется от VWAP, это обычно указывает на условия перекупки или перепродажи на рынке. OBV RSI, с другой стороны, вводит фактор объема на основе традиционного индикатора RSI для определения силы рыночных тенденций путем измерения интенсивности изменений объема.

В частности, стратегия использует 60 свечей в качестве периода расчета для VWAP, с ценой закрытия в качестве входных данных. Затем она конструирует зоны перекупки и перепродажи на основе ценовых отклонений положительных и отрицательных 3 стандартных отклонений от VWAP. Для OBV RSI она использует 5 свечей в качестве периода расчета и устанавливает пороги 70 и 30 в качестве критериев для определения условий перекупки и перепродажи.

С точки зрения логики торговли, когда цена находится в зоне перепродажи ниже нижней полосы VWAP и OBV RSI меньше 30, стратегия генерирует длинный сигнал. И наоборот, когда цена находится в зоне перекупки выше верхней полосы VWAP и OBV RSI больше 70, она генерирует короткий сигнал. Кроме того, стратегия устанавливает соотношение прибыли и остановки потери в размере 0,6% и вводит период охлаждения после 10 подряд потерь для контроля рисков.

Преимущества стратегии

  1. Объединяет множество рыночных факторов, таких как цена и объем, чтобы всесторонне отразить тенденции и динамику рынка.
  2. Принимает динамические индикаторы VWAP и OBV RSI для адаптации к изменениям в различных рыночных циклах.
  3. Определяет разумные коэффициенты получения прибыли и остановки убытков и периоды затягивания, чтобы эффективно контролировать риски при использовании возможностей.
  4. Ясная логика, легкая для понимания и реализации, с определенным уровнем интерпретации.
  5. Регулируемые параметры, подходящие для трейдеров с различными стилями оптимизации и улучшения.

Стратегические риски

  1. Для осциллирующих или повторяющихся рынков частое распространение торговых сигналов может привести к переоценке и увеличению расходов на сдвиг.
  2. На трендовых рынках, полагаясь исключительно на VWAP для получения прибыли, стратегия может выйти слишком рано, упустив последующие трендовые прибыли.
  3. Настройки фиксированных параметров могут не адаптироваться к изменениям рыночных условий, что требует оптимизации для различных инструментов и временных рамок.
  4. Показатель OBV в значительной степени зависит от данных объема; когда данные объема неточны или манипулируются, искажения показателя могут вводить в заблуждение.
  5. Стратегия не учитывает внешние факторы, такие как макроэкономика и новости, и может потерпеть неудачу в экстремальных рыночных условиях.

Руководство по оптимизации

  1. Внедрить больше фильтрующих условий для колеблющихся рынков, таких как индикаторы подтверждения тенденции и индикаторы волатильности, чтобы уменьшить частоту торговли.
  2. Оптимизировать условия выхода, например, использовать остановки или комбинировать с другими индикаторами, следующими за трендом, чтобы лучше улавливать трендовые рынки.
  3. Проводить адаптивную оптимизацию параметров VWAP и OBV RSI, динамически регулируя периоды расчета и пороговые параметры.
  4. Ввести механизмы проверки подлинности объема для повышения надежности индикатора RSI OBV.
  5. Рассмотреть возможность включения анализа макроэкономических данных, показателей настроения и т. д., чтобы повысить адаптивность и надежность стратегии.

Резюме

Торговая стратегия BabyShark VWAP представляет собой количественную торговую стратегию, которая сочетает в себе средневзвешенную стоимость и индекс относительной силы объема баланса для получения торговых сигналов путем улавливания условий перекупленности и перепродажи и изменений тренда. Стратегия имеет четкую логику, интегрируя несколько рыночных факторов, таких как цена и объем, чтобы всесторонне понять пульс рынка. В то же время разумные настройки получения прибыли и остановки потерь и механизмы контроля риска позволяют стратегии добиваться прибыли, учитывая управление рисками. Однако стратегия также имеет потенциальные проблемы, такие как недостаточная адаптивность к колеблющимся и трендовым рынкам и фиксированные оптимизаторы. Будущие улучшения могут сосредоточиться на адаптерах входа, динамическом получении прибыли, параметрах динамических параметров, улучшении анализа внешних данных и дальнейшем улучшении надежности и рентабельности стратегии. В


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GreatestUsername

//@version=5
strategy("BabyShark VWAP Strategy", overlay=true, margin_long=100, margin_short=100, calc_on_every_tick = true)


// VWAP
ls = input(false, title='Log-space', group = "Optional")
type = 'Average Deviation'
length = input(60, group="Strategy Modification")
source = input(close, group="Strategy Modification")
_low = ls == true ? math.log(low) : low
_high = ls == true ? math.log(high) : high
src = ls == true ? math.log(source) : source

//weighted mean
pine_vwmean(x, y) =>
    cw = 0.0
    cd = 0.0
    w_sum = 0.0
    d_sum = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw := volume[i]
        d_sum += cw * cd
        w_sum += cw
        w_sum
    d_sum / w_sum

//weighted standard deviation
pine_vwstdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.pow(cd - b, 2)
        w_sum += cw
        w_sum
    math.sqrt(d_sum / w_sum)

//weighted average deviation
pine_vwavdev(x, y, b) =>
    d_sum = 0.0
    w_sum = 0.0
    cd = 0.0
    for i = 0 to y - 1 by 1
        cd := x[i]
        cw = volume[i]
        d_sum += cw * math.abs(cd - b)
        w_sum += cw
        w_sum
    d_sum / w_sum

vwmean = pine_vwmean(src, length)

//consider using Average Deviation instead of Standard Deviatio if there are values outside of 3rd upper & lower bands within a rolling window
dev = if type == 'Standard Deviation'
    dev = pine_vwstdev(src, length, vwmean)
    dev
else if type == 'Average Deviation'
    dev = pine_vwavdev(src, length, vwmean)
    dev

basis = ls == true ? math.exp(vwmean) : vwmean
plot(basis, color=color.new(#b7b7b7, 60), title='Basis')

upper_dev_2 = vwmean + dev * 2
upper_dev_3 = vwmean + dev * 3

lower_dev_2 = vwmean - dev * 2
lower_dev_3 = vwmean - dev * 3

fill(
     plot1=plot(ls == true ? math.exp(upper_dev_2) : upper_dev_2, color=color.new(#B20000, 0), title='Upper dev 2'), 
     plot2=plot(ls == true ? math.exp(upper_dev_3) : upper_dev_3, color=color.new(#FF6666, 0), title='Upper dev 3', display=display.none), 
     color=color.new(#FF4D4D, 80), title='Upper band'
     )
fill(
     plot1=plot(ls == true ? math.exp(lower_dev_3) : lower_dev_3, color=color.new(#00CC00, 0), title='Lower dev 3', display=display.none), 
     plot2=plot(ls == true ? math.exp(lower_dev_2) : lower_dev_2, color=color.new(#008000, 0), title='Lower dev 2'), 
     color=color.new(#006600, 80), title='Lower band'
     )


// Input to enable or disable the table visibility
table_visible = input(false, title="Show Table", group="Deviation Cross Monitor")
// Input for the number of candles to look back
table_length = input(300, title="Table Lookback Length", group="Deviation Cross Monitor")

// Custom count function
count_occurrences(cond, length) =>
    count = 0
    for i = 0 to length - 1
        if cond[i]
            count := count + 1
    count

// Count occurrences of prices above Upper dev 2 and below Lower dev 2

above_upper_dev_2 = count_occurrences(close > upper_dev_2, table_length)
below_lower_dev_2 = count_occurrences(close < lower_dev_2, table_length)

// Create table in the bottom right corner
var table tbl = table.new(position=position.bottom_right, rows=2, columns=2)

if table_visible
    if barstate.islast
        // Update the table headers
        table.cell(tbl, 0, 0, "Above Upper Dev 2", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl, 0, 1, "Below Lower Dev 2", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl, 1, 0, str.tostring(above_upper_dev_2), bgcolor=color.new(color.green, 90), text_color=color.green)
        table.cell(tbl, 1, 1, str.tostring(below_lower_dev_2), bgcolor=color.new(color.red, 90), text_color=color.red)
else
    table.delete(tbl)

// RSI
obvsrc = close
change_1 = ta.change(obvsrc)
obv = ta.cum(ta.change(obvsrc) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)

src2 = obv
len = input.int(5, minval=1, title="RSI Length", group="Strategy Modification")
up = ta.rma(math.max(ta.change(src2), 0), len)
down = ta.rma(-math.min(ta.change(src2), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
higherlvl = input(70, title="Higher Level", group="Strategy Modification")
lowerlvl = input(30, title="Lower Level", group="Strategy Modification")


plot_color = rsi >= higherlvl ? color.red : rsi <= lowerlvl ? color.green : color.new(#b7b7b7, 60)
// plot(rsi, color=plot_color)

//plot(rsi, color=color.white)



// Count occurrences of RSI crossing higher level and lower level
cross_above_higher = ta.crossover(rsi, higherlvl)
cross_below_lower = ta.crossunder(rsi, lowerlvl)
above_higher_count = count_occurrences(cross_above_higher, table_length)
below_lower_count = count_occurrences(cross_below_lower, table_length)

// Create table in the bottom right corner
if (table_visible)
    var table tbl2 = table.new(position=position.bottom_right, rows=2, columns=2)
    if (barstate.islast)
        // Update the table headers
        table.cell(tbl2, 0, 0, "Higher Level Cross", bgcolor=color.gray, text_color=color.white)
        table.cell(tbl2, 0, 1, "Lower Level Cross", bgcolor=color.gray, text_color=color.white)
        
        // Update the table values
        table.cell(tbl2, 1, 0, str.tostring(above_higher_count), bgcolor=color.new(color.red, 90), text_color=color.red)
        table.cell(tbl2, 1, 1, str.tostring(below_lower_count), bgcolor=color.new(color.green, 90), text_color=color.green)


// Entries

// Long Entry:
// Price is in the shaded GREEN area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is GREEN.
longCondition1 = close <= lower_dev_3
longConditions = plot_color == color.green and longCondition1 and strategy.position_size == 0

// Short Entry:
// Price is in the shaded RED area of [Hoss] VWAP Deviation
// and the [Hoss] OBV RSI is RED.
shortCondition1 = close >= upper_dev_3
shortConditions = plot_color == color.red and shortCondition1 and strategy.position_size == 0

var int lastEntryBar = 0


shortEMA = ta.ema(close, 12)
longEMA = ta.ema(close, 21)
uptrend = shortEMA > longEMA

if longConditions and lastEntryBar < bar_index - 10 //and uptrend
    strategy.entry("Long", strategy.long, stop=close * 0.994)
    lastEntryBar := bar_index

if shortConditions and lastEntryBar < bar_index - 10 //and not uptrend
    strategy.entry("Short", strategy.short, stop=close * 1.006)
    lastEntryBar := bar_index


if strategy.position_size > 0 and (ta.crossover(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 0.994 > close)
    strategy.close("Long", immediately = true)
if strategy.position_size < 0 and (ta.crossunder(close, basis) or strategy.opentrades.entry_price(strategy.opentrades - 1) * 1.006 < close)
    strategy.close("Short", immediately = true)

// Stop Loss:
// 0.6%
// After 1 Loss => NO more Trades for 10 Candles (10 minutes) (usually a breakout will happen, and it takes average 10min till it ranges again. So basically wait for range to form again)

// Take Profit:
// Grey line on [Hoss] VWAP Deviation or 0.6%



Больше