Estratégia de negociação do oscilador do ciclo delta da diferença de volume

Autora:ChaoZhang, Data: 2023-10-30 11:45:42
Tags:

img

Resumo

Esta estratégia julga a conversão de ciclos de touro e urso calculadora da taxa de mudança da mudança de volume, que pertence às estratégias de divergência volume-preço.

Lógica de negociação

  1. Calcular a taxa de variação da variação de volume (a taxa de variação do indicador de diferença de volume), para obter o resultado do indicador baseado no momento de volume.

  2. Calcule as bandas de Bollinger de n para obter bbr representando o desvio padrão do momento do volume.

  3. Calcule as bandas de Bollinger do preço de fechamento para obter bbr1 representando o desvio padrão do preço.

  4. Calcule a diferença hist entre os dois, que é o desvio-padrão do momento do volume menos o desvio-padrão do preço, como indicador final.

  5. Quando o hist cruza acima de 0, é o sinal de entrada curto, e quando cruza abaixo de 0, é o sinal de entrada longo.

Ao calcular a taxa de mudança da mudança de volume, o efeito principal da mudança de volume no preço é amplificado. Quando o volume reverte enquanto o preço ainda não reverteu, o hist cruzará acima ou abaixo de 0, gerando sinais de negociação. Ele pode prever os pontos de virada das tendências de preços com antecedência.

Vantagens

  1. Esta estratégia é uma estratégia de divergência volume-preço baseada na taxa de variação de volume, que pode refletir previamente os pontos de virada das tendências de preços.

  2. O cálculo da taxa de variação da variação de volume amplifica o efeito principal da variação de volume no preço, resultando em um melhor desempenho comercial.

  3. A combinação de indicadores de impulso de volume com Bandas de Bollinger de preço torna os sinais de negociação mais confiáveis.

  4. Usando suavização exponencial tripla em dados Hist torna os sinais mais precisos e suaves.

  5. A definição de linhas sobrecompradas/supervendidas e ordens de stop loss/take profit longas/cortas ajuda a controlar os riscos de forma eficaz.

  6. Muitos parâmetros personalizáveis, como o comprimento das bandas de Bollinger, o multiplicador de desvio padrão e os fatores de suavização Hist, permitem a otimização da estratégia.

Riscos

  1. Os dados relativos ao volume podem não reflectir verdadeiramente as trocas de mercado e poderem ser manipulados.

  2. A divergência volume-preço pode não persistir e o preço pode romper sem reverter.

  3. As configurações incorretas dos parâmetros podem causar excesso de negociação ou sinais imprecisos.

  4. Cuidado com sinais falsos de dados anormais de volume.

  5. Os sinais de reversão devem ser evitados quando a tendência for forte.

Os riscos podem ser mitigados através da otimização de parâmetros, adição de outros filtros e definição de stop loss/take profit.

Oportunidades de melhoria

  1. Otimizar os parâmetros das bandas de Bollinger para sinais mais estáveis.

  2. Adicionar filtro de tendência para evitar a negociação contra a tendência.

  3. Incorporar outros indicadores como o MACD para confirmação do sinal.

  4. Utilize a IA para otimizar automaticamente os parâmetros de forma adaptativa.

  5. Adicionar stop loss/take profit dinâmico para otimizar a gestão do risco.

  6. Aplicar aprendizado de máquina para determinar a taxa de sucesso da divergência volume-preço para uma qualidade de sinal mais elevada.

Conclusão

Esta estratégia amplifica o efeito principal da mudança de volume no preço, calculando a taxa de mudança de volume, permitindo a detecção precoce de pontos de virada da tendência. Em comparação com os indicadores de volume único, ela tem maior confiabilidade e precisão. Mas riscos como manipulação de volume e ruptura de divergência devem ser evitados por meio de otimização de parâmetros, filtros de indicadores, etc. No futuro, a IA pode ser alavancada para otimização adaptativa de parâmetros para melhorar ainda mais a estabilidade e lucratividade da estratégia.


/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © tathal and special thanks to oakwhiz for his porting of my custom volume indicator

//@version=5
strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000)

startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31)
startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12)
startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100)

endDate = input.int(title='End Date', defval=31, minval=1, maxval=31)
endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12)
endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100)

// Normalize Function
normalize(_src, _min, _max) =>
    // Normalizes series with unknown min/max using historical min/max.
    // _src      : series to rescale.
    // _min, _min: min/max values of rescaled series.
    var _historicMin = 10e10
    var _historicMax = -10e10
    _historicMin := math.min(nz(_src, _historicMin), _historicMin)
    _historicMax := math.max(nz(_src, _historicMax), _historicMax)
    _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10)


// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

// Stop loss & Take Profit Section     
l_sl_inp = input(2.0, title='Long Stop Loss %') / 100
l_tp_inp = input(4.0, title='Long Take Profit %') / 100

l_stop_level = strategy.position_avg_price * (1 - l_sl_inp)
l_take_level = strategy.position_avg_price * (1 + l_tp_inp)

s_sl_inp = input(2.0, title='Short Stop Loss %') / 100
s_tp_inp = input(4.0, title='Short Take Profit %') / 100

s_stop_level = strategy.position_avg_price * (1 + s_sl_inp)
s_take_level = strategy.position_avg_price * (1 - s_tp_inp)

src = close

//  Volume Differnce Indicator Delta

float change_src = ta.change(src)
float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume)
float i_pvt = ta.pvt

float result = ta.change(i_obv - i_pvt)

float nresult = ta.ema(normalize(result, -1, 1), 20)


// Volume Differnce Indicator Delta %B
length = input.int(20, minval=1, title='Volume Bands Length')
mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev')
basis = ta.ema(nresult, length)
dev = mult * ta.stdev(nresult, length)
upper = basis + dev
lower = basis - dev
bbr = (nresult - lower) / (upper - lower)

// Normal %B, Based on close

l1 = input.int(20, minval=1, title='Bollinger Bands Length')
src2 = close
mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev')
basis1 = ta.sma(src2, l1)
dev1 = mult1 * ta.stdev(src2, l1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
bbr1 = (src - lower1) / (upper1 - lower1)

/// Final Output Line

hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3'))

/// Overbought / Oversold Line Creation
oversold = input(-.1)
overbought = input(.4)
hline(oversold, linewidth=2, color=color.new(#81c784, 62))
hline(overbought, linewidth=2, color=color.new(#c2185b, 38))

/// Long & Short Conditions

short = hist > overbought
long = hist < oversold

/// Colors & Plotting
histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350
plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0))

CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na
bgcolor(color.new(CrossBgColor, 90))

/// Strategy Methodology

if inDateRange
    strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level)

if inDateRange and strategy.position_size > 0
    strategy.close_all(when=short)

if inDateRange
    strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level)

if inDateRange and strategy.position_size < 0
    strategy.close_all(when=long)



Mais.