Estratégia de negociação do oscilador de saldo final

Autora:ChaoZhang, Data: 2024-01-12 14:08:33
Tags:

img

Resumo

A estratégia de negociação Ultimate Balance Oscillator é uma estratégia de negociação quantitativa que combina inteligentemente sinais de vários indicadores técnicos. Ao aproveitar o poder de indicadores como Rate of Change (ROC), Relative Strength Index (RSI), Commodity Channel Index (CCI), Williams %R e Average Directional Index (ADX), ele calcula um oscilador composto para determinar a tendência do mercado e gerar sinais de negociação.

A maior vantagem desta estratégia reside na sua capacidade de avaliar objetivamente e sistematicamente os mercados para identificar pontos de entrada e saída ideais.

Estratégia lógica

O núcleo da estratégia de negociação do oscilador de saldo final é o cálculo de um indicador de oscilador composto.

  1. Calcular os valores dos indicadores técnicos individuais: ROC, RSI, CCI, Williams %R e ADX

  2. Estandarizar estes valores de indicador para o intervalo 0-1 para permitir a comparação

  3. Use uma metodologia média ponderada para calcular um valor do oscilador composto. Cada indicador tem uma ponderação ajustável, com valores padrão de 2 para ROC, 0,5 para RSI, 2 para CCI, 0,5 para %R e 0,5 para ADX. Multiplicar cada indicador padronizado pelo seu peso, somá-los e dividir pelo peso total para obter um valor composto de 0-1.

  4. Ativar sinais de negociação quando este oscilador composto cruza os níveis de sobrecompra e sobrevenda adequadamente definidos.

Como é evidente, a estratégia utiliza de forma flexível sinais de múltiplos indicadores e os processa sistematicamente para determinar a tendência do mercado e tomar decisões de negociação.

Vantagens

A estratégia de negociação do Oscilador de Balanço Último tem várias vantagens principais:

  1. Fornece uma metodologia objetiva e sistemática de análise de mercado, utilizando múltiplos indicadores para superar as limitações de ferramentas individuais e gerar sinais acionáveis e baseados em quantidade.

  2. Otimiza o tempo de entrada e saída/precisão através dos valores precisos e padronização do oscilador.

  3. É altamente personalizável e adaptável aos estilos de negociação individuais e às condições de mercado através de ponderações e parâmetros de indicadores ajustáveis.

  4. Sistema de alerta em tempo real para notificar os operadores de novos sinais de compra/saída e garantir a informação sobre os últimos desenvolvimentos do mercado.

  5. Recurso rigoroso e otimização pré-trading para avaliar o desempenho sobre dados históricos e ajustar os parâmetros para melhoria da estratégia.

Riscos

Apesar dos seus méritos, alguns dos principais riscos na aplicação prática incluem:

  1. Risco de otimização de parâmetros de ponderações e configurações de indicadores subóptimos que prejudicam o desempenho ao vivo.

  2. Risco de nível de sobrevenda/supercompra decorrente de uma definição de intervalo inadequada em relação às condições e ao sentimento mais amplos do mercado.

  3. Os indicadores divergentes correm o risco de distorcer os valores dos osciladores compostos.

  4. A redução do número de casos de doenças graves é uma das principais causas de problemas de saúde.

Para mitigar os riscos, é fortemente recomendado um backtesting abrangente, calibragem para entender as limitações do modelo, rastreamento do desempenho ao vivo e flexibilidade no ajuste de parâmetros ou pesos com base nas condições em evolução.

Oportunidades de melhoria

Algumas maneiras de otimizar ainda mais a estratégia incluem:

  1. Expandir o modelo multifator com indicadores técnicos mais diversos para melhorar a precisão das previsões.

  2. Aplicar técnicas de aprendizagem de máquina como redes neurais para descobrir sinais latentes e prever valores de indicadores.

  3. Incorporar dados fundamentais como relatórios de ganhos e indicadores econômicos para aumentar os fatores quant.

  4. Introdução de ajustes adaptativos de parâmetros para modificar dinamicamente as ponderações e as definições com base nas mudanças do cenário do mercado.

  5. Construção de mecanismos de stop loss para controlar ativamente a queda nas negociações individuais.

  6. Integração de modelos de dimensionamento de posições baseados no tamanho da conta para a gestão de capital quantificado.

Conclusão

