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


Дата создания: 2024-03-08 16:39:28 Последнее изменение: 2024-03-08 16:39:28
Копировать: 0 Количество просмотров: 388
1
Подписаться
1166
Подписчики

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

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

Торговая стратегия BabyShark VWAP - это количественная торговая стратегия, основанная на средневесовой стоимости VWAP и относительно слабом индексе OBV RSI. Эта стратегия предназначена для выявления потенциальных сигналов покупки и продажи в зависимости от степени отклонения цены от VWAP и прорыва OBV RSI определенного порога.

Стратегический принцип

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

В частности, эта стратегия использует 60 K-линий в качестве цикла для VWAP и использует цену закрытия в качестве входных данных. Затем создаются зоны перекупа и перепродажи в соответствии с диапазоном отклонения цены от VWAP на положительное и отрицательное 3 стандартных отклонения. Для OBV RSI используется 5 K-линий в качестве цикла для вычисления и устанавливается два порога 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. Введение механизма проверки подлинности сделок, повышение надежности показателя OBV RSI.
  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%