Estratégia de tendência dinâmica de absorção

Autora:ChaoZhang, Data: 2024-02-29 11:24:18
Tags:

img

Resumo

A estratégia de tendência de engulfamento dinâmico é uma estratégia de negociação que assume posições longas ou curtas com base em padrões de engulfamento na direção da tendência. Esta estratégia usa a faixa verdadeira média (ATR) para medir a volatilidade do mercado, o indicador Supertrend para determinar a direção da tendência do mercado e entra em negociações quando os padrões de engulfamento se alinham com a direção da tendência.

Estratégia lógica

  1. Calcular o ATR para medir a volatilidade do mercado.
  2. Calcular o indicador Supertrend para identificar a tendência do mercado.
  3. Definir condições para tendências ascendentes e descendentes.
  4. Identificar o engulf bullish (em tendência de alta) e o engulf bearish (em tendência de baixa).
  5. Calcular os níveis de Stop Loss (SL) e Take Profit (TP) com base nos padrões de engulfing.
  6. Entre em negociações quando os padrões de engulfamento coincidirem com a direção da tendência.
  7. Exit trades quando o preço atinge os níveis SL ou TP.
  8. Trace os padrões de engolimento no gráfico.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. Melhoria da qualidade do sinal através da combinação de padrões de engulfing com tendência.
  2. Capacidade de identificar inversões de tendência para entradas precisas.
  3. Signais claros para melhor sincronização.
  4. A estratégia de stop de engulfing segue a tendência enquanto gerencia os riscos.
  5. Estrutura de código modular para otimizações fáceis.

Análise de riscos

Há também alguns riscos a considerar:

  1. Os padrões de engolimento podem revelar-se falsos.
  2. Difícil determinar parâmetros ideais como tamanho do padrão, duração, etc.
  3. A determinação imperfeita da tendência pode levar a sinais falsos.
  4. Os níveis de stop loss e take profit dependem de critérios de apreciação e podem ser subjetivos.
  5. O desempenho depende do ajuste dos parâmetros com base em dados históricos.

Os riscos podem ser mitigados por:

  1. Adicionando filtros para remover falsos sinais de fuga.
  2. Utilização de ATR adaptativo para cálculos de parâmetros robustos.
  3. Melhorar a determinação de tendências através da aprendizagem automática.
  4. Encontrar parâmetros ótimos através de algoritmos genéticos.
  5. Testes de retorno durante períodos mais longos para garantir a robustez.

Orientações de otimização

Há margem de manobra para uma melhor otimização:

  1. O aprendizado de máquina pode melhorar a determinação de tendências.
  2. Novos métodos de reconhecimento de padrões podem identificar melhor os padrões de engolimento.
  3. As últimas estratégias de stop loss/take profit podem otimizar os níveis de forma dinâmica.
  4. Os dados de alta frequência podem desenvolver sistemas de curto prazo.
  5. Ajuste de parâmetros para diferentes instrumentos.

Conclusão

Em resumo, a estratégia de tendência de engulfamento dinâmico combina os sinais de padrão de engulfamento de alta qualidade com determinação precisa da tendência para gerar um sistema de negociação com entradas precisas e perdas de parada razoáveis e lucro.


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


//@version=4
strategy("Engulfing with Trend", overlay=true)

Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2

up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn

trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")

// Define Downtrend and Uptrend conditions
downtrend = trend == -1
uptrend = trend == 1


// Engulfing 
boringThreshold = input(25, title="Boring Candle Threshold (%)", minval=1, maxval=100, step=1)
engulfingThreshold = input(50, title="Engulfing Candle Threshold (%)", minval=1, maxval=100, step=1)
stopLevel = input(200, title="Stop Level (Pips)", minval=1)


// Boring Candle (Inside Bar) and Engulfing Candlestick Conditions
isBoringCandle = abs(open[1] - close[1]) * 100 / abs(high[1] - low[1]) <= boringThreshold
isEngulfingCandle = abs(open - close) * 100 / abs(high - low) <= engulfingThreshold

// Bullish and Bearish Engulfing Conditions
bullEngulfing = uptrend and close[1] < open[1] and close > open[1] and not isBoringCandle and not isEngulfingCandle
bearEngulfing = downtrend and close[1] > open[1] and close < open[1] and not isBoringCandle and not isEngulfingCandle

// Stop Loss, Take Profit, and Entry Price Calculation
bullStop = close + (stopLevel * syminfo.mintick)
bearStop = close - (stopLevel * syminfo.mintick)
bullSL = low 
bearSL = high
bullTP = bullStop + (bullStop - low)
bearTP = bearStop - (high - bearStop)

// Entry Conditions
enterLong = bullEngulfing and uptrend
enterShort = bearEngulfing and downtrend

// Exit Conditions
exitLong = crossover(close, bullTP) or crossover(close, bullSL)
exitShort = crossover(close, bearTP) or crossover(close, bearSL)

// Check if exit conditions are met by the next candle
exitLongNextCandle = exitLong and (crossover(close[1], bullTP[1]) or crossover(close[1], bullSL[1]))
exitShortNextCandle = exitShort and (crossover(close[1], bearTP[1]) or crossover(close[1], bearSL[1]))

// Strategy Execution
strategy.entry("Buy", strategy.long, when=enterLong )
strategy.entry("Sell", strategy.short, when=enterShort )

// Exit Conditions for Long (Buy) Positions
if (bullEngulfing and not na(bullTP) and not na(bullSL))
    strategy.exit("Exit Long", from_entry="Buy", stop=bullSL, limit=bullTP)

// Exit Conditions for Short (Sell) Positions
if (bearEngulfing and not na(bearTP) and not na(bearSL))
    strategy.exit("Exit Short", from_entry="Sell", stop=bearSL, limit=bearTP)

// Plot Shapes and Labels
plotshape(bullEngulfing, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(bearEngulfing, style=shape.triangledown, location=location.abovebar, color=color.red)

// Determine OP, SL, and TP
plot(bullEngulfing ? bullStop : na, title="Bullish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearStop : na, title="Bearish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bullEngulfing ? bullSL : na, title="Bullish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearSL : na, title="Bearish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bullEngulfing ? bullTP : na, title="Bullish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearTP : na, title="Bearish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)



Mais.