A estratégia de negociação do Ultimate Balance Oscillator é uma abordagem quantitativa excepcional, sintetizando a essência de vários indicadores técnicos em uma metodologia rigorosa para avaliação de mercado. Com uma enorme personalização para atender às necessidades individuais, fornece aos traders sistemáticos de varejo um plano para prosperar. Como em qualquer estratégia de quantidade, a melhoria incansável através de backtesting, otimização e inovação para expandir a robustez do modelo em todos os ambientes de mercado continua sendo a principal busca.


/*backtest
start: 2023-01-05 00:00:00
end: 2024-01-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Julien_Eche

//@version=5
strategy("Ultimate Balance Oscillator Strategy", overlay=true)

// Indicator Weights
weightROC = input.float(2, "Rate of Change (ROC) Weight", group="Weightings")
weightRSI = input.float(0.5, "Relative Strength Index (RSI) Weight", group="Weightings")
weightCCI = input.float(2, "Commodity Channel Index (CCI) Weight", group="Weightings")
weightWilliamsR = input.float(0.5, "Williams %R Weight", group="Weightings")
weightADX = input.float(0.5, "Average Directional Index (ADX) Weight", group="Weightings")

// ROC Settings
rocLength = input.int(20, "Length", minval=1, group="ROC")

// RSI Settings
rsiLength = input.int(14, "Length", minval=1, group="RSI")

// CCI Settings
cciLength = input.int(20, "Length", minval=1, group="CCI")

// Williams %R Settings
williamsRLength = input.int(14, "Length", minval=1, group="Williams %R")

// ADX Settings
adxLength = input.int(14, "ADX Length", minval=1, group="ADX")
adxDiLength = input.int(14, "DI Length", minval=1, group="ADX")

// Source
source_options = input.string("hlc3", "Source", options=["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"])

price_open = request.security(syminfo.tickerid, "D", open)
price_high = request.security(syminfo.tickerid, "D", high)
price_low = request.security(syminfo.tickerid, "D", low)
price_close = request.security(syminfo.tickerid, "D", close)
price_hl2 = request.security(syminfo.tickerid, "D", hl2)
price_hlc3 = request.security(syminfo.tickerid, "D", hlc3)
price_ohlc4 = request.security(syminfo.tickerid, "D", ohlc4)

get_source(source_option) =>
    price = price_close
    if source_option == "open"
        price := price_open
    else if source_option == "high"
        price := price_high
    else if source_option == "low"
        price := price_low
    else if source_option == "close"
        price := price_close
    else if source_option == "hl2"
        price := price_hl2
    else if source_option == "hlc3"
        price := price_hlc3
    else
        price := price_ohlc4
    price

src = get_source(source_options)

// Overbought/Oversold Levels
obLevel = input.float(0.75, "Overbought Level")
osLevel = input.float(0.25, "Oversold Level")

// Calculating the indicators
rocValue = ta.change(close, rocLength)
rsiValue = ta.rsi(close, rsiLength)
cciValue = (src - ta.sma(src, cciLength)) / (0.015 * ta.dev(src, cciLength))
williamsRValue = -100 * (ta.highest(high, williamsRLength) - close) / (ta.highest(high, williamsRLength) - ta.lowest(low, williamsRLength))

dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

adxValue = adx(adxDiLength, adxLength)

// Normalizing the values
normalize(value, min, max) =>
    (value - min) / (max - min)

normalizedROC = normalize(rocValue, ta.lowest(rocValue, rocLength), ta.highest(rocValue, rocLength))
normalizedRSI = normalize(rsiValue, 0, 100)
normalizedCCI = normalize(cciValue, ta.lowest(cciValue, cciLength), ta.highest(cciValue, cciLength))
normalizedWilliamsR = normalize(williamsRValue, ta.lowest(williamsRValue, williamsRLength), ta.highest(williamsRValue, williamsRLength))
normalizedADX = normalize(adxValue, 0, 50)

// Calculating the combined oscillator line
oscillatorLine = (normalizedROC * weightROC + normalizedRSI * weightRSI + normalizedCCI * weightCCI + normalizedWilliamsR * weightWilliamsR + normalizedADX * weightADX) / (weightROC + weightRSI + weightCCI + weightWilliamsR + weightADX)

// Strategy conditions
enterLong = ta.crossover(oscillatorLine, obLevel)
exitLong = ta.crossunder(oscillatorLine, osLevel)

// Strategy orders
if (enterLong)
    strategy.entry("Buy", strategy.long)
if (exitLong)
    strategy.close("Buy")

// Alert conditions
if (enterLong)
    alert("Buy signal")
if (exitLong)
    alert("Exit signal")


Mais.