Estratégia de sinais de tendência de sobreposição

Autora:ChaoZhang, Data: 2024-02-18 10:00:22
Tags:

img

Resumo

Esta estratégia gera sinais de negociação calculando os índices de movimento direcional (DMI) DI+ e DI- juntamente com o índice direcional médio (ADX) e a média móvel exponencial (EMA). Ele aciona um sinal longo quando o DI+ cruza acima do DI- e o ADX está acima de 20. Um sinal curto é acionado quando o DI- cruza abaixo do DI+ e o ADX está acima de 25.

Estratégia lógica

  1. Calcular o DI+, DI-, ADX

    • Usar ta.dmi() para calcular DI+, DI-, ADX
    • DI+/DI- mede o movimento direcional dos preços
    • O ADX mede a força do movimento dos preços
  2. Calcule a média móvel exponencial

    • Use a função my_ema() personalizada para calcular a EMA
    • EMA suaviza dados de preços
  3. Gerar sinais comerciais

    • Sinais longos: DI+ cruza acima de DI- e ADX > 20 e fecha > EMA
      • Indica tendência ascendente e aumento da volatilidade
    • Sinais curtos: DI- cruza abaixo de DI+ e ADX > 25 e aproxima < EMA
      • Indica tendência descendente e elevada volatilidade
  4. Configurar perda de parada

    • Perda de parada longa: DI- cruza acima de DI+ e ADX > 30
      • Indica uma inversão da tendência
    • Perda de parada curta: DI+ cruza abaixo de DI- e ADX > 30
      • Indica uma inversão da tendência

Em resumo, esta estratégia combina indicadores de análise de impulso e tendência para negociar quando surgem fortes tendências de preços, com stop losses para limitar as perdas.

Análise das vantagens

  1. O DI duplo evita sinais falsos.
    • O DI único pode dar sinais falsos, o DI duplo garante tendência
  2. O limiar do ADX requer maior volatilidade
    • Apenas negocia movimentos de alta volatilidade, evita os intervalos
  3. A EMA complementa o DI
    • A EMA identifica tendências a médio e longo prazo
  4. Stop loss rigoroso
    • Cortar perdas rapidamente

Análise de riscos

  1. Perda de paragem frequente
    • Oscilações voláteis podem desencadear paradas frequentes
  2. Dependência do parâmetro
    • É necessário encontrar parâmetros de DI e ADX ideais
  3. Baixa frequência de negociação
    • Regras rigorosas reduzem o comércio

Pode otimizar expandindo a perda de parada, ajustando parâmetros, adicionando filtros para aumentar a frequência.

Oportunidades de otimização

  1. Optimização de parâmetros
    • Otimizar os parâmetros DI e ADX
  2. Adicionar filtros
    • Volume, divergência, etc.
  3. Ampliar o stop loss
    • Paradas relaxadas para reduzir a frequência

Conclusão

Esta estratégia combina indicadores de análise de impulso e tendência para negociar tendências fortes, com paradas rigorosas para controlar o risco.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 4h
basePeriod: 15m
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/
// © Tamil_FNO_Trader

//@version=5
strategy("Overlay Signals by TFOT", overlay=true)

// Calculate DMI
len = input.int(14, minval=1, title="DI Length")
lensig = input.int(14, title="ADX Smoothing", minval=1, maxval=50)
[diplus, diminus, adx] = ta.dmi(len, lensig)

// Get EMA
emalen = input.int(26, minval=1, title = "EMA Length")
emasrc = input.source(close, title = "EMA Source")

my_ema(src, length) =>
    alpha = 2 / (length + 1)
    sum = 0.0
    sum := na(sum[1]) ? src : alpha * src + (1 - alpha) * nz(sum[1])
EMA2 = my_ema(emasrc, emalen)

// Variables
var bool buycondition1 = false
var bool sellcondition1 = false

var int firstbuybar = na
var int firstsellbar = na

var int buyexitbar = na
var int sellexitbar = na

var bool buyexit1 = false
var bool sellexit1 = false

// Buy & Sell Conditions
buycondition1 := (ta.crossover(diplus, diminus)) and (adx > 20) and (close > EMA2) and na(firstbuybar)
sellcondition1 := (ta.crossover(diminus, diplus)) and (adx > 25) and (close < EMA2) and na(firstsellbar)

buyexit1 := ta.crossover(diminus, diplus) and (adx > 30) and na(buyexitbar)
sellexit1 := ta.crossover(diplus, diminus) and (adx > 30) and na(sellexitbar)

if buycondition1
    if(na(firstbuybar))
        firstbuybar := bar_index
        buyexitbar := na
        firstsellbar := na
        strategy.entry("Buy", strategy.long)

if sellcondition1
    if(na(firstsellbar))
        firstsellbar := bar_index
        sellexitbar := na
        firstbuybar := na
        strategy.entry("Sell", strategy.short)

if buyexit1 and not na(firstbuybar)
    if(na(buyexitbar))
        buyexitbar := bar_index
        firstbuybar := na
        firstsellbar := na
        strategy.close("Buy")

if sellexit1 and not na(firstsellbar)
    if(na(sellexitbar))
        sellexitbar := bar_index
        firstsellbar := na
        firstbuybar := na
        strategy.close("Sell")

// Plot signals on chart
hl = input.bool(defval = true, title = "Signal Labels")

plotshape(hl and buycondition1 and bar_index == firstbuybar ? true : na, "Buy", style = shape.labelup, location = location.belowbar, color = color.green, text = "Buy", textcolor = color.white, size = size.tiny)
plotshape(hl and sellcondition1 and bar_index == firstsellbar ? true : na, "Sell", style = shape.labeldown, location = location.abovebar, color = color.red, text = "Sell", textcolor = color.white, size = size.tiny)

plotshape(hl and buyexit1 and bar_index == buyexitbar ? true : na, "Buy Exit", style = shape.labelup, location = location.belowbar, color = color.red, text = "Buy X", textcolor = color.white, size = size.tiny)
plotshape(hl and sellexit1 and bar_index == sellexitbar ? true : na, "Sell Exit", style = shape.labeldown, location = location.abovebar, color = color.red, text = "Sell X", textcolor = color.white, size = size.tiny)



Mais.