Estratégia de acompanhamento de tendências com base no indicador OBV


Data de criação: 2024-02-20 15:35:08 última modificação: 2024-02-20 15:35:08
cópia: 0 Cliques: 904
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendências com base no indicador OBV

Visão geral

A estratégia usa um intervalo de linha média de duas EMAs para julgar a tendência multi-espaço do indicador OBV, com uma abordagem de curto e longo prazo de acordo com a direção da tendência. Nela, o indicador OBV pode refletir com mais clareza a relação entre preço e volume de transação, julgando a vontade dos participantes do mercado e, portanto, pode ser usado para capturar a tendência do mercado. A estratégia, combinada com o processamento suave do indicador de médias móveis, pode efetivamente filtrar o ruído do mercado e capturar as principais tendências.

Princípio da estratégia

A estratégia baseia-se principalmente no OBV indicador em uma tendência ascendente para julgar o momento de entrada de cabeça múltipla. Concretamente, é o cálculo de 6 dias de EMA e 24 dias de EMA do OBV, que produz um sinal de cabeça múltipla quando o 6o dia de EMA atravessa o 24o dia de EMA. Da mesma forma, quando o 6o dia de EMA atravessa o 24o dia de EMA, produz um sinal de cabeça vazia. Além disso, a estratégia também define um stop loss de 3%.

A chave para a estratégia de julgar as tendências está no OBV. O OBV reflete a vontade coletiva de grandes capitais e pode efetivamente refletir a atitude dos participantes do mercado. Em combinação com o processamento de médias móveis, pode eliminar parte do ruído, tornando o sinal mais claro e confiável. A estratégia utiliza linhas de EMA rápidas e linhas de EMA lentas para construir sinais de negociação, que podem suavizar os dados de preços e, ao mesmo tempo, capturar as mudanças de tendência de forma mais sensível.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. O indicador OBV baseado no volume de transações permite avaliar com clareza a intenção dos participantes do mercado, e os sinais são mais confiáveis.

  2. O processamento homogêneo do EMA duplo elimina parte do ruído, tornando o sinal mais claro.

  3. A combinação de linhas EMA rápidas e lentas permite equilibrar preços e capturar mudanças de tendência.

  4. A estratégia é simples e fácil de implementar.

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. O indicador OBV emite sinais errados em alguns momentos, quando a estratégia pode perder.

  2. Em situações extremas, o EMA pode ter atrasos no processamento das linhas e pode perder os melhores pontos de entrada.

  3. A fixação de stop loss pode ser demasiado rígida para se adaptar às mudanças do mercado.

Resposta:

  1. Para evitar erros de sinalização, verifique em combinação com outros indicadores.

  2. Otimizar a configuração dos parâmetros para tornar a linha EMA mais sensível.

  3. Configuração de parada dinâmica.

Direção de otimização

A estratégia pode ser otimizada em várias direções:

  1. Otimizar a combinação de EMA para encontrar um parâmetro de linha média mais adequado.

  2. Adicionar outros indicadores para a confirmação do sinal, como MACD, RSI, etc., para melhorar a precisão do sinal.

  3. A configuração de stop loss dinâmico permite ajustar o ponto de stop loss em tempo real de acordo com as flutuações do mercado.

  4. Optimizar o conjunto de parâmetros para encontrar o melhor conjunto de parâmetros.

Resumir

A estratégia é, em geral, uma estratégia de acompanhamento de tendências mais simples e confiável. Combina o indicador OBV e a linha de equilíbrio dupla EMA para realizar o julgamento da tendência. A vantagem é a facilidade de operação, a clareza do sinal e a capacidade de acompanhar a tendência de forma eficaz; A desvantagem é que pode haver sinais errados e o tratamento da linha EMA está atrasado.

Código-fonte da estratégia
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("OBV EMA X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// OBV /////////////// 
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))

///////////////  Strategy  /////////////// 
long = crossover(e2, e1)
short = crossunder(e2, e1)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

//////////////// Stop loss /////////////// 
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)