Triple Supertrend Ichimoku Cloud Estratégia de negociação quantitativa

Autora:ChaoZhang, Data: 2023-12-27 15:22:40
Tags:

img

Resumo

Esta estratégia é uma estratégia quantitativa de negociação que combina o indicador de supertrend triplo, o indicador de nuvem de Ichimoku, o indicador de faixa média verdadeira (ATR) e a média móvel exponencial (EMA).

Princípio da estratégia

A lógica central desta estratégia é baseada no indicador de supertrend triplo. O indicador de supertrend determina a direção da tendência comparando o preço com a faixa média verdadeira dentro de um determinado período. Quando o preço está acima da faixa superior, é um sinal de alta, e quando o preço está abaixo da faixa inferior, é um sinal de baixa. Esta estratégia adota três indicadores de supertrend com parâmetros diferentes. Os sinais de negociação são gerados quando todos os três dão sinais de compra ou venda ao mesmo tempo.

Além disso, a espessura da nuvem Ichimoku ajuda a determinar a força da tendência atual para filtrar alguns sinais falsos.

Especificamente, vá longo quando o preço estiver acima da faixa superior de todos os três indicadores de supertrend e vá curto quando estiver abaixo da faixa inferior de todos os três. Também exija que o preço esteja acima ou abaixo da nuvem Ichimoku para filtrar sinais incertos.

Vantagens

  1. Os três indicadores de supertendência com configurações diferentes podem filtrar eficazmente o ruído do mercado e determinar a direção da tendência com mais precisão.

  2. A nuvem de Ichimoku determina a força da tendência para evitar falsas rupturas.

  3. A EMA ajuda a confirmar a direcção da tendência a médio e longo prazo, a verificar os sinais da super tendência, melhorando ainda mais a fiabilidade.

  4. A combinação de múltiplos indicadores torna os sinais mais fiáveis, uma vez que podem verificar-se mutuamente para determinar a tendência do mercado.

Riscos

  1. Embora a nuvem Ichimoku seja adicionada, ainda há o risco de entrar na zona inválida se a espessura da nuvem for penetrada.

  2. Quando a volatilidade é alta, o stop loss definido pelo ATR pode ser ativado diretamente, aumentando assim a taxa de perda.

  3. Os sinais inválidos podem ocorrer com frequência se os parâmetros da supertendência forem definidos de forma inadequada.

Reforço

  1. Mais indicadores como o índice de volatilidade, as bandas de Bollinger podem ser adicionados para ajudar a filtrar os sinais e melhorar a confiabilidade.

  2. Melhorar o cálculo do ATR para ajustar dinamicamente o intervalo de stop loss durante oscilações enormes para reduzir a taxa de perda.

  3. Adicionar um modelo de aprendizado de máquina treinado em dados históricos para julgar sinais de negociação em vez de configuração manual de parâmetros.

Conclusão

Esta estratégia combina quatro partes, incluindo a tripla supertrend, Ichimoku cloud, ATR e EMA. Os sinais são verificados em todos os indicadores ao determinar a tendência do mercado. Ichimoku cloud e ATR controle de perda de parada risco. EMA confirma tendência de médio e longo prazo. Os sinais desta estratégia é relativamente confiável para a detenção de médio a longo prazo.


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

//@version=5
strategy(title="HyperTrend", shorttitle="HyperTrend", overlay=true )

// 
float percent_of_portfo = input.int(2, title = "percent of portfo per order", minval = 0, maxval = 100) / 100

// ichimoku Cloud
conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group = "ichimoku")
basePeriods = input.int(26, minval=1, title="Base Line Length", group = "ichimoku")
laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group = "ichimoku")
displacement = input.int(26, minval=1, title="Lagging Span", group = "ichimoku")
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = math.avg(conversionLine, baseLine)
leadLine2 = donchian(laggingSpan2Periods)
p1 = plot(leadLine1, offset = displacement - 1, color=#A5D6A7,
	 title="Leading Span A", display = display.none)
p2 = plot(leadLine2, offset = displacement - 1, color=#ef9a9a,
	 title="Leading Span B", display = display.none)
plot(leadLine1 > leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Upper Line", display = display.none) 
plot(leadLine1 < leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Lower Line", display = display.none) 
fill(p1, p2, color = leadLine1 > leadLine2 ? color.rgb(67, 160, 72, 59) : color.rgb(244, 67, 54, 70))


// three supertrend

//1
atrPeriod1 = input(10, "ATR Length1", group="SuperTrend")
factor1 = input.float(1.0, "Factor1", step = 0.01, group="SuperTrend")

[supertrend1, direction1] = ta.supertrend(factor1, atrPeriod1)
supertrend1 := barstate.isfirst ? na : supertrend1

bodyMiddle1 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend1 =    plot(direction1 < 0 ? supertrend1 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend1 =  plot(direction1 < 0 ? na : supertrend1, "Down Trend", color = color.red,   style = plot.style_linebr)


//2
atrPeriod2 = input(11, "ATR Length2", group="SuperTrend")
factor2 = input.float(2.0, "Factor2", step = 0.01, group="SuperTrend")

[supertrend2, direction2] = ta.supertrend(factor2, atrPeriod2)
supertrend2 := barstate.isfirst ? na : supertrend2

bodyMiddle2 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend2 =    plot(direction2 < 0 ? supertrend2 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend2 =  plot(direction2 < 0 ? na : supertrend2, "Down Trend", color = color.red,   style = plot.style_linebr)


//3
atrPeriod3 = input(12, "ATR Length2", group="SuperTrend")
factor3 = input.float(3.0, "Factor2", step = 0.01, group="SuperTrend")

[supertrend3, direction3] = ta.supertrend(factor3, atrPeriod3)
supertrend3 := barstate.isfirst ? na : supertrend3

bodyMiddle3 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend3 =    plot(direction3 < 0 ? supertrend3 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend3 =  plot(direction3 < 0 ? na : supertrend3, "Down Trend", color = color.red,   style = plot.style_linebr)


// ATR
lengthATR = input.int(title="Length (ATR)", defval=14, minval=1, group="ATR")
smoothingATR = input.string(title="Smoothing (ATR)", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"], group="ATR")
ma_function(sourceATR, lengthATR) =>
	switch smoothingATR
		"RMA" => ta.rma(sourceATR, lengthATR)
		"SMA" => ta.sma(sourceATR, lengthATR)
		"EMA" => ta.ema(sourceATR, lengthATR)
		=> ta.wma(sourceATR, lengthATR)
ATR = ma_function(ta.tr(true), lengthATR)
plot(ATR, title = "ATR", color=color.new(#B71C1C, 0), display = display.none)

// EMA
lenEMA = input.int(200, minval=1, title="Length of EMA", group="EMA")
srcEMA = input(close, title="Source of EMA", group="EMA")
offset = input.int(title="Offset (EMA)", defval=0, minval=-500, maxval=500, group="EMA")
outEMA = ta.ema(srcEMA, lenEMA)
plot(outEMA, title="EMA", color=color.blue, offset=offset, display = display.none)

ma(sourceEMA, lengthEMA, type) =>
    switch type
        "SMA" => ta.sma(sourceEMA, lengthEMA)
        "EMA" => ta.ema(sourceEMA, lengthEMA)
        "SMMA (RMA)" => ta.rma(sourceEMA, lengthEMA)
        "WMA" => ta.wma(sourceEMA, lengthEMA)
        "VWMA" => ta.vwma(sourceEMA, lengthEMA)

typeMA = input.string(title = "Method (EMA)", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="EMA")
smoothingLengthEMA = input.int(title = "Smoothing Length (EMA)", defval = 5, minval = 1, maxval = 100, group="EMA")

smoothingLine = ma(outEMA, smoothingLengthEMA, typeMA)
plot(smoothingLine, title="Smoothing Line", color=#f37f20, offset=offset, display=display.none)


//logic



if (open + ATR > supertrend1) and (open + ATR > supertrend2) and (open + ATR > supertrend3) 
	strategy.entry("L", strategy.long)
else if (open < supertrend1 + ATR) and (open < supertrend2 + ATR) and (open < supertrend3 + ATR) 
	strategy.entry("S", strategy.short)
else
	strategy.close_all("C")

Mais.