Estratégia de negociação BabyShark baseada nos indicadores VWAP e OBV RSI


Data de criação: 2024-03-08 16:39:28 última modificação: 2024-03-08 16:39:28
cópia: 0 Cliques: 812
1
focar em
1617
Seguidores

Estratégia de negociação BabyShark baseada nos indicadores VWAP e OBV RSI

Visão geral da estratégia

A estratégia de negociação BabyShark VWAP é uma estratégia de negociação quantitativa baseada no preço médio ponderado por volume de transação (VWAP) e no índice de força relativa do indicador de energia (OBV RSI). A estratégia visa identificar potenciais sinais de compra e venda com base no grau de desvio do preço do VWAP e na ruptura do OBV RSI em um determinado limiar.

Princípio da estratégia

O principal princípio da estratégia é o uso de dois indicadores, o VWAP e o OBV RSI, para capturar tendências e mudanças de dinâmica no mercado. O VWAP é uma média dinâmica baseada no preço e na quantidade de transações, capaz de refletir as principais áreas de negociação do mercado. Quando o preço se desvia significativamente do VWAP, geralmente significa que o mercado está sobrecomprado ou sobrevendido.

Especificamente, a estratégia usa linhas K de 60 como um ciclo de cálculo do VWAP e usa o preço de fechamento como um dado de entrada. Em seguida, é construída uma zona de sobrecompra e de sobrevenda de acordo com a diferença de 3 padrões positivos e negativos do preço do VWAP. Para o OBV RSI, é usado um ciclo de cálculo de linhas K de 5 e define os dois limites de 70 e 30 como critérios de julgamento de sobrecompra e sobrevenda.

Em termos de lógica de negociação, a estratégia emite um sinal de multiplo quando o preço está na zona de venda excessiva do VWAP abaixo da linha e o OBV RSI é menor que 30; e emite um sinal de falta quando o preço está na zona de venda excessiva do VWAP acima da linha e o OBV RSI é maior que 70. Além disso, a estratégia também define uma taxa de stop loss de 0,6%, e introduz um período de quietude de 10K linhas após perdas consecutivas para controlar o risco.

Vantagens estratégicas

  1. Combinando vários fatores de mercado, como preço e volume de transação, para capturar as tendências e a dinâmica do mercado.
  2. Utiliza indicadores dinâmicos VWAP e OBV RSI, capazes de se adaptar às mudanças de diferentes ciclos de mercado.
  3. Estabeleça uma proporção razoável de stop loss e um período de repouso para controlar o risco de forma eficaz, aproveitando as oportunidades.
  4. A lógica é clara, fácil de entender e de implementar, e tem uma certa interpretabilidade.
  5. Os parâmetros podem ser ajustados para otimizar e melhorar para diferentes estilos de negociação.

Risco estratégico

  1. Para mercados em turbulência ou em recorrência, os sinais de negociação frequentes podem levar a excesso de negociação e aumento dos custos de deslizamento.
  2. Em um cenário de tendência, a mera dependência do VWAP para fazer um stop-loss pode levar a uma saída prematura da estratégia, perdendo o lucro da tendência subsequente.
  3. As configurações de parâmetros fixos podem não se adaptar às mudanças no ambiente de mercado, e precisam ser otimizadas para diferentes variedades e ciclos.
  4. Os indicadores OBV são fortemente dependentes do volume de transações e podem induzir o julgamento quando os dados de transações não são verdadeiros ou são manipulados.
  5. A falta de consideração de fatores externos, como a macroeconomia, a notícia, etc., pode tornar a estratégia ineficaz em situações extremas.

Direção de otimização

  1. A introdução de mais filtros para mercados de turbulência, como indicadores de confirmação de tendência, indicadores de volatilidade, etc., reduz a frequência de negociação.
  2. Otimizar as condições de saída, como o uso de paradas móveis ou em combinação com outros indicadores de acompanhamento de tendências, para melhor entender a tendência.
  3. Optimização adaptativa dos parâmetros do VWAP e do OBV RSI, ajuste dinâmico do ciclo de cálculo e configuração de limite.
  4. Introdução de um mecanismo de verificação de autenticidade de transação para aumentar a confiabilidade do indicador OBV RSI.
  5. Considere a inclusão de análises de dados macroeconômicos, indicadores de sentimentos, etc., para aumentar a adaptabilidade e a robustez da estratégia.

Resumir

A estratégia de negociação do BabyShark VWAP é uma estratégia de negociação quantitativa que combina o preço médio ponderado do volume de transação e o índice de tendência energética relativamente fraco, para gerar sinais de negociação através da captura do estado de sobrevenda e da mudança da dinâmica de tendência do mercado. A lógica da estratégia é clara, combinando vários elementos de mercado, como preço e volume de transação, para ter uma visão completa do pulso do mercado.

Código-fonte da estratégia
/*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%