Estratégia de negociação em pivô de supertendência filtrada pelo ADX

Autora:ChaoZhang, Data: 2024-02-19 15:01:36
Tags:

img

Resumo

Esta estratégia combina pontos pivô SuperTrend e o indicador ADX para negociação de alta freqüência. As linhas SuperTrend calculam dinamicamente os últimos níveis de suporte e resistência para determinar as tendências de preços e gerar sinais de negociação. O indicador ADX mede a força da tendência e atua como um filtro, tomando negociações apenas quando a tendência é forte o suficiente.

Estratégia lógica

  1. Calcule as linhas de suporte e resistência do pivô. Pegue o preço de fechamento e adicione/subtraia um intervalo de ATR acima e abaixo. As quebras dessas linhas sinalizam reversões de tendência.

  2. Os valores mais elevados do ADX indicam uma forte tendência.

  3. Combine os dois para sinais comerciais.

Análise das vantagens

Vantagens desta estratégia:

  1. As linhas dinâmicas de SuperTendência identificam rapidamente as rupturas.

  2. O filtro ADX evita sinais falsos durante os mercados de intervalo.

  3. Uma boa relação risco/recompensa e controlo da utilização.

Análise de riscos

Riscos desta estratégia:

  1. Os movimentos de gap podem invalidar as linhas SuperTrend.

  2. A má definição do limiar ADX afeta o desempenho.

  3. A alta frequência de negociação aumenta os custos de transacção.

Soluções:

  1. Otimizar os parâmetros para permitir maiores faixas de fuga.

  2. Teste para obter melhores valores de ADX.

  3. Reduzir a frequência do comércio.

Orientações de otimização

Áreas de melhoria:

  1. Optimize o multiplicador ATR para linhas mais robustas.

  2. Teste diferentes parâmetros ADX.

  3. Adicionar stop-loss para limitar as perdas.

Conclusão

Esta estratégia combina os pontos fortes do SuperTrend e do ADX para identificar pontos de reversão de tendência de alta probabilidade, filtrados pelo ADX para qualidade.


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

//@version=4
strategy("STPP20 + ADX", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50)
AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1)
AtrPd=input(defval = 20, title = "ATR Period", minval=1)

float ph = na
float pl = na
ph := pivothigh(PPprd, PPprd)
pl := pivotlow(PPprd, PPprd)

float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * atr(AtrPd))
Dn = center + (AtrFactor * atr(AtrPd))

float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 25
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
outMA = sma(srcMA, lenMA)


// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 

if (buy)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long)


if (sell) and (strategy.position_size > 0)
    strategy.order("Sell", false, when = sell)

Mais.