Desvio do ímpeto e tendência na sequência da estratégia de combinação

Autora:ChaoZhang, Data: 2023-12-13 16:41:25
Tags:

img

Resumo

Esta estratégia é uma estratégia de combinação que integra indicadores de momento, indicadores de tendência e indicadores de média móvel para realizar a tendência de seguimento e entrada/saída de ruptura.

Princípio da estratégia

A estratégia consiste nos seguintes indicadores:

  1. Quando a EMA25 cruza acima da EMA50 e a EMA100 cruza acima da EMA200, é uma tendência ascendente, caso contrário é uma tendência descendente.

  2. Indicador de tendência de Supertrend: Os parâmetros são o Fator 3 e o ATR 10 para julgar se o preço atual está em uma tendência de alta ou baixa.

  3. Indicador de momento estocástico: %K 8 e %D 3 para determinar se o estocástico gera cruz de ouro ou cruz morta.

A estratégia de compra é: EMA mostra tendência de alta + Supertrend mostra tendência de alta + Stochastic cruz de ouro.
A estratégia de venda é: EMA mostra tendência de baixa + Supertrend mostra tendência de baixa + Stochastic cruz morta.

Esta estratégia integra indicadores de tendência, dinâmica e ruptura para determinar de forma fiável os movimentos do mercado e os pontos de negociação.

Análise das vantagens

As principais vantagens desta estratégia são:

  1. A combinação de múltiplos indicadores melhora a robustez e filtra efetivamente as falhas.

  2. A adição de um indicador de impulso pode identificar pontos de virada.

  3. Parâmetros personalizáveis adequados a diferentes ambientes de mercado.

  4. Realiza uma configuração de stop loss e take profit relativamente eficiente.

  5. Funciona bem quando testado em períodos de tempo longos, como diariamente.

Análise de riscos

Há também alguns riscos:

  1. A configuração incorreta dos parâmetros pode causar negociações demasiado frequentes ou sinais instáveis.

  2. Pode ainda haver erros de julgamento no momento, podendo ser adicionados mais indicadores de filtro.

  3. O stop loss definido em extremos estocásticos pode ser muito próximo.

  4. Dados insuficientes de backtest podem causar viés no ajuste dos parâmetros.

Orientações de otimização

A estratégia pode ser otimizada das seguintes formas:

  1. Teste mais conjuntos de parâmetros para encontrar o ideal.

  2. Adicione mais indicadores de filtro como energia ou volatilidade para reduzir erros de julgamento.

  3. Teste diferentes formas de stop loss, por exemplo, stop loss baseado em percentagem.

  4. Otimizar, tirar lucro, como parar de seguir para obter mais lucros.

  5. Ampliar o âmbito, adaptar-se a mais produtos ou prazos mais longos.

Conclusão

A lógica da estratégia é clara e a seleção do indicador razoável. Realiza a negociação de tendência seguindo e rompendo o momento com bons resultados de backtest. Mas ainda há espaço para otimização, por exemplo, ajuste de parâmetros, adição de filtros, melhoria de paradas e captação de lucros. A otimização multidimensional pode tornar a estratégia mais robusta.


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-06 07:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Supertrend + Stoch Strategy", overlay=true)

// ---inputs---
pl = input(1.5, title="P/L", minval=0.1)
lossPercentage = input(1, title="Loss Percentage", minval=1, maxval=100)
atrPeriod = input(10, "ATR Length")
factor = input(3, "Supertrend Factor")
periodK = input(8, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
ema1l = input(25, title="EMA 1 Length", minval=1)
ema2l = input(50, title="EMA 2 Length", minval=1)
ema3l = input(100, title="EMA 3 Length", minval=1)
ema4l = input(200, title="EMA 4 Length", minval=1)

// ---lines---
ema1 = ema(close, ema1l)
ema2 = ema(close, ema2l)
ema3 = ema(close, ema3l)
ema4 = ema(close, ema4l)
trendUpper = ema1 > ema2 and ema3 > ema4
trendLower = ema1 < ema2 and ema3 < ema4

[supertrend, direction] = supertrend(factor, atrPeriod)
supertrendUpper = direction < 0
supertrendLower = direction > 0

k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)
stochCrossOver = crossover(k, d)
stochCrossUnder = crossunder(k, d)

// ---plot---
plot(ema1, color=color.green)
plot(ema2, color=color.orange)
plot(ema3, color=color.blue)
plot(ema4, color=color.purple)

bodyMiddle = plot((open + close) / 2, display=display.none)
upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(direction < 0 ? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend, color.new(color.green, 95), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red, 95), fillgaps=false)

// ---stop place compute---
edge = 0.  // periodly high/low
edge := stochCrossOver ? high : stochCrossUnder ? low : k > d ? max(edge[1], high) : k < d ? min(edge[1], low) : edge[1]

// plot(edge)

// ---trade condition---
// longCond = trendUpper and supertrendUpper and stochCrossOver
// shortCond = trendLower and supertrendLower and stochCrossUnder
longCond = trendUpper and supertrendUpper and stochCrossOver and strategy.position_size == 0
shortCond = trendLower and supertrendLower and stochCrossUnder and strategy.position_size == 0

// ---stop & take---
stop = 0.
stop := nz(stop[1], stop)
take = 0.
take := nz(take[1], take)

if longCond
    stop := edge[1]
    take := close + (close - stop) * pl
if shortCond
    stop := edge[1]
    take := close - (stop - close) * pl

// ---trade---
qty = strategy.equity / abs(stop - close) / 100 * lossPercentage

strategy.entry("Buy", strategy.long, when=longCond, qty=qty)
strategy.exit("Close Buy","Buy", limit=take, stop=stop)

strategy.entry("Sell", strategy.short, when=shortCond, qty=qty)
strategy.exit("Close Sell","Sell", limit=take, stop=stop)

stopLine = plot(strategy.position_size != 0 ? stop : na, color=color.red, style=plot.style_linebr)
takeLine = plot(strategy.position_size != 0 ? take : na, color=color.green, style=plot.style_linebr)
entryLine = plot(strategy.position_size != 0 ? strategy.position_avg_price : na, color=color.blue, style=plot.style_linebr)
fill(entryLine, stopLine, color.new(color.red, 90), fillgaps=false)
fill(entryLine, takeLine, color.new(color.green, 90), fillgaps=false)

Mais.