Estratégia de negociação quantitativa de cruzamento de média móvel de abertura e fechamento combinada com indicador dinâmico ADX

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Data de criação: 2025-02-18 13:35:54 última modificação: 2025-02-18 13:35:54
cópia: 1 Cliques: 445
1
focar em
1617
Seguidores

Estratégia de negociação quantitativa de cruzamento de média móvel de abertura e fechamento combinada com indicador dinâmico ADX

Visão geral

Esta é uma estratégia de negociação quantitativa baseada no cruzamento de médias móveis entre o preço de abertura e o preço de fechamento, e que utiliza o indicador de tendência média ((ADX) como filtro. A estratégia utiliza vários tipos de médias móveis, incluindo SMMA, EMA, DEMA, etc., para capturar mudanças na tendência do mercado, identificando pontos de cruzamento de médias, enquanto usa o indicador ADX para confirmar a força da tendência, aumentando a confiabilidade da negociação.

Princípio da estratégia

A lógica central da estratégia é a de calcular a média móvel do preço de abertura e do preço de fechamento, gerando um sinal de multiplicação quando a média de fechamento atravessa a média de abertura e o ADX é maior do que o limiar definido; e um sinal de ruptura quando a média de fechamento atravessa a média de abertura e o ADX é maior do que o limiar definido. A estratégia suporta vários métodos de cálculo da média móvel, incluindo a média móvel simples (SMA), a média móvel indexada (EMA) e a média móvel dupla (EMAD), que podem ser selecionados de acordo com os tipos de média mais adequados para diferentes características do mercado.

Vantagens estratégicas

  1. Flexível: Suporta vários tipos de média móvel, permitindo a escolha da melhor média de acordo com diferentes cenários de mercado
  2. Confirmação de tendências: Filtragem de indicadores ADX para reduzir sinais falsos em mercados de turbulência
  3. Controle de risco perfeito: inclui funções de stop loss e stop-loss para controlar efetivamente o risco de cada transação
  4. Alta customização: oferece várias interfaces de parâmetros, incluindo período de linha média, ADX, direção de negociação, etc., para otimização de estratégias
  5. Suporte a múltiplos períodos de tempo: pode ser executado em diferentes períodos de tempo, adaptado a diferentes estilos de negociação

Risco estratégico

  1. Moving Average Lag: A Moving Average é essencialmente um indicador de atraso, podendo gerar sinais de atraso em mercados de rápida flutuação
  2. Risco de Falso Breakout: Falso Breakout de linha média pode ocorrer em momentos de turbulência no mercado, embora haja filtragem do ADX.
  3. Sensibilidade de parâmetros: os efeitos da estratégia são mais sensíveis à configuração de parâmetros e precisam ser adequadamente ajustados em diferentes circunstâncias de mercado
  4. Adaptabilidade do mercado: Melhor desempenho em mercados de tendência evidente, mas pode ser negociado com frequência em mercados de turbulência
  5. Complexidade de computação: computação de vários tipos de linha média pode aumentar a carga do sistema, sendo necessário prestar atenção à eficiência operacional

Direção de otimização da estratégia

  1. Introdução de indicadores de volume: A eficácia da tendência pode ser confirmada pela combinação de mudanças no volume
  2. Parâmetros de otimização do ADX: Ajustar os limites do ADX de acordo com a dinâmica de diferentes ciclos de mercado
  3. Aumentar os indicadores de confirmação de tendências: pode ser considerado adicionar outros indicadores de tendências para aumentar a confiabilidade do sinal
  4. Melhorar o mecanismo de stop loss: introdução de stop loss de rastreamento ou stop loss adaptável à taxa de flutuação
  5. Optimizar o tempo de negociação: levar em conta a volatilidade do mercado e os fatores de liquidez para escolher o melhor momento de negociação

Resumir

Trata-se de um sistema de negociação quantitativa que combina estratégias clássicas de equilíbrio de linha cruzada com indicadores ADX. Com o apoio de vários tipos de equilíbrio e a confirmação de tendências ADX, é possível ter uma melhor compreensão das tendências do mercado, além de ter um mecanismo de controle de risco completo. A estratégia é altamente personalizável e pode ser ajustada de forma otimizada para diferentes condições de mercado.

Código-fonte da estratégia
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
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/
// © algostudio

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===