Impulso do Ciclo de Tendência de Schaff Seguindo a Estratégia

Autora:ChaoZhang, Data: 2023-11-01 16:08:35
Tags:

img

Resumo

Esta estratégia baseia-se no indicador do Ciclo de Tendência Schaff, combinado com os princípios de sobrecompra e sobrevenda do Stoch RSI, para determinar e acompanhar tendências usando métricas de impulso.

Estratégia lógica

    1. Calcule o MACD, onde o comprimento rápido padrão é 23 e o comprimento lento é 50. O MACD reflete a diferença entre as médias móveis de curto e longo prazo para julgar o impulso do preço.
    1. Aplicar o Stoch RSI ao MACD para formar o valor K, onde a duração do ciclo por defeito é 10, refletindo os níveis de sobrecompra/supervenda da métrica de impulso do MACD.
    1. Tomar a média móvel ponderada de K para formar D, onde o 1o %D de comprimento é 3, para remover o ruído de K.
    1. Aplicar novamente o RSI de Stoch a D para formar o valor inicial STC, onde o 2o %D de comprimento por defeito é 3, para criar sinais precisos de sobrecompra/supervenda.
    1. Tome a média móvel ponderada do STC inicial para obter o valor final do STC, variando de 0 a 100.
    1. Vai longo quando o STC cruza acima de 25 para cima, e curto quando o STC cruza para baixo acima de 75.

Vantagens

    1. O desenho do STC que combina o RSI de Stoch identifica claramente as regiões de sobrecompra/supervenda, formando fortes sinais de tendência.
    1. A filtragem dupla do Stoch RSI efetivamente elimina falhas.
    1. O intervalo padronizado de 0-100 do STC permite sinais comerciais mecanizados diretos.
    1. O backtest implementa marcas de fuga visuais e alertas pop-up de texto para captura de sinal clara e intuitiva.
    1. Os parâmetros padrão otimizados evitam sinais supersensíveis e negociações desnecessárias.

Riscos

    1. O STC é sensível a parâmetros. Diferentes moedas e prazos exigem ajuste de parâmetros para atender às características do mercado.
    1. As estratégias de fuga são propensas a armadilhas, exigindo paradas para controlar o risco.
    1. As falsas rupturas de baixa liquidez podem gerar maus sinais, necessitando de um filtro de volume.
    1. A STC por si só corre o risco de reverter, sendo necessária a confirmação com outros fatores.
    1. Os principais níveis de suporte/resistência devem ser observados para evitar sinais negativos.

Oportunidades de melhoria

    1. Otimizar os parâmetros MACD para diferentes períodos e moedas.
    1. Refinar os valores K e D do Stoch RSI para suavizar a curva STC.
    1. Adicionar um filtro de volume para evitar falhas de baixa liquidez.
    1. Incorporar indicadores adicionais para confirmar sinais, por exemplo, Bandas de Bollinger.
    1. Adicionar mecanismos de parada, como movimentos/paradas ATR.
    1. Regular a entrada, por exemplo, inserir a retração após a ruptura para confirmação da tendência.

Conclusão

A estratégia do Ciclo de Tendência Schaff identifica sobrecompra/supervenda por meio de métricas de impulso para determinar mudanças de tendência de preços de curto prazo.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// Copyright (c) 2018-present, Alex Orekhov (everget)
// Schaff Trend Cycle script may be freely distributed under the MIT license.
strategy("Schaff Trend Cycle", shorttitle="STC Backtest", overlay=true)

fastLength = input(title="MACD Fast Length",  defval=23)
slowLength = input(title="MACD Slow Length",  defval=50)
cycleLength = input(title="Cycle Length",  defval=10)
d1Length = input(title="1st %D Length",  defval=3)
d2Length = input(title="2nd %D Length",  defval=3)
src = input(title="Source",  defval=close)
highlightBreakouts = input(title="Highlight Breakouts ?", type=bool, defval=true)

macd = ema(src, fastLength) - ema(src, slowLength)

k = nz(fixnan(stoch(macd, macd, macd, cycleLength)))

d = ema(k, d1Length)

kd = nz(fixnan(stoch(d, d, d, cycleLength)))

stc = ema(kd, d2Length)
stc := 	stc > 100 ? 100 : stc < 0 ? 0 : stc

//stcColor = not highlightBreakouts ? (stc > stc[1] ? green : red) : #ff3013
//stcPlot = plot(stc, title="STC", color=stcColor, transp=0)

upper = input(75, defval=75)
lower = input(25, defval=25)

transparent = color(white, 100)

upperLevel = plot(upper, title="Upper", color=gray)
// hline(50, title="Middle", linestyle=dotted)
lowerLevel = plot(lower, title="Lower", color=gray)

fill(upperLevel, lowerLevel, color=#f9cb9c, transp=90)

upperFillColor = stc > upper and highlightBreakouts ? green : transparent
lowerFillColor = stc < lower and highlightBreakouts ? red : transparent

//fill(upperLevel, stcPlot, color=upperFillColor, transp=80)
//fill(lowerLevel, stcPlot, color=lowerFillColor, transp=80)

long =  crossover(stc, lower) ? lower : na
short = crossunder(stc, upper) ? upper : na

long_filt = long and not short
short_filt = short and not long

prev = 0
prev := long_filt ? 1 : short_filt ? -1 : prev[1]

long_final = long_filt and prev[1] == -1
short_final = short_filt and prev[1] == 1

strategy.entry("long", strategy.long, when = long )
strategy.entry("short", strategy.short, when = short)

plotshape(crossover(stc, lower) ? lower : na, title="Crossover", location=location.absolute, style=shape.circle, size=size.tiny, color=green, transp=0)
plotshape(crossunder(stc, upper) ? upper : na, title="Crossunder", location=location.absolute, style=shape.circle, size=size.tiny, color=red, transp=0)

alertcondition(long_final, "Long", message="Long")
alertcondition(short_final,"Short", message="Short")

plotshape(long_final, style=shape.arrowup, text="Long", color=green, location=location.belowbar)
plotshape(short_final, style=shape.arrowdown, text="Short", color=red, location=location.abovebar)


Mais